using Microsoft.AspNetCore.Mvc;
using AspNetCore.Reporting;
using Microsoft.AspNetCore.Hosting;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using System.Data;
using Oracle.EntityFrameworkCore;
using Oracle.ManagedDataAccess.Client;
using AMESCoreStudio.WebApi.Models.BAS;
using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.Web.Models;
using AMESCoreStudio.WebApi.DTO.AMES;
using DocumentFormat.OpenXml.Math;
using AMESCoreStudio.Web.ViewModels.PCS;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using AMESCoreStudio.Web.ViewModels.RPT;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.Enum;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Linq;

namespace AMESCoreStudio.Web.Controllers
{
    public class RPTController : Controller
    {
        private readonly IWebHostEnvironment environment = null;
        public readonly IRPT _rptApi;
        public readonly IPCS _pcsApi;
        public readonly IBAS _basApi;

        public RPTController(IWebHostEnvironment environment, IRPT rptApi, IPCS pcsApi, IBAS basApi)
        {
            this.environment = environment;
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            _rptApi = rptApi;
            _pcsApi = pcsApi;
            _basApi = basApi;
        }

        public async Task<IActionResult> RPT001()
        {
            var sdate = "";
            var edate = "";

            ViewBag.QueryDate = DateTime.Now.ToString("yyyy/MM");
            ViewBag.QueryDate2 = DateTime.Now.ToString("yyyyMM");
            ViewBag.QueryDate3 = DateTime.Now.Year.ToString();

            var model = await _rptApi.GetRPT001View(sdate, edate);

            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> RPT001(string SerachData)
        {
            var Data = DateTime.Parse(SerachData);

            ViewBag.QueryDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM");
            ViewBag.QueryDate2 = new DateTime(Data.Year, Data.Month, 1).ToString("yyyyMM");
            ViewBag.QueryDate3 = Data.Year.ToString();

            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var model = await _rptApi.GetRPT001View(sDate, eDate);

            return View(model);
        }

        public async Task<IActionResult> RPT002()
        {
            var sdate = "";
            var edate = "";
            var model = await _rptApi.GetRPT002View(sdate, edate);
            model.SerachData = DateTime.Now.ToString("yyyy/MM");
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> RPT002(string SerachData)
        {
            var Data = DateTime.Parse(SerachData);
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var model = await _rptApi.GetRPT002View(sDate, eDate);
            model.SerachData = SerachData;
            return View(model);
        }

        public async Task<IActionResult> RPT001A(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                #region 看傳入的生產指數是哪一類型
                case "01":
                    title = data.Substring(0, 4) + "生產力";
                    break;

                case "02":
                    title = data.Substring(0, 4) + "效率";
                    break;

                case "03":
                    title = data.Substring(0, 4) + "出勤率";
                    break;

                case "04":
                    title = data.Substring(0, 4) + "加班工時";
                    break;

                case "05":
                    title = data.Substring(0, 4) + "無效工時";
                    break;

                case "06":
                    title = data.Substring(0, 4) + "未結工單數";
                    break;

                case "07":
                    title = data.Substring(0, 4) + "完工入庫數";
                    break;
                    #endregion
            }
            ViewBag.Title = title;

            string MonthDataList = "<table border='1' cellpadding='2'><tr class='TR_Item_Sstyle'><td>月份</td><td>01</td><td>02</td><td>03</td><td>04</td><td>05</td><td>06</td><td>07</td><td>08</td><td>09</td><td>10</td><td>11</td><td>12</td></tr><tr><td class='TD_Data_Sstyle'>數值</td>";

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");

                ResultModel<dynamic> pi;
                ResultModel<FqcInhouseMaster_WareDto> pi2;

                double dRate = 0.00; //月累積
                double dAVG_Rate = 0.00;  //月平均

                switch (type)
                {
                    case "06":  //未結工單數
                        pi = await _pcsApi.GetWipInfoPCS008(null, null, 0, null, sDate, eDate, null, 0, 10);
                        dRate = double.Parse(pi.DataTotal.ToString());
                        dAVG_Rate = dRate;
                        break;

                    case "07":  //完工入庫數
                        //pi2 = await _pcsApi.GetFqcInhouseMasteMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "",0,10);
                        pi2 = await _pcsApi.GetFqcInhouseMasterMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "", 0, 10);

                        dRate = double.Parse(pi2.DataTotal.ToString());
                        dAVG_Rate = dRate;
                        break;

                    default: //以上都不符合走這個
                        #region 統計12個月的數值
                        pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

                        if (pi.DataTotal > 0)
                        {
                            double dSum_Rate = 0.00;

                            #region 做12個月的數值加總
                            foreach (var item in pi.Data)
                            {
                                JObject jo = JObject.Parse(item.ToString());
                                dRate = 0.00;
                                switch (type)
                                {
                                    case "01": //生產力
                                        dRate = double.Parse(jo["productivity"].ToString());
                                        break;

                                    case "02":  //效率
                                        dRate = double.Parse(jo["efficiency"].ToString());
                                        break;

                                    case "03":  //出勤率
                                        dRate = double.Parse(jo["attendance"].ToString());
                                        break;

                                    case "04":  //加班工時
                                        dRate = double.Parse(jo["overTime"].ToString());
                                        break;

                                    case "05":  //無效工時
                                        dRate = double.Parse(jo["invalidTime"].ToString());
                                        break;
                                }
                                dSum_Rate = dSum_Rate + dRate;
                            }
                            #endregion

                            #region 換算12個月的平均數值
                            switch (type)
                            {
                                case "01": //生產力
                                case "02": //效率
                                case "03": //出勤率
                                    dAVG_Rate = dSum_Rate / pi.DataTotal;
                                    break;

                                case "04": //加班工時
                                case "05":
                                    dAVG_Rate = dSum_Rate;
                                    break;
                            }
                        }
                        #endregion
                        break;
                        #endregion
                }

                if (dAVG_Rate > 0)
                {
                    MonthDataList = MonthDataList + "<td class='TD_Data_Rate_Sstyle'>" + "<a href =\"javascript:hg.open('按日期統計資料','/RPT/RPT001B/" + type + "_" + Data.ToString("yyyyMM") + "',800,720);\">" + dAVG_Rate.ToString("0.00") + "</a></td>";
                }
                else
                {
                    MonthDataList = MonthDataList + "<td class='TD_Data_Rate_Sstyle'>0.00</td>";
                }
            }

            MonthDataList = MonthDataList + "</tr></table>";

            ViewData["MonthDataList"] = MonthDataList;
            return View();
        }

        public async Task<IActionResult> RPT001C(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                case "11":
                    title = data.Substring(0, 4) + "異常工時";
                    break;
            }
            ViewBag.Title = title;

            //堆叠图
            DataTable dtTime = new DataTable();

            dtTime.Columns.Add("Group");
            dtTime.Columns.Add("M01");
            dtTime.Columns.Add("M02");
            dtTime.Columns.Add("M03");
            dtTime.Columns.Add("M04");
            dtTime.Columns.Add("M05");
            dtTime.Columns.Add("M06");
            dtTime.Columns.Add("M07");
            dtTime.Columns.Add("M08");
            dtTime.Columns.Add("M09");
            dtTime.Columns.Add("M10");
            dtTime.Columns.Add("M11");
            dtTime.Columns.Add("M12");
            dtTime.PrimaryKey = new DataColumn[] { dtTime.Columns[0] };
            dtTime.AcceptChanges();

            var result = await _rptApi.GetExceptionWorktime4RPT001D(data.Substring(0, 4) + "/01/01", data.Substring(0, 4) + "/12/31");
            if (result.DataTotal > 0)
            {
                foreach (var item in result.Data)
                {
                    JObject jo = JObject.Parse(item.ToString());
                    string no = jo["exceptionNo"].ToString();

                    DataRow dr = dtTime.NewRow();
                    dr[0] = no;
                    dr[1] = 0.00;
                    dr[2] = 0.00;
                    dr[3] = 0.00;
                    dr[4] = 0.00;
                    dr[5] = 0.00;
                    dr[6] = 0.00;
                    dr[7] = 0.00;
                    dr[8] = 0.00;
                    dr[9] = 0.00;
                    dr[10] = 0.00;
                    dr[11] = 0.00;
                    dr[12] = 0.00;

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

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetExceptionWorktime4RPT001D(sDate, eDate);

                if (pi.DataTotal > 0)
                {
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        double time = 0.00;
                        string no = jo["exceptionNo"].ToString();
                        time = double.Parse(jo["exceptionTime"].ToString());

                        DataRow dr = dtTime.Rows.Find(no);

                        dr[m] = time;

                        dtTime.AcceptChanges();
                    }
                }
            }

            string seriesData = "[";

            for (int r = 0; r < dtTime.Rows.Count; r++)
            {
                seriesData = seriesData + "{name:'" + dtTime.Rows[r][0].ToString() + "',";
                seriesData = seriesData + "data:[" + double.Parse(dtTime.Rows[r][1].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][2].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][3].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][4].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][5].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][6].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][7].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][8].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][9].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][10].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][11].ToString()) + ",";
                seriesData = seriesData + double.Parse(dtTime.Rows[r][12].ToString()) + "]},";
            }

            ViewBag.SeriesData = seriesData.Substring(0, seriesData.Length - 1) + "]";

            string MonthDataList = "<table border='1' cellpadding='2'><tr class='TR_Item_Sstyle'><td>月份</td><td>01</td><td >02</td><td>03</td><td>04</td><td>05</td><td>06</td><td>07</td><td>08</td><td>09</td><td>10</td><td>11</td><td>12</td></tr><tr><td class='TD_Data_Sstyle'>數值</td>";

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetExceptionWorktime4RPT001(sDate, eDate);

                if (pi.DataTotal > 0)
                {
                    double sum_time = 0.00;
                    double sum_hour = 0.00;
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        double time = 0.00;

                        time = double.Parse(jo["time"].ToString());
                        sum_time = sum_time + time;
                    }

                    if (sum_time > 0)
                    {
                        sum_hour = sum_time / 60.0;
                    }

                    MonthDataList = MonthDataList + "<td class='TD_Data_Rate_Sstyle'>" + "<a href =\"javascript:hg.open('按日期統計資料','/RPT/RPT001D/" + type + "_" + Data.ToString("yyyyMM") + "',800,720);\">" + sum_hour.ToString("0.00") + "</a></td>";


                }
                else
                {
                    MonthDataList = MonthDataList + "<td class='TD_Data_Rate_Sstyle'>0.00</td>";
                }
            }

            MonthDataList = MonthDataList + "</tr></table>";

            ViewData["MonthDataList"] = MonthDataList;



            return View();
        }

        [HttpPost]
        public async Task<JsonResult> GetMonthData4RPT001AAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                #region 看傳入的生產指數是哪一類型
                case "01":
                    title = data.Substring(0, 4) + "生產力";
                    break;

                case "02":
                    title = data.Substring(0, 4) + "效率";
                    break;

                case "03":
                    title = data.Substring(0, 4) + "出勤率";
                    break;

                case "04":
                    title = data.Substring(0, 4) + "加班工時";
                    break;

                case "05":
                    title = data.Substring(0, 4) + "無效工時";
                    break;

                case "06":
                    title = data.Substring(0, 4) + "未結工單數";
                    break;

                case "07":
                    title = data.Substring(0, 4) + "完工入庫數";
                    break;
                    #endregion
            }

            ViewBag.Title = title;
            ViewBag.Title2 = data.Substring(0, 4);

            var query = new RPT001AViewModel();

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");

                ResultModel<dynamic> pi;
                ResultModel<FqcInhouseMaster_WareDto> pi2;

                double dRate = 0.00; //月累積
                double dAVG_Rate = 0.00;  //月平均

                switch (type)
                {
                    case "06":  //未結工單數
                        pi = await _pcsApi.GetWipInfoPCS008(null, null, 0, null, sDate, eDate, null, 0, 10);
                        dRate = double.Parse(pi.DataTotal.ToString());
                        dAVG_Rate = dRate;
                        break;

                    case "07":  //完工入庫數
                        pi2 = await _pcsApi.GetFqcInhouseMasterMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "");
                        dRate = double.Parse(pi2.DataTotal.ToString());
                        dAVG_Rate = dRate;
                        break;

                    default: //以上都不符合走這個
                        #region 統計12個月的數值
                        pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

                        if (pi.DataTotal > 0)
                        {
                            double dSum_Rate = 0.00;

                            #region 做12個月的數值加總
                            foreach (var item in pi.Data)
                            {
                                JObject jo = JObject.Parse(item.ToString());
                                dRate = 0.00;
                                switch (type)
                                {
                                    case "01": //生產力
                                        dRate = double.Parse(jo["productivity"].ToString());
                                        break;

                                    case "02":  //效率
                                        dRate = double.Parse(jo["efficiency"].ToString());
                                        break;

                                    case "03":  //出勤率
                                        dRate = double.Parse(jo["attendance"].ToString());
                                        break;

                                    case "04":  //加班工時
                                        dRate = double.Parse(jo["overTime"].ToString());
                                        break;

                                    case "05":  //無效工時
                                        dRate = double.Parse(jo["invalidTime"].ToString());
                                        break;
                                }
                                dSum_Rate = dSum_Rate + dRate;
                            }
                            #endregion

                            #region 換算12個月的平均數值
                            switch (type)
                            {
                                case "01": //生產力
                                case "02": //效率
                                case "03": //出勤率
                                    dAVG_Rate = dSum_Rate / pi.DataTotal;
                                    break;

                                case "04": //加班工時
                                case "05":
                                    dAVG_Rate = dSum_Rate;
                                    break;
                            }
                        }
                        #endregion
                        break;
                        #endregion
                }

                if (dAVG_Rate > 0)
                {
                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = double.Parse(dAVG_Rate.ToString("0.00"))
                    });
                }
                else
                {
                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = 0.00
                    });
                }
            }

            return Json(query.Datas);
        }

        [HttpPost]
        public async Task<JsonResult> GetMonthData4RPT001CAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                case "11":
                    title = data.Substring(0, 4) + "異常工時";
                    break;
            }

            ViewBag.Title = title;
            ViewBag.Title2 = data.Substring(0, 4);

            var query = new RPT001AViewModel();

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetExceptionWorktime4RPT001D(sDate, eDate);

                if (pi.DataTotal > 0)
                {
                    double sum_time = 0.00;
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        double time = 0.00;
                        string no = jo["exceptionNo"].ToString();
                        time = double.Parse(jo["exceptionTime"].ToString());

                        sum_time = sum_time + time;
                    }

                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = double.Parse(sum_time.ToString("0.00"))
                    });

                }
                else
                {
                    query.Datas.Add(new MonthGroup
                    {
                        Month = Data.ToString("yyyyMM"),
                        Yield = 0.00
                    });
                }


            }

            return Json(query.Datas);
        }

        public async Task<JsonResult> GetMonthData4RPT001C2Async(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                case "11":
                    title = data.Substring(0, 4) + "異常工時";
                    break;
            }

            ViewBag.Title = title;
            ViewBag.Title2 = data.Substring(0, 4);

            var query = new RPT001CViewModel();

            DataTable dtTime = new DataTable();

            dtTime.Columns.Add("Group");
            dtTime.Columns.Add("M01");
            dtTime.Columns.Add("M02");
            dtTime.Columns.Add("M03");
            dtTime.Columns.Add("M04");
            dtTime.Columns.Add("M05");
            dtTime.Columns.Add("M06");
            dtTime.Columns.Add("M07");
            dtTime.Columns.Add("M08");
            dtTime.Columns.Add("M09");
            dtTime.Columns.Add("M10");
            dtTime.Columns.Add("M11");
            dtTime.Columns.Add("M12");
            dtTime.PrimaryKey = new DataColumn[] { dtTime.Columns[0] };
            dtTime.AcceptChanges();

            var result = await _rptApi.GetExceptionWorktime4RPT001D(data.Substring(0, 4) + "/01/01", data.Substring(0, 4) + "/12/31");
            if (result.DataTotal > 0)
            {
                foreach (var item in result.Data)
                {
                    JObject jo = JObject.Parse(item.ToString());
                    string no = jo["exceptionNo"].ToString();

                    DataRow dr = dtTime.NewRow();
                    dr[0] = no;
                    dr[1] = 0.00;
                    dr[2] = 0.00;
                    dr[3] = 0.00;
                    dr[4] = 0.00;
                    dr[5] = 0.00;
                    dr[6] = 0.00;
                    dr[7] = 0.00;
                    dr[8] = 0.00;
                    dr[9] = 0.00;
                    dr[10] = 0.00;
                    dr[11] = 0.00;
                    dr[12] = 0.00;

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

            for (int m = 1; m <= 12; m++)
            {
                var Data = DateTime.Parse(data.Substring(0, 4) + "/" + m.ToString().PadLeft(2, '0'));
                var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
                var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
                var pi = await _rptApi.GetExceptionWorktime4RPT001D(sDate, eDate);

                double[] yield = new double[dtTime.Columns.Count - 1];

                if (pi.DataTotal > 0)
                {
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        double time = 0.00;
                        string no = jo["exceptionNo"].ToString();
                        time = double.Parse(jo["exceptionTime"].ToString());

                        DataRow dr = dtTime.Rows.Find(no);

                        dr[m] = time;

                        dtTime.AcceptChanges();

                    }
                }
            }

            for (int r = 0; r < dtTime.Rows.Count; r++)
            {
                query.Datas.Add(new YieldGroup
                {
                    Group = dtTime.Rows[r][0].ToString(),
                    Yield = new double[12] { double.Parse(dtTime.Rows[r][1].ToString()), double.Parse(dtTime.Rows[r][2].ToString()), double.Parse(dtTime.Rows[r][3].ToString()), double.Parse(dtTime.Rows[r][4].ToString()), double.Parse(dtTime.Rows[r][5].ToString()), double.Parse(dtTime.Rows[r][6].ToString()), double.Parse(dtTime.Rows[r][7].ToString()), double.Parse(dtTime.Rows[r][8].ToString()), double.Parse(dtTime.Rows[r][9].ToString()), double.Parse(dtTime.Rows[r][10].ToString()), double.Parse(dtTime.Rows[r][11].ToString()), double.Parse(dtTime.Rows[r][12].ToString()) }
                });
            }

            return Json(query.Datas);
        }

        [HttpPost]
        public async Task<JsonResult> GetDayData4RPT001BAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                #region 看傳入的生產指數是哪一類型
                case "01":
                    title = data + "生產力";
                    break;
                case "02":
                    title = data + "效率";
                    break;

                case "03":
                    title = data + "出勤率";
                    break;

                case "04":
                    title = data + "加班工時";
                    break;

                case "05":
                    title = data + "無效工時";
                    break;

                case "06":
                    title = data + "未結工單數";
                    break;

                case "07":
                    title = data + "完工入庫數";
                    break;
                    #endregion
            }

            ViewBag.Title = title;
            ViewBag.Title2 = data;

            var query = new RPT001BViewModel();

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");

            //var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

            ResultModel<dynamic> pi;
            ResultModel<FqcInhouseMaster_WareDto> pi2;

            string fieldName = "";

            switch (type)
            {
                case "06":  //未結工單數
                    pi = await _pcsApi.GetWipInfoPCS008(null, null, 0, null, sDate, eDate, null, 0, 10);
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        DateTime date = DateTime.Parse(jo["createDate"].ToString());

                        query.Datas.Add(new DayGroup
                        {
                            Day = date.ToString("yyyyMMdd"),

                            Yield = double.Parse(pi.DataTotal.ToString())
                        });
                    }
                    break;

                case "07":  //完工入庫數
                    //pi2 = await _rptApi.GetFqcInhouseMasteMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "");
                    pi2 = await _pcsApi.GetFqcInhouseMasterMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "");
                    foreach (var item in pi2.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        DateTime date = DateTime.Parse(jo["updateDate"].ToString());

                        query.Datas.Add(new DayGroup
                        {
                            Day = date.ToString("yyyyMMdd"),

                            Yield = double.Parse(pi2.DataTotal.ToString())
                        });
                    }
                    break;

                default: //以上都不符合走這個
                    pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

                    switch (type)
                    {
                        case "01":
                            fieldName = "productivity";
                            break;

                        case "02":
                            fieldName = "efficiency";
                            break;

                        case "03":
                            fieldName = "attendance";
                            break;

                        case "04":
                            fieldName = "overTime";
                            break;

                        case "05":
                            fieldName = "invalidTime";
                            break;
                    }

                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        DateTime date = DateTime.Parse(jo["productionDate"].ToString());

                        query.Datas.Add(new DayGroup
                        {
                            Day = date.ToString("yyyyMMdd"),

                            Yield = double.Parse(jo[fieldName].ToString())
                        });
                    }
                    break;
            }

            return Json(query.Datas);
        }

        [HttpPost]
        public async Task<JsonResult> GetExceptionTime4RPT001DAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            ViewBag.Title = title;
            ViewBag.Title2 = data;
            switch (type)
            {
                case "11":
                    title = data + "異常代碼統計";
                    break;
            }

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");

            var result = await _rptApi.GetExceptionWorktime4RPT001D(sDate, eDate);

            return Json(result.Data);
            //return Json(new { data = result.Data });
        }

        [HttpPost]
        public async Task<JsonResult> GetDayData4RPT001DAsync(string id)
        {
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                case "11":
                    title = data + "異常工時";
                    break;
            }

            ViewBag.Title = title;
            ViewBag.Title2 = data;

            var query = new RPT001BViewModel();

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var pi = await _rptApi.GetExceptionWorktime4RPT001(sDate, eDate);

            string fieldName = "time";

            DataTable dt = new DataTable();
            dt.Columns.Add("Day");
            dt.Columns.Add("Time");
            dt.PrimaryKey = new DataColumn[] { dt.Columns[0] };
            dt.AcceptChanges();

            foreach (var item in pi.Data)
            {
                JObject jo = JObject.Parse(item.ToString());
                DateTime date = DateTime.Parse(jo["exceptionDate"].ToString());

                DataRow dr = dt.NewRow();
                dr[0] = date.ToString("yyyyMMdd");
                dr[1] = double.Parse(jo[fieldName].ToString());

                try
                {
                    dt.Rows.Add(dr);
                    dt.AcceptChanges();
                }
                catch
                {
                    DataRow drFind = dt.Rows.Find(date.ToString("yyyyMMdd"));
                    drFind[1] = double.Parse(drFind[1].ToString()) + double.Parse(jo[fieldName].ToString());

                    dt.AcceptChanges();
                }

            }

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                query.Datas.Add(new DayGroup
                {
                    Day = dt.Rows[i]["Day"].ToString(),

                    Yield = double.Parse(dt.Rows[i]["Time"].ToString())
                });
            }

            return Json(query.Datas);
        }

        public async Task<IActionResult> RPT001B(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                #region 看傳入的生產指數是哪一類型
                case "01":
                    title = data + "生產力";
                    break;
                case "02":
                    title = data + "效率";
                    break;

                case "03":
                    title = data + "出勤率";
                    break;

                case "04":
                    title = data + "加班工時";
                    break;

                case "05":
                    title = data + "無效工時";
                    break;

                case "06":
                    title = data + "未結工單數";
                    break;

                case "07":
                    title = data + "完工入庫數";
                    break;
                    #endregion
            }

            ViewBag.Title = title;

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");

            //var pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

            double day01 = 0.00, day02 = 0.00, day03 = 0.00, day04 = 0.00, day05 = 0.00, day06 = 0.00, day07 = 0.00, day08 = 0.00, day09 = 0.00, day10 = 0.00;
            double day11 = 0.00, day12 = 0.00, day13 = 0.00, day14 = 0.00, day15 = 0.00, day16 = 0.00, day17 = 0.00, day18 = 0.00, day19 = 0.00, day20 = 0.00;
            double day21 = 0.00, day22 = 0.00, day23 = 0.00, day24 = 0.00, day25 = 0.00, day26 = 0.00, day27 = 0.00, day28 = 0.00, day29 = 0.00, day30 = 0.00;
            double day31 = 0.00;

            ResultModel<dynamic> pi;
            ResultModel<FqcInhouseMaster_WareDto> pi2;

            string fieldName = "";

            double dDay_Rate = 0.00; //日累積 

            switch (type)
            {
                case "06":
                    pi = await _pcsApi.GetWipInfoPCS008(null, null, 0, null, sDate, eDate, null, 0, 10);
                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        DateTime date = DateTime.Parse(jo["createDate"].ToString());
                        dDay_Rate = double.Parse(pi.DataTotal.ToString());

                        switch (date.Day)
                        {
                            case 1:
                                day01 = dDay_Rate;
                                break;
                            case 2:
                                day02 = dDay_Rate;
                                break;
                            case 3:
                                day03 = dDay_Rate;
                                break;
                            case 4:
                                day04 = dDay_Rate;
                                break;
                            case 5:
                                day05 = dDay_Rate;
                                break;
                            case 6:
                                day06 = dDay_Rate;
                                break;
                            case 7:
                                day07 = dDay_Rate;
                                break;
                            case 8:
                                day08 = dDay_Rate;
                                break;
                            case 9:
                                day09 = dDay_Rate;
                                break;
                            case 10:
                                day10 = dDay_Rate;
                                break;
                            case 11:
                                day11 = dDay_Rate;
                                break;
                            case 12:
                                day12 = dDay_Rate;
                                break;
                            case 13:
                                day13 = dDay_Rate;
                                break;
                            case 14:
                                day14 = dDay_Rate;
                                break;
                            case 15:
                                day15 = dDay_Rate;
                                break;
                            case 16:
                                day16 = dDay_Rate;
                                break;
                            case 17:
                                day17 = dDay_Rate;
                                break;
                            case 18:
                                day18 = dDay_Rate;
                                break;
                            case 19:
                                day19 = dDay_Rate;
                                break;
                            case 20:
                                day20 = dDay_Rate;
                                break;
                            case 21:
                                day21 = dDay_Rate;
                                break;
                            case 22:
                                day22 = dDay_Rate;
                                break;
                            case 23:
                                day23 = dDay_Rate;
                                break;
                            case 24:
                                day24 = dDay_Rate;
                                break;
                            case 25:
                                day25 = dDay_Rate;
                                break;
                            case 26:
                                day26 = dDay_Rate;
                                break;
                            case 27:
                                day27 = dDay_Rate;
                                break;
                            case 28:
                                day28 = dDay_Rate;
                                break;
                            case 29:
                                day29 = dDay_Rate;
                                break;
                            case 30:
                                day30 = dDay_Rate;
                                break;
                            case 31:
                                day31 = dDay_Rate;
                                break;
                        }
                    }
                    break;

                case "07":
                    //pi2 = await _rptApi.GetFqcInhouseMasteMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "");
                    pi2 = await _pcsApi.GetFqcInhouseMasterMultiQuery("", "", "", "", date_str: sDate, date_end: eDate, "");
                    foreach (var item in pi2.Data)
                    {

                        DateTime date = item.CreateDate;

                        dDay_Rate = 1;

                        switch (date.Day)
                        {
                            case 1:
                                day01 = day01 + dDay_Rate;
                                break;
                            case 2:
                                day02 = day02 + dDay_Rate;
                                break;
                            case 3:
                                day03 = day03 + dDay_Rate;
                                break;
                            case 4:
                                day04 = day04 + dDay_Rate;
                                break;
                            case 5:
                                day05 = day05 + dDay_Rate;
                                break;
                            case 6:
                                day06 = day06 + dDay_Rate;
                                break;
                            case 7:
                                day07 = day07 + dDay_Rate;
                                break;
                            case 8:
                                day08 = day08 + dDay_Rate;
                                break;
                            case 9:
                                day09 = day09 + dDay_Rate;
                                break;
                            case 10:
                                day10 = day10 + dDay_Rate;
                                break;
                            case 11:
                                day11 = day11 + dDay_Rate;
                                break;
                            case 12:
                                day12 = day12 + dDay_Rate;
                                break;
                            case 13:
                                day13 = day13 + dDay_Rate;
                                break;
                            case 14:
                                day14 = day14 + dDay_Rate;
                                break;
                            case 15:
                                day15 = day15 + dDay_Rate;
                                break;
                            case 16:
                                day16 = day16 + dDay_Rate;
                                break;
                            case 17:
                                day17 = day17 + dDay_Rate;
                                break;
                            case 18:
                                day18 = day18 + dDay_Rate;
                                break;
                            case 19:
                                day19 = day19 + dDay_Rate;
                                break;
                            case 20:
                                day20 = day20 + dDay_Rate;
                                break;
                            case 21:
                                day21 = day21 + dDay_Rate;
                                break;
                            case 22:
                                day22 = day22 + dDay_Rate;
                                break;
                            case 23:
                                day23 = day23 + dDay_Rate;
                                break;
                            case 24:
                                day24 = day24 + dDay_Rate;
                                break;
                            case 25:
                                day25 = day25 + dDay_Rate;
                                break;
                            case 26:
                                day26 = day26 + dDay_Rate;
                                break;
                            case 27:
                                day27 = day27 + dDay_Rate;
                                break;
                            case 28:
                                day28 = day28 + dDay_Rate;
                                break;
                            case 29:
                                day29 = day29 + dDay_Rate;
                                break;
                            case 30:
                                day30 = day30 + dDay_Rate;
                                break;
                            case 31:
                                day31 = day31 + dDay_Rate;
                                break;
                        }
                    }
                    break;

                default:
                    pi = await _rptApi.GetProductionIndex4RPT001(sDate, eDate);

                    switch (type)
                    {
                        case "01":
                            fieldName = "productivity";
                            break;

                        case "02":
                            fieldName = "efficiency";
                            break;

                        case "03":
                            fieldName = "attendance";
                            break;

                        case "04":
                            fieldName = "overTime";
                            break;

                        case "05":
                            fieldName = "invalidTime";
                            break;
                    }

                    foreach (var item in pi.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        DateTime date = DateTime.Parse(jo["productionDate"].ToString());

                        dDay_Rate = double.Parse(jo[fieldName].ToString());

                        switch (date.Day)
                        {
                            case 1:
                                day01 = dDay_Rate;
                                break;
                            case 2:
                                day02 = dDay_Rate;
                                break;
                            case 3:
                                day03 = dDay_Rate;
                                break;
                            case 4:
                                day04 = dDay_Rate;
                                break;
                            case 5:
                                day05 = dDay_Rate;
                                break;
                            case 6:
                                day06 = dDay_Rate;
                                break;
                            case 7:
                                day07 = dDay_Rate;
                                break;
                            case 8:
                                day08 = dDay_Rate;
                                break;
                            case 9:
                                day09 = dDay_Rate;
                                break;
                            case 10:
                                day10 = dDay_Rate;
                                break;
                            case 11:
                                day11 = dDay_Rate;
                                break;
                            case 12:
                                day12 = dDay_Rate;
                                break;
                            case 13:
                                day13 = dDay_Rate;
                                break;
                            case 14:
                                day14 = dDay_Rate;
                                break;
                            case 15:
                                day15 = dDay_Rate;
                                break;
                            case 16:
                                day16 = dDay_Rate;
                                break;
                            case 17:
                                day17 = dDay_Rate;
                                break;
                            case 18:
                                day18 = dDay_Rate;
                                break;
                            case 19:
                                day19 = dDay_Rate;
                                break;
                            case 20:
                                day20 = dDay_Rate;
                                break;
                            case 21:
                                day21 = dDay_Rate;
                                break;
                            case 22:
                                day22 = dDay_Rate;
                                break;
                            case 23:
                                day23 = dDay_Rate;
                                break;
                            case 24:
                                day24 = dDay_Rate;
                                break;
                            case 25:
                                day25 = dDay_Rate;
                                break;
                            case 26:
                                day26 = dDay_Rate;
                                break;
                            case 27:
                                day27 = dDay_Rate;
                                break;
                            case 28:
                                day28 = dDay_Rate;
                                break;
                            case 29:
                                day29 = dDay_Rate;
                                break;
                            case 30:
                                day30 = dDay_Rate;
                                break;
                            case 31:
                                day31 = dDay_Rate;
                                break;
                        }
                    }
                    break;
            }

            string DayDataList = "<table border='1' cellpadding='2'>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>01</td><td>02</td><td>03</td><td>04</td><td>05</td><td>06</td><td>07</td><td>08</td><td>09</td><td>10</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day01 + "</td><td class='TD_Data_Rate_Sstyle''>" + day02 + "</td><td class='TD_Data_Rate_Sstyle''>" + day03 + "</td><td class='TD_Data_Rate_Sstyle''>" + day04 + "</td><td class='TD_Data_Rate_Sstyle''>" + day05 + "</td><td class='TD_Data_Rate_Sstyle''>" + day06 + "</td><td class='TD_Data_Rate_Sstyle''>" + day07 + "</td><td class='TD_Data_Rate_Sstyle''>" + day08 + "</td><td class='TD_Data_Rate_Sstyle''>" + day09 + "</td><td class='TD_Data_Rate_Sstyle''>" + day10 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day11 + "</td><td class='TD_Data_Rate_Sstyle''>" + day12 + "</td><td class='TD_Data_Rate_Sstyle''>" + day13 + "</td><td class='TD_Data_Rate_Sstyle''>" + day14 + "</td><td class='TD_Data_Rate_Sstyle''>" + day15 + "</td><td class='TD_Data_Rate_Sstyle''>" + day16 + "</td><td class='TD_Data_Rate_Sstyle''>" + day17 + "</td><td class='TD_Data_Rate_Sstyle''>" + day18 + "</td><td class='TD_Data_Rate_Sstyle''>" + day19 + "</td><td class='TD_Data_Rate_Sstyle''>" + day20 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day21 + "</td><td class='TD_Data_Rate_Sstyle''>" + day22 + "</td><td class='TD_Data_Rate_Sstyle''>" + day23 + "</td><td class='TD_Data_Rate_Sstyle''>" + day24 + "</td><td class='TD_Data_Rate_Sstyle''>" + day25 + "</td><td class='TD_Data_Rate_Sstyle''>" + day26 + "</td><td class='TD_Data_Rate_Sstyle''>" + day27 + "</td><td class='TD_Data_Rate_Sstyle''>" + day28 + "</td><td class='TD_Data_Rate_Sstyle''>" + day29 + "</td><td class='TD_Data_Rate_Sstyle''>" + day30 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>31</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day31 + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td></tr>";

            DayDataList = DayDataList + "</table>";

            ViewData["DayDataList"] = DayDataList;

            return View();
        }

        public async Task<IActionResult> RPT001D(string id)
        {
            ViewData["ParamList"] = id;
            string[] param = id.Split("_");
            string type = param[0];
            string data = param[1];
            string title = "";

            switch (type)
            {
                case "11":
                    title = data + "異常工時";
                    break;
            }

            ViewBag.Title = title;

            var Data = DateTime.Parse(data.Substring(0, 4) + "/" + data.Substring(4));
            var sDate = new DateTime(Data.Year, Data.Month, 1).ToString("yyyy/MM/dd");
            var eDate = new DateTime(Data.Year, Data.Month, DateTime.DaysInMonth(Data.Year, Data.Month)).ToString("yyyy/MM/dd");
            var pi = await _rptApi.GetExceptionWorktime4RPT001(sDate, eDate);

            double day01 = 0.00, day02 = 0.00, day03 = 0.00, day04 = 0.00, day05 = 0.00, day06 = 0.00, day07 = 0.00, day08 = 0.00, day09 = 0.00, day10 = 0.00;
            double day11 = 0.00, day12 = 0.00, day13 = 0.00, day14 = 0.00, day15 = 0.00, day16 = 0.00, day17 = 0.00, day18 = 0.00, day19 = 0.00, day20 = 0.00;
            double day21 = 0.00, day22 = 0.00, day23 = 0.00, day24 = 0.00, day25 = 0.00, day26 = 0.00, day27 = 0.00, day28 = 0.00, day29 = 0.00, day30 = 0.00;
            double day31 = 0.00;

            string fieldName = "time";

            foreach (var item in pi.Data)
            {
                JObject jo = JObject.Parse(item.ToString());
                DateTime date = DateTime.Parse(jo["exceptionDate"].ToString());

                switch (date.Day)
                {
                    case 1:
                        day01 = day01 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 2:
                        day02 = day02 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 3:
                        day03 = day03 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 4:
                        day04 = day04 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 5:
                        day05 = day05 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 6:
                        day06 = day06 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 7:
                        day07 = day07 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 8:
                        day08 = day08 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 9:
                        day09 = day09 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 10:
                        day10 = day10 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 11:
                        day11 = day11 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 12:
                        day12 = day12 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 13:
                        day13 = day13 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 14:
                        day14 = day14 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 15:
                        day15 = day15 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 16:
                        day16 = day16 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 17:
                        day17 = day17 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 18:
                        day18 = day18 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 19:
                        day19 = day19 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 20:
                        day20 = day20 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 21:
                        day21 = day21 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 22:
                        day22 = day22 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 23:
                        day23 = day23 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 24:
                        day24 = day24 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 25:
                        day25 = day25 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 26:
                        day26 = day26 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 27:
                        day27 = day27 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 28:
                        day28 = day28 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 29:
                        day29 = day29 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 30:
                        day30 = day30 + double.Parse(jo[fieldName].ToString());
                        break;
                    case 31:
                        day31 = day31 + double.Parse(jo[fieldName].ToString());
                        break;
                }
            }

            string DayDataList = "<table border='1' cellpadding='2'>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>01</td><td>02</td><td>03</td><td>04</td><td>05</td><td>06</td><td>07</td><td>08</td><td>09</td><td>10</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day01 + "</td><td class='TD_Data_Rate_Sstyle''>" + day02 + "</td><td class='TD_Data_Rate_Sstyle''>" + day03 + "</td><td class='TD_Data_Rate_Sstyle''>" + day04 + "</td><td class='TD_Data_Rate_Sstyle''>" + day05 + "</td><td class='TD_Data_Rate_Sstyle''>" + day06 + "</td><td class='TD_Data_Rate_Sstyle''>" + day07 + "</td><td class='TD_Data_Rate_Sstyle''>" + day08 + "</td><td class='TD_Data_Rate_Sstyle''>" + day09 + "</td><td class='TD_Data_Rate_Sstyle''>" + day10 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day11 + "</td><td class='TD_Data_Rate_Sstyle''>" + day12 + "</td><td class='TD_Data_Rate_Sstyle''>" + day13 + "</td><td class='TD_Data_Rate_Sstyle''>" + day14 + "</td><td class='TD_Data_Rate_Sstyle''>" + day15 + "</td><td class='TD_Data_Rate_Sstyle''>" + day16 + "</td><td class='TD_Data_Rate_Sstyle''>" + day17 + "</td><td class='TD_Data_Rate_Sstyle''>" + day18 + "</td><td class='TD_Data_Rate_Sstyle''>" + day19 + "</td><td class='TD_Data_Rate_Sstyle''>" + day20 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day21 + "</td><td class='TD_Data_Rate_Sstyle''>" + day22 + "</td><td class='TD_Data_Rate_Sstyle''>" + day23 + "</td><td class='TD_Data_Rate_Sstyle''>" + day24 + "</td><td class='TD_Data_Rate_Sstyle''>" + day25 + "</td><td class='TD_Data_Rate_Sstyle''>" + day26 + "</td><td class='TD_Data_Rate_Sstyle''>" + day27 + "</td><td class='TD_Data_Rate_Sstyle''>" + day28 + "</td><td class='TD_Data_Rate_Sstyle''>" + day29 + "</td><td class='TD_Data_Rate_Sstyle''>" + day30 + "</td></tr>";
            DayDataList = DayDataList + "<tr class='TR_Item_Sstyle'><td>日期</td><td>31</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>";
            DayDataList = DayDataList + "<tr><td class='TD_Data_Sstyle'>數值</td><td class='TD_Data_Rate_Sstyle''>" + day31 + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td><td class='TD_Data_Rate_Sstyle''>" + "" + "</td></tr>";

            DayDataList = DayDataList + "</table>";

            ViewData["DayDataList"] = DayDataList;

            return View();
        }

        #region RPT003 QC RATE 維護

        /// <summary>
        /// 西元 Select
        /// </summary>
        /// <returns></returns>
        private void GetYearItemSelect()
        {
            var YearItem = new List<SelectListItem>();
            for (int i = -1; i <= 1; i++)
            {
                YearItem.Add(new SelectListItem
                {
                    Text = DateTime.Now.AddYears(i).Year.ToString(),
                    Value = DateTime.Now.AddYears(i).Year.ToString()
                });
            }

            ViewBag.GetYearItemList = YearItem;
        }

        /// <summary>
        /// 月份 Select
        /// </summary>
        /// <returns></returns>
        private void GetMonthItemSelect()
        {
            var MonthItem = new List<SelectListItem>();
            for (int i = 1; i <= 12; i++)
            {
                MonthItem.Add(new SelectListItem
                {
                    Text = i.ToString(),
                    Value = i.ToString()
                });
            }

            ViewBag.GetMonthItemList = MonthItem;
        }

        /// <summary>
        /// QC_Rate 類別 Select
        /// </summary>
        /// <returns></returns>
        private void GetQcRateTypeSelect()
        {
            var QcRateTypeItem = new List<SelectListItem>(){
                new SelectListItem() {
                    Text = "DOA",
                    Value = "DOA",
                },
                new SelectListItem
                {
                    Text = "RMA",
                    Value = "RMA",
                }
            };

            ViewBag.GetQcRateTypeList = QcRateTypeItem;
        }

        /// <summary>
        /// QC_Rate 公司類型 Select
        /// </summary>
        /// <returns></returns>
        private void GetProductTypeSelect()
        {
            var ProductTypeItem = new List<SelectListItem>(){
                new SelectListItem() {
                    Text = "SYSTEM",
                    Value = "SYSTEM",
                },
                new SelectListItem
                {
                    Text = "BOARD",
                    Value = "BOARD",
                },
                new SelectListItem
                {
                    Text = "MEDICAL",
                    Value = "MEDICAL",
                }
            };

            ViewBag.GetProductTypeList = ProductTypeItem;
        }

        public IActionResult RPT003()
        {
            GetYearItemSelect();
            GetMonthItemSelect();
            GetQcRateTypeSelect();
            GetProductTypeSelect();
            return View();
        }

        //新增頁面
        public IActionResult RPT003C()
        {
            GetYearItemSelect();
            GetMonthItemSelect();
            GetQcRateTypeSelect();
            GetProductTypeSelect();
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> RPT003Async(QcRate model)
        {
            GetYearItemSelect();
            GetMonthItemSelect();
            GetQcRateTypeSelect();
            GetProductTypeSelect();
            IResultModel<QcRate> query = await _rptApi.GetQcRatesQuery(model.Yrer, model.Month, model.QcRateType, model.ProductType);

            if (query.Data.Count() != 0)
            {
                ModelState.AddModelError("error", "已有重複資料,請在確認");
                return View("RPT003C", model);
            }

            if (ModelState.IsValid)
            {
                IResultModel result;
                model.CreateUserID = GetLogInUserID();
                model.UpdateUserID = GetLogInUserID();
                result = await _rptApi.PostQcRate(JsonConvert.SerializeObject(model));
                if (result.Success)
                {
                    var _msg = "新增成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    ModelState.AddModelError("error", result.Msg);
                }
            }
            return View("RPT003C", model);

        }

        //修改頁面
        [HttpGet]
        public async Task<IActionResult> RPT003U(string year, string month, string qcRateType, string productType)
        {
            GetYearItemSelect();
            GetMonthItemSelect();
            GetQcRateTypeSelect();
            GetProductTypeSelect();
            IResultModel<QcRate> result = await _rptApi.GetQcRatesQuery(year, month, qcRateType, productType);
            return View(result.Data.FirstOrDefault());
        }

        public async Task<IActionResult> RPT003UAsync(QcRate model)
        {
            GetYearItemSelect();
            GetMonthItemSelect();
            GetQcRateTypeSelect();
            GetProductTypeSelect();

            if (ModelState.IsValid)
            {
                IResultModel result;
                model.UpdateUserID = GetLogInUserID();
                result = await _rptApi.PutQcRate(JsonConvert.SerializeObject(model));
                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    ModelState.AddModelError("error", result.Msg);
                }
            }
            return View("RPT003U", model);

        }

        [HttpPost]
        public async Task<IActionResult> RPT003D(string year, string month, string qcRateType, string productType)
        {
            var model = new QcRate()
            {
                Yrer = year,
                Month = month,
                QcRateType = qcRateType,
                ProductType = productType
            };
            var result = await _rptApi.DeleteQcRate(JsonConvert.SerializeObject(model));
            return Json(new Result() { success = result.Success, msg = result.Msg });
        }

        /// <summary>
        /// 查詢 QcRate
        /// </summary>
        /// <param name="year">西元</param>
        /// <param name="month">月份</param>
        /// <param name="qcRateType">類別</param>
        /// <param name="productType">產品別</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> RPT003Query(string year, string month, string qcRateType, string productType, int page = 0, int limit = 10)
        {
            IResultModel<QcRate> result = await _rptApi.GetQcRatesQuery(year, month, qcRateType, productType, page, limit);

            if (result.Data.Count() != 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result.Data, count = result.DataTotal });
            }
            return Json(new Table() { count = 0, data = null });
        }
        #endregion

        #region RPT004 線頭看板

        /// <summary>
        /// 生產單位
        /// </summary>
        /// <param name="SelectAll">true:Add全部選項</param>
        /// <returns></returns>
        private async Task GetFactoryUnit(bool SelectAll = true)
        {
            var result = await _basApi.GetFactoryUnits();

            var FactoryUnit = new List<SelectListItem>();

            if (SelectAll)
                FactoryUnit.Add(new SelectListItem("全部", ""));

            for (int i = 0; i < result.Count; i++)
            {
                FactoryUnit.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString()));
            }

            ViewBag.FactoryUnitList = FactoryUnit;
        }

        public async Task<IActionResult> RPT004()
        {
            var model = new RPT004ViewDto();
            await GetFactoryUnit(false);
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> RPT004(RPT004ViewDto model)
        {
            try
            {
                await GetFactoryUnit(false);
                // By Dip 
                if (model.unitNo == "D")
                    model = await _rptApi.GetRPT004ViewByDip(model.unitNo, model.lineId);
                // By Smt
                else if (model.unitNo == "S")
                    model = await _rptApi.GetRPT004ViewBySmt(model.unitNo, model.lineId);
                else
                    model = await _rptApi.GetRPT004View(model.unitNo, model.lineId);
                return View(model);
            }
            catch (Exception ex)
            {
                return View(model);
            }
        }

        #endregion

        #region RPT005 線頭看板(輪播)

        public async Task<IActionResult> RPT005()
        {
            var model = new RPT004ViewDto();
            await GetFactoryUnit(false);
            ViewBag.oldUinit = "";
            ViewBag.oldLineSeq = 0;
            return View(model);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <param name="oldUinit">查詢前製程</param>
        /// <param name="oldLineSeq">查詢前線別</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> RPT005(RPT004ViewDto model, string oldUinit, int oldLineSeq)
        {
            try
            {
                await GetFactoryUnit(false);
                // 取得目前有開線的線別
                var lines = await _basApi.GetLineInfoes();
                var lineItmes = lines.Where(w => w.UnitNo == model.unitNo && w.WipNo != -1)
                                     .OrderBy(o => o.UpdateDate).Select(s => s.LineID).ToList();

                if (model.unitNo == "D")
                {
                    lineItmes = await _rptApi.GetRPT004ViewByDipOnWip();
                }

                // 有資料才判斷
                if (lineItmes.Any())
                {
                    // 相同製程 就往後輪播
                    if (model.unitNo == oldUinit)
                    {
                        if (lineItmes.Count() >= oldLineSeq + 1)
                        {
                            model.lineId = lineItmes[oldLineSeq];
                            ViewBag.oldLineSeq = oldLineSeq + 1;
                        }
                        else
                        {
                            model.lineId = lineItmes[0];
                            ViewBag.oldLineSeq = 1;
                        }
                    }
                    else
                    {
                        model.lineId = lineItmes[0];
                        ViewBag.oldLineSeq = 1;
                    }
                }
                ViewBag.oldUinit = model.unitNo;

                // By Dip
                if (model.unitNo == "D")
                    model = await _rptApi.GetRPT004ViewByDip(model.unitNo, model.lineId);
                // By Smt
                else if (model.unitNo == "S")
                    model = await _rptApi.GetRPT004ViewBySmt(model.unitNo, model.lineId);
                else
                    model = await _rptApi.GetRPT004View(model.unitNo, model.lineId);

                return View(model);
            }
            catch
            {
                return View(model);
            }
        }

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