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;
using System;
using System.Data;
using AMESCoreStudio.Web.ViewModels;
using AspNetCore.Reporting;

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;
        public readonly IKCS _kcsApi;
        public readonly IQRS _qrsApi;
        private readonly IWebHostEnvironment _env;

        public QRSController(ILogger<QRSController> logger, IREP repApi, IPPS ppsApi, IBAS basApi, IPCS pcsApi, ISYS sysApi, IKCS kcsApi, IWebHostEnvironment env, IQRS qrsApi)
        {
            _logger = logger;
            _repApi = repApi;
            _ppsApi = ppsApi;
            _basApi = basApi;
            _pcsApi = pcsApi;
            _sysApi = sysApi;
            _kcsApi = kcsApi;
            _qrsApi = qrsApi;
            _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();
        }

        /// <summary>
        /// 生產進度查詢
        /// </summary>
        /// <param name="unitNo">生產製程</param>
        /// <param name="itemNO">料號</param>
        /// <param name="wipNO">工單號碼</param>
        /// <param name="wipStatus">工單狀態:N(未完工) E(已完工)</param>
        /// <returns></returns>
        public async Task<IActionResult> QRS011AAsync(string unitNo, string itemNO, string wipNO, string wipStatus)
        {
            ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 料號 : " + itemNO + "; 工單號碼 : " + wipNO;

            IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS011(unitNo, itemNO, wipNO, wipStatus);

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

                            // 完工站(1000)PASS資料 抓上一站PASS數
                            if (rule_sation[j].StationID == 1000)
                            {
                                wip_station = await _pcsApi.GetWipStation4QRS009Group(wip_id, rule_sation[j - 1].StationID);
                                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());
                                        }
                                    }
                                }
                            }

                            //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 GetFactoryList()
        {
            var result = await _basApi.GetFactoryInfoes();

            var FactoryItems = new List<SelectListItem>();

            foreach (var item in result)
            {
                FactoryItems.Add(new SelectListItem(item.FactoryNo + item.FactoryNameCh, item.FactoryNo.ToString()));
            }

            ViewBag.WerksList = FactoryItems;
        }

        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.ToUpper().Trim().Contains(factoryNo.Trim().ToUpper())).ToList();

            ViewBag.LineList = LineItems;
        }

        /// <summary>
        /// 廠別/委外廠
        /// </summary>
        /// <returns></returns>
        private async Task GetFactoryInfo()
        {
            var result = await _pcsApi.GetFactoryInfo();

            var FactoryInfo = new List<SelectListItem>();
            result = result.Where(w => w.StatusNo == "A").OrderBy(o => o.FactoryID).ToList();
            for (int i = 0; i < result.Count; i++)
            {
                FactoryInfo.Add(new SelectListItem(result[i].FactoryNo + "-" + result[i].FactoryNameCh, result[i].FactoryID.ToString()));
            }

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

            ViewBag.FactoryInfoList = FactoryInfo;
        }

        [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 = double.Parse((int.Parse(joPass["firstCnt"].ToString()) * 1.0 / int.Parse(jo["passCnt"].ToString()) * 100.0).ToString("0.00"))
                    });
                }
            }

            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();
            await GetFactoryList();

            return View();
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014Async(string id)
        {
            string[] param = id.Split('_');

            var ft_stations = await _basApi.GetStations4FTByConfig(param[0]);

            IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS014(param[0], param[1], param[2], param[3], param[4], param[5], param[6], param[7]);

            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;
                int sum_idx = 1;

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

                    if (rate > 0)
                    {
                        sum_idx = sum_idx + 1;
                        sum_rate = sum_rate + rate;
                    }
                }

                query.SumYieldDatas.Add(new SumYieldData
                {
                    WipID = int.Parse(jo["wipID"].ToString()),
                    WipNO = jo["wipNO"].ToString(),
                    Yield = sum_rate / sum_idx
                });
            }

            return Json(query.SumYieldDatas);
        }


        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014BSAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014BViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            #region 01

            string dateStart01 = yCode + "-01-01";
            string dateEnd01 = yCode + "-02-01";
            var wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart01, dateEnd01, param[5], param[6], param[7]);
            double sum_rate01 = 100.0;
            int sum_idx01 = 1;
            if (wipStaiton01.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate01 = sum_rate01 * (rate / 100.0);
                            sum_idx01 = sum_idx01 + 1;
                            sum_rate01 = sum_rate01 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate01 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-01",
                Yield = double.Parse((sum_rate01 / sum_idx01).ToString("0.00"))
            });

            #endregion

            #region 02

            string dateStart02 = yCode + "-02-01";
            string dateEnd02 = yCode + "-03-01";
            var wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart02, dateEnd02, param[5], param[6], param[7]);
            double sum_rate02 = 100.0;
            int sum_idx02 = 1;
            if (wipStaiton02.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate02 = sum_rate02 * (rate / 100.0);
                            sum_idx02 = sum_idx02 + 1;
                            sum_rate02 = sum_rate02 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate02 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-02",
                Yield = double.Parse((sum_rate02 / sum_idx02).ToString("0.00"))
            });

            #endregion

            #region 03

            string dateStart03 = yCode + "-03-01";
            string dateEnd03 = yCode + "-04-01";
            var wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart03, dateEnd03, param[5], param[6], param[7]);
            double sum_rate03 = 100.0;
            int sum_idx03 = 1;
            if (wipStaiton03.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate03 = sum_rate03 * (rate / 100.0);
                            sum_idx03 = sum_idx03 + 1;
                            sum_rate03 = sum_rate03 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate03 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-03",
                Yield = double.Parse((sum_rate03 / sum_idx03).ToString("0.00"))
            });

            #endregion

            #region 04

            string dateStart04 = yCode + "-04-01";
            string dateEnd04 = yCode + "-05-01";
            var wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart04, dateEnd04, param[5], param[6], param[7]);
            double sum_rate04 = 100.0;
            int sum_idx04 = 1;
            if (wipStaiton04.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate04 = sum_rate04 * (rate / 100.0);
                            sum_idx04 = sum_idx04 + 1;
                            sum_rate04 = sum_rate04 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate04 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-04",
                Yield = double.Parse((sum_rate04 / sum_idx04).ToString("0.00"))
            });

            #endregion

            #region 05

            string dateStart05 = yCode + "-05-01";
            string dateEnd05 = yCode + "-06-01";
            var wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart05, dateEnd05, param[5], param[6], param[7]);
            double sum_rate05 = 100.0;
            int sum_idx05 = 1;
            if (wipStaiton05.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate05 = sum_rate05 * (rate / 100.0);
                            sum_idx05 = sum_idx05 + 1;
                            sum_rate05 = sum_rate05 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate05 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-05",
                Yield = double.Parse((sum_rate05 / sum_idx05).ToString("0.00"))
            });

            #endregion

            #region 06

            string dateStart06 = yCode + "-06-01";
            string dateEnd06 = yCode + "-07-01";
            var wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart06, dateEnd06, param[5], param[6], param[7]);
            double sum_rate06 = 100.0;
            int sum_idx06 = 1;
            if (wipStaiton06.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate06 = sum_rate06 * (rate / 100.0);
                            sum_idx06 = sum_idx06 + 1;
                            sum_rate06 = sum_rate06 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate06 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-06",
                Yield = double.Parse((sum_rate06 / sum_idx06).ToString("0.00"))
            });

            #endregion

            #region 07

            string dateStart07 = yCode + "-07-01";
            string dateEnd07 = yCode + "-08-01";
            var wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart07, dateEnd07, param[5], param[6], param[7]);
            double sum_rate07 = 100.0;
            int sum_idx07 = 1;
            if (wipStaiton07.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate07 = sum_rate07 * (rate / 100.0);
                            sum_idx07 = sum_idx07 + 1;
                            sum_rate07 = sum_rate07 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate07 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-07",
                Yield = double.Parse((sum_rate07 / sum_idx07).ToString("0.00"))
            });

            #endregion

            #region 08

            string dateStart08 = yCode + "-08-01";
            string dateEnd08 = yCode + "-09-01";
            var wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart08, dateEnd08, param[5], param[6], param[7]);
            double sum_rate08 = 100.0;
            int sum_idx08 = 1;
            if (wipStaiton08.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate08 = sum_rate08 * (rate / 100.0);
                            sum_idx08 = sum_idx08 + 1;
                            sum_rate08 = sum_rate08 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate08 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-08",
                Yield = double.Parse((sum_rate08 / sum_idx08).ToString("0.00"))
            });

            #endregion

            #region 09

            string dateStart09 = yCode + "-09-01";
            string dateEnd09 = yCode + "-10-01";
            var wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart09, dateEnd09, param[5], param[6], param[7]);
            double sum_rate09 = 100.0;
            int sum_idx09 = 1;
            if (wipStaiton09.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate09 = sum_rate09 * (rate / 100.0);
                            sum_idx09 = sum_idx09 + 1;
                            sum_rate09 = sum_rate09 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate09 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-09",
                Yield = double.Parse((sum_rate09 / sum_idx09).ToString("0.00"))
            });

            #endregion

            #region 10

            string dateStart10 = yCode + "-10-01";
            string dateEnd10 = yCode + "-11-01";
            var wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart10, dateEnd10, param[5], param[6], param[7]);
            double sum_rate10 = 100.0;
            int sum_idx10 = 1;
            if (wipStaiton10.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate10 = sum_rate10 * (rate / 100.0);
                            sum_idx10 = sum_idx10 + 1;
                            sum_rate10 = sum_rate10 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate10 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-10",
                Yield = double.Parse((sum_rate10 / sum_idx10).ToString("0.00"))
            });

            #endregion

            #region 11

            string dateStart11 = yCode + "-11-01";
            string dateEnd11 = yCode + "-12-01";
            var wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart11, dateEnd11, param[5], param[6], param[7]);
            double sum_rate11 = 100.0;
            int sum_idx11 = 1;
            if (wipStaiton11.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate11 = sum_rate11 * (rate / 100.0);
                            sum_idx11 = sum_idx11 + 1;
                            sum_rate11 = sum_rate11 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate11 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-11",
                Yield = double.Parse((sum_rate11 / sum_idx11).ToString("0.00"))
            });

            #endregion

            #region 12

            string dateStart12 = yCode + "-12-01";
            string dateEnd12 = (int.Parse(yCode) + 1).ToString() + "-01-01";
            var wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupS(param[1], dateStart12, dateEnd12, param[5], param[6], param[7]);
            double sum_rate12 = 100.0;
            int sum_idx12 = 1;
            if (wipStaiton12.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate12 = sum_rate12 * (rate / 100.0);
                            sum_idx12 = sum_idx12 + 1;
                            sum_rate12 = sum_rate12 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate12 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-12",
                Yield = double.Parse((sum_rate12 / sum_idx12).ToString("0.00"))
            });

            #endregion

            return Json(query.FPYDatas);
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014BBAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014BViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            #region 01

            string dateStart01 = yCode + "-01-01";
            string dateEnd01 = yCode + "-02-01";
            var wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart01, dateEnd01, param[5], param[6], param[7]);
            double sum_rate01 = 100.0;
            int sum_idx01 = 1;
            if (wipStaiton01.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate01 = sum_rate01 * (rate / 100.0);
                            sum_idx01 = sum_idx01 + 1;
                            sum_rate01 = sum_rate01 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate01 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-01",
                Yield = double.Parse((sum_rate01 / sum_idx01).ToString("0.00"))
            });

            #endregion

            #region 02

            string dateStart02 = yCode + "-02-01";
            string dateEnd02 = yCode + "-03-01";
            var wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart02, dateEnd02, param[5], param[6], param[7]);
            double sum_rate02 = 100.0;
            int sum_idx02 = 1;
            if (wipStaiton02.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate02 = sum_rate02 * (rate / 100.0);
                            sum_idx02 = sum_idx02 + 1;
                            sum_rate02 = sum_rate02 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate02 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-02",
                Yield = double.Parse((sum_rate02 / sum_idx02).ToString("0.00"))
            });

            #endregion

            #region 03

            string dateStart03 = yCode + "-03-01";
            string dateEnd03 = yCode + "-04-01";
            var wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart03, dateEnd03, param[5], param[6], param[7]);
            double sum_rate03 = 100.0;
            int sum_idx03 = 1;
            if (wipStaiton03.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate03 = sum_rate03 * (rate / 100.0);
                            sum_idx03 = sum_idx03 + 1;
                            sum_rate03 = sum_rate03 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate03 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-03",
                Yield = double.Parse((sum_rate03 / sum_idx03).ToString("0.00"))
            });

            #endregion

            #region 04

            string dateStart04 = yCode + "-04-01";
            string dateEnd04 = yCode + "-05-01";
            var wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart04, dateEnd04, param[5], param[6], param[7]);
            double sum_rate04 = 100.0;
            int sum_idx04 = 1;
            if (wipStaiton04.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate04 = sum_rate04 * (rate / 100.0);
                            sum_idx04 = sum_idx04 + 1;
                            sum_rate04 = sum_rate04 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate04 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-04",
                Yield = double.Parse((sum_rate04 / sum_idx04).ToString("0.00"))
            });

            #endregion

            #region 05

            string dateStart05 = yCode + "-05-01";
            string dateEnd05 = yCode + "-06-01";
            var wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart05, dateEnd05, param[5], param[6], param[7]);
            double sum_rate05 = 100.0;
            int sum_idx05 = 1;
            if (wipStaiton05.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate05 = sum_rate05 * (rate / 100.0);
                            sum_idx05 = sum_idx05 + 1;
                            sum_rate05 = sum_rate05 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate05 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-05",
                Yield = double.Parse((sum_rate05 / sum_idx05).ToString("0.00"))
            });

            #endregion

            #region 06

            string dateStart06 = yCode + "-06-01";
            string dateEnd06 = yCode + "-07-01";
            var wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart06, dateEnd06, param[5], param[6], param[7]);
            double sum_rate06 = 100.0;
            int sum_idx06 = 1;
            if (wipStaiton06.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate06 = sum_rate06 * (rate / 100.0);
                            sum_idx06 = sum_idx06 + 1;
                            sum_rate06 = sum_rate06 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate06 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-06",
                Yield = double.Parse((sum_rate06 / sum_idx06).ToString("0.00"))
            });

            #endregion

            #region 07

            string dateStart07 = yCode + "-07-01";
            string dateEnd07 = yCode + "-08-01";
            var wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart07, dateEnd07, param[5], param[6], param[7]);
            double sum_rate07 = 100.0;
            int sum_idx07 = 1;
            if (wipStaiton07.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate07 = sum_rate07 * (rate / 100.0);
                            sum_idx07 = sum_idx07 + 1;
                            sum_rate07 = sum_rate07 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate07 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-07",
                Yield = double.Parse((sum_rate07 / sum_idx07).ToString("0.00"))
            });

            #endregion

            #region 08

            string dateStart08 = yCode + "-08-01";
            string dateEnd08 = yCode + "-09-01";
            var wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart08, dateEnd08, param[5], param[6], param[7]);
            double sum_rate08 = 100.0;
            int sum_idx08 = 1;
            if (wipStaiton08.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate08 = sum_rate08 * (rate / 100.0);
                            sum_idx08 = sum_idx08 + 1;
                            sum_rate08 = sum_rate08 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate08 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-08",
                Yield = double.Parse((sum_rate08 / sum_idx08).ToString("0.00"))
            });

            #endregion

            #region 09

            string dateStart09 = yCode + "-09-01";
            string dateEnd09 = yCode + "-10-01";
            var wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart09, dateEnd09, param[5], param[6], param[7]);
            double sum_rate09 = 100.0;
            int sum_idx09 = 1;
            if (wipStaiton09.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate09 = sum_rate09 * (rate / 100.0);
                            sum_idx09 = sum_idx09 + 1;
                            sum_rate09 = sum_rate09 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate09 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-09",
                Yield = double.Parse((sum_rate09 / sum_idx09).ToString("0.00"))
            });

            #endregion

            #region 10

            string dateStart10 = yCode + "-10-01";
            string dateEnd10 = yCode + "-11-01";
            var wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart10, dateEnd10, param[5], param[6], param[7]);
            double sum_rate10 = 100.0;
            int sum_idx10 = 1;
            if (wipStaiton10.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate10 = sum_rate10 * (rate / 100.0);
                            sum_idx10 = sum_idx10 + 1;
                            sum_rate10 = sum_rate10 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate10 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-10",
                Yield = double.Parse((sum_rate10 / sum_idx10).ToString("0.00"))
            });

            #endregion

            #region 11

            string dateStart11 = yCode + "-11-01";
            string dateEnd11 = yCode + "-12-01";
            var wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart11, dateEnd11, param[5], param[6], param[7]);
            double sum_rate11 = 100.0;
            int sum_idx11 = 1;
            if (wipStaiton11.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate11 = sum_rate11 * (rate / 100.0);
                            sum_idx11 = sum_idx11 + 1;
                            sum_rate11 = sum_rate11 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate11 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-11",
                Yield = double.Parse((sum_rate11 / sum_idx11).ToString("0.00"))
            });

            #endregion

            #region 12

            string dateStart12 = yCode + "-12-01";
            string dateEnd12 = (int.Parse(yCode) + 1).ToString() + "-01-01";
            var wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupB(param[1], dateStart12, dateEnd12, param[5], param[6], param[7]);
            double sum_rate12 = 100.0;
            int sum_idx12 = 1;
            if (wipStaiton12.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate12 = sum_rate12 * (rate / 100.0);
                            sum_idx12 = sum_idx12 + 1;
                            sum_rate12 = sum_rate12 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate12 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-12",
                Yield = double.Parse((sum_rate12 / sum_idx12).ToString("0.00"))
            });

            #endregion

            return Json(query.FPYDatas);
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014CBAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014CViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            var wipStation = await _pcsApi.GetWipStation4QRS014GroupBByWeek(param[1], param[3], param[4], param[5], param[6], param[7]);

            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        query.FPYDatas.Add(new FPY4WeekGroup
                        {
                            Week = week_code,
                            Yield = double.Parse(rate.ToString("0.00"))
                        });
                    }
                }
            }

            return Json(query.FPYDatas);
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014CMAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014CViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            var wipStation = await _pcsApi.GetWipStation4QRS014GroupMByWeek(param[1], param[3], param[4], param[5], param[6], param[7]);

            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        query.FPYDatas.Add(new FPY4WeekGroup
                        {
                            Week = week_code,
                            Yield = double.Parse(rate.ToString("0.00"))
                        });
                    }
                }
            }

            return Json(query.FPYDatas);
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014CSAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014CViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            var wipStation = await _pcsApi.GetWipStation4QRS014GroupSByWeek(param[1], param[3], param[4], param[5], param[6], param[7]);

            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        query.FPYDatas.Add(new FPY4WeekGroup
                        {
                            Week = week_code,
                            Yield = double.Parse(rate.ToString("0.00"))
                        });
                    }
                }
            }

            return Json(query.FPYDatas);
        }

        [HttpPost]
        public async Task<JsonResult> GetYieldData4QRS014BMAsync(string id)
        {
            string[] param = id.Split('_');

            var query = new QRS014BViewModel();

            string yCode = DateTime.Now.Year.ToString();
            if (param[3] != null)
            {
                if (param[3] != "")
                {
                    yCode = param[3].Substring(0, 4);
                }
            }

            #region 01

            string dateStart01 = yCode + "-01-01";
            string dateEnd01 = yCode + "-02-01";
            var wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart01, dateEnd01, param[5], param[6], param[7]);
            double sum_rate01 = 100.0;
            int sum_idx01 = 1;
            if (wipStaiton01.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate01 = sum_rate01 * (rate / 100.0);
                            sum_idx01 = sum_idx01 + 1;
                            sum_rate01 = sum_rate01 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate01 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-01",
                Yield = double.Parse((sum_rate01 / sum_idx01).ToString("0.00"))
            });

            #endregion

            #region 02

            string dateStart02 = yCode + "-02-01";
            string dateEnd02 = yCode + "-03-01";
            var wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart02, dateEnd02, param[5], param[6], param[7]);
            double sum_rate02 = 100.0;
            int sum_idx02 = 1;
            if (wipStaiton02.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate02 = sum_rate02 * (rate / 100.0);
                            sum_idx02 = sum_idx02 + 1;
                            sum_rate02 = sum_rate02 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate02 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-02",
                Yield = double.Parse((sum_rate02 / sum_idx02).ToString("0.00"))
            });

            #endregion

            #region 03

            string dateStart03 = yCode + "-03-01";
            string dateEnd03 = yCode + "-04-01";
            var wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart03, dateEnd03, param[5], param[6], param[7]);
            double sum_rate03 = 100.0;
            int sum_idx03 = 1;
            if (wipStaiton03.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate03 = sum_rate03 * (rate / 100.0);
                            sum_idx03 = sum_idx03 + 1;
                            sum_rate03 = sum_rate03 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate03 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-03",
                Yield = double.Parse((sum_rate03 / sum_idx03).ToString("0.00"))
            });

            #endregion

            #region 04

            string dateStart04 = yCode + "-04-01";
            string dateEnd04 = yCode + "-05-01";
            var wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart04, dateEnd04, param[5], param[6], param[7]);
            double sum_rate04 = 100.0;
            int sum_idx04 = 1;
            if (wipStaiton04.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate04 = sum_rate04 * (rate / 100.0);
                            sum_idx04 = sum_idx04 + 1;
                            sum_rate04 = sum_rate04 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate04 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-04",
                Yield = double.Parse((sum_rate04 / sum_idx04).ToString("0.00"))
            });

            #endregion

            #region 05

            string dateStart05 = yCode + "-05-01";
            string dateEnd05 = yCode + "-06-01";
            var wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart05, dateEnd05, param[5], param[6], param[7]);
            double sum_rate05 = 100.0;
            int sum_idx05 = 1;
            if (wipStaiton05.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate05 = sum_rate05 * (rate / 100.0);
                            sum_idx05 = sum_idx05 + 1;
                            sum_rate05 = sum_rate05 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate05 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-05",
                Yield = double.Parse((sum_rate05 / sum_idx05).ToString("0.00"))
            });

            #endregion

            #region 06

            string dateStart06 = yCode + "-06-01";
            string dateEnd06 = yCode + "-07-01";
            var wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart06, dateEnd06, param[5], param[6], param[7]);
            double sum_rate06 = 100.0;
            int sum_idx06 = 1;
            if (wipStaiton06.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate06 = sum_rate06 * (rate / 100.0);
                            sum_idx06 = sum_idx06 + 1;
                            sum_rate06 = sum_rate06 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate06 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-06",
                Yield = double.Parse((sum_rate06 / sum_idx06).ToString("0.00"))
            });

            #endregion

            #region 07

            string dateStart07 = yCode + "-07-01";
            string dateEnd07 = yCode + "-08-01";
            var wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart07, dateEnd07, param[5], param[6], param[7]);
            double sum_rate07 = 100.0;
            int sum_idx07 = 1;
            if (wipStaiton07.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate07 = sum_rate07 * (rate / 100.0);
                            sum_idx07 = sum_idx07 + 1;
                            sum_rate07 = sum_rate07 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate07 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-07",
                Yield = double.Parse((sum_rate07 / sum_idx07).ToString("0.00"))
            });

            #endregion

            #region 08

            string dateStart08 = yCode + "-08-01";
            string dateEnd08 = yCode + "-09-01";
            var wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart08, dateEnd08, param[5], param[6], param[7]);
            double sum_rate08 = 100.0;
            int sum_idx08 = 1;
            if (wipStaiton08.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate08 = sum_rate08 * (rate / 100.0);
                            sum_idx08 = sum_idx08 + 1;
                            sum_rate08 = sum_rate08 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate08 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-08",
                Yield = double.Parse((sum_rate08 / sum_idx08).ToString("0.00"))
            });

            #endregion

            #region 09

            string dateStart09 = yCode + "-09-01";
            string dateEnd09 = yCode + "-10-01";
            var wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart09, dateEnd09, param[5], param[6], param[7]);
            double sum_rate09 = 100.0;
            int sum_idx09 = 1;
            if (wipStaiton09.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate09 = sum_rate09 * (rate / 100.0);
                            sum_idx09 = sum_idx09 + 1;
                            sum_rate09 = sum_rate09 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate09 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-09",
                Yield = double.Parse((sum_rate09 / sum_idx09).ToString("0.00"))
            });

            #endregion

            #region 10

            string dateStart10 = yCode + "-10-01";
            string dateEnd10 = yCode + "-11-01";
            var wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart10, dateEnd10, param[5], param[6], param[7]);
            double sum_rate10 = 100.0;
            int sum_idx10 = 1;
            if (wipStaiton10.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate10 = sum_rate10 * (rate / 100.0);
                            sum_idx10 = sum_idx10 + 1;
                            sum_rate10 = sum_rate10 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate10 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-10",
                Yield = double.Parse((sum_rate10 / sum_idx10).ToString("0.00"))
            });

            #endregion

            #region 11

            string dateStart11 = yCode + "-11-01";
            string dateEnd11 = yCode + "-12-01";
            var wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart11, dateEnd11, param[5], param[6], param[7]);
            double sum_rate11 = 100.0;
            int sum_idx11 = 1;
            if (wipStaiton11.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate11 = sum_rate11 * (rate / 100.0);
                            sum_idx11 = sum_idx11 + 1;
                            sum_rate11 = sum_rate11 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate11 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-11",
                Yield = double.Parse((sum_rate11 / sum_idx11).ToString("0.00"))
            });

            #endregion

            #region 12

            string dateStart12 = yCode + "-12-01";
            string dateEnd12 = (int.Parse(yCode) + 1).ToString() + "-01-01";
            var wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupM(param[1], dateStart12, dateEnd12, param[5], param[6], param[7]);
            double sum_rate12 = 100.0;
            int sum_idx12 = 1;
            if (wipStaiton12.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate12 = sum_rate12 * (rate / 100.0);
                            sum_idx12 = sum_idx12 + 1;
                            sum_rate12 = sum_rate12 + rate;
                        }
                    }
                }
            }
            else
            {
                sum_rate12 = 0.00;
            }
            query.FPYDatas.Add(new FPY4MonthGroup
            {
                Month = yCode + "-12",
                Yield = double.Parse((sum_rate12 / sum_idx12).ToString("0.00"))
            });

            #endregion

            return Json(query.FPYDatas);
        }

        public async Task<IActionResult> QRS014AAsync(string unitNo, string werksNo, string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string dateType)
        {
            if (werksNo == "*")
            {
                werksNo = "";
            }

            ViewData["ParamList"] = unitNo + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd + "_" + modelNO + "_" + werksNo + "_" + dateType;

            if (dateType == "WipDate" || dateType == null)
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 生產日期 : " + dateStart + " ~ " + dateEnd;
            }
            else
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 結案日期 : " + dateStart + " ~ " + dateEnd;
            }

            var ft_stations = await _basApi.GetStations4FTByConfig(unitNo);

            IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS014(unitNo, itemNO, wipNO, dateStart, dateEnd, modelNO, werksNo, dateType);

            string rateDataList = "<font size='3'>";

            if (ft_stations.Count > 0)
            {
                int tdQty = ft_stations.Count * 4 + 3;
                rateDataList = rateDataList + "<table id = 'ratelist' border='1' width='100%'><tr bgcolor='#66CCFF'><td></td><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>工單號碼</td><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'>FPY</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();
                        string type = "";
                        if (jo["customerMedical"].ToString() == "Y")
                        {
                            type = "醫療";
                        }
                        else
                        {
                            if (jo["unitNO"].ToString() == "B")
                            {
                                type = "系統";
                            }
                            if (jo["unitNO"].ToString() == "S")
                            {
                                type = "板卡";
                            }
                        }

                        rateDataList = rateDataList + "<tr><td>" + wip_no + "</td><td width='160'>" + type + "</td><td width='240'>" + item_no + "</td>";
                        double sum_rate = 100.0;

                        int sum_idx = 1;

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

                            if (rate > 0)
                            {
                                sum_idx = sum_idx + 1;
                                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 / sum_idx).ToString("0.00") + "%</td></tr>";
                    }
                }


                rateDataList = rateDataList + "</table>";
            }

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

        public async Task<IActionResult> QRS014BAsync(string unitNo, string werksNo, string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string dateType)
        {
            if (werksNo == "*")
            {
                werksNo = "";
            }

            ViewData["ParamList"] = unitNo + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd + "_" + modelNO + "_" + werksNo + "_" + dateType;

            if (dateType == "WipDate" || dateType == null)
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 生產日期 : " + dateStart + " ~ " + dateEnd;
            }
            else
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 結案日期 : " + dateStart + " ~ " + dateEnd;
            }
            

            string rateDataList = "<font size='3'>";

            rateDataList = rateDataList + @"<table border='1' cellpadding='2' width='100%'><tr bgcolor='#66CCFF'><td>年度-類別</td><td width='120'>JAN</td><td width='120'>FEB</td><td width='120'>MAR</td>
<td width='120'>APR</td><td width='120'>MAY</td><td width='120'>JUN</td><td width='120'>JUL</td><td width='120'>AUG</td><td width='120'>SEP</td>
<td width='120'>OCT</td><td width='120'>NOV</td><td width='120'>DEC</td></tr>";

            //單板FPY
            //rateDataList = rateDataList + @"<tr><td>" + DateTime.Now.Year.ToString() + "-單板" + "</td>";
            string yCode = DateTime.Now.Year.ToString();
            if (dateStart != null)
            {
                yCode = dateStart.Substring(0, 4);
            }
            rateDataList = rateDataList + @"<tr><td>" + yCode + "-單板" + "</td>";

            #region 01

            string dateStart01 = yCode + "-01-01";
            string dateEnd01 = yCode + "-02-01";
            var wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart01, dateEnd01, modelNO, werksNo, dateType);
            if (wipStaiton01.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 02

            string dateStart02 = yCode + "-02-01";
            string dateEnd02 = yCode + "-03-01";
            var wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart02, dateEnd02, modelNO, werksNo, dateType);
            if (wipStaiton02.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 03

            string dateStart03 = yCode + "-03-01";
            string dateEnd03 = yCode + "-04-01";
            var wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart03, dateEnd03, modelNO, werksNo, dateType);
            if (wipStaiton03.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 04

            string dateStart04 = yCode + "-04-01";
            string dateEnd04 = yCode + "-05-01";
            var wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart04, dateEnd04, modelNO, werksNo, dateType);
            if (wipStaiton04.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 05

            string dateStart05 = yCode + "-05-01";
            string dateEnd05 = yCode + "-06-01";
            var wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart05, dateEnd05, modelNO, werksNo, dateType);
            if (wipStaiton05.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 06

            string dateStart06 = yCode + "-06-01";
            string dateEnd06 = yCode + "-07-01";
            var wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart06, dateEnd06, modelNO, werksNo, dateType);
            if (wipStaiton06.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 07

            string dateStart07 = yCode + "-07-01";
            string dateEnd07 = yCode + "-08-01";
            var wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart07, dateEnd07, modelNO, werksNo, dateType);
            if (wipStaiton07.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;

                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 08

            string dateStart08 = yCode + "-08-01";
            string dateEnd08 = yCode + "-09-01";
            var wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart08, dateEnd08, modelNO, werksNo, dateType);
            if (wipStaiton08.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 09

            string dateStart09 = yCode + "-09-01";
            string dateEnd09 = yCode + "-10-01";
            var wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart09, dateEnd09, modelNO, werksNo, dateType);
            if (wipStaiton09.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 10

            string dateStart10 = yCode + "-10-01";
            string dateEnd10 = yCode + "-11-01";
            var wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart10, dateEnd10, modelNO, werksNo, dateType);
            if (wipStaiton10.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 11

            string dateStart11 = yCode + "-11-01";
            string dateEnd11 = yCode + "-12-01";
            var wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart11, dateEnd11, modelNO, werksNo, dateType);
            if (wipStaiton11.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 12

            string dateStart12 = yCode + "-12-01";
            string dateEnd12 = (int.Parse(yCode) + 1).ToString() + "-01-01";
            var wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupS(itemNO, dateStart12, dateEnd12, modelNO, werksNo, dateType);
            if (wipStaiton12.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            rateDataList = rateDataList + "</tr>";

            //系統FPY
            rateDataList = rateDataList + @"<tr><td>" + yCode + "-系統" + "</td>";

            #region 01

            //string dateStart01 = DateTime.Now.Year.ToString() + "-01-01";
            //string dateEnd01 = DateTime.Now.Year.ToString() + "-02-01";
            wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart01, dateEnd01, modelNO, werksNo, dateType);
            if (wipStaiton01.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 02

            //string dateStart02 = DateTime.Now.Year.ToString() + "-02-01";
            //string dateEnd02 = DateTime.Now.Year.ToString() + "-03-01";
            wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart02, dateEnd02, modelNO, werksNo, dateType);
            if (wipStaiton02.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 03

            //string dateStart03 = DateTime.Now.Year.ToString() + "-03-01";
            //string dateEnd03 = DateTime.Now.Year.ToString() + "-04-01";
            wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart03, dateEnd03, modelNO, werksNo, dateType);
            if (wipStaiton03.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 04

            //string dateStart04 = DateTime.Now.Year.ToString() + "-04-01";
            //string dateEnd04 = DateTime.Now.Year.ToString() + "-05-01";
            wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart04, dateEnd04, modelNO, werksNo, dateType);
            if (wipStaiton04.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 05

            //string dateStart05 = DateTime.Now.Year.ToString() + "-05-01";
            //string dateEnd05 = DateTime.Now.Year.ToString() + "-06-01";
            wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart05, dateEnd05, modelNO, werksNo, dateType);
            if (wipStaiton05.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 06

            //string dateStart06 = DateTime.Now.Year.ToString() + "-06-01";
            //string dateEnd06 = DateTime.Now.Year.ToString() + "-07-01";
            wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart06, dateEnd06, modelNO, werksNo, dateType);
            if (wipStaiton06.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 07

            //string dateStart07 = DateTime.Now.Year.ToString() + "-07-01";
            //string dateEnd07 = DateTime.Now.Year.ToString() + "-08-01";
            wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart07, dateEnd07, modelNO, werksNo, dateType);
            if (wipStaiton07.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 08

            //string dateStart08 = DateTime.Now.Year.ToString() + "-08-01";
            //string dateEnd08 = DateTime.Now.Year.ToString() + "-09-01";
            wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart08, dateEnd08, modelNO, werksNo, dateType);
            if (wipStaiton08.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 09

            //string dateStart09 = DateTime.Now.Year.ToString() + "-09-01";
            //string dateEnd09 = DateTime.Now.Year.ToString() + "-10-01";
            wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart09, dateEnd09, modelNO, werksNo, dateType);
            if (wipStaiton09.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 10

            //string dateStart10 = DateTime.Now.Year.ToString() + "-10-01";
            //string dateEnd10 = DateTime.Now.Year.ToString() + "-11-01";
            wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart10, dateEnd10, modelNO, werksNo, dateType);
            if (wipStaiton10.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 11

            //string dateStart11 = DateTime.Now.Year.ToString() + "-11-01";
            //string dateEnd11 = DateTime.Now.Year.ToString() + "-12-01";
            wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart11, dateEnd11, modelNO, werksNo, dateType);
            if (wipStaiton11.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 12

            //string dateStart12 = DateTime.Now.Year.ToString() + "-12-01";
            //string dateEnd12 = DateTime.Now.AddYears(1).Year.ToString() + "-01-01";
            wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupB(itemNO, dateStart12, dateEnd12, modelNO, werksNo, dateType);
            if (wipStaiton12.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            rateDataList = rateDataList + "</tr>";

            //醫療
            rateDataList = rateDataList + @"<tr><td>" + yCode + "-醫療" + "</td>";

            #region 01

            //string dateStart01 = DateTime.Now.Year.ToString() + "-01-01";
            //string dateEnd01 = DateTime.Now.Year.ToString() + "-02-01";
            wipStaiton01 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart01, dateEnd01, modelNO, werksNo, dateType);
            if (wipStaiton01.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton01.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 02

            //string dateStart02 = DateTime.Now.Year.ToString() + "-02-01";
            //string dateEnd02 = DateTime.Now.Year.ToString() + "-03-01";
            wipStaiton02 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart02, dateEnd02, modelNO, werksNo, dateType);
            if (wipStaiton02.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton02.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 03

            //string dateStart03 = DateTime.Now.Year.ToString() + "-03-01";
            //string dateEnd03 = DateTime.Now.Year.ToString() + "-04-01";
            wipStaiton03 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart03, dateEnd03, modelNO, werksNo, dateType);
            if (wipStaiton03.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton03.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 04

            //string dateStart04 = DateTime.Now.Year.ToString() + "-04-01";
            //string dateEnd04 = DateTime.Now.Year.ToString() + "-05-01";
            wipStaiton04 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart04, dateEnd04, modelNO, werksNo, dateType);
            if (wipStaiton04.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton04.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 05

            //string dateStart05 = DateTime.Now.Year.ToString() + "-05-01";
            //string dateEnd05 = DateTime.Now.Year.ToString() + "-06-01";
            wipStaiton05 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart05, dateEnd05, modelNO, werksNo, dateType);
            if (wipStaiton05.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton05.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 06

            //string dateStart06 = DateTime.Now.Year.ToString() + "-06-01";
            //string dateEnd06 = DateTime.Now.Year.ToString() + "-07-01";
            wipStaiton06 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart06, dateEnd06, modelNO, werksNo, dateType);
            if (wipStaiton06.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton06.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 07

            //string dateStart07 = DateTime.Now.Year.ToString() + "-07-01";
            //string dateEnd07 = DateTime.Now.Year.ToString() + "-08-01";
            wipStaiton07 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart07, dateEnd07, modelNO, werksNo, dateType);
            if (wipStaiton07.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton07.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 08

            //string dateStart08 = DateTime.Now.Year.ToString() + "-08-01";
            //string dateEnd08 = DateTime.Now.Year.ToString() + "-09-01";
            wipStaiton08 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart08, dateEnd08, modelNO, werksNo, dateType);
            if (wipStaiton08.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton08.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 09

            //string dateStart09 = DateTime.Now.Year.ToString() + "-09-01";
            //string dateEnd09 = DateTime.Now.Year.ToString() + "-10-01";
            wipStaiton09 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart09, dateEnd09, modelNO, werksNo, dateType);
            if (wipStaiton09.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton09.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate/sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 10

            //string dateStart10 = DateTime.Now.Year.ToString() + "-10-01";
            //string dateEnd10 = DateTime.Now.Year.ToString() + "-11-01";
            wipStaiton10 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart10, dateEnd10, modelNO, werksNo, dateType);
            if (wipStaiton10.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton10.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 11

            //string dateStart11 = DateTime.Now.Year.ToString() + "-11-01";
            //string dateEnd11 = DateTime.Now.Year.ToString() + "-12-01";
            wipStaiton11 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart11, dateEnd11, modelNO, werksNo, dateType);
            if (wipStaiton11.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton11.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            #region 12

            //string dateStart12 = DateTime.Now.Year.ToString() + "-12-01";
            //string dateEnd12 = DateTime.Now.AddYears(1).Year.ToString() + "-01-01";
            wipStaiton12 = await _pcsApi.GetWipStation4QRS014GroupM(itemNO, dateStart12, dateEnd12, modelNO, werksNo, dateType);
            if (wipStaiton12.DataTotal > 0)
            {
                double sum_rate = 100.0;
                int sum_idx = 1;
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("STATION_ID");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStaiton12.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    int stationID = int.Parse(j0["stationID"].ToString());

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["STATION_ID"].ToString() == stationID.ToString())
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = stationID;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        if (rate > 0)
                        {
                            //sum_rate = sum_rate * (rate / 100.0);
                            sum_idx = sum_idx + 1;
                            sum_rate = sum_rate + rate;
                        }
                    }
                }
                rateDataList = rateDataList + "<td width='120'>" + (sum_rate / sum_idx).ToString("0.00") + "</td>";
            }
            else
            {
                rateDataList = rateDataList + "<td width='120'>" + "0.00" + "</td>";
            }

            #endregion

            rateDataList = rateDataList + "</tr>";

            rateDataList = rateDataList + "</table></font>";
            ViewData["RateDataList"] = rateDataList;
            return View();
        }

        public async Task<IActionResult> QRS014CAsync(string unitNo, string werksNo, string itemNO, string wipNO, string dateStart, string dateEnd, string modelNO, string dateType)
        {
            if (werksNo == "*")
            {
                werksNo = "";
            }

            ViewData["ParamList"] = unitNo + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd + "_" + modelNO + "_" + werksNo + "_" + dateType;

            if (dateType == "WipDate" || dateType == null)
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 生產日期 : " + dateStart + " ~ " + dateEnd;
            }
            else
            {
                ViewData["Title"] = "查詢條件 - 製程代碼 : " + unitNo + "; 生產廠別 : " + werksNo + "; 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 結案日期 : " + dateStart + " ~ " + dateEnd;
            }


            string rateDataList = "<font size='3'>";

            rateDataList = rateDataList + "<table border='1' width='100%'><tr><td width='80' style='text-align:center'>類別</td><td width='80' style='text-align:center'>週別</td><td style='text-align:center'>通過筆數</td><td width='200' style='text-align:center'>不良筆數</td><td width='160' style='text-align:center'>通過率</td></tr>";

            //單板FPY
            //rateDataList = rateDataList + @"<tr><td>" + DateTime.Now.Year.ToString() + "-單板" + "</td>";
            string yCode = DateTime.Now.Year.ToString();
            if (dateStart != null)
            {
                if (dateStart != "")
                {
                    yCode = dateStart.Substring(0, 4);
                }
            }

            #region 單板

            var wipStation = await _pcsApi.GetWipStation4QRS014GroupSByWeek(itemNO, dateStart, dateEnd, modelNO, werksNo, dateType);
            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        rateDataList = rateDataList + "<tr><td width='80'style='text-align:center'> 單板 </td><td width='80'style='text-align:center'>" + "&nbsp;&nbsp;" + week_code + "</td><td>" + "&nbsp;&nbsp;" + okQty + "</td><td width='200'>" + "&nbsp;&nbsp;" + ngQty + "</td><td width='160'>" + "&nbsp;&nbsp;" + rate.ToString("0.00") + "%</td></tr>";

                    }
                }
            }

            #endregion

            #region 系統

            wipStation = await _pcsApi.GetWipStation4QRS014GroupBByWeek(itemNO, dateStart, dateEnd, modelNO, werksNo, dateType);
            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        rateDataList = rateDataList + "<tr><td width='80'style='text-align:center'> 系統 </td><td width='80'style='text-align:center'>" + "&nbsp;&nbsp;" + week_code + "</td><td>" + "&nbsp;&nbsp;" + okQty + "</td><td width='200'>" + "&nbsp;&nbsp;" + ngQty + "</td><td width='160'>" + "&nbsp;&nbsp;" + rate.ToString("0.00") + "%</td></tr>";

                    }
                }
            }

            #endregion

            #region 醫療

            wipStation = await _pcsApi.GetWipStation4QRS014GroupMByWeek(itemNO, dateStart, dateEnd, modelNO, werksNo, dateType);
            if (wipStation.DataTotal > 0)
            {
                DataTable dtRate = new DataTable();
                dtRate.Columns.Add("WEEK_CODE");
                dtRate.Columns.Add("OK_QTY");
                dtRate.Columns.Add("NG_QTY");
                dtRate.PrimaryKey = new DataColumn[] { dtRate.Columns[0] };
                dtRate.AcceptChanges();

                foreach (var data in wipStation.Data)
                {
                    JObject j0 = JObject.Parse(data.ToString());
                    string weekCode = j0["weekCode"].ToString();

                    bool existFlag = false;
                    int idx = 0;

                    for (int i = 0; i < dtRate.Rows.Count; i++)
                    {
                        if (dtRate.Rows[i]["WEEK_CODE"].ToString() == weekCode)
                        {
                            idx = i;
                            existFlag = true;
                            break;
                        }
                    }

                    int okQty = 0, ngQty = 0;

                    if (j0["ruleStatus"].ToString() == "P")
                    {
                        okQty = int.Parse(j0["firstCnt"].ToString());
                    }
                    else
                    {
                        ngQty = int.Parse(j0["firstCnt"].ToString());
                    }

                    if (existFlag)
                    {
                        if (okQty > 0)
                        {
                            dtRate.Rows[idx][1] = okQty;
                        }
                        if (ngQty > 0)
                        {
                            dtRate.Rows[idx][2] = ngQty;
                        }

                        dtRate.AcceptChanges();
                    }
                    else
                    {
                        DataRow dr = dtRate.NewRow();
                        dr[0] = weekCode;
                        dr[1] = okQty;
                        dr[2] = ngQty;

                        dtRate.Rows.Add(dr);
                        dtRate.AcceptChanges();
                    }
                }

                if (dtRate.Rows.Count > 0)
                {
                    for (int j = 0; j < dtRate.Rows.Count; j++)
                    {
                        string week_code = dtRate.Rows[j][0].ToString();
                        int okQty = int.Parse(dtRate.Rows[j][1].ToString());
                        int ngQty = int.Parse(dtRate.Rows[j][2].ToString());

                        int inputQty = okQty + ngQty;

                        double rate = 0;
                        if (okQty > 0)
                        {
                            rate = (okQty * 1.0 / inputQty) * 100;
                        }

                        rateDataList = rateDataList + "<tr><td width='80'style='text-align:center'> 醫療 </td><td width='80'style='text-align:center'>" + "&nbsp;&nbsp;" + week_code + "</td><td>" + "&nbsp;&nbsp;" + okQty + "</td><td width='200'>" + "&nbsp;&nbsp;" + ngQty + "</td><td width='160'>" + "&nbsp;&nbsp;" + rate.ToString("0.00") + "%</td></tr>";

                    }
                }
            }

            #endregion

            rateDataList = rateDataList + "</table></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 table id = 'ratelistipqc' border='1' width='100%'><tr><td width='80' style='text-align:center'>周次</td><td width='200' 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);\">" + ipqc_cnt + "</a></td><td width='200' style='color:green'>" +  pass_cnt + "</td><td width='200' style='color:red'>" +  fail_cnt + "</td><td width='160'>" +  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  width='200'>" +  sumIpqcCnt + "</td><td width='200' style='color:green'>" + sumPassCnt + "</td><td width='200' style='color:red'>" + sumFailCnt + "</td><td width='160'>" + 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();
            await GetFactoryInfo();
            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];
            string factoryID = param[5];

            var result = await _pcsApi.GetFQCHeaderData4QRS016(wip_no, item_no, model_no, start_date, end_date, factoryID);

            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, string factoryID, string factoryName)
        {
            //
            ViewData["ParamList"] = modelNO + "_" + itemNO + "_" + wipNO + "_" + dateStart + "_" + dateEnd + "_" + factoryID;

            ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + "; 料號 : " + itemNO + "; 機種 : " + modelNO + "; 檢驗日期 : " + dateStart + " ~ " + dateEnd + $"; 委外廠別 : {factoryID}({factoryName})";

            string fqcDataList = "<font size='3'>";

            IResultModel<dynamic> result = await _pcsApi.GetFQCHeaderData4QRS016(wipNO, itemNO, modelNO, dateStart, dateEnd, factoryID);

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

            // 各細項統計
            IResultModel<QRS016Detail> resultDetail = await _pcsApi.GetFQCHeaderData4QRS016Detail(wipNO, itemNO, modelNO, dateStart, dateEnd, factoryID);
            if (resultDetail.Success)
            {
                fqcDataList += "<br/>";
                fqcDataList += "<table border='1' width='70%'><tr><td width='80' style='text-align:center'>類別</td>" +
                               "<td style='text-align:center'>FQC總抽驗數</td>" +
                               "<td width='200' style='text-align:center'>FQC允收數</td>" +
                               "<td width='200' style='text-align:center'>FQC批退數</td>" +
                               "<td width='160' style='text-align:center'>批退率</td></tr>";

                foreach (var item in resultDetail.Data)
                {
                    fqcDataList += $"<tr style='text-align:center'><td>{item.type}</td>";
                    fqcDataList += $"<td>{item.allQty}</td>";
                    fqcDataList += $"<td>{item.passQty}</td>";
                    fqcDataList += $"<td>{item.failQty}</td>";
                    fqcDataList += $"<td>{item.rejectRate}%</td></tr>";
                }
                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;
        }

        public async Task<IActionResult> QRS017(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();
        }

        public async Task<IActionResult> QRS017AAsync(string wipNO)
        {
            ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO;

            string kpDataList = "<font size='3'>";

            try
            {
                IResultModel<dynamic> result = await _pcsApi.GetWipInfo4QRS017(wipNO);

                if (result.DataTotal > 0)
                {
                    kpDataList = kpDataList + "<table id = 'kplist' border = '1' width='100%' cellspacing='2px' cellpadding='10px'>";

                    bool titleFlag = true;
                    foreach (var item in result.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        JProperty[] jp = jo.Properties().ToArray();
                        if (titleFlag)
                        {
                            //jo.Properties().ToArray()[0].Name
                            kpDataList = kpDataList + "<tr bgcolor='#66CCFF' height='30'>";
                            for (int i = 0; i < jp.Length; i++)
                            {
                                switch (i)
                                {
                                    case 0:
                                        kpDataList = kpDataList + "<td width = '150' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 1:
                                        kpDataList = kpDataList + "<td style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 2:
                                        kpDataList = kpDataList + "<td width = '200' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 3:
                                        kpDataList = kpDataList + "<td width = '150' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 4:
                                        //kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 5:
                                        kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    case 6:
                                        kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Name + "</td>";
                                        break;
                                    default:
                                        string kp_name = jp[i].Name.Replace("kP_", "");
                                        int kp_idx = kp_name.IndexOf("#");
                                        if (kp_idx > 0)
                                        {
                                            if (kp_name.StartsWith("MB") && kp_name.IndexOf("MAC") > 0)
                                            {
                                                string kp_no = kp_name.Replace("#", "_");
                                                var kp_item = await _kcsApi.GetItems(kp_no);
                                                if (kp_item.Count > 0)
                                                {
                                                    kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_item[0].ItemName + "</td>";
                                                }
                                                else
                                                {
                                                    kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_no + "</td>";
                                                }
                                            }
                                            else
                                            {
                                                string kp_no = kp_name.Substring(0, kp_idx);
                                                var kp_item = await _kcsApi.GetItems(kp_no);
                                                if (kp_item.Count > 0)
                                                {
                                                    kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_item[0].ItemName + "</td>";
                                                }
                                                else
                                                {
                                                    kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_no + "</td>";
                                                }
                                            }
                                        }
                                        else
                                        {
                                            var kp_item = await _kcsApi.GetItems(kp_name);
                                            if (kp_item.Count > 0)
                                            {
                                                kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_item[0].ItemName + "</td>";
                                            }
                                            else
                                            {
                                                kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_name + "</td>";
                                            }

                                        }
                                        /*
                                        if (kp_name.IndexOf("_") > 0)
                                        {
                                            if (kp_name.StartsWith("MB") && kp_name.IndexOf("MAC") > 0)
                                            {

                                                kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_name + "</td>";
                                            }
                                            else
                                            {
                                                int idx = kp_name.IndexOf("_");
                                                kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_name.Substring(0, idx) + "</td>";
                                            }
                                        }
                                        else
                                        {
                                            kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + kp_name + "</td>";
                                        }
                                        */

                                        break;
                                }

                                //kpDataList = kpDataList + "<td>" + jp[i].Name + "</td>";
                            }
                            kpDataList = kpDataList + "</tr>";
                            titleFlag = false;
                        }
                        kpDataList = kpDataList + "<tr height='30'>";
                        for (int i = 0; i < jp.Length; i++)
                        {
                            switch (i)
                            {
                                case 0:
                                    kpDataList = kpDataList + "<td width = '150' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                case 1:
                                    kpDataList = kpDataList + "<td style = 'text-align:left'>&nbsp;'" + jp[i].Value + "</td>";
                                    break;
                                case 2:
                                    kpDataList = kpDataList + "<td width = '200' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                case 3:
                                    kpDataList = kpDataList + "<td width = '150' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                case 4:
                                    //kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                case 5:
                                    kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                case 6:
                                    kpDataList = kpDataList + "<td width = '120' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                                default:
                                    kpDataList = kpDataList + "<td width = '160' style = 'text-align:left'>&nbsp;" + jp[i].Value + "</td>";
                                    break;
                            }


                        }
                        kpDataList = kpDataList + "</tr>";

                        //string barcode_no = jo["barcodeno"].ToString();
                        //kpDataList = kpDataList + "<tr><td>"+barcode_no+"</td><tr>";
                    }
                    kpDataList = kpDataList + "</table>";
                }
                else
                {
                    kpDataList = kpDataList + "查無資料";
                }
            }
            catch (Exception e1)
            {
                kpDataList = kpDataList + "查詢過程超時:" + e1.Message;
            }
            kpDataList = kpDataList + "</font>";
            ViewData["KpDataList"] = kpDataList;
            return View();
        }

        public async Task<IActionResult> QRS018(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();
        }

        public IActionResult QRS018A(string id)
        {
            ViewData["Title"] = "查詢條件 - 工單號碼 : " + id;

            ViewBag.WIP_NO = id;

            return View();
        }

        public async Task<IActionResult> QRS018B(string wipNO, string stationID, string ngNO)
        {
            var station = await _basApi.GetStations(int.Parse(stationID));

            ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + " , 站別 : " + station[0].StationName + " , 不良代碼 : " + ngNO;

            ViewBag.WIP_NO = wipNO;
            ViewBag.STATION_ID = stationID;
            ViewBag.NG_NO = ngNO;

            return View();
        }

        public async Task<IActionResult> QRS018C(string wipNO, string stationID, string repairNO)
        {
            var station = await _basApi.GetStations(int.Parse(stationID));

            ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + " , 站別 : " + station[0].StationName + " , 維修代碼 : " + repairNO;

            ViewBag.WIP_NO = wipNO;
            ViewBag.STATION_ID = stationID;
            ViewBag.REPAIR_NO = repairNO;

            return View();
        }

        public async Task<IActionResult> QRS018D(string wipNO, string stationID, string partNO)
        {
            var station = await _basApi.GetStations(int.Parse(stationID));

            ViewData["Title"] = "查詢條件 - 工單號碼 : " + wipNO + " , 站別 : " + station[0].StationName + " , 維修料號 : " + partNO;

            ViewBag.WIP_NO = wipNO;
            ViewBag.STATION_ID = stationID;
            ViewBag.PART_NO = partNO;

            return View();
        }


        public async Task<IActionResult> GetErrorCode4QRS018Async(string id)
        {
            IResultModel<dynamic> result = await _repApi.GetErrorCode4QRS018(id);

            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> GetErrorCodeList4QRS018Async(string id)
        {
            string[] param = id.Split('_');

            IResultModel<dynamic> result = await _repApi.GetErrorCodeList4QRS018(param[0], int.Parse(param[1]), param[2]);

            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> GetRepairCode4QRS018Async(string id)
        {
            IResultModel<dynamic> result = await _repApi.GetRepairCode4QRS018(id);

            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> GetRepairCodeList4QRS018Async(string id)
        {
            string[] param = id.Split('_');
            IResultModel<dynamic> result = await _repApi.GetRepairCodeList4QRS018(param[0], int.Parse(param[1]), param[2]);

            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> GetRepairPartNo4QRS018Async(string id)
        {
            IResultModel<dynamic> result = await _repApi.GetRepairPartNo4QRS018(id);

            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> GetRepairPartNoList4QRS018Async(string id)
        {
            string[] param = id.Split('_');
            IResultModel<dynamic> result = await _repApi.GetRepairPartNoList4QRS018(param[0], int.Parse(param[1]), param[2]);

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

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

            if (string.IsNullOrWhiteSpace(model.Input))
                return Json(new Result1() { success = Success, msg = Msg, data = "", data1 = "" });

            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.Trim().ToUpper() == w.ItemNo.Trim().ToUpper())).ToList();
                // 判斷Input為指定KeyParts順序
                if (items.Any(a => a.ItemName.ToUpper() == Data.ToUpper()))
                {
                    if (model.KpItemName != null)
                    {
                        // 取得目前Input指定KP代碼的綁定數量
                        var KpItemNameByCount = model.KpItemName.Split(",").Where(w => w.ToUpper() == Data.ToUpper()).Count();
                        // WipKp的ByKpNo數量
                        var WipKpByCount = model.WipKps.Where(w1 => w1.KpNo == items.Where(w => w.ItemName.ToUpper() == Data.ToUpper())
                                                .Select(s => s.ItemNo).FirstOrDefault()).Count();
                        // 目前綁定KpNo 等於 WipKp ByKpNo 數量  
                        if (KpItemNameByCount == WipKpByCount)
                        {
                            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

        #region QRS022 儲存裝置掃毒暨異常處理查詢
        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> QRS022()
        {
            return View();
        }

        [HttpGet]
        public async Task<IActionResult> QRS022Query(string wipNO, string itemNO, string DateStart, string DateEnd)
        {   
            var result = await  _pcsApi.GetAntiVirusResult(wipNO, itemNO, DateStart, DateEnd);

            var query = new QRS022ViewModel();

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

                query.AntiVirus.Add(new AntiVirus
                {
                    wip = jo["wip"].ToString(),
                    models = jo["models"].ToString(),
                    station = jo["station"].ToString(),
                    prg_Name = jo["prg_Name"].ToString(),
                    disk_Number = jo["disk_Number"].ToString(),
                    virusname = jo["virusname"].ToString(),
                    scan_Status = jo["scan_Status"].ToString(),
                    user_Name = jo["user_Name"].ToString(),
                    time = jo["time"].ToString(),
                    result = jo["result"].ToString()
                });

            }

            if (result.DataTotal > 0 )
            {
                return Json(new Table() { code = 0, msg = "", data = query.AntiVirus, count = result.DataTotal });
            }

            return Json(new Table() { count = 0, data = null });
        }
        #region QRS023  電動起子扭力紀錄表
        /// <summary>
        /// QRS023
        /// </summary>
        /// <returns></returns>
        public async Task<IActionResult> QRS023()

        {
            return View();
        }

        public async Task<IActionResult> QRS023QueryAsync(string wipNo, string sapNo, string dateStr, string dateEnd, int page = 0, int limit = 10)
        {

            var result = await _qrsApi.GetEstorquebyQueryAll(wipNo: wipNo, sapNo: sapNo, sDate: dateStr, eDate: dateEnd, page: page, limit: limit);

            return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal });
        }

        public async Task<IActionResult> QRS023_Excel(string wipNo, string sapNo, string dateStr, string dateEnd)
        {
            string mimeType = "";
            int extension = 1;
            Dictionary<string, string> param = new Dictionary<string, string>();
            var localReport = GetReprot(wipNo, sapNo, dateStr, dateEnd);
            var result = localReport.Result.Execute(RenderType.ExcelOpenXml, extension, param, mimeType);
            //return File(result.MainStream, "application/msexcel", "Export.xls");
            return File(result.MainStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "ZTorque_" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".xlsx");
            //return File(result.MainStream, "application/msexcel", "Export.xls");
        }

        /// <summary>
        /// 產生FQC報表
        /// </summary>
        /// <param name="inhouseNo">FQC單號</param>
        /// <param name="seqID">FQC單號_編號</param>
        /// <returns></returns>
        private async Task<LocalReport> GetReprot(string wipNo, string sapNo, string dateStr, string dateEnd)
        {
            var path = $"{this._env.WebRootPath}\\Reports\\QRS023View.rdlc";
            LocalReport localReport = new LocalReport(path);

            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            System.Text.Encoding.GetEncoding(1252);
            var resultQuery = _qrsApi.GetEstorquebyQueryAll(wipNo, sapNo, dateStr, dateEnd).InvokeAsync().Result;

            localReport.AddDataSource("DataSet3", resultQuery.Data);


            return localReport;
        }
        #endregion

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