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;
using System.Linq;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.WebApi.Models.BAS;

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;
        public readonly ISYS _sysApi;
        private readonly IWebHostEnvironment _env;

        public QRSController(ILogger<QRSController> logger, IREP repApi, IPPS ppsApi, IBAS basApi, IPCS pcsApi, ISYS sysApi, IWebHostEnvironment env)
        {
            _logger = logger;
            _repApi = repApi;
            _ppsApi = ppsApi;
            _basApi = basApi;
            _pcsApi = pcsApi;
            _sysApi = sysApi;
            _env = env;
        }

        public async Task<IActionResult> QRS009(string id)
        {
            string unitNo = null, factoryNo = null;
            if (id != null)
            {
                string[] param = id.Split('_');
                if (param[0] != null && param[0] != "")
                {
                    unitNo = param[0];
                }
                if (param.Length > 1)
                {
                    if (param[1] != null && param[1] == "OC")
                    {
                        if (Request.Cookies["_AMESCookie"] != null)
                        {
                            var userID = "";
                            HttpContext.Request.Cookies.TryGetValue("UserID", out userID);
                            if (userID != null)
                            {
                                if (int.Parse(userID.ToString()) >= 0)
                                {
                                    int user_id = int.Parse(userID.ToString());
                                    var user_info = await _sysApi.GetUserData(user_id);

                                    if (user_info.DataTotal > 0)
                                    {
                                        foreach (var item in user_info.Data)
                                        {
                                            JObject jo = JObject.Parse(item.ToString());
                                            factoryNo = jo["factoryNo"].ToString();
                                        }
                                    }
                                }
                            }

                        }
                    }
                }
            }
            IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS009(unitNo, factoryNo);

            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>";
                    }
                    */

                    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;

                }
            }
            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;
        }

        /// <summary>
        /// 線別 預設帶全部
        /// </summary>
        /// <param name="factoryNo">廠商代號</param>
        /// <returns></returns>
        private async Task GetLineInfoList(string factoryNo = null)
        {
            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()));
            }

            if (!string.IsNullOrWhiteSpace(factoryNo))
                LineItems = LineItems.Where(w => w.Text == factoryNo).ToList();

            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 async Task<IActionResult> QRS013(string id)
        {
            if (id != null)
            {
                string[] param = id.Split('_');
                if (param[0] != null && param[0] != "")
                {
                    ViewBag.UnitNo = param[0];
                }

                if (param[1] != null && param[1] == "OC")
                {
                    if (Request.Cookies["_AMESCookie"] != null)
                    {
                        var userID = "";
                        HttpContext.Request.Cookies.TryGetValue("UserID", out userID);
                        if (userID != null)
                        {
                            if (int.Parse(userID.ToString()) >= 0)
                            {
                                int user_id = int.Parse(userID.ToString());
                                var user_info = await _sysApi.GetUserData(user_id);

                                if (user_info.DataTotal > 0)
                                {
                                    foreach (var item in user_info.Data)
                                    {
                                        JObject jo = JObject.Parse(item.ToString());
                                        string factoryNo = jo["factoryNo"].ToString();
                                        ViewBag.UserFactory = factoryNo;
                                    }
                                }
                            }
                        }

                    }
                }
            }
            return View();
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> QRS013AAsync(string wipNO, string factoryNo, 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, factoryNo, page, limit);

            string cols= @"";

            ViewBag.ColList = cols;

            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();
        }

        [HttpPost]
        public async Task<JsonResult> GetIPQCData4QRS015Async(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.GetIPQCHeaderData4QRS015(wip_no, item_no, model_no, start_date, end_date);

            var query = new QRS015ViewModel();

            foreach (var data in result.Data)
            {
                JObject jo = JObject.Parse(data.ToString());

                query.IpqcDatas.Add(new IpqcData
                {
                    WeekCode = jo["ipqcWeek"].ToString(),
                    IpqcCnt = int.Parse(jo["ipqcCnt"].ToString()),
                    PassCnt = int.Parse(jo["passCnt"].ToString()),
                    FailCnt = int.Parse(jo["failCnt"].ToString()),
                    Rate = double.Parse((int.Parse(jo["passCnt"].ToString()) * 1.0 / int.Parse(jo["ipqcCnt"].ToString()) * 100.0).ToString("0.00"))
                });
            }

            return Json(query.IpqcDatas);
        }

        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' 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 sumIpqcCnt = 0, sumPassCnt = 0, sumFailCnt = 0;

                foreach (var item in result.Data)
                {
                    JObject jo = JObject.Parse(item.ToString());
                    string ipqc_week = jo["ipqcWeek"].ToString();
                    int ipqc_cnt = int.Parse(jo["ipqcCnt"].ToString());
                    int pass_cnt = int.Parse(jo["passCnt"].ToString());
                    int fail_cnt = int.Parse(jo["failCnt"].ToString());
                    double ipqc_rate = pass_cnt * 100.0 / ipqc_cnt;
                    ipqcDataList = ipqcDataList + "<tr><td width='80'style='text-align:center'>" + ipqc_week + "</td><td><a href =\"javascript:hg.open('IPQC明細資料','/QRS/QRS015B/" + wipNO + "_" + itemNO + "_" + modelNO + "_" + dateStart + "_" + dateEnd + "_" + ipqc_week + "',1000,600);\">" + "&nbsp;&nbsp;" + ipqc_cnt + "</a></td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + pass_cnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + fail_cnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + ipqc_rate.ToString("0.00") + "%</td></tr>";
                    sumIpqcCnt = sumIpqcCnt + ipqc_cnt;
                    sumPassCnt = sumPassCnt + pass_cnt;
                    sumFailCnt = sumFailCnt + fail_cnt;
                }
                double sum_ipqc_rate = sumPassCnt * 100.0 / sumIpqcCnt;
                ipqcDataList = ipqcDataList + "<tr><td width='80'style='text-align:center'>" + " " + "Total" + "</td><td>" + "&nbsp;&nbsp;" + sumIpqcCnt + "</td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + sumPassCnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + sumFailCnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + sum_ipqc_rate.ToString("0.00") + "%</td></tr>";
                ipqcDataList = ipqcDataList + "</table>";
            }

            ipqcDataList = ipqcDataList + "</font>";
            ViewData["IPQCDataList"] = ipqcDataList;
            return View();
        }

        public IActionResult QRS015B(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();
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetIPQCDetailData(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.GetIPQCDetailData(wip_no, item_no, model_no, start_date, end_date, week, 0, 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> 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 = double.Parse((int.Parse(jo["passCnt"].ToString()) * 1.0 / int.Parse(jo["fqcCnt"].ToString()) * 100.0).ToString("0.00"))
                });
            }

            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);\">" + "&nbsp;&nbsp;" + fqc_cnt + "</a></td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + pass_cnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + fail_cnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + 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>" + "&nbsp;&nbsp;" + sumFqcCnt + "</td><td width='200' style='color:green'>" + "&nbsp;&nbsp;" + sumPassCnt + "</td><td width='200' style='color:red'>" + "&nbsp;&nbsp;" + sumFailCnt + "</td><td width='160'>" + "&nbsp;&nbsp;" + 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, 0, 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 });
        }

        /// <summary>
        /// 流程ID By站別
        /// </summary>
        /// <returns>StationID</returns>
        private async Task<List<RuleStation>> GetRuleStationByFlowRuleID(int flowruleID)
        {
            var result = await _basApi.GetRuleStationsByFlow(flowruleID, 0);
            result = result.Where(w => w.StationType == "M").OrderBy(o => o.Sequence).ToList();
            var RuleStations = new List<SelectListItem>();
            for (int i = 0; i < result.Count; i++)
            {
                RuleStations.Add(new SelectListItem(result[i].Sequence + "-" + result[i].Station.StationName, result[i].StationID.ToString()));
            }

            if (RuleStations.Count == 0)
            {
                RuleStations.Add(new SelectListItem("N/A", null));
            }

            ViewBag.GetRuleStationByFlowRuleIDList = RuleStations;
            return result;
        }

        #region PCS021 條碼輸入作業
        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> QRS021()
        {
            var model = new QRS021ViewModel();
            await GetUnitList();
            await GetLineInfoList(GetFactoryNo().Result);
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> QRS021_GetWip(QRS021ViewModel model)
        {
            await GetUnitList();
            await GetLineInfoList(GetFactoryNo().Result);
            model.KpItemName += "null";
            if (string.IsNullOrWhiteSpace(model.WipNO))
            {
                ModelState.AddModelError("error", "請輸入工單號碼");
            }

            if (string.IsNullOrWhiteSpace(model.UnitNO))
            {
                ModelState.AddModelError("error", "請選擇生產單位");
            }

            if (model.LineID == 0)
            {
                ModelState.AddModelError("error", "請選擇線別");
            }

            var q = await _pcsApi.GetWipInfoByWipNO(model.WipNO);
            q = q.Where(w => w.UnitNO == model.UnitNO && w.WerksNO == GetFactoryNo().Result).ToList();

            // 取作業站的生產製程
            var stationUnit = string.Empty;
            var station = await _basApi.GetStations(model.Station);
            if (station.Count() != 0)
            {
                stationUnit = station.FirstOrDefault().UnitNo;
            }
            else
            {
                ModelState.AddModelError("error", "找不到該作業站的生產單位");
            }


            if (q.Count() == 0)
            {
                ModelState.AddModelError("error", "找不到該生產單位的工單號碼");
            }

            if (q.Count != 0)
            {
                model.WipID = q.FirstOrDefault().WipID;
                model.PlanQTY = q.FirstOrDefault().PlanQTY;
                model.UnitNO = q.FirstOrDefault().UnitNO;
                model.FlowRuleID = q.FirstOrDefault().FlowRuleID;
                model.ItemNO = (await _pcsApi.GetWipAtt(model.WipNO)).ItemNO;

                // 判斷工單狀態
                var BarCodeWip = await _pcsApi.CheckBarCodeWip(model.WipNO, model.UnitNO, model.LineID, model.FlowRuleID);
                if (!BarCodeWip.Success)
                {
                    ModelState.AddModelError("error", BarCodeWip.Msg);
                    return View("QRS021", model);
                }

                // 工單流程ID 取站別
                var ruleStations = await GetRuleStationByFlowRuleID(model.FlowRuleID);
                var StationNameSt = ""; // 作業站名稱代碼 提供不二過
                if (model.Station != 0)
                {
                    if (ruleStations.Where(w => w.StationID == model.Station).Any())
                    {
                        model.RuleStation = ruleStations.Where(w => w.StationID == model.Station).FirstOrDefault().RuleStationID;
                        model.StationTypeNo = ruleStations.Where(w => w.StationID == model.Station).FirstOrDefault().Station.TypeNo;
                        StationNameSt = ruleStations.Where(w => w.StationID == model.Station).FirstOrDefault().Station.StationNameSt;
                    }
                    else
                    {
                        model.RuleStation = ruleStations.FirstOrDefault().RuleStationID;
                        model.StationTypeNo = ruleStations.FirstOrDefault().Station.TypeNo;
                        model.Station = ruleStations.FirstOrDefault().StationID;
                        StationNameSt = ruleStations.FirstOrDefault().Station.StationNameSt;
                    }
                }
                else
                {
                    model.RuleStation = ruleStations.FirstOrDefault().RuleStationID;
                    model.StationTypeNo = ruleStations.FirstOrDefault().Station.TypeNo;
                    model.Station = ruleStations.FirstOrDefault().StationID;
                    StationNameSt = ruleStations.FirstOrDefault().Station.StationNameSt;
                }

                // 工單已刷數量
                model.InputQTY = await _pcsApi.GetBarcodeStationByInputQty(model.WipID, model.Station);

                // 工單KeyParts
                model.WipKps = await _pcsApi.GetWipKpByWipNo(model.WipNO);
                model.WipKps = model.WipKps.Where(w => w.UnitNo == stationUnit).OrderBy(o => o.KpSeq).ToList();

                // 料號檔案
                model.MaterialItem = await _pcsApi.GetMaterialItemByItemNO(model.ItemNO);
                if (model.MaterialItem != null)
                {

                    model.MaterialStationsItems = await _pcsApi.GetMaterialStationsItemByItemID(model.MaterialItem.ItemID);
                    model.MaterialStationsItems = model.MaterialStationsItems.Where(w => w.StationID == model.Station).OrderBy(o => o.StationsItemSeq).ToList();
                    if (model.MaterialStationsItems.Count() != 0)
                    {
                        ModelState.AddModelError("error", "該站別有設定作業工項");
                    }

                    // 治具
                    var q1 = await _pcsApi.GetWipOutfitByWipNo(model.WipNO);
                    q1 = q1.Where(w => (w.UnitNo == model.UnitNO && w.StationID == null) ||
                                       (w.UnitNo == model.UnitNO && w.StationID == model.Station)).ToList();
                    model.wipOutfits.Clear();
                    foreach (var item in q1)
                    {
                        model.wipOutfits.Add(new WipOutfitDtos
                        {
                            OutfitNo = item.OutfitNo,
                            PartNo = item.PartNo,
                            PartNoName = item.PartNoName,
                            StationName = item.StationName,
                            UnitNoName = item.UnitNoName
                        });

                    }
                }

                // 工程工單備註
                var wipsystem = await _pcsApi.GetWipSystem(model.WipNO);
                if (wipsystem != null)
                {
                    if (stationUnit == "B")
                        model.SystemMemo = wipsystem.BabMemo;
                    else if (stationUnit == "T")
                        model.SystemMemo = wipsystem.TestMemo;
                    else if (stationUnit == "P")
                        model.SystemMemo = wipsystem.PackingMemo;
                }

                // KPSeq順序清除
                model.KpItemName = string.Empty;

                // 工單SOP
                var wipSOP = await _pcsApi.GetWipSopByWipNo(model.WipNO);
                // 標準SOP A
                if (wipSOP.Where(w => w.UnitNo == stationUnit && w.SOPType == "A").Any())
                {
                    var wipSOPTypeA = wipSOP.Where(w => w.UnitNo == stationUnit && w.SOPType == "A")
                                            .OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                    var Esop = await _pcsApi.GetDocEsopViewByNo(wipSOPTypeA.SOPName);
                    if (Esop.Count != 0)
                    {
                        model.Sops.Add(new QRS021ViewModel_SOP
                        {
                            SopName = "SOP文件",
                            SopPath = $@"/DocEsop/{Esop.FirstOrDefault().file_path}"
                        });
                    }
                }
                // 暫行SOP D
                if (wipSOP.Where(w => w.UnitNo == stationUnit && w.SOPType == "D").Any())
                {
                    var wipSOPTypeD = wipSOP.Where(w => w.UnitNo == stationUnit && w.SOPType == "D")
                                            .OrderByDescending(w => w.UpdateTime).FirstOrDefault();
                    var Esop = await _pcsApi.GetEsopBySopName(wipSOPTypeD.SOPName);
                    if (Esop.Count != 0)
                    {
                        model.Sops.Add(new QRS021ViewModel_SOP
                        {
                            SopName = "暫行文件",
                            SopPath = $@"/e-sop/{Esop.FirstOrDefault().Process}/{Esop.FirstOrDefault().SopName}.pdf"
                        });
                    }
                }
                // 不二過
                model.Sops.Add(new QRS021ViewModel_SOP
                {
                    SopName = "不二過",
                    SopPath = "https://qazone.avalue.com.tw/qazone/sfislinktopp.aspx?" +
                              "QA_MFID=YS00" +
                              $"&QA_PRDID={model.ItemNO}" +
                              $"&QA_ROUTEID={StationNameSt}"
                }); ;
            }

            return View("QRS021", model);
        }

        [HttpPost]
        public async Task<IActionResult> QRS021_Input(QRS021ViewModel model)
        {
            // ResultModel
            string Msg = string.Empty;
            bool Success = true;
            string Data = model.Input;
            // 刷入條碼+異常欄位
            if (!string.IsNullOrWhiteSpace(model.InputNo))
                Data += "@" + model.InputNo;

            string ExtNo = string.Empty;

            #region 基本Input 輸入判斷
            if (model.WipID == 0)
                Msg += "請確認是否有輸入工單相關訊息</br>";

            // 當有作業站就必須要填治具編號
            if (model.wipOutfits.Where(w => !string.IsNullOrWhiteSpace(w.StationName) && string.IsNullOrWhiteSpace(w.Inputs)).Any())
                Msg += "請刷入治具編號</br>";

            if (model.Station == 0)
            {
                Msg += "請選擇作業站</br>";
            }

            if (string.IsNullOrWhiteSpace(model.Input))
            {
                Msg += "請刷讀條碼</br>";
            }

            if (!string.IsNullOrWhiteSpace(Msg))
            {
                Success = false;
                return Json(new Result() { success = Success, msg = Msg, data = Data });
            }
            #endregion

            var q = await _pcsApi.CheckBarCodeByWipNo(model.Input, model.WipNO.Trim().ToUpper());
            // 判斷是否序號與工單號碼是否對應條碼區間值,沒對應到視為組件或不良代碼
            if (q.Success)
            {
                #region 確認序號的狀態
                // Input為內部序號
                model.Barcode = true;

                // 取RuleStationID
                var RuleStations = await _basApi.GetRuleStationsByFlow(model.FlowRuleID, 0);
                if (RuleStations.Count != 0)
                {
                    // 抓作業站順序
                    model.RuleStation = RuleStations.Where(w => w.StationID == model.Station).Select(s => s.RuleStationID).FirstOrDefault();
                    model.StationSEQ = RuleStations.Where(w => w.StationID == model.Station).Select(s => s.Sequence).FirstOrDefault();
                }
                // 判斷是否有$符號,代表有不良代碼
                if (model.Inputs.Where(w => w.Input.Contains("$")).Any())
                {
                    model.BarcodeNG = true;
                    // 判斷是否為投入站,投入站不能刷不良
                    //if (model.StationSEQ == 1)
                    //{
                    //    Msg += "投入站不能刷不良代碼</br>";
                    //}

                    if (!string.IsNullOrWhiteSpace(Msg))
                    {
                        Success = false;
                        return Json(new Result() { success = Success, msg = Msg, data = Data });
                    }
                }

                // 取作業站的生產製程
                var stationUnit = string.Empty;
                var station = await _basApi.GetStations(model.Station);
                if (station.Count() != 0)
                {
                    stationUnit = station.FirstOrDefault().UnitNo;
                }
                var keyParts = new List<BarCodeCheckDto.inputItem>();

                // 先查詢已綁定組件數量
                var BarCodeItems = await _pcsApi.GetBarcodeItemByBarCode(model.Input);
                BarCodeItems = BarCodeItems.Where(w => w.S.UnitNo == stationUnit).ToList();

                //  KeyParts代碼順序
                var KeyPartsNo = model.KpItemName == null ? new List<string>() : model.KpItemName.Split(',').ToList();
                int KpItemQty = BarCodeItems.Count();
                int i = 0;

                // 判斷指定KeyParts代碼是否有刷足夠數
                if (KeyPartsNo.Count() > model.Inputs.Where(w => !w.Input.StartsWith("$")).Count())
                {
                    Msg = "有指定KeyParts代號 刷入數量不足,請在確認!";
                    return Json(new Result() { success = false, msg = Msg, data = Data });
                }

                foreach (var KeyPartItem in model.Inputs)
                {
                    // 判斷是組件先+1
                    if (!KeyPartItem.Input.StartsWith("$"))
                        i += 1;

                    // 當刷入組組件+已紀錄組件數量 大於 設定組件數量
                    if (i + KpItemQty > model.WipKps.Count())
                    {
                        Msg = "已刷超過組件數量";
                        Success = false;
                        return Json(new Result() { success = Success, msg = Msg, data = Data });
                    }

                    // NG代碼
                    if (KeyPartItem.Input.StartsWith("$"))
                    {
                        keyParts.Add(new BarCodeCheckDto.inputItem
                        {
                            inputType = "NG",
                            inputData = KeyPartItem.Input,
                            oldInputData = KeyPartItem.InputNo,
                            kpItemNo = ""
                        });
                    }
                    else // KeaParts
                    {
                        // 判斷是否有輸入KeyParts代碼順序
                        // 有指定KeyParts順序
                        if (i <= KeyPartsNo.Count())
                        {
                            var WipKp = model.WipKps.Where(w => w.KpNoName.ToUpper() == KeyPartsNo[i - 1].ToUpper()).FirstOrDefault();
                            keyParts.Add(new BarCodeCheckDto.inputItem
                            {
                                inputType = WipKp.KpNo,
                                inputData = KeyPartItem.Input,
                                oldInputData = KeyPartItem.InputNo,
                                kpItemNo = WipKp.KpName
                            });
                        }
                        else
                        {
                            var WipKp = model.WipKps.Where(w => !KeyPartsNo.Any(w1 => w1.ToUpper().Contains(w.KpNoName.ToUpper())))
                                                          .ToList();
                            // 排除有指定數量,其他按照WipKp順序取值
                            var k = i - 1 - KeyPartsNo.Count();
                            keyParts.Add(new BarCodeCheckDto.inputItem
                            {
                                inputType = WipKp[k + KpItemQty].KpNo,
                                inputData = KeyPartItem.Input,
                                oldInputData = KeyPartItem.InputNo,
                                kpItemNo = WipKp[k + KpItemQty].KpName
                            });
                        }
                    }
                }

                // 治具
                var outfit = new List<BarCodeCheckDto.Outfit>();
                foreach (var outfitItem in model.wipOutfits)
                {
                    outfit.Add(new BarCodeCheckDto.Outfit
                    {
                        inputData = outfitItem.Inputs
                    });
                }

                var x = new BarCodeCheckDto
                {
                    wipNo = model.WipNO,
                    barcode = model.Input,
                    barcodeType = "M",
                    stationID = model.Station,
                    line = model.LineID,
                    unitNo = model.UnitNO,
                    inputItems = keyParts,
                    outfits = outfit,
                    userID = GetLogInUserID()
                };

                var barcode_result = await _pcsApi.PassIngByCheck(JsonConvert.SerializeObject(x));
                if (!barcode_result.Success)
                    return Json(new Result() { success = barcode_result.Success, msg = barcode_result.Msg, data = Data });
                // 過站判斷成功
                else
                {
                    Msg = barcode_result.Msg;
                    Data = string.Empty;
                }
                #endregion
            }
            else
            {
                var items = await _pcsApi.GetItems();
                items = items.Where(w => model.WipKps.Any(wi => wi.KpNo == w.ItemNo)).ToList();
                if (items.Any(a => a.ItemName.ToUpper() == Data.ToUpper()))
                {
                    // 判斷是否有重複輸入KP順序代號
                    if (model.KpItemName != null)
                    {
                        if (model.KpItemName.Split(",").Where(w => w.ToUpper() == Data.ToUpper()).Any())
                        {
                            Success = false;
                            Msg = $"KeyParts代號重複輸入:{Data} </br>";
                            return Json(new Result() { success = Success, msg = Msg, data = Data });
                        }
                    }

                    return Json(new Result1() { success = Success, msg = Msg, data = "", data1 = Data });
                }
            }

            #region 判斷下一站為完工站
            var NextStopCloseStation = await _pcsApi.CheckNextStopCloseStation(model.WipNO, model.UnitNO, model.Station);
            #endregion

            if (NextStopCloseStation.Success)
            {
                // 刪除 BarCodeGroup DIP完工後刪除
                if (model.UnitNO == "D")
                {
                    var GroupID = await _pcsApi.GetBarcodeGroupByBarCodeID(model.BarCodeID);
                    if (GroupID.Count != 0)
                    {
                        await _pcsApi.DeleteBarcodeGroupByGroupID(GroupID.FirstOrDefault().GroupID);
                    }
                }
            }

            return Json(new Result1() { success = Success, msg = Msg, data = Data, data1 = "" });
        }

        /// <summary>
        /// 目前已刷數量
        /// </summary>
        /// <param name="wipNo">工單號碼</param>
        /// <param name="unitNo">生產單位</param>
        /// <param name="ststionID">作業站</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<JsonResult> getBarcodeStationByInputQty(string wipNo, string unitNo, int ststionID)
        {
            var q = await _pcsApi.GetWipInfoByWipNO(wipNo);
            var q1 = q.Where(w => w.UnitNO == unitNo && w.WerksNO == GetFactoryNo().Result).FirstOrDefault();
            if (q1 != null)
            {

                // 工單流程ID 取站別
                var ruleStations = await GetRuleStationByFlowRuleID(q1.FlowRuleID);
                //var rulestationID = ruleStations.Where(w => w.StationID == ststionID).FirstOrDefault().RuleStationID;

                // 工單已刷數量
                int InputQTY = await _pcsApi.GetBarcodeStationByInputQty(q1.WipID, ststionID);

                //将数据Json化并传到前台视图
                return Json(new { data = InputQTY });
            }
            return Json(new { data = 0 });
        }
        #endregion

        /// <summary>
        /// 登入UserID
        /// </summary>
        /// <returns></returns>
        public int GetLogInUserID()
        {
            int user_id = 0;
            HttpContext.Request.Cookies.TryGetValue("UserID", out string userID);

            if (userID != null)
            {
                if (int.Parse(userID.ToString()) >= 0)
                {
                    user_id = int.Parse(userID.ToString());
                }
            }
            return user_id;
        }

        /// <summary>
        /// 廠商代號
        /// </summary>
        /// <returns></returns>
        public async Task<string> GetFactoryNo()
        {
            string factoryNo = string.Empty;
            int user_id = 0;
            HttpContext.Request.Cookies.TryGetValue("UserID", out string userID);

            if (userID != null)
            {
                var user_info = await _sysApi.GetUserData(int.Parse(userID));

                if (user_info.DataTotal > 0)
                {
                    foreach (var item in user_info.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        factoryNo = jo["factoryNo"].ToString();
                    }
                }
            }


            return factoryNo;
        }
    }
}