using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.CommonTools.Result;
using System.Data.Common;
using System.Reflection;
using Microsoft.Extensions.Configuration;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 工單各站數量資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class WipStationController : ControllerBase
    {
        private readonly AMESContext _context;
        private readonly IConfiguration _config;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        public WipStationController(AMESContext context)
        {
            _config = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory).AddJsonFile("appsettings.json").Build();
            _context = context;
        }

        /// <summary>
        /// 獲取全部工單各站數量資料
        /// </summary>
        /// <returns></returns>
        // GET: api/WipStation
        [HttpGet]
        public async Task<ActionResult<IEnumerable<WipStation>>> GetWipStations()
        {
            //方法2
            List<WipStation> list = new List<WipStation>();
            string tempName = string.Empty;
            DbConnection conn = _context.Database.GetDbConnection();
            if (conn.State != System.Data.ConnectionState.Open)
            {
                await conn.OpenAsync();
            }

            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = @"SELECT WIP_ID as WipID,RULE_STATION_ID as RuleStationID,RULE_STATUS as RuleStatus,FIRST_CNT as FirstCnt,
PASS_CNT as PassCnt,CREATE_USERID as CreateUserID,CREATE_DATE as CreateDate,UPDATE_DATE as UpdateDate
FROM JHAMES.WIP_STATION";

                using (var reader = await cmd.ExecuteReaderAsync())
                {
                    if (reader.HasRows)
                    {
                        while (reader.Read())
                        {
                            WipStation row = new WipStation();
                            PropertyInfo[] propertys = row.GetType().GetProperties();
                            foreach (PropertyInfo pi in propertys)
                            {
                                var obj = new object();
                                try
                                {
                                    obj = reader[pi.Name];
                                }
                                catch
                                {
                                    continue;
                                }

                                if (obj == DBNull.Value || obj == null)
                                {
                                    continue;
                                }

                                var si = pi.GetSetMethod();
                                if (si == null)
                                {
                                    continue;
                                }

                                if (obj is decimal)
                                {
                                    pi.SetValue(row, Convert.ToInt32(obj), null);
                                }
                                else
                                {
                                    pi.SetValue(row, obj, null);
                                }
                            }
                            list.Add(row);
                        }
                        reader.Close();
                        return list;
                    }
                }
            }

            return list;


            /*
            //方法1
            var wip_station = await _context.WipStations.FromSqlRaw("SELECT * FROM JHAMES.WIP_STATION").ToListAsync();
            return wip_station;
            */

            //return await _context.WipStations.ToListAsync();
        }

        // GET: api/WipStation/5
        [HttpGet("{id}")]
        public async Task<ActionResult<WipStation>> GetWipStation(int id)
        {
            var wipStation = await _context.WipStations.FindAsync(id);

            if (wipStation == null)
            {
                return NotFound();
            }

            return wipStation;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupALL")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupALL(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q5.WipNo into fqc_data
                    from x in fqc_data.DefaultIfEmpty()
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        FqcDate = (x.FqcDate == null ? DateTime.Now : x.FqcDate)
                    };

            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }

            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }
            else
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.FqcDate >= DateTime.Parse(dateStart) && w.FqcDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.StationID, x.RuleStatus }).Select(x => new
            {
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }


        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupB")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupB(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q5.WipNo into fqc_data
                    from x in fqc_data.DefaultIfEmpty()
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        FqcDate = (x.FqcDate == null ? DateTime.Now : x.FqcDate)
                    };

            q = q.Where(w => w.CustomerMedical == "N" && w.UnitNO == "B");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }

            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }
            else
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.FqcDate >= DateTime.Parse(dateStart) && w.FqcDate <= DateTime.Parse(dateEnd));
                    }
                }
            }
            var g = q.GroupBy(x => new { x.StationID, x.RuleStatus }).Select(x => new
            {
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupM")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupM(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q5.WipNo into fqc_data
                    from x in fqc_data.DefaultIfEmpty()
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        FqcDate = (x.FqcDate == null ? DateTime.Now : x.FqcDate)
                    };

            q = q.Where(w => w.CustomerMedical == "Y");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }


            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }
            else
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.FqcDate >= DateTime.Parse(dateStart) && w.FqcDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.StationID, x.RuleStatus }).Select(x => new
            {
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }


        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupSByWeek")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupSByWeek(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.CalendarTables on q1.CreateDate.Date equals q5.TimeID
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        q5.Year,
                        q5.WeekOfYear
                    };

            q = q.Where(w => w.CustomerMedical == "N" && w.UnitNO == "S");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }


            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.Year, x.WeekOfYear, x.RuleStatus }).Select(x => new
            {
                WeekCode = x.Key.Year + x.Key.WeekOfYear,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.Year == x.Key.Year && j.WeekOfYear == x.Key.WeekOfYear && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            g = g.OrderBy(p => p.WeekCode);

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupMByWeek")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupMByWeek(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.CalendarTables on q1.CreateDate.Date equals q5.TimeID
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        q5.Year,
                        q5.WeekOfYear
                    };

            q = q.Where(w => w.CustomerMedical == "Y");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }


            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.Year, x.WeekOfYear, x.RuleStatus }).Select(x => new
            {
                WeekCode = x.Key.Year + x.Key.WeekOfYear,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.Year == x.Key.Year && j.WeekOfYear == x.Key.WeekOfYear && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            g = g.OrderBy(p => p.WeekCode);

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupBByWeek")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupBByWeek(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.CalendarTables on q1.CreateDate.Date equals q5.TimeID
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        q5.Year,
                        q5.WeekOfYear
                    };

            q = q.Where(w => w.CustomerMedical == "N" && w.UnitNO == "B");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }

            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.Year, x.WeekOfYear, x.RuleStatus }).Select(x => new
            {
                WeekCode = x.Key.Year + x.Key.WeekOfYear,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.Year == x.Key.Year && j.WeekOfYear == x.Key.WeekOfYear && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            g = g.OrderBy(p => p.WeekCode);

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="werksNo">生產廠別</param>
        /// <param name="dateType">日期類別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014GroupS")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014GroupS(string itemNo, string dateStart, string dateEnd, string modelNo, string werksNo, string dateType)
        {
            string fpyStation = _config["FPYStation"].ToString();
            string[] fpy_station = fpyStation.Split(',');
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    join q5 in _context.FqcResultMasters.GroupBy(x => new { x.WipNo }).Select(x => new { WipNo = x.Key.WipNo, FqcDate = x.Max(o => o.EndTime) }) on q2.WipNO equals q5.WipNo into fqc_data
                    from x in fqc_data.DefaultIfEmpty()
                    select new
                    {
                        q1.WipID,
                        q2.WerksNO,
                        q2.CustomerMedical,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q4.StationName,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q2.WipScheduleDate,
                        FqcDate = (x.FqcDate == null ? DateTime.Now : x.FqcDate)
                    };

            q = q.Where(w => w.CustomerMedical == "N" && w.UnitNO == "S");
            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }

            if (werksNo != null)
            {
                if (werksNo != "")
                    q = q.Where(w => w.WerksNO == werksNo);
            }


            if (dateType == "WipDate" || dateType == null)
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.WipScheduleDate >= DateTime.Parse(dateStart) && w.WipScheduleDate <= DateTime.Parse(dateEnd));
                    }
                }
            }
            else
            {
                if (dateStart != null && dateEnd != null)
                {
                    if (dateStart != "" && dateEnd != "")
                    {
                        q = q.Where(w => w.FqcDate >= DateTime.Parse(dateStart) && w.FqcDate <= DateTime.Parse(dateEnd));
                    }
                }
            }

            var g = q.GroupBy(x => new { x.StationID, x.RuleStatus }).Select(x => new
            {
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }


        /// <summary>
        /// 基本查詢
        /// </summary>
        /// <param name="wipID">工單ID</param>
        /// <param name="ruleStationID">流程ID</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS009")]
        public async Task<ActionResult<IEnumerable<WipStation>>> GetWipStation4QRS009(int wipID, int ruleStationID)
        {
            IQueryable<WipStation> q = _context.WipStations;


            if (wipID != 0)
                q = q.Where(w => w.WipID == wipID);


            if (ruleStationID != 0)
                q = q.Where(w => w.StationID == ruleStationID);

            var result = await q.ToListAsync();

            return result;
        }

        /// <summary>
        /// 基本查詢
        /// </summary>
        /// <param name="wipID">工單ID</param>
        /// <param name="stationID">流程ID</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS009Group")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS009Group(int wipID, int stationID)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            IQueryable<WipStation> q = _context.WipStations;


            if (wipID != 0)
                q = q.Where(w => w.WipID == wipID);


            if (stationID != 0)
                q = q.Where(w => w.StationID == stationID);

            var g = q.GroupBy(x => new { x.WipID, x.StationID, x.RuleStatus }).Select(x => new
            {
                WipID = x.Key.WipID,
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.WipID == x.Key.WipID && j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            //var result = await q.ToListAsync();
            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }

        /// <summary>
        /// 根據料號+時間起迄查詢首次過站紀錄
        /// </summary>
        /// <param name="unitNo">制程代码</param>
        /// <param name="itemNo">料號</param>
        /// <param name="dateStart">開始日期</param>
        /// <param name="dateEnd">結束日期</param>
        /// <param name="modelNo">機種</param>
        /// <param name="custType">客戶別</param>
        /// <returns></returns>
        [HttpGet("GetWipStation4QRS014Group")]
        public async Task<ResultModel<dynamic>> GetWipStation4QRS014Group(string unitNo, string itemNo, string dateStart, string dateEnd, string modelNo, string custType)
        {
            string fpyStation = "";
            if (unitNo == "I")
            {
                fpyStation = _config["I_FPYStation"].ToString();
            }
            else
            {
                fpyStation = _config["FPYStation"].ToString();
            }

            string[] fpy_station = fpyStation.Split(',');

            ResultModel<dynamic> result = new ResultModel<dynamic>();

            var q = from q1 in _context.WipStations
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    join q4 in _context.Stationses on q1.StationID equals q4.StationID
                    select new
                    {
                        q1.WipID,
                        q2.UnitNO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q1.RuleStatus,
                        q1.FirstCnt,
                        q1.CreateDate,
                        q4.StationName
                    };

            q = q.Where(w => fpy_station.Contains(w.StationName));

            if (unitNo != null)
            {
                if (unitNo != "")
                    q = q.Where(w => w.UnitNO == unitNo);
            }

            if (itemNo != null)
            {
                if (itemNo != "")
                    q = q.Where(w => w.ItemNO == itemNo);
            }

            if (custType != null)
            {
                if (custType != "")
                    q = q.Where(w => w.ItemNO.Substring(0, 2) == custType);
            }

            if (modelNo != null)
            {
                if (modelNo != "")
                    q = q.Where(w => w.ModelNO == modelNo);
            }


            if (dateStart != null && dateEnd != null)
            {
                if (dateStart != "" && dateEnd != "")
                {
                    q = q.Where(w => w.CreateDate >= DateTime.Parse(dateStart) && w.CreateDate <= DateTime.Parse(dateEnd));
                }
            }

            var g = q.GroupBy(x => new { x.StationID, x.RuleStatus }).Select(x => new
            {
                StationID = x.Key.StationID,
                RuleStatus = x.Key.RuleStatus,
                FirstCnt = q.Where(j => j.StationID == x.Key.StationID && j.RuleStatus == x.Key.RuleStatus).Sum(k => k.FirstCnt)
            });

            result.DataTotal = g.ToList().Count;

            result.Data = await g.ToListAsync();

            return result;
        }


        /// <summary>
        /// 基本查詢
        /// </summary>
        /// <param name="wipID">工單ID</param>
        /// <param name="stationID">流程ID</param>
        /// <returns></returns>
        [HttpGet("Query")]
        public async Task<ActionResult<WipStation>> GetWipStation(int wipID , int stationID)
        {
            IQueryable<WipStation> q = _context.WipStations;


            if (wipID != 0)
                q = q.Where(w => w.WipID == wipID);

            
            if (stationID != 0)
                q = q.Where(w => w.StationID == stationID);

            var result = await q.ToListAsync();

            return result.FirstOrDefault();
        }

        /// <summary>
        /// 更新工單各站數量
        /// </summary>
        /// <param name="wipStation"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<WipStation>> PutWipStation(WipStation wipStation)
        {
            ResultModel<WipStation> result = new ResultModel<WipStation>();
            _context.Entry(wipStation).State = EntityState.Modified;
            wipStation.UpdateDate = DateTime.Now;

            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }


        /// <summary>
        /// 新增工單各站數量
        /// </summary>
        /// <param name="wipStation"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WipStation>> PostWipStation(WipStation wipStation)
        {
            ResultModel<WipStation> result = new ResultModel<WipStation>();
            _context.WipStations.Add(wipStation);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        // DELETE: api/WipStation/5
        [HttpDelete("{id}")]
        public async Task<ActionResult<WipStation>> DeleteWipStation(int id)
        {
            var wipStation = await _context.WipStations.FindAsync(id);
            if (wipStation == null)
            {
                return NotFound();
            }

            _context.WipStations.Remove(wipStation);
            await _context.SaveChangesAsync();

            return wipStation;
        }

        private bool WipStationExists(int id)
        {
            return _context.WipStations.Any(e => e.WipID == id);
        }
    }
}