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);\">" + "&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, 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 });
        }
    }
}