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.CommonTools.Result;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.WebApi.Extensions;
using Dapper;
using System.Data;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 條碼變更資料表
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class BarcodeInfoesController : ControllerBase
    {
        private readonly AMESContext _context;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        public BarcodeInfoesController(AMESContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 获取全部條碼资料
        /// </summary>
        /// <returns></returns>
        // GET: api/BarcodeInfoes
        [HttpGet]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoes()
        {
            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.OrderBy(p => p.BarcodeID);

            var BarcodeInfoes = await q.ToListAsync();
            return BarcodeInfoes;
            //return await _context.BarcodeInfoes.ToListAsync();
        }

        /// <summary>
        /// 用ID获取该條碼资料
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        // GET: api/BarcodeInfoes/5
        [HttpGet("{id}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoes(int id)
        {

            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.Where(p => p.BarcodeID.Equals(id));
            var barcodeInfo = await q.ToListAsync();

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

            return barcodeInfo;
        }

        /// <summary>
        /// 用No获取该條碼资料
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        // GET: api/BarcodeInfoes/5
        [HttpGet("No/{id}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoesByNo(string id)
        {

            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.Where(p => p.BarcodeNo.Trim().ToUpper() == id.Trim().ToUpper());
            var barcodeInfo = await q.ToListAsync();

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

            return barcodeInfo;
        }

        /// <summary>
        /// 查詢工單站別在製條碼數量
        /// </summary>
        /// <returns></returns>
        [Route("[action]")]
        [HttpGet]
        public async Task<ResultModel<dynamic>> GetWipQty4QRS009(int wipID, int stationID, int page = 0, int limit = 10)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();
            var q = from q1 in _context.BarcodeInfoes
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.LineInfoes on q2.LineID equals q3.LineID
                    select new
                    {
                        q1.BarcodeID,
                        q1.WipID,
                        q1.StationID,
                        q1.BarcodeNo,
                        q3.LineDesc,
                        q1.RuleStatus,
                        q1.SysType,
                        q1.CreateDate,
                        q1.UpdateDate
                    };

            q = q.Where(w => w.WipID == wipID && w.StationID == stationID);

            q = q.OrderBy(w => w.BarcodeNo);

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

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

            result.Data = await q.ToListAsync();

            if (result == null)
            {
                result.Msg = "查無資料";
                result.Success = false;
                return result;
            }

            result.Success = true;
            result.Msg = "OK";
            return result;
        }

        /// <summary>
        /// 查詢工單站別在製條碼資料
        /// </summary>
        /// <returns></returns>
        [Route("[action]")]
        [HttpGet]
        public async Task<ResultModel<dynamic>> GetWipBarcode4QRS009(int wipID, int stationID, int page = 0, int limit = 10)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();
            var q = from q1 in _context.BarcodeInfoes
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.LineInfoes on q2.LineID equals q3.LineID
                    join q5 in _context.BarcodeStation on new { q1.BarcodeID, q1.WipID, q1.StationID, q1.RuleStatus } equals new { q5.BarcodeID, q5.WipID, q5.StationID, q5.RuleStatus }
                    join q4 in _context.UserInfoes on q5.CreateUserID equals q4.UserID
                    select new
                    {
                        q1.BarcodeID,
                        q1.WipID,
                        q1.StationID,
                        q1.BarcodeNo,
                        q3.LineDesc,
                        q1.RuleStatus,
                        q1.SysType,
                        q1.CreateDate,
                        q1.UpdateDate,
                        q4.UserName
                    };

            q = q.Where(w => w.WipID == wipID && w.StationID == stationID);

            q = q.OrderBy(w => w.BarcodeNo);

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

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

            result.Data = await q.ToListAsync();

            if (result == null)
            {
                result.Msg = "查無資料";
                result.Success = false;
                return result;
            }

            result.Success = true;
            result.Msg = "OK";
            return result;
        }

        /// <summary>
        /// 查詢未結轉條碼資料
        /// </summary>
        /// <returns></returns>
        [Route("[action]")]
        [HttpGet]
        public async Task<ResultModel<dynamic>> GetBarcode4DataCarrier(int page = 1, int limit = 200)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();
            var q = from q1 in _context.BarcodeInfoes
                    orderby q1.UpdateDate
                    join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                    join q3 in _context.WipAtts on q2.WipNO equals q3.WipNO
                    select new
                    {
                        q1.BarcodeID,
                        q1.BarcodeNo,
                        q1.ExtraBarcodeNo,
                        q1.BoxNo,
                        q1.LocationID,
                        q1.StatusID,
                        q1.WipID,
                        q2.WipNO,
                        q2.RelatedWONO,
                        q3.ItemNO,
                        q3.ModelNO,
                        q1.StationID,
                        q1.RuleStatus,
                        q1.SysType,
                        q1.UpdateDate
                    };

            q = q.Where(w => w.ExtraBarcodeNo.Length > 0 && w.BoxNo.Length > 0 && w.LocationID == -1 && w.StatusID == -1 && w.RelatedWONO.Length > 0 && w.ItemNO.StartsWith("EV"));

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

            //Table 頁數
            if (page > 0)
            {
                q = q.OrderBy(p => p.UpdateDate).Skip((page - 1) * limit).Take(limit);
            }
            else
            {
                q = q.OrderBy(p => p.UpdateDate);
            }

            result.Data = await q.ToListAsync();

            if (result == null)
            {
                result.Msg = "查無資料";
                result.Success = false;
                return result;
            }

            result.Success = true;
            result.Msg = "OK";
            return result;
        }


        /// <summary>
        /// 更新結轉標記,1成功,0安勤查無工單不更新
        /// </summary>
        /// <param name="barcodeID"></param>
        /// <param name="locationID"></param>
        /// <returns></returns>
        [HttpPut("UpdateBarcode4DataCarrier/{barcodeID}/{locationID}")]
        public async Task<ResultModel<dynamic>> UpdateBarcode4DataCarrier(int barcodeID, int locationID)
        {
            Helper helper = new Helper(_context);
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            try
            {
                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET LOCATION_ID={locationID},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={barcodeID}");
                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>
        // GET: api/BarcodeInfoes/5
        [HttpGet("ByWipNo/{id}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoesByWipNo(string id)
        {
            var barcodeInfo = new List<BarcodeInfo>();

            WipInfosController wipInfosController = new WipInfosController(_context);

            var q1 = await wipInfosController.GetWipInfoByWipNo(id);

            if (q1.Value.Count() != 0)
            {
                IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
                q = q.Where(p => q1.Value.Select(s => s.WipID).Contains(p.WipID));
                barcodeInfo = await q.ToListAsync();
            }
            return barcodeInfo;
        }

        /// <summary>
        /// 用客戶序號找條碼资料
        /// </summary>
        /// <param name="extraNo">客戶序號</param>
        /// <returns></returns>
        [HttpGet("ByExtraNo/{extraNo}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoesByExtraNo(string extraNo)
        {
            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.Where(p => p.ExtraBarcodeNo.Trim().ToUpper() == extraNo.Trim().ToUpper());
            var barcodeInfo = await q.ToListAsync();
            return barcodeInfo;
        }

        /// <summary>
        /// 用包裝箱號获取该條碼资料
        /// </summary>
        /// <param name="boxNo">包裝箱號</param>
        /// <returns></returns>
        // GET: api/BarcodeInfoes/5
        [HttpGet("ByBoxNo/{boxNo}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoesByBoxNo(string boxNo)
        {
            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.Where(p => p.BoxNo.Trim().ToUpper() == boxNo.Trim().ToUpper());
            var barcodeInfo = await q.ToListAsync();

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

            return barcodeInfo;
        }

        /// <summary>
        /// 用工單ID找條碼资料
        /// </summary>
        /// <param name="id">工單ID</param>
        /// <returns></returns>
        [HttpGet("ByWipID/{id}")]
        public async Task<ActionResult<IEnumerable<BarcodeInfo>>> GetBarcodeInfoesByWipID(int id)
        {
            IQueryable<BarcodeInfo> q = _context.BarcodeInfoes;
            q = q.Where(p => p.WipID == id);
            var barcodeInfo = await q.ToListAsync();
            return barcodeInfo;
        }

        /// <summary>
        /// 用工單ID找條碼资料
        /// </summary>
        /// <param name="id">工單ID</param>
        /// <returns></returns>
        [HttpGet("DapperByWipID/{id}")]
        public ActionResult<IEnumerable<BarcodeInfo>> GetBarcodeInfoesDapperByWipID(int id)
        {
            var query = @$" SELECT BARCODE_ID as BarcodeID , BARCODE_NO as BarcodeNo ,
                            STATUS_NO as StatusNo , EXTRA_BARCODE_NO as ExtraBarcodeNo , LOCATION_ID as LocationID ,
                            STATION_ID as StationID , RULE_STATUS as RuleStatus , WIP_ID as WipID , BOX_NO as BoxNo ,
                            SYSTYPE as SysType , STATUS_ID as StatusID , CREATE_USERID as CreateUserID , CREATE_DATE as CreateDate ,
                            UPDATE_DATE as UpdateDate
                            FROM JHAMES.BARCODE_INFO WHERE WIP_ID = :id";

            DynamicParameters p = new DynamicParameters();
            p.Add("id", id, DbType.Int32);
            var q = _context.Database.DapperQuery<BarcodeInfo>(query, p);
            return q.ToList();
        }



        /// <summary>
        /// 用序號List找條碼资料
        /// </summary>
        /// <param name="id">序號List</param>
        /// <returns></returns>
        [HttpPost("DapperByListBarcodeNO")]
        public ActionResult<IEnumerable<BarcodeInfo>> GetBarcodeInfoesDapperByListNO([FromBody] List<string> id)
        {
            if (id.Count() > 0)
            {
                var query = @$" SELECT BARCODE_ID as BarcodeID , BARCODE_NO as BarcodeNo ,
                            STATUS_NO as StatusNo , EXTRA_BARCODE_NO as ExtraBarcodeNo , LOCATION_ID as LocationID ,
                            STATION_ID as StationID , RULE_STATUS as RuleStatus , WIP_ID as WipID , BOX_NO as BoxNo ,
                            SYSTYPE as SysType , STATUS_ID as StatusID , CREATE_USERID as CreateUserID , CREATE_DATE as CreateDate ,
                            UPDATE_DATE as UpdateDate
                            FROM JHAMES.BARCODE_INFO WHERE (";
                var queryConditions = new List<string>();
                foreach (var item in id)
                {
                    // 构建查询条件,并将它们添加到列表中
                    queryConditions.Add($"BARCODE_NO = '{item}'");
                }

                // 使用逻辑运算符将查询条件组合成一个完整的查询
                query += string.Join(" OR ", queryConditions);
                query += " )";
                DynamicParameters p = new DynamicParameters();
                var q = _context.Database.DapperQuery<BarcodeInfo>(query, p);

                return q.ToList();
            }
            else
            {
                List<BarcodeInfo> q = new List<BarcodeInfo>();
                return q.ToList();


            }
        }


        /// <summary>
        /// 用序號ID List找條碼资料
        /// </summary>
        /// <param name="id">序號List</param>
        /// <returns></returns>
        [HttpPost("DapperByListBarcodeID")]
        public ActionResult<IEnumerable<BarcodeInfo>> GetBarcodeInfoesDapperByListID([FromBody] List<string> id)
        {

            var query = @$" SELECT BARCODE_ID as BarcodeID , BARCODE_NO as BarcodeNo ,
                            STATUS_NO as StatusNo , EXTRA_BARCODE_NO as ExtraBarcodeNo , LOCATION_ID as LocationID ,
                            STATION_ID as StationID , RULE_STATUS as RuleStatus , WIP_ID as WipID , BOX_NO as BoxNo ,
                            SYSTYPE as SysType , STATUS_ID as StatusID , CREATE_USERID as CreateUserID , CREATE_DATE as CreateDate ,
                            UPDATE_DATE as UpdateDate
                            FROM JHAMES.BARCODE_INFO WHERE (";
            var queryConditions = new List<string>();
            foreach (var item in id)
            {
                // 构建查询条件,并将它们添加到列表中
                queryConditions.Add($"BARCODE_ID = '{item}'");
            }

            // 使用逻辑运算符将查询条件组合成一个完整的查询
            query += string.Join(" OR ", queryConditions);
            query += " )";
            DynamicParameters p = new DynamicParameters();
            var q = _context.Database.DapperQuery<BarcodeInfo>(query, p);

            return q.ToList();
        }

        /// <summary>
        /// 條碼批次查詢
        /// </summary>
        /// <param name="wipNo">工單號碼</param>
        /// <param name="itemNo">料號</param>
        /// <param name="unit">生產單位</param>
        /// <param name="lineID">線別</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet("BarcodeInfoByPCS022")]
        public async Task<ResultModel<BarcodeInfoDto>> GetBarcodeInfoByPCS022(string wipNo, string itemNo,
          string unit, int lineID, int page = 0, int limit = 10)
        {
            ResultModel<BarcodeInfoDto> result = new ResultModel<BarcodeInfoDto>();
            try
            {
                var barcodeInfos = new List<BarcodeInfo>();
                // 查詢工單號碼
                if (!string.IsNullOrWhiteSpace(wipNo))
                {
                    var wipID = _context.WipInfos.Where(w => w.WipNO == wipNo.Trim().ToUpper() && w.StatusNO != "E").Select(s => s.WipID).ToList();
                    barcodeInfos = await _context.BarcodeInfoes.Where(w => wipID.Contains(w.WipID)).ToListAsync();
                }
                // 查詢料號
                else if (!string.IsNullOrWhiteSpace(itemNo))
                {
                    var wipAtt = _context.WipAtts.Where(w => w.ItemNO == itemNo.Trim().ToUpper()).Select(s => s.WipNO).ToList();
                    var wipID = await _context.WipInfos.Where(w => wipAtt.Contains(w.WipNO) && w.StatusNO != "E").Select(s => s.WipID).ToListAsync();
                    barcodeInfos = await _context.BarcodeInfoes.Where(w => wipID.Contains(w.WipID)).ToListAsync();
                }

                var q = from q1 in barcodeInfos.Where(w => w.RuleStatus != "S" && w.RuleStatus != "F" && w.StationID != 1000)
                        join q2 in _context.Stationses on q1.StationID equals q2.StationID
                        join q3 in _context.WipInfos on q1.WipID equals q3.WipID
                        join q4 in _context.LineInfoes on q3.LineID equals q4.LineID
                        join q5 in _context.FactoryUnits on q3.UnitNO equals q5.UnitNo
                        select new BarcodeInfoDto
                        {
                            WipID = q1.WipID,
                            WipNo = q3.WipNO,
                            WipQty = q3.PlanQTY,
                            StationID = q1.StationID,
                            StationName = q2.StationName,
                            InputQty = 0,
                            LineName = q4.LineDesc,
                            LineID = q4.LineID,
                            Unit = q5.UnitNo,
                            UnitName = q5.UnitName,
                            WipType = q3.WipType
                        };

                // 查詢生產單位
                if (!string.IsNullOrWhiteSpace(unit))
                {
                    q = q.Where(w => w.Unit == unit).ToList();
                }

                // 查詢生產單位
                if (lineID != 0)
                {
                    q = q.Where(w => w.LineID == lineID).ToList();
                }

                // Group

                q = q.GroupBy(g => new
                {
                    g.WipID,
                    g.WipNo,
                    g.WipQty,
                    g.LineID,
                    g.LineName,
                    g.StationName,
                    g.StationID,
                    g.Unit,
                    g.UnitName
                })
                    .Select(s => new BarcodeInfoDto
                    {
                        WipNo = s.Key.WipNo,
                        WipQty = s.Key.WipQty,
                        WipID = s.Key.WipID,
                        StationName = s.Key.StationName,
                        StationID = s.Key.StationID,
                        LineID = s.Key.LineID,
                        LineName = s.Key.LineName,
                        Unit = s.Key.Unit,
                        UnitName = s.Key.UnitName,
                        InputQty = s.Count(),
                        ItemNo = _context.WipAtts.Where(w => w.WipNO == s.Key.WipNo).FirstOrDefault().ItemNO
                    }).ToList();

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

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

                result.Data = q.ToList();
                result.Success = true;
                return result;
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.Message;
                return result;
            }
        }

        /// <summary>
        /// 更新條碼资料
        /// </summary>
        /// <param name="barcodeInfo"></param>
        /// <returns></returns>
        // PUT: api/BarcodeInfoes/5
        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://go.microsoft.com/fwlink/?linkid=2123754.
        [HttpPut]
        public async Task<ResultModel<BarcodeInfo>> PutBarcodeInfoes([FromBody] BarcodeInfo barcodeInfo)
        {
            ResultModel<BarcodeInfo> result = new ResultModel<BarcodeInfo>();

            _context.Entry(barcodeInfo).State = EntityState.Modified;
            //設置容器空間某一個模型的某一個欄位 不提交到資料庫
            _context.Entry<BarcodeInfo>(barcodeInfo).Property("CreateDate").IsModified = false;
            _context.Entry<BarcodeInfo>(barcodeInfo).Property("CreateUserID").IsModified = false;
            barcodeInfo.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="barcodeID"></param>
        /// <param name="ExtaNO"></param>
        /// <returns></returns>
        [HttpPut("UpdateBarcodeExtraNo/{barcodeNo}/{ExtaNO}")]
        public async Task<ResultModel<dynamic>> UpdateBarcodeExtraNo(string barcodeNo, string ExtaNO)
        {
            Helper helper = new Helper(_context);
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            try
            {

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET Extra_Barcode_no={ExtaNO},UPDATE_DATE={DateTime.Now} WHERE BARCODE_No={barcodeNo}");
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }

            return result;
        }

        /// <summary>
        /// 更新箱號
        /// </summary>
        /// <param name="barcodeID"></param>
        /// <param name="BoxNO"></param>
        /// <returns></returns>
        [HttpPut("UpdateBarcodeBoxNO/{barcodeNo}/{BoxNO}")]
        public async Task<ResultModel<dynamic>> UpdateBarcodeBoxNO(string barcodeNo, string BoxNO)
        {
            Helper helper = new Helper(_context);
            ResultModel<dynamic> result = new ResultModel<dynamic>();

            try
            {

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET Extra_Barcode_no={BoxNO},UPDATE_DATE={DateTime.Now} WHERE BARCODE_No={barcodeNo}");
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }

            return result;
        }


        /// <summary>
        /// 新增條碼资料
        /// </summary>
        /// <param name="barcodeInfo"></param>
        /// <returns></returns>
        // POST: api/BarcodeInfoes
        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://go.microsoft.com/fwlink/?linkid=2123754.
        [HttpPost]
        public async Task<ResultModel<BarcodeInfo>> PostBarcodeInfoes([FromBody] BarcodeInfo barcodeInfo)
        {
            ResultModel<BarcodeInfo> result = new ResultModel<BarcodeInfo>();
            Helper helper = new Helper(_context);
            barcodeInfo.BarcodeID = helper.GetIDKey("BARCODE_ID").Result;

            _context.BarcodeInfoes.Add(barcodeInfo);
            List<BarcodeInfo> barcodeInfos = new List<BarcodeInfo>();
            barcodeInfos.Add(barcodeInfo);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
                result.Data = barcodeInfos;
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;

        }

        /// <summary>
        /// 包裝拆箱作業-置換(出貨序號)
        /// </summary>
        /// <param name="oldBarcodeID"></param>
        /// <param name="oldBarcodeNo"></param>
        /// <param name="oldExtraBarcodeNo"></param>
        /// <param name="newBarcodeID"></param>
        /// <param name="newBarcodeNo"></param>
        /// <param name="newExtraBarcodeNo"></param>
        /// <param name="boxNo"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        [HttpPut("DisplaceExtraBarcode4ASM012/{oldBarcodeID}/{oldBarcodeNo}/{oldExtraBarcodeNo}/{newBarcodeID}/{newBarcodeNo}/{newExtraBarcodeNo}/{boxNo}/{userID}")]
        public async Task<ResultModel<BarcodeInfo>> DisplaceExtraBarcode4ASM012(int oldBarcodeID, string oldBarcodeNo, string oldExtraBarcodeNo, int newBarcodeID, string newBarcodeNo, string newExtraBarcodeNo, string boxNo, int userID)
        {
            Helper helper = new Helper(_context);
            ResultModel<BarcodeInfo> result = new ResultModel<BarcodeInfo>();

            try
            {
                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={oldBarcodeNo + "_"},EXTRA_BARCODE_NO={oldExtraBarcodeNo + "_"},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={newBarcodeID}");

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={newBarcodeNo},EXTRA_BARCODE_NO={newExtraBarcodeNo},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={oldBarcodeID}");

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={oldBarcodeNo},EXTRA_BARCODE_NO={oldExtraBarcodeNo},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={newBarcodeID}");

                try
                {
                    BoxChange boxChange = new BoxChange();
                    boxChange.BoxChangeID = helper.GetIDKey("BOX_CHANGE_ID").Result;
                    boxChange.BoxNo = boxNo;
                    boxChange.BarcodeNoOld = oldExtraBarcodeNo;
                    boxChange.BarcodeNoNew = newExtraBarcodeNo;
                    boxChange.ChangeType = "E";
                    boxChange.Memo = "置換";
                    boxChange.CreateUserID = userID;
                    boxChange.CreateDate = DateTime.Now;

                    _context.BoxChanges.Add(boxChange);
                    await _context.SaveChangesAsync();
                }
                catch (Exception e1)
                {
                    result.Msg = e1.Message;
                }

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

        /// <summary>
        /// 包裝拆箱作業-置換
        /// </summary>
        /// <param name="oldBarcodeID"></param>
        /// <param name="oldBarcodeNo"></param>
        /// <param name="oldExtraBarcodeNo"></param>
        /// <param name="newBarcodeID"></param>
        /// <param name="newBarcodeNo"></param>
        /// <param name="newExtraBarcodeNo"></param>
        /// <param name="boxNo"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        [HttpPut("DisplaceBarcode4ASM012/{oldBarcodeID}/{oldBarcodeNo}/{oldExtraBarcodeNo}/{newBarcodeID}/{newBarcodeNo}/{newExtraBarcodeNo}/{boxNo}/{userID}")]
        public async Task<ResultModel<BarcodeInfo>> DisplaceBarcode4ASM012(int oldBarcodeID, string oldBarcodeNo, string oldExtraBarcodeNo, int newBarcodeID, string newBarcodeNo, string newExtraBarcodeNo, string boxNo, int userID)
        {
            Helper helper = new Helper(_context);
            ResultModel<BarcodeInfo> result = new ResultModel<BarcodeInfo>();

            try
            {
                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={oldBarcodeNo + "_"},EXTRA_BARCODE_NO={oldExtraBarcodeNo + "_"},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={newBarcodeID}");

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={newBarcodeNo},EXTRA_BARCODE_NO={newExtraBarcodeNo},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={oldBarcodeID}");

                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BARCODE_NO={oldBarcodeNo},EXTRA_BARCODE_NO={oldExtraBarcodeNo},UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={newBarcodeID}");

                try
                {
                    BoxChange boxChange = new BoxChange();
                    boxChange.BoxChangeID = helper.GetIDKey("BOX_CHANGE_ID").Result;
                    boxChange.BoxNo = boxNo;
                    boxChange.BarcodeNoOld = oldBarcodeNo;
                    boxChange.BarcodeNoNew = newBarcodeNo;
                    boxChange.ChangeType = "P";
                    boxChange.Memo = "置換";
                    boxChange.CreateUserID = userID;
                    boxChange.CreateDate = DateTime.Now;

                    _context.BoxChanges.Add(boxChange);
                    await _context.SaveChangesAsync();
                }
                catch (Exception e1)
                {
                    result.Msg = e1.Message;
                }

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

        /// <summary>
        /// 包裝拆箱作業-刪除
        /// </summary>
        /// <param name="oldBarcodeID"></param>
        /// <param name="oldBarcodeNo"></param>
        /// <param name="boxNo"></param>
        /// <param name="userID"></param>
        /// <returns></returns>
        [HttpPut("DeleteBarcode4ASM012/{oldBarcodeID}/{oldBarcodeNo}/{boxNo}/{userID}")]
        public async Task<ResultModel<BarcodeInfo>> DeleteBarcode4ASM012(int oldBarcodeID, string oldBarcodeNo, string boxNo, int userID)
        {
            Helper helper = new Helper(_context);
            ResultModel<BarcodeInfo> result = new ResultModel<BarcodeInfo>();

            try
            {
                await _context.Database.ExecuteSqlInterpolatedAsync($"UPDATE JHAMES.BARCODE_INFO SET BOX_NO=NULL,UPDATE_DATE={DateTime.Now} WHERE BARCODE_ID={oldBarcodeID}");

                try
                {
                    BoxChange boxChange = new BoxChange();
                    boxChange.BoxChangeID = helper.GetIDKey("BOX_CHANGE_ID").Result;
                    boxChange.BoxNo = boxNo;
                    boxChange.BarcodeNoOld = oldBarcodeNo;
                    boxChange.BarcodeNoNew = oldBarcodeNo;
                    boxChange.ChangeType = "P";
                    boxChange.Memo = "刪除";
                    boxChange.CreateUserID = userID;
                    boxChange.CreateDate = DateTime.Now;

                    _context.BoxChanges.Add(boxChange);
                    await _context.SaveChangesAsync();
                }
                catch (Exception e1)
                {
                    result.Msg = e1.Message;
                }

                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/BarcodeInfoes/5
        [HttpDelete("{id}")]
        public async Task<ActionResult<BarcodeInfo>> DeleteBarcodeInfoes(int id)
        {
            //var repairResponsibleUnits = await _context.BarcodeInfoes.FindAsync(id);
            var barcodeInfo = await _context.BarcodeInfoes.Where(m => m.BarcodeID == id).FirstOrDefaultAsync();
            if (barcodeInfo == null)
            {
                return NotFound();
            }

            _context.BarcodeInfoes.Remove(barcodeInfo);
            await _context.SaveChangesAsync();

            return barcodeInfo;
        }

        //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">抽驗結果</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet("ByBoxNoPCS031Q")]
        public async Task<ResultModel<BoxNO_SNDto>> GetBarcodeInfoesByBoxNoPCS031Q(string boxNo, int page = 0, int limit = 10)
        {

            IQueryable<BoxNO_SNDto> q = from q1 in _context.BarcodeInfoes
                                        join q2 in _context.WipInfos on q1.WipID equals q2.WipID
                                        select new BoxNO_SNDto
                                        {
                                            BarcodeID = q1.BarcodeID,
                                            BarcodeNo = q1.BarcodeNo,
                                            BoxNo = q1.BoxNo,
                                            ExtraBarcodeNo = q1.ExtraBarcodeNo,
                                            StatusNo = q1.StatusNo,
                                            WipNO = q2.WipNO,
                                            StationID = q1.StationID
                                        };

            q = q.Where(w => w.BoxNo == boxNo);


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

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

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

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

        private bool BarcodeInfoesExists(int id)
        {
            return _context.BarcodeInfoes.Any(e => e.BarcodeID == id);
        }
    }
}