using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using AMESCoreStudio.CommonTools.Result; using Microsoft.AspNetCore.Hosting; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using AMESCoreStudio.Web.Models; using System.Collections.Generic; using Microsoft.AspNetCore.Mvc.Rendering; using AMESCoreStudio.Web.ViewModels.QRS; namespace AMESCoreStudio.Web.Controllers { public class QRSController : Controller { private readonly ILogger<QRSController> _logger; public readonly IREP _repApi; public readonly IPPS _ppsApi; public readonly IBAS _basApi; public readonly IPCS _pcsApi; private readonly IWebHostEnvironment _env; public QRSController(ILogger<QRSController> logger, IREP repApi, IPPS ppsApi, IBAS basApi, IPCS pcsApi, IWebHostEnvironment env) { _logger = logger; _repApi = repApi; _ppsApi = ppsApi; _basApi = basApi; _pcsApi = pcsApi; _env = env; } public async Task<IActionResult> QRS009(string id) { IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS009(id); string wipDataList = "<font size='3'>"; if (result.DataTotal > 0) { foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); int wip_id = int.Parse(jo["wipID"].ToString()); int flow_rule_id = int.Parse(jo["flowRuleID"].ToString()); int line_id = int.Parse(jo["lineID"].ToString()); string item_no = jo["itemNO"].ToString(); string unit_name = jo["unitName"].ToString(); string line_desc = jo["lineDesc"].ToString(); string wip_no = jo["wipNO"].ToString(); int plan_qty = int.Parse(jo["planQTY"].ToString()); int input_qty = int.Parse(jo["completeQTY"].ToString()); int output_qty = 0; var cycle_time = await _ppsApi.GetCycleTime(item_no + "," + line_id); string ct1 = ""; if (cycle_time.Count > 0) { ct1 = cycle_time[0].CT1.ToString() + "s"; } wipDataList = wipDataList + "<font color='#FF80FF'>" + unit_name + " - " + line_desc + "</font>" + " - " + "<font color='#0080FF'>" + wip_no + "</font>" + "<font color='#FFC90E'>" + "(" + item_no + ")" + "</font>" + " - " + "<font color='#0080FF'>" + plan_qty + " / " + input_qty + " / " + output_qty + "</font>" + " | " + "<font color='#0080FF'>" + "標準工時: " + "</font>" + ct1 + "<br/>"; var rule_sation = await _basApi.GetRuleStationsByFlow(flow_rule_id); wipDataList = wipDataList + "<table><tr><td width='120'></td>"; string stationQty = "<table><tr><td width='120'>過站數量</td>"; string stationRate = "<table><tr><td width='120'>良率</td>"; string stationWip = "<table><tr><td width='120'>WIP</td>"; string stationList = ""; for (int j = 0; j < rule_sation.Count; j++) { //if (rule_sation[j].StationID != 1000 && rule_sation[j].StationType == "M") if (rule_sation[j].StationType == "M") { stationList = stationList + rule_sation[j].StationID + ","; wipDataList = wipDataList + "<td width='150' style='text-align:left'>" + rule_sation[j].Station.StationName + "</td>"; var wip_station = await _pcsApi.GetWipStation4QRS009Group(wip_id, rule_sation[j].StationID); int okQty = 0, ngQty = 0; if (wip_station.DataTotal > 0) { foreach (var data in wip_station.Data) { JObject j0 = JObject.Parse(data.ToString()); if (j0["ruleStatus"].ToString() == "P") { okQty = int.Parse(j0["firstCnt"].ToString()); } else { ngQty = int.Parse(j0["firstCnt"].ToString()); } } /* for (int k = 0; k < wip_station.Count; k++) { if (wip_station[k].RuleStatus == "P") { okQty = wip_station[k].FirstCnt; } else { ngQty = wip_station[k].FirstCnt; } } */ } //stationQty = stationQty + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('過站PASS條碼資料','/QRS/QRS009P/" + wip_id + "_" + rule_sation[j].RuleStationID + "','','',true);\">" + okQty + "</a>/<a href=\"javascript:hg.open('過站FAIL條碼資料','/QRS/QRS009F','','',true);\">" + ngQty + "</a></td>"; stationQty = stationQty + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('過站PASS條碼資料','/QRS/QRS009P/" + wip_id + "_" + rule_sation[j].StationID + "',800,600);\">" + okQty + "</a>/<a href=\"javascript:hg.open('過站FAIL條碼資料','/QRS/QRS009F/" + wip_id + "_" + rule_sation[j].StationID + "',800,600);\">" + ngQty + "</a></td>"; double rate = ((okQty * 1.0) / (okQty + ngQty)) * 100; if (okQty + ngQty == 0) { rate = 100; } if (j == rule_sation.Count - 1) { if (rate <= 90) { stationRate = stationRate + "<td width='150' style='text-align:left;color:red'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 95 && rate <= 97) { stationRate = stationRate + "<td width='150' style='text-align:left;color:yellow'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 98) { stationRate = stationRate + "<td width='150' style='text-align:left;color:green'>" + rate.ToString("0.00") + "%" + "</td>"; } else { stationRate = stationRate + "<td width='150' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } //stationRate = stationRate + "<td width='150' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } else { //stationRate = stationRate + "<td width='90' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; if (rate <= 90) { stationRate = stationRate + "<td width='90' style='text-align:left;color:red'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 95 && rate <= 97) { stationRate = stationRate + "<td width='90' style='text-align:left;color:yellow'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 98) { stationRate = stationRate + "<td width='90' style='text-align:left;color:green'>" + rate.ToString("0.00") + "%" + "</td>"; } else { stationRate = stationRate + "<td width='90' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } stationRate = stationRate + "<td width='60' style='text-align:left'>" + "<font color='#FF80FF'>" + " >> " + "</font>" + "</td>"; } } } stationQty = stationQty + "</tr></table>"; stationRate = stationRate + "</tr></table>"; string[] station_list = stationList.Split(","); //for (int j = 0; j < station_list.Length - 1; j++) //{ // var wip_station1 = await _pcsApi.GetWipStation4QRS009Group(wip_id, int.Parse(station_list[j])); // int okQty1 = 0, ngQty1 = 0; // if (wip_station1.DataTotal > 0) // { // foreach (var data in wip_station1.Data) // { // JObject j1 = JObject.Parse(data.ToString()); // if (j1["ruleStatus"].ToString() == "P") // { // okQty1 = int.Parse(j1["firstCnt"].ToString()); // } // else // { // ngQty1 = int.Parse(j1["firstCnt"].ToString()); // } // } // /* // for (int k = 0; k < wip_station1; k++) // { // if (wip_station1[k].RuleStatus == "P") // { // okQty1 = wip_station1[k].FirstCnt; // } // else // { // ngQty1 = wip_station1[k].FirstCnt; // } // } // */ // } // int okQty2 = 0, ngQty2 = 0; // //计算WIP // if (j < station_list.Length - 2) // { // var wip_station2 = await _pcsApi.GetWipStation4QRS009Group(wip_id, int.Parse(station_list[j + 1])); // if (wip_station2.DataTotal > 0) // { // /* // for (int k = 0; k < wip_station2.Count; k++) // { // if (wip_station2[k].RuleStatus == "P") // { // okQty2 = wip_station2[k].FirstCnt; // } // else // { // ngQty2 = wip_station2[k].FirstCnt; // } // } // */ // foreach (var data in wip_station2.Data) // { // JObject j2 = JObject.Parse(data.ToString()); // if (j2["ruleStatus"].ToString() == "P") // { // okQty2 = int.Parse(j2["firstCnt"].ToString()); // } // else // { // ngQty2 = int.Parse(j2["firstCnt"].ToString()); // } // } // } // } // int wip_qty = okQty1 + ngQty1 - okQty2 - ngQty2; // if (wip_qty < 0) // { // wip_qty = 0; // } // stationWip = stationWip + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('在製條碼資料','/QRS/QRS009W/" + wip_id + "_" + station_list[j] + "',800,600);\">" + wip_qty + "</a></td>"; //} for (int j = 0; j < station_list.Length - 1; j++) { int wip_qty = 0; var wip_station1 = await _pcsApi.GetWipBarcode4QRS009(wip_id, int.Parse(station_list[j]), 0, 10); if (wip_station1.DataTotal > 0) { wip_qty = wip_station1.DataTotal; } if (wip_qty < 0) { wip_qty = 0; } stationWip = stationWip + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('在製條碼資料','/QRS/QRS009W/" + wip_id + "_" + station_list[j] + "',800,600);\">" + wip_qty + "</a></td>"; } stationWip = stationWip + "</tr></table><br/>"; wipDataList = wipDataList + "</tr></table>"; wipDataList = wipDataList + stationQty; wipDataList = wipDataList + stationRate; wipDataList = wipDataList + stationWip; /* wipDataList = wipDataList + "<table><tr><td width='120'>過站數量</td>"; for (int j = 0; j < rule_sation.Count; j++) { if (rule_sation[j].StationID != 1000 && rule_sation[j].StationType == "M") { wipDataList = wipDataList + "<td width='150' style='text-align:left'>" + "0/0" + "</td>"; } } wipDataList = wipDataList + "</tr></table>"; */ /* wipDataList = wipDataList + "<table><tr><td width='120'>良率</td>"; for (int j = 0; j < rule_sation.Count; j++) { if (rule_sation[j].StationID != 1000 && rule_sation[j].StationType == "M") { if (j == rule_sation.Count - 2) { wipDataList = wipDataList + "<td width='150' style='text-align:left'>" + "100%" + "</td>"; } else { wipDataList = wipDataList + "<td width='90' style='text-align:left'>" + "100%" + "</td>"; wipDataList = wipDataList + "<td width='60' style='text-align:left'>" + "<font color='#FF80FF'>" + " >> " + "</font>" + "</td>"; } } } wipDataList = wipDataList + "</tr></table>"; */ /* wipDataList = wipDataList + "<table><tr><td width='120'>WIP</td>"; for (int j = 0; j < rule_sation.Count; j++) { if (rule_sation[j].StationID != 1000 && rule_sation[j].StationType == "M") { wipDataList = wipDataList + "<td width='150' style='text-align:left'>" + "0" + "</td>"; } } wipDataList = wipDataList + "</tr></table><br/>"; */ } } else { wipDataList = wipDataList + "查无资料"; } wipDataList = wipDataList + "</font>"; ViewData["WipDataList"] = wipDataList; return View(); } public IActionResult QRS009P(string id) { string[] param = id.Split("_"); ViewBag.WIP_ID = param[0]; ViewBag.STATION_ID = param[1]; return View(); } public IActionResult QRS009F(string id) { string[] param = id.Split("_"); ViewBag.WIP_ID = param[0]; ViewBag.STATION_ID = param[1]; return View(); } public IActionResult QRS009W(string id) { string[] param = id.Split("_"); ViewBag.WIP_ID = param[0]; ViewBag.STATION_ID = param[1]; return View(); } public async Task<IActionResult> QRS011() { await GetUnitList(); return View(); } public async Task<IActionResult> QRS011AAsync(string unitNo, string itemNO, string wipNO) { ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 料號 : " + itemNO + "; 工單號碼 : " + wipNO; IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS011(unitNo, itemNO, wipNO); string wipDataList = "<font size='3'>"; if (result.DataTotal > 0) { foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); int wip_id = int.Parse(jo["wipID"].ToString()); int flow_rule_id = int.Parse(jo["flowRuleID"].ToString()); int line_id = int.Parse(jo["lineID"].ToString()); string item_no = jo["itemNO"].ToString(); string unit_name = jo["unitName"].ToString(); string line_desc = jo["lineDesc"].ToString(); string wip_no = jo["wipNO"].ToString(); int plan_qty = int.Parse(jo["planQTY"].ToString()); int input_qty = int.Parse(jo["completeQTY"].ToString()); int output_qty = 0; var cycle_time = await _ppsApi.GetCycleTime(item_no + "," + line_id); string ct1 = ""; if (cycle_time.Count > 0) { ct1 = cycle_time[0].CT1.ToString() + "s"; } wipDataList = wipDataList + "<font color='#FF80FF'>" + unit_name + " - " + line_desc + "</font>" + " - " + "<font color='#0080FF'>" + wip_no + "</font>" + "<font color='#FFC90E'>" + "(" + item_no + ")" + "</font>" + " - " + "<font color='#0080FF'>" + plan_qty + " / " + input_qty + " / " + output_qty + "</font>" + " | " + "<font color='#0080FF'>" + "標準工時: " + "</font>" + ct1 + "<br/>"; var rule_sation = await _basApi.GetRuleStationsByFlow(flow_rule_id); wipDataList = wipDataList + "<table><tr><td width='120'></td>"; string stationQty = "<table><tr><td width='120'>過站數量</td>"; string stationRate = "<table><tr><td width='120'>良率</td>"; string stationWip = "<table><tr><td width='120'>WIP</td>"; string stationList = ""; for (int j = 0; j < rule_sation.Count; j++) { //if (rule_sation[j].StationID != 1000 && rule_sation[j].StationType == "M") if (rule_sation[j].StationType == "M") { stationList = stationList + rule_sation[j].StationID + ","; wipDataList = wipDataList + "<td width='150' style='text-align:left'>" + rule_sation[j].Station.StationName + "</td>"; var wip_station = await _pcsApi.GetWipStation4QRS009Group(wip_id, rule_sation[j].StationID); int okQty = 0, ngQty = 0; if (wip_station.DataTotal > 0) { foreach (var data in wip_station.Data) { JObject j0 = JObject.Parse(data.ToString()); if (j0["ruleStatus"].ToString() == "P") { okQty = int.Parse(j0["firstCnt"].ToString()); } else { ngQty = int.Parse(j0["firstCnt"].ToString()); } } } //stationQty = stationQty + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('過站PASS條碼資料','/QRS/QRS009P/" + wip_id + "_" + rule_sation[j].RuleStationID + "','','',true);\">" + okQty + "</a>/<a href=\"javascript:hg.open('過站FAIL條碼資料','/QRS/QRS009F','','',true);\">" + ngQty + "</a></td>"; stationQty = stationQty + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('過站PASS條碼資料','/QRS/QRS009P/" + wip_id + "_" + rule_sation[j].StationID + "',800,600);\">" + okQty + "</a>/<a href=\"javascript:hg.open('過站FAIL條碼資料','/QRS/QRS009F/" + wip_id + "_" + rule_sation[j].StationID + "',800,600);\">" + ngQty + "</a></td>"; double rate = ((okQty * 1.0) / (okQty + ngQty)) * 100; if (okQty + ngQty == 0) { rate = 100; } if (j == rule_sation.Count - 2) { if (rate <= 90) { stationRate = stationRate + "<td width='150' style='text-align:left;color:red'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 95 && rate <= 97) { stationRate = stationRate + "<td width='150' style='text-align:left;color:yellow'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 98) { stationRate = stationRate + "<td width='150' style='text-align:left;color:green'>" + rate.ToString("0.00") + "%" + "</td>"; } else { stationRate = stationRate + "<td width='150' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } //stationRate = stationRate + "<td width='150' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } else { //stationRate = stationRate + "<td width='90' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; if (rate <= 90) { stationRate = stationRate + "<td width='90' style='text-align:left;color:red'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 95 && rate <= 97) { stationRate = stationRate + "<td width='90' style='text-align:left;color:yellow'>" + rate.ToString("0.00") + "%" + "</td>"; } else if (rate >= 98) { stationRate = stationRate + "<td width='90' style='text-align:left;color:green'>" + rate.ToString("0.00") + "%" + "</td>"; } else { stationRate = stationRate + "<td width='90' style='text-align:left'>" + rate.ToString("0.00") + "%" + "</td>"; } stationRate = stationRate + "<td width='60' style='text-align:left'>" + "<font color='#FF80FF'>" + " >> " + "</font>" + "</td>"; } } } stationQty = stationQty + "</tr></table>"; stationRate = stationRate + "</tr></table>"; string[] station_list = stationList.Split(","); for (int j = 0; j < station_list.Length - 1; j++) { var wip_station1 = await _pcsApi.GetWipStation4QRS009Group(wip_id, int.Parse(station_list[j])); int okQty1 = 0, ngQty1 = 0; if (wip_station1.DataTotal > 0) { foreach (var data in wip_station1.Data) { JObject j1 = JObject.Parse(data.ToString()); if (j1["ruleStatus"].ToString() == "P") { okQty1 = int.Parse(j1["firstCnt"].ToString()); } else { ngQty1 = int.Parse(j1["firstCnt"].ToString()); } } } int okQty2 = 0, ngQty2 = 0; //计算WIP if (j < station_list.Length - 2) { var wip_station2 = await _pcsApi.GetWipStation4QRS009Group(wip_id, int.Parse(station_list[j + 1])); if (wip_station2.DataTotal > 0) { foreach (var data in wip_station2.Data) { JObject j2 = JObject.Parse(data.ToString()); if (j2["ruleStatus"].ToString() == "P") { okQty2 = int.Parse(j2["firstCnt"].ToString()); } else { ngQty2 = int.Parse(j2["firstCnt"].ToString()); } } } } int wip_qty = okQty1 + ngQty1 - okQty2 - ngQty2; if (wip_qty < 0) { wip_qty = 0; } stationWip = stationWip + "<td width='150' style='text-align:left'><a href=\"javascript:hg.open('在製條碼資料','/QRS/QRS009W/" + wip_id + "_" + station_list[j] + "',800,600);\">" + wip_qty + "</a></td>"; } stationWip = stationWip + "</tr></table><br/>"; wipDataList = wipDataList + "</tr></table>"; wipDataList = wipDataList + stationQty; wipDataList = wipDataList + stationRate; wipDataList = wipDataList + stationWip; } } else { wipDataList = wipDataList + "查无资料"; } wipDataList = wipDataList + "</font>"; ViewData["WipDataList"] = wipDataList; return View(); } [ResponseCache(Duration = 0)] [HttpGet] public async Task<IActionResult> GetWipStationPassBarcode(string id, int page = 0, int limit = 10) { string[] param = id.Split("_"); int wip_id = int.Parse(param[0]); int station_id = int.Parse(param[1]); var result = await _pcsApi.GetWipStationBarcode4QRS009(wip_id, station_id, "P", page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } [ResponseCache(Duration = 0)] [HttpGet] public async Task<IActionResult> GetWipStationFailBarcode(string id, int page = 0, int limit = 10) { string[] param = id.Split("_"); int wip_id = int.Parse(param[0]); int station_id = int.Parse(param[1]); var result = await _pcsApi.GetWipStationBarcode4QRS009(wip_id, station_id, "F", page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } [ResponseCache(Duration = 0)] [HttpGet] public async Task<IActionResult> GetWipStationBarcode(string id, int page = 0, int limit = 10) { string[] param = id.Split("_"); int wip_id = int.Parse(param[0]); int station_id = int.Parse(param[1]); var result = await _pcsApi.GetWipBarcode4QRS009(wip_id, station_id, page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } private async Task GetProductTypeList() { var result = await _pcsApi.GetProductTypes(); var ProductTypes = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { ProductTypes.Add(new SelectListItem(result[i].ProductTypeName, result[i].ProductTypeID.ToString())); } ViewBag.ProductTypeList = ProductTypes; } private async Task GetMFGTypeList() { var result = await _pcsApi.GetMFGTypes(); var MFGTypes = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { MFGTypes.Add(new SelectListItem(result[i].MFGTypeName, result[i].MFGTypeNO.ToString())); } ViewBag.MFGTypeList = MFGTypes; } private async Task GetTestTypeList() { var result = await _basApi.GetTestTypes(); var TestTypeItems = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { TestTypeItems.Add(new SelectListItem(result[i].TypeName, result[i].TypeNo.ToString())); } ViewBag.TestTypeList = TestTypeItems; } private async Task GetUnitList() { var result = await _basApi.GetFactoryUnits(); var UnitItems = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { UnitItems.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString())); } ViewBag.UnitList = UnitItems; } private async Task GetLineInfoList() { var result = await _basApi.GetLineInfoes(); var LineItems = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { LineItems.Add(new SelectListItem(result[i].LineDesc, result[i].LineID.ToString())); } ViewBag.LineList = LineItems; } [HttpPost] public async Task<JsonResult> GetUnitLineJson(string unit_no) { var result = await _basApi.GetLineInfoByUnit(unit_no); var item = new List<SelectListItem>(); item.Add(new SelectListItem("全部", "0")); for (int i = 0; i < result.Count; i++) { item.Add(new SelectListItem(result[i].LineDesc, result[i].LineID.ToString())); } /* if (item.Count == 0) { item.Add(new SelectListItem("全部", "*")); } */ //将数据Json化并传到前台视图 return Json(new { data = item }); } private async Task GetStationList() { var result = await _basApi.GetStationses(); var StationItems = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { StationItems.Add(new SelectListItem(result[i].StationName, result[i].StationID.ToString())); } ViewBag.StationList = StationItems; } [HttpPost] public async Task<JsonResult> GetUnitStationJson(string unit_no) { var result = await _basApi.GetStationsByUnit(unit_no); var item = new List<SelectListItem>(); for (int i = 0; i < result.Count; i++) { item.Add(new SelectListItem(result[i].StationName, result[i].StationID.ToString())); } if (item.Count == 0) { item.Add(new SelectListItem("全部", "*")); } //将数据Json化并传到前台视图 return Json(new { data = item }); } public async Task<IActionResult> QRS010() { await GetProductTypeList(); await GetTestTypeList(); await GetUnitList(); await GetLineInfoList(); await GetStationList(); await GetMFGTypeList(); return View(); } public async Task<IActionResult> QRS010QueryAsync(string unitNo, string lineID, string stationID, string mfgTypeNo, string wipNO, string itemNO, string dateStart, string dateEnd, int page = 0, int limit = 10) { var result = await _pcsApi.GetYieldData4QRS010(unitNo, lineID, stationID, mfgTypeNo, wipNO, itemNO, dateStart, dateEnd, page, limit); var query = new QRS010ViewModel(); foreach (var data in result.Data) { JObject jo = JObject.Parse(data.ToString()); var passData = await _pcsApi.GetPassData4QRS010(jo["lineDesc"].ToString(), jo["stationID"].ToString(), jo["wipNO"].ToString()); foreach (var pass in passData.Data) { JObject joPass = JObject.Parse(pass.ToString()); query.YieldDatas.Add(new YieldData { WipID = int.Parse(jo["wipID"].ToString()), WipNO = jo["wipNO"].ToString(), PlanQTY = int.Parse(jo["planQTY"].ToString()), //RuleStationID = int.Parse(jo["ruleStationID"].ToString()), StationID = int.Parse(jo["stationID"].ToString()), StationDesc = jo["stationName"].ToString(), ItemNO = jo["itemNO"].ToString(), LineDesc = jo["lineDesc"].ToString(), ModelNO = jo["modelNO"].ToString(), FirstCnt = int.Parse(joPass["firstCnt"].ToString()), PassCnt = int.Parse(jo["passCnt"].ToString()), Yield = int.Parse(joPass["firstCnt"].ToString()) * 1.0 / int.Parse(jo["passCnt"].ToString()) * 100.0 }); } } if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = query.YieldDatas, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } public IActionResult QRS010A(string id) { ViewData["ParamList"] = id; return View(); } [HttpPost] public async Task<JsonResult> GetYieldData4QRS010Async(string id) { string[] param = id.Split('_'); var result = await _pcsApi.GetYieldData4QRS010(param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], 0, 10); var query = new QRS010ViewModel(); foreach (var data in result.Data) { JObject jo = JObject.Parse(data.ToString()); var passData = await _pcsApi.GetPassData4QRS010(jo["lineDesc"].ToString(), jo["stationID"].ToString(), jo["wipNO"].ToString()); foreach (var pass in passData.Data) { JObject joPass = JObject.Parse(pass.ToString()); query.YieldDatas.Add(new YieldData { WipID = int.Parse(jo["wipID"].ToString()), WipNO = jo["wipNO"].ToString(), PlanQTY = int.Parse(jo["planQTY"].ToString()), //RuleStationID = int.Parse(jo["ruleStationID"].ToString()), StationID = int.Parse(jo["stationID"].ToString()), StationDesc = jo["stationName"].ToString(), ItemNO = jo["itemNO"].ToString(), LineDesc = jo["lineDesc"].ToString(), ModelNO = jo["modelNO"].ToString(), FirstCnt = int.Parse(joPass["firstCnt"].ToString()), PassCnt = int.Parse(jo["passCnt"].ToString()), Yield = int.Parse(joPass["firstCnt"].ToString()) * 1.0 / int.Parse(jo["passCnt"].ToString()) * 100.0 }); } } return Json(query.YieldDatas); } public async Task<IActionResult> GetYieldData4QRS010ListAsync(string id) { string[] param = id.Split('_'); var result = await _pcsApi.GetYieldData4QRS010(param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7], 0, 10); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } public IActionResult QRS012(string id) { ViewBag.WipNo = id; return View(); } public async Task<IActionResult> GetWipAlarmsByType(int alarmTypeID, string wipNO, int page = 0, int limit = 10) { //var result = await _repApi.GetWipAlarmsByType(alarmTypeID, page, limit); var result = await _repApi.GetWipAlarm2(alarmTypeID, wipNO, page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } public IActionResult QRS013() { return View(); } [ResponseCache(Duration = 0)] [HttpGet] public async Task<IActionResult> QRS013AAsync(string wipNO, int page = 0, int limit = 10) { ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO; if (wipNO == null) { return Json(new Table() { count = 0, data = null }); } var result = await _pcsApi.GetWipInfo4QRS013(wipNO, page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } public async Task<IActionResult> QRS014() { await GetUnitList(); return View(); } [HttpPost] public async Task<JsonResult> GetYieldData4QRS014Async(string id) { string[] param = id.Split('_'); var ft_stations = await _basApi.GetStations4FT(param[0]); IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS014(param[0], param[1], param[2], param[3], param[4]); var query = new QRS014ViewModel(); foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); int wip_id = int.Parse(jo["wipID"].ToString()); double sum_rate = 100.0; for (int i = 0; i < ft_stations.Count; i++) { int station_id = ft_stations[i].StationID; var wip_station = await _pcsApi.GetWipStation4QRS009Group(wip_id, station_id); int okQty = 0, ngQty = 0, inputQty = 0; if (wip_station.DataTotal > 0) { foreach (var data in wip_station.Data) { JObject j0 = JObject.Parse(data.ToString()); if (j0["ruleStatus"].ToString() == "P") { okQty = int.Parse(j0["firstCnt"].ToString()); } else { ngQty = int.Parse(j0["firstCnt"].ToString()); } } } inputQty = okQty + ngQty; double rate = 0; if (okQty > 0) { rate = (okQty * 1.0 / inputQty) * 100; } if (rate > 0) { sum_rate = sum_rate * rate; } } query.SumYieldDatas.Add(new SumYieldData { WipID = int.Parse(jo["wipID"].ToString()), WipNO = jo["wipNO"].ToString(), Yield = sum_rate }); } return Json(query.SumYieldDatas); } public async Task<IActionResult> QRS014AAsync(string unitNo, string itemNO, string wipNO, string dateStart, string dateEnd) { ViewData["ParamList"] = unitNo + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd; ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 生產日期 : " + dateStart + " ~ " + dateEnd; var ft_stations = await _basApi.GetStations4FT(unitNo); IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS014(unitNo, itemNO, wipNO, dateStart, dateEnd); string rateDataList = "<font size='3'>"; if (ft_stations.Count > 0) { int tdQty = ft_stations.Count * 4 + 3; rateDataList = rateDataList + "<table border='1'><tr><td width='160'></td><td width='240'></td>"; for (int i = 0; i < ft_stations.Count; i++) { rateDataList = rateDataList + "<td width='240' colspan='4' align='center'>" + ft_stations[i].StationName + "</td>"; } rateDataList = rateDataList + "<td width='120'></td></tr>"; rateDataList = rateDataList + "<tr><td width='160'>工單號碼</td><td width='240'>料號</td>"; for (int i = 0; i < ft_stations.Count; i++) { rateDataList = rateDataList + "<td width='60'>Input</td><td width='60'>Pass</td><td width='60'>Fail</td><td width='60'>Yield</td>"; } rateDataList = rateDataList + "<td width='120'></td></tr>"; if (result.DataTotal > 0) { foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); int wip_id = int.Parse(jo["wipID"].ToString()); string wip_no = jo["wipNO"].ToString(); string item_no = jo["itemNO"].ToString(); rateDataList = rateDataList + "<tr><td width='160'>" + wip_no + "</td><td width='240'>" + item_no + "</td>"; double sum_rate = 100.0; for (int i = 0; i < ft_stations.Count; i++) { int station_id = ft_stations[i].StationID; var wip_station = await _pcsApi.GetWipStation4QRS009Group(wip_id, station_id); int okQty = 0, ngQty = 0, inputQty = 0; if (wip_station.DataTotal > 0) { foreach (var data in wip_station.Data) { JObject j0 = JObject.Parse(data.ToString()); if (j0["ruleStatus"].ToString() == "P") { okQty = int.Parse(j0["firstCnt"].ToString()); } else { ngQty = int.Parse(j0["firstCnt"].ToString()); } } } inputQty = okQty + ngQty; double rate = 0; if (okQty > 0) { rate = (okQty * 1.0 / inputQty) * 100; } if (rate > 0) { sum_rate = sum_rate * rate; } rateDataList = rateDataList + "<td width='60'>" + inputQty + "</td><td width='60'>" + okQty + "</td><td width='60'>" + ngQty + "</td><td width='60'>" + rate.ToString("0.00") + "%</td>"; } rateDataList = rateDataList + "<td width='120'>" + sum_rate.ToString("0.00") + "%</td></tr>"; } } rateDataList = rateDataList + "</table>"; } rateDataList = rateDataList + "</font>"; ViewData["RateDataList"] = rateDataList; return View(); } public async Task<IActionResult> QRS015() { await GetUnitList(); ViewBag.StartDate = System.DateTime.Now.AddDays(-7).ToString("yyyy/MM/dd"); ViewBag.EndDate = System.DateTime.Now.ToString("yyyy/MM/dd"); return View(); } public async Task<IActionResult> QRS015AAsync(string modelNO, string itemNO, string wipNO, string dateStart, string dateEnd) { ViewData["ParamList"] = modelNO + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd; ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 檢驗日期 : " + dateStart + " ~ " + dateEnd; string ipqcDataList = "<font size='3'>"; IResultModel<dynamic> result = await _pcsApi.GetIPQCHeaderData4QRS015(wipNO, itemNO, modelNO, dateStart, dateEnd); if (result.DataTotal > 0) { ipqcDataList = ipqcDataList + "<table border='1'><tr><td width='160'>周次</td><td>抽驗總筆數</td><td width='160'>通過筆數</td><td width='160'>不良筆數</td><td width='160'>通過率</td></tr>"; foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); string ipqc_week = jo["ipqcWeek"].ToString(); string ipqc_cnt = jo["ipqcCnt"].ToString(); ipqcDataList = ipqcDataList + "<tr><td width='160'>" + ipqc_week + "</td><td>" + ipqc_cnt + "</td><td width='160'>" + ipqc_cnt + "</td><td width='160'>0</td><td width='160'>100%</td></tr>"; } ipqcDataList = ipqcDataList + "</table>"; } ipqcDataList = ipqcDataList + "</font>"; ViewData["IPQCDataList"] = ipqcDataList; return View(); } public async Task<IActionResult> QRS016() { await GetUnitList(); ViewBag.StartDate = System.DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd"); ViewBag.EndDate = System.DateTime.Now.ToString("yyyy-MM-dd"); return View(); } public IActionResult QRS016B(string id) { string[] param = id.Split("_"); ViewBag.WIP_NO = param[0]; ViewBag.ITEM_NO = param[1]; ViewBag.MODEL_NO = param[2]; ViewBag.START_DATE = param[3]; ViewBag.END_DATE = param[4]; ViewBag.WEEK = param[5]; return View(); } [HttpPost] public async Task<JsonResult> GetFQCData4QRS016Async(string id) { string[] param = id.Split('_'); string wip_no = param[0]; string item_no = param[1]; string model_no = param[2]; string start_date = param[3]; string end_date = param[4]; var result = await _pcsApi.GetFQCHeaderData4QRS016(wip_no, item_no, model_no, start_date, end_date); var query = new QRS016ViewModel(); foreach (var data in result.Data) { JObject jo = JObject.Parse(data.ToString()); query.FqcDatas.Add(new FqcData { WeekCode = jo["fqcWeek"].ToString(), FqcCnt = int.Parse(jo["fqcCnt"].ToString()), PassCnt = int.Parse(jo["passCnt"].ToString()), FailCnt = int.Parse(jo["failCnt"].ToString()), Rate = int.Parse(jo["passCnt"].ToString()) * 1.0 / int.Parse(jo["fqcCnt"].ToString()) * 100.0 }); } return Json(query.FqcDatas); } public async Task<IActionResult> QRS016AAsync(string modelNO, string itemNO, string wipNO, string dateStart, string dateEnd) { ViewData["ParamList"] = modelNO + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd; ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 檢驗日期 : " + dateStart + " ~ " + dateEnd; string fqcDataList = "<font size='3'>"; IResultModel<dynamic> result = await _pcsApi.GetFQCHeaderData4QRS016(wipNO, itemNO, modelNO, dateStart, dateEnd); if (result.DataTotal > 0) { fqcDataList = fqcDataList + "<table border='1' width='100%'><tr><td width='80' style='text-align:center'>周次</td><td style='text-align:center'>抽驗總筆數</td><td width='200' style='text-align:center'>通過筆數</td><td width='200' style='text-align:center'>不良筆數</td><td width='160' style='text-align:center'>通過率</td></tr>"; int sumFqcCnt = 0, sumPassCnt = 0, sumFailCnt = 0; foreach (var item in result.Data) { JObject jo = JObject.Parse(item.ToString()); string fqc_week = jo["fqcWeek"].ToString(); int fqc_cnt = int.Parse(jo["fqcCnt"].ToString()); int pass_cnt = int.Parse(jo["passCnt"].ToString()); int fail_cnt = int.Parse(jo["failCnt"].ToString()); double fqc_rate = pass_cnt * 100.0 / fqc_cnt; fqcDataList = fqcDataList + "<tr><td width='80'style='text-align:center'>" + fqc_week + "</td><td><a href =\"javascript:hg.open('FQC明細資料','/QRS/QRS016B/" + wipNO + "_" + itemNO + "_" + modelNO + "_" + dateStart + "_" + dateEnd + "_" + fqc_week + "',1000,600);\">" + " " + fqc_cnt + "</a></td><td width='200' style='color:green'>" + " " + pass_cnt + "</td><td width='200' style='color:red'>" + " " + fail_cnt + "</td><td width='160'>" + " " + fqc_rate.ToString("0.00") + "%</td></tr>"; sumFqcCnt = sumFqcCnt + fqc_cnt; sumPassCnt = sumPassCnt + pass_cnt; sumFailCnt = sumFailCnt + fail_cnt; } double sum_fqc_rate = sumPassCnt * 100.0 / sumFqcCnt; fqcDataList = fqcDataList + "<tr><td width='80'style='text-align:center'>" + " " + "Total" + "</td><td>" + " " + sumFqcCnt + "</td><td width='200' style='color:green'>" + " " + sumPassCnt + "</td><td width='200' style='color:red'>" + " " + sumFailCnt + "</td><td width='160'>" + " " + sum_fqc_rate.ToString("0.00") + "%</td></tr>"; fqcDataList = fqcDataList + "</table>"; } fqcDataList = fqcDataList + "</font>"; ViewData["FQCDataList"] = fqcDataList; return View(); } [ResponseCache(Duration = 0)] [HttpGet] public async Task<IActionResult> GetFQCDetailData(string id, int page = 0, int limit = 10) { string[] param = id.Split("_"); string wip_no = param[0]; string item_no = param[1]; string model_no = param[2]; string start_date = param[3]; string end_date = param[4]; string week = param[5]; var result = await _pcsApi.GetFQCDetailData(wip_no, item_no, model_no, start_date, end_date, week, page, limit); if (result.DataTotal > 0) { return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal }); } return Json(new Table() { count = 0, data = null }); } } }