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 AMESCoreStudio.WebApi.Enum;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 入庫單資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class FqcInhouseMasterController : ControllerBase
    {
        private readonly AMESContext _context;

        public FqcInhouseMasterController(AMESContext context)
        {
            _context = context;
        }

        // GET: api/FqcInhouseMaster
        [HttpGet]
        public async Task<ActionResult<IEnumerable<FqcInhouseMaster>>> GetFqcInhouseMasters()
        {
            return await _context.FqcInhouseMasters.ToListAsync();
        }

        // GET: api/FqcInhouseMaster/5
        [HttpGet("ByWipNo/{wipNo}")]
        public async Task<ActionResult<IEnumerable<FqcInhouseMaster>>> GetFqcInhouseMasterByWipNo(string wipNo)
        {
            var fqcInhouseMaster = await _context.FqcInhouseMasters.Where(w => w.WipNo == wipNo.ToUpper())
                                         .ToListAsync();

            return fqcInhouseMaster;
        }

        /// <summary>
        /// 查詢入庫單by入庫單號
        /// </summary>
        /// <param name="inhouseNo"></param>
        /// <returns></returns>
        [HttpGet("ByinhouseNo/{inhouseNo}")]
        public async Task<ActionResult<IEnumerable<FqcInhouseMaster>>> GetFqcInhouseMasterByinhouseNo(string inhouseNo)
        {
            var fqcInhouseMaster = await _context.FqcInhouseMasters.Where(w => w.InhouseNo == inhouseNo.ToUpper())
                                         .ToListAsync();

            return fqcInhouseMaster;
        }

        // GET: api/FqcInhouseMaster/5
        [HttpGet("{inhouseNo}/{seqID}")]
        public async Task<ActionResult<FqcInhouseMaster>> GetFqcInhouseMaster(string inhouseNo, int seqID)
        {
            var fqcInhouseMaster = await _context.FqcInhouseMasters.FindAsync(inhouseNo, seqID);

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

            return fqcInhouseMaster;
        }

        /// <summary>
        /// 取最新入庫單號
        /// </summary>
        /// <param name="inhouseNo"></param>
        /// <returns></returns>
        [HttpGet("NewInhouseNo/{inhouseNo}")]
        public async Task<ActionResult<string>> GetFqcInhouseMasterNewInhouseNo(string inhouseNo)
        {
            var fqcInhouseMaster = await _context.FqcInhouseMasters.Where(w => w.InhouseNo.StartsWith(inhouseNo)).ToListAsync();

            string NowInhouseNo = string.Empty;

            if (fqcInhouseMaster.Count() == 0)
                return inhouseNo + "001";

            NowInhouseNo = fqcInhouseMaster.OrderByDescending(o => o.InhouseNo).FirstOrDefault().InhouseNo;
            inhouseNo += (int.Parse(NowInhouseNo.Substring(NowInhouseNo.Length - 3, 3)) + 1).ToString().PadLeft(3, '0');

            return inhouseNo;
        }

        /// <summary>
        /// FQC查詢 by Table
        /// </summary>
        /// <param name="barcodeNo">內部序號</param>
        /// <param name="wipNo">工單號碼</param>
        /// <param name="boxNo">外箱號碼</param>
        /// <param name="inhouseNo">入庫單號碼</param>
        /// <param name="date_str">入庫時間起</param>
        /// <param name="date_end">入庫時間迄</param>
        /// <param name="status">抽驗結果</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <param name="factoryID">委外廠商ID</param>
        /// <param name="factoryNo">委外廠商ID</param>
        /// <returns></returns>
        [HttpGet("FqcInhouseMasterQuery")]
        public async Task<ResultModel<FqcInhouseMasterDto>> GetFqcInhouseMasterQuery(string barcodeNo, string wipNo, string boxNo
          , string inhouseNo, string date_str, string date_end, string status, string factoryID, string factoryNo, int page = 0, int limit = 10)
        {
            var q = from q1 in _context.FqcInhouseMasters
                    join q2 in _context.FqcInhouseDetails on new { q1.InhouseNo, q1.SeqID } equals new { q2.InhouseNo, q2.SeqID } into j0
                    from q2 in j0.DefaultIfEmpty()
                    join q3 in _context.FqcResultMasters on new { q1.InhouseNo, q1.SeqID } equals new { q3.InhouseNo, q3.SeqID } into j1
                    from q3 in j1.DefaultIfEmpty()
                    join q4 in _context.WipInfos on q1.WipNo equals q4.WipNO into s
                    from q4 in s.DefaultIfEmpty()
                    join q5 in _context.FactoryInfos on q4.Werks equals q5.FactoryID.ToString() into j2
                    from q5 in j2.DefaultIfEmpty()
                    select new FqcInhouseMasterDto
                    {
                        Werks = q4.Werks,
                        SerialNo = q2.SerialNo,
                        FactoryNo = q5.FactoryNo,
                        InhouseNo = q1.InhouseNo,
                        SeqID = q1.SeqID,
                        WipNo = q1.WipNo,
                        ItemNo = q1.ItemNo,
                        InhouseQty = q1.InhouseQty,
                        ModelNo = q1.ModelNo,
                        StatusName = q1.Status,
                        ProTypeName = q1.ProType,
                        CreateDate = q1.CreateDate,
                        EndTime = q3.EndTime,
                        SpecialNo = q3.SpecialPo,
                        QaMemo = q3.QaMeno
                    };
            //q1.Status == "P" ? "允收" : q1.Status == "R" ? "批退" : "未驗收完成",
            //IQueryable <FqcInhouseDetail> q1 = _context.FqcInhouseDetails;
            if (!string.IsNullOrWhiteSpace(inhouseNo))
                q = q.Where(w => w.InhouseNo == inhouseNo);

            if (!string.IsNullOrWhiteSpace(wipNo))
                q = q.Where(w => w.WipNo == wipNo);

            if (!string.IsNullOrWhiteSpace(status))
            {
                // P1 特採允收
                if (status != "P1")
                    q = q.Where(w => w.StatusName == status);
                else
                {
                    q = q.Where(w => w.StatusName == "P" && !string.IsNullOrWhiteSpace(w.SpecialNo));
                }
            }

            if (!string.IsNullOrWhiteSpace(factoryID))
                q = q.Where(w => w.Werks.ToString() == factoryID);

            if (!string.IsNullOrWhiteSpace(factoryNo))
                q = q.Where(w => w.FactoryNo.ToString() == factoryNo);

            // 優先用內部序號取出包裝序號
            if (!string.IsNullOrWhiteSpace(barcodeNo))
            {
                BarcodeInfoesController barcodeInfoesController = new BarcodeInfoesController(_context);
                var q1 = await barcodeInfoesController.GetBarcodeInfoesByNo(barcodeNo);
                if (q1.Value.Count() != 0)
                {
                    boxNo = q1.Value.FirstOrDefault().BoxNo;
                }
            }

            if (!string.IsNullOrWhiteSpace(boxNo))
            {
                q = q.Where(w => w.SerialNo == boxNo);
            }

            if (DateTime.TryParse(date_str, out _))
            {
                q = q.Where(w => w.CreateDate >= DateTime.Parse(date_str));
            }

            if (DateTime.TryParse(date_end, out _))
            {
                q = q.Where(w => w.CreateDate <= DateTime.Parse(date_end));
            }

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

            var resultQuery = await q.Select(s => new FqcInhouseMasterDto
            {
                Werks = s.Werks,
                FactoryNo = s.FactoryNo,
                InhouseNo = s.InhouseNo,
                SeqID = s.SeqID,
                WipNo = s.WipNo,
                ItemNo = s.ItemNo,
                InhouseQty = s.InhouseQty,
                ModelNo = s.ModelNo,
                StatusName = s.StatusName,
                ProTypeName = s.ProTypeName,
                CreateDate = s.CreateDate,
                EndTime = s.EndTime,
                SpecialNo = s.SpecialNo,
                QaMemo = s.QaMemo
            }).Distinct().ToListAsync();

            // 紀錄筆數
            result.DataTotal = resultQuery.Count();

            // Table 頁數
            if (page > 0)
            {
                resultQuery = resultQuery.Skip((page - 1) * limit).Take(limit).ToList();
            }

            result.Data = resultQuery;

            // 判斷結束時間
            result.Data = result.Data.Select(s => { s.EndTime = s.StatusName == "A" ? null : s.EndTime; return s; })
             .ToList();

            // 修改狀態名稱
            result.Data = result.Data.Select(s => { s.StatusName = s.StatusName == "P" ? string.IsNullOrWhiteSpace(s.SpecialNo) ? "允收" : "特採允收" : s.StatusName == "R" ? "批退" : "未驗收完成"; return s; })
                          .ToList();

            return result;
        }

        /// <summary>
        /// FQC抽驗資料
        /// </summary>
        /// <param name="inhouseNo">入庫單號碼</param>
        /// <param name="seqid">序號</param>
        /// <returns></returns>
        [HttpGet("FqcQuery/{inhouseNo}")]
        public async Task<ResultModel<FqcDto>> GetFqcQuery(string inhouseNo, int seqid = 1)
        {
            IQueryable<FqcDto> q = from q1 in _context.FqcInhouseMasters.Where(w => w.InhouseNo == inhouseNo && w.SeqID == seqid)
                                   join q2 in _context.FqcResultMasters on new { q1.InhouseNo, q1.SeqID } equals new { q2.InhouseNo, q2.SeqID }
                                   into cp
                                   from q2 in cp.DefaultIfEmpty()
                                   join q3 in _context.QcCriteria on q1.CritID equals q3.CritID
                                   join q4 in _context.WipInfos on q1.WipNo equals q4.WipNO
                                   join q5 in _context.FactoryInfos on q4.Werks equals q5.FactoryID.ToString()
                                   join q6 in _context.UserInfoes on q2.Supervisor equals q6.UserNo into cp6
                                   from q6 in cp6.DefaultIfEmpty()
                                   join q7 in _context.UserInfoes on q2.Proved equals q7.UserNo into cp7
                                   from q7 in cp7.DefaultIfEmpty()
                                   join q8 in _context.UserInfoes on q2.UpdateUserID equals q8.UserID into cp8
                                   from q8 in cp8.DefaultIfEmpty()
                                   select new FqcDto
                                   {
                                       InhouseNo = q1.InhouseNo,
                                       SeqID = q1.SeqID,
                                       WipNo = q1.WipNo,
                                       ItemNo = q1.ItemNo,
                                       ModelNo = q1.ModelNo,
                                       InhouseQty = q1.InhouseQty,
                                       SpecialPo = q2.SpecialPo,
                                       StatusName = q1.Status == "P" ? string.IsNullOrWhiteSpace(q2.SpecialPo) ? "允收Pass" : "特採允收" : q1.Status == "R" ? "批退Reject" : "",
                                       FqcID = q2.WipNo == null ? 0 : q2.FqcID,
                                       InhouseMemo = q1.InhouseMemo,
                                       ManualQaMeno = q2.ManualQaMeno,
                                       QaMeno = q2.QaMeno,
                                       CustomerNo = q4.CustomerNO,
                                       CustomerMedical = q4.CustomerMedical,
                                       CustomerVIP = q4.CustomerVIP,
                                       Werk = q5.FactoryNo + "-" + q5.FactoryNameCh,
                                       BIOS = q2.BIOS,
                                       CPU = q2.CPU,
                                       OS = q2.OS,
                                       RAM = q2.RAM,
                                       OutfitNo = q2.OutfitNo,
                                       Supervisor = q2.Supervisor,
                                       Supervisor_Name = q6.UserName,
                                       Proved = q2.Proved,
                                       Proved_Name = q7.UserName,
                                       UpdateUser = q8.UserNo,
                                       UpdateUser_Name = q8.UserName,
                                       InspectionType = q2.InspectionType,
                                       MajorQty = q2.MajorQty,
                                       MinorQty = q2.MinorQty,
                                       WipECN = q4.GetWipAtt.ECN,
                                       EndTime = q2.EndTime.ToString("yyyy/MM/dd"),
                                       QuotDescription = q3.GetQcQuot.QuotDescription,
                                       CritID = q3.CritID,
                                       QcQty = q3.QcQty,
                                       AcQty = q3.AcQty,
                                       ReQty = q3.ReQty,
                                       AQL = q3.GetQcQuot.Aql,
                                       AQLType = q3.GetQcQuot.AqlType,
                                       QuotName = q3.GetQcQuot.QuotName,
                                       PLMECN = q2.PLM_ECN,
                                       ECN_Memo = q2.ECN_Memo,
                                       Note = q2.Note,
                                       InspectionStatus = q2.InspectionStatus,
                                       Description = q4.Description,
                                       LocationNo = q1.LocationNo
                                   };

            var query = await q.Distinct().ToListAsync();

            query.Select(s => s.InspectionTypeName =
         System.Enum.IsDefined(typeof(EnumFQC.EnumInspection_Type), s.InspectionType ?? "") ?
         EnumFQC.GetDisplayName((EnumFQC.EnumInspection_Type)System.Enum.Parse(typeof(EnumFQC.EnumInspection_Type), s.InspectionType)) : "")
         .ToList();

            var FqcDetail = new List<FqcDto.FqcDetailDto>();
            if (query.Count() != 0)
            {
                var Detail = _context.FqcInhouseDetails.Where(w => w.InhouseNo == inhouseNo && w.SeqID == seqid);

                foreach (var item in Detail)
                {
                    // 取抽驗結果明細檔資料
                    var FqcResultDetail = _context.FqcResultDetails.Where(w => w.FqcID == query.FirstOrDefault().FqcID
                                           && w.BoxNo == item.SerialNo).ToList();
                    FqcDetail.Add(new FqcDto.FqcDetailDto
                    {
                        SerialNo = item.SerialNo,
                        Qty = _context.BarcodeInfoes.Where(w => w.BoxNo == item.SerialNo).Count(),
                        HasQty = FqcResultDetail.Count(),
                        PassQty = FqcResultDetail.Where(w => w.StatusNo != "F").Count(),
                        FailQty = FqcResultDetail.Where(w => w.StatusNo == "F").Count()
                    });

                    // 總數
                    query.FirstOrDefault().PassQty += FqcResultDetail.Where(w => w.StatusNo != "F").Count();
                    query.FirstOrDefault().FailQty += FqcResultDetail.Where(w => w.StatusNo == "F").Count();
                }

                // 特殊判斷 
                // 檢查儀器編號 空白時預設帶N/A
                query = query.Select(s =>
                {
                    s.OutfitNo = string.IsNullOrEmpty(s.OutfitNo) ? "N/A" : s.OutfitNo;
                    return s;
                }).ToList();

                // Proved 空白時 抓開立入庫單人員
                foreach (var item in query.Where(w => string.IsNullOrWhiteSpace(w.Proved)))
                {
                    var ByQuery = await _context.FqcInhouseMasters.Where(w => w.InhouseNo == item.InhouseNo && w.SeqID == item.SeqID).FirstOrDefaultAsync();
                    var UserInfo = await _context.UserInfoes.Where(w => w.UserID == ByQuery.CreateUserID).FirstOrDefaultAsync();
                    if (UserInfo != null)
                    {
                        item.Proved = UserInfo.UserNo;
                        item.Proved_Name = UserInfo.UserName;
                    }
                }
            }

            ResultModel<FqcDto> result = new ResultModel<FqcDto>();
            result.Data = query;
            foreach (var item in result.Data)
            {
                item.fqcDetails = FqcDetail.OrderBy(o => o.SerialNo).ToList();
            }
            return result;
        }

        /// <summary>
        /// 更新入庫單
        /// </summary>
        /// <param name="fqcInhouseMaster"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<FqcInhouseMaster>> PutFqcInhouseMaster(FqcInhouseMaster fqcInhouseMaster)
        {
            ResultModel<FqcInhouseMaster> result = new ResultModel<FqcInhouseMaster>();
            _context.Entry(fqcInhouseMaster).State = EntityState.Modified;
            _context.Entry<FqcInhouseMaster>(fqcInhouseMaster).Property("CreateDate").IsModified = false;
            _context.Entry<FqcInhouseMaster>(fqcInhouseMaster).Property("CreateUserID").IsModified = false;
            fqcInhouseMaster.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="fqcInhouseMaster"></param>
        /// <returns></returns>
        [HttpPut("PutForCritID")]
        public async Task<ResultModel<FqcInhouseMaster>> PutFqcInhouseMasterForCritID(FqcInhouseMaster fqcInhouseMaster)
        {
            ResultModel<FqcInhouseMaster> result = new ResultModel<FqcInhouseMaster>();
            var data = await _context.FqcInhouseMasters.Where(w => w.InhouseNo == fqcInhouseMaster.InhouseNo &&
                                                                   w.SeqID == fqcInhouseMaster.SeqID).FirstOrDefaultAsync();
            data.CritID = fqcInhouseMaster.CritID;
            _context.Entry(data).State = EntityState.Modified;
            _context.Entry<FqcInhouseMaster>(data).Property("CritID").IsModified = true;

            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="fqcInhouseMaster"></param>
        /// <returns></returns>
        [HttpPut("PutForLocationNo")]
        public async Task<ResultModel<FqcInhouseMaster>> PutFqcInhouseMasterForLocationNo(FqcInhouseMaster fqcInhouseMaster)
        {
            ResultModel<FqcInhouseMaster> result = new ResultModel<FqcInhouseMaster>();
            var data = await _context.FqcInhouseMasters.Where(w => w.InhouseNo == fqcInhouseMaster.InhouseNo &&
                                                                   w.SeqID == fqcInhouseMaster.SeqID).FirstOrDefaultAsync();
            data.LocationNo = fqcInhouseMaster.LocationNo;
            _context.Entry(data).State = EntityState.Modified;
            _context.Entry<FqcInhouseMaster>(data).Property("LocationNo").IsModified = true;

            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";

                await _context.Database.ExecuteSqlInterpolatedAsync
                ($" UPDATE JHAMES.WAREHOUSEING SET LOCATION_NO={fqcInhouseMaster.LocationNo} WHERE INHOUSE_NO={fqcInhouseMaster.InhouseNo} AND SEQ_ID={fqcInhouseMaster.SeqID}");
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 新增入庫單
        /// </summary>
        /// <param name="fqcInhouseMaster"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<FqcInhouseMaster>> PostFqcInhouseMaster(FqcInhouseMaster fqcInhouseMaster)
        {
            ResultModel<FqcInhouseMaster> result = new ResultModel<FqcInhouseMaster>();

            try
            {
                _context.FqcInhouseMasters.Add(fqcInhouseMaster);
                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="no">入庫單號</param>
        /// <param name="seq">順序</param>
        /// <returns></returns>
        [HttpDelete("{no}/{seq}")]
        public async Task<ResultModel<string>> DeleteFqcInhouseMaster(string no, int seq)
        {
            ResultModel<string> result = new ResultModel<string>();
            var fqcInhouseMaster = await _context.FqcInhouseMasters.FindAsync(no, seq);

            try
            {
                if (fqcInhouseMaster == null)
                {
                    result.Success = false;
                    result.Msg = "找不到要刪除資料";
                }
                else
                {
                    _context.FqcInhouseMasters.Remove(fqcInhouseMaster);
                    await _context.SaveChangesAsync();
                    result.Success = true;
                    result.Msg = "OK";
                }
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        //YIRU ADD  -----------------------------------------------------------------------------------------------------------------------------------------------
        /// <summary>
        /// FQC查詢 by Table
        /// </summary>
        /// <param name="barcodeNo">內部序號</param>
        /// <param name="wipNo">工單號碼</param>
        /// <param name="boxNo">外箱號碼</param>
        /// <param name="inhouseNo">入庫單號碼</param>
        /// <param name="date_str">入庫時間起</param>
        /// <param name="date_end">入庫時間迄</param>
        /// <param name="status">是否已入庫Y/N/ALL</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet("FqcInhouseMasterMultiQuery")]
        public async Task<ResultModel<FqcInhouseMaster_WareDto>> GetFqcInhouseMasteMultiQuery(string barcodeNo, string wipNo, string boxNo
          , string inhouseNo, string date_str, string date_end, string status, int page = 0, int limit = 10)
        {
            IQueryable<FqcInhouseMaster_WareDto> q = from q1 in _context.FqcInhouseMasters
                                                     join q2 in _context.FqcInhouseDetails on new { q1.InhouseNo, q1.SeqID } equals new { q2.InhouseNo, q2.SeqID }
                                                     join q2_1 in _context.WipBoxs on q2.SerialNo equals q2_1.BoxNo
                                                     join q3 in _context.FqcResultMasters on q1.InhouseNo equals q3.InhouseNo
                                                     join q4 in _context.WareHouseings on new { q2.InhouseNo, q2.SeqID, q2.SerialNo } equals new { q4.InhouseNo, q4.SeqID, q4.SerialNo } into q2q4
                                                     from q402 in q2q4.DefaultIfEmpty()
                                                     select new FqcInhouseMaster_WareDto
                                                     {
                                                         InhouseNo = q1.InhouseNo,
                                                         SeqID = q1.SeqID,
                                                         WipNo = q1.WipNo,
                                                         ItemNo = q1.ItemNo,
                                                         ModelNo = q1.ModelNo,
                                                         SerialNo = q2.SerialNo,
                                                         StatusName = q1.Status,
                                                         ProTypeName = q1.ProType,
                                                         CreateDate = q1.CreateDate,
                                                         EndTime = q3.EndTime,
                                                         RecordNumber = q402.RecordNumber,
                                                         RecordDate = q402.Create_Date,
                                                         LocationNo = q1.LocationNo,
                                                         BoxQty = q2_1.BoxCnt.ToString()
                                                     };
            //q1.Status == "P" ? "允收" : q1.Status == "R" ? "批退" : "未驗收完成",
            //IQueryable <FqcInhouseDetail> q1 = _context.FqcInhouseDetails;
            if (!string.IsNullOrWhiteSpace(inhouseNo))
                q = q.Where(w => w.RecordNumber == inhouseNo);

            if (!string.IsNullOrWhiteSpace(wipNo))
                q = q.Where(w => w.WipNo == wipNo);

            if (!string.IsNullOrWhiteSpace(status) || status != "ALL")
            // q = q.Where(w => w.StatusName == status);
            {
                if (status == "N")
                    q = q.Where(w => w.RecordNumber == null);
                else if (status == "Y")
                    q = q.Where(w => w.RecordNumber != null);
            }


            // 優先用內部序號取出包裝序號
            if (!string.IsNullOrWhiteSpace(barcodeNo))
            {
                BarcodeInfoesController barcodeInfoesController = new BarcodeInfoesController(_context);
                var q1 = await barcodeInfoesController.GetBarcodeInfoesByNo(barcodeNo);
                if (q1.Value.Count() != 0)
                {
                    boxNo = q1.Value.FirstOrDefault().BoxNo;
                }
            }

            if (!string.IsNullOrWhiteSpace(boxNo))
            {
                q = q.Where(w => w.SerialNo == boxNo);
            }

            if (DateTime.TryParse(date_str, out _))
            {
                q = q.Where(w => w.RecordDate >= DateTime.Parse(date_str));
            }

            if (DateTime.TryParse(date_end, out _))
            {
                q = q.Where(w => w.RecordDate <= DateTime.Parse(date_end));
            }
            q = q.Where(w => w.StatusName == "P");
            ResultModel<FqcInhouseMaster_WareDto> result = new ResultModel<FqcInhouseMaster_WareDto>();

            // 紀錄筆數
            result.DataTotal = q.Count();

            // Table 頁數
            if (page > 0)
            {
                q = q.Skip((page - 1) * limit).Take(limit);
            }
            result.Data = await q.ToListAsync();

            // 判斷結束時間
            result.Data = result.Data.Select(s => { s.EndTime = s.StatusName == "A" ? null : s.EndTime; return s; })
             .ToList();

            // 修改狀態名稱
            result.Data = result.Data.Select(s => { s.StatusName = s.StatusName == "P" ? "允收" : s.StatusName == "R" ? "批退" : "未驗收完成"; return s; })
                          .ToList();

            return result;
        }


        /// <summary>
        /// FQC查詢 by 安勤
        /// </summary>
        /// <param name="barcodeNo">內部序號</param>
        /// <param name="wipNo">工單號碼</param>
        /// <param name="boxNo">外箱號碼</param>
        /// <param name="inhouseNo">入庫單號碼</param>
        /// <param name="date_str">入庫時間起</param>
        /// <param name="date_end">入庫時間迄</param>
        /// <param name="status">是否已入庫Y/N/ALL</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet("FqcInhouseMasterMultiQuery_Avalue")]
        public async Task<ResultModel<FqcInhouseMaster_WareDto>> GetFqcInhouseMasteMultiQuery_Avalue(string barcodeNo, string wipNo, string boxNo
          , string inhouseNo, string date_str, string date_end, string status, int page = 0, int limit = 10)
        {
            IQueryable<FqcInhouseMaster_WareDto> q = from q1 in _context.FqcInhouseMasters.Where(w => w.ItemNo.StartsWith("EV"))
                                                     join q2 in _context.FqcInhouseDetails on new { q1.InhouseNo, q1.SeqID } equals new { q2.InhouseNo, q2.SeqID }
                                                     join q2_1 in _context.WipBoxs on q2.SerialNo equals q2_1.BoxNo
                                                     join q3 in _context.FqcResultMasters on q1.InhouseNo equals q3.InhouseNo
                                                     join q4 in _context.WareHouseings on new { q2.InhouseNo, q2.SeqID, q2.SerialNo } equals new { q4.InhouseNo, q4.SeqID, q4.SerialNo } into q2q4
                                                     from q402 in q2q4.DefaultIfEmpty()
                                                     select new FqcInhouseMaster_WareDto
                                                     {
                                                         InhouseNo = q1.InhouseNo,
                                                         SeqID = q1.SeqID,
                                                         WipNo = q1.WipNo,
                                                         ItemNo = q1.ItemNo,
                                                         ModelNo = q1.ModelNo,
                                                         SerialNo = q2.SerialNo,
                                                         StatusName = q1.Status,
                                                         ProTypeName = q1.ProType,
                                                         CreateDate = q1.CreateDate,
                                                         EndTime = q3.EndTime,
                                                         RecordNumber = q402.RecordNumber,
                                                         RecordDate = q402.Create_Date,
                                                         LocationNo = q1.LocationNo,
                                                         BoxQty = q2_1.BoxCnt.ToString()
                                                     };
            //q1.Status == "P" ? "允收" : q1.Status == "R" ? "批退" : "未驗收完成",
            //IQueryable <FqcInhouseDetail> q1 = _context.FqcInhouseDetails;
            if (!string.IsNullOrWhiteSpace(inhouseNo))
                q = q.Where(w => w.RecordNumber == inhouseNo);

            if (!string.IsNullOrWhiteSpace(wipNo))
                q = q.Where(w => w.WipNo == wipNo);

            if (!string.IsNullOrWhiteSpace(status) || status != "ALL")
            // q = q.Where(w => w.StatusName == status);
            {
                if (status == "N")
                    q = q.Where(w => w.RecordNumber == null);
                else if (status == "Y")
                    q = q.Where(w => w.RecordNumber != null);
            }


            // 優先用內部序號取出包裝序號
            if (!string.IsNullOrWhiteSpace(barcodeNo))
            {
                BarcodeInfoesController barcodeInfoesController = new BarcodeInfoesController(_context);
                var q1 = await barcodeInfoesController.GetBarcodeInfoesByNo(barcodeNo);
                if (q1.Value.Count() != 0)
                {
                    boxNo = q1.Value.FirstOrDefault().BoxNo;
                }
            }

            if (!string.IsNullOrWhiteSpace(boxNo))
            {
                q = q.Where(w => w.SerialNo == boxNo);
            }

            if (DateTime.TryParse(date_str, out _))
            {
                q = q.Where(w => w.RecordDate >= DateTime.Parse(date_str));
            }

            if (DateTime.TryParse(date_end, out _))
            {
                q = q.Where(w => w.RecordDate <= DateTime.Parse(date_end));
            }
            q = q.Where(w => w.StatusName == "P");
            ResultModel<FqcInhouseMaster_WareDto> result = new ResultModel<FqcInhouseMaster_WareDto>();

            // 紀錄筆數
            result.DataTotal = q.Count();

            // Table 頁數
            if (page > 0)
            {
                q = q.Skip((page - 1) * limit).Take(limit);
            }
            result.Data = await q.ToListAsync();

            // 判斷結束時間
            result.Data = result.Data.Select(s => { s.EndTime = s.StatusName == "A" ? null : s.EndTime; return s; })
             .ToList();

            // 修改狀態名稱
            result.Data = result.Data.Select(s => { s.StatusName = s.StatusName == "P" ? "允收" : s.StatusName == "R" ? "批退" : "未驗收完成"; return s; })
                          .ToList();

            return result;
        }


        //YIRU End  -----------------------------------------------------------------------------------------------------------------------------------------------

        private bool FqcInhouseMasterExists(string id)
        {
            return _context.FqcInhouseMasters.Any(e => e.InhouseNo == id);
        }
    }
}