core/Monitor.cs
@@ -133,8 +133,11 @@
                                            else
                                            {
                                                var endLoc = db.Queryable<TN_Location>().
                                                                           Where(c => c.S_AREA_CODE == Settings.Areas[1] && c.S_LOCK_STATE == "无" && c.N_LOCK_STATE == 0 && c.N_CURRENT_NUM == 0 && c.C_ENABLE == "Y").
                                                                           OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位,直接判断当前数量为0即可
                                                                           Where(c => c.S_AREA_CODE == Settings.Areas[1] && c.S_LOCK_STATE == "无"
                                                                           && c.N_LOCK_STATE == 0 && c.N_CURRENT_NUM == 0
                                                                           && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == c.S_CODE).NotAny()//不能有货
                                                                           && c.C_ENABLE == "Y").
                                                                           OrderBy(o => o.N_LAYER, OrderByType.Asc).First();//查询合适的终点货位,直接判断当前数量为0即可
                                                if (endLoc != null)
                                                {
@@ -179,7 +182,7 @@
                                                    endLoc.N_LOCK_STATE = 1;
                                                    endLoc.S_LOCK_STATE = "入库锁";
                                                    startLoc.T_MODIFY = System.DateTime.Now;
                                                    endLoc.T_MODIFY = System.DateTime.Now;
                                                    using (var tran = db.Ado.UseTran())
                                                    {
@@ -223,6 +226,7 @@
                                                                    ITEMCODE = woInfo.S_ITEM_CODE,
                                                                    LOGINNAME = woInfo.S_LINE_NO,
                                                                    SHIFT = "None",
                                                                    STARTLOC = startLoc.S_CODE,
                                                                };
                                                                SpecHelper.InsertInventoryM(target);
                                                            });
@@ -278,7 +282,7 @@
                            return;
                        }
                        var endLoc = db.Queryable<TN_Location>().
                        var endLoc = db.Queryable<TN_Location>().//空托上线的终点不校验是否有货
                        First(a => a.S_CODE == endPoint.PointIn && a.S_LOCK_STATE == "无" && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y");
                        if (endLoc == null)
@@ -347,6 +351,305 @@
        }
        /// <summary>
        /// 检测原材料产线下线附近是否有空位
        /// </summary>
        internal static void CheckEmptyLoc_YclOutLineArea()
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var endLoc = db.Queryable<TN_Location>().
                Where(o => o.S_AREA_CODE == Settings.Areas[15]
                && o.N_LOCK_STATE == 0
                && o.S_LOCK_STATE == "无"
                && o.C_ENABLE == "Y"
                && o.N_CURRENT_NUM == 0
                && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()
                ).//原材料产线附近空托库区
                First();
                if (endLoc == null)
                {
                    LogHelper.Info($"原材料产线附近空托库区{Settings.Areas[15]},已满,无需再入空托");
                    return;
                }
                var startLoc = db.Queryable<TN_Location>().
                Where(o => o.S_AREA_CODE == Settings.Areas[3]
                && o.N_LOCK_STATE == 0
                && o.S_LOCK_STATE == "无"
                && o.C_ENABLE == "Y"
                && o.N_CURRENT_NUM == o.N_CAPACITY
                && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).Any()
                ).ToList().//空托堆叠库区
                FirstOrDefault();
                if (startLoc == null)
                {
                    startLoc = db.Queryable<TN_Location>().
                    Where(o => o.S_AREA_CODE == Settings.Areas[16]
                    && o.N_LOCK_STATE == 0
                    && o.S_LOCK_STATE == "无"
                    && o.C_ENABLE == "Y"
                    && o.N_CURRENT_NUM == o.N_CAPACITY
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).Any()
                    ).ToList().//空托货架库区
                    FirstOrDefault();
                }
                if (startLoc == null)
                {
                    LogHelper.Info($"检测原材料产线下线附近是否有空位,起点没有找到合适的空托货位,要求有货");
                    return;
                }
                var cntrList = db.Queryable<TN_Loc_Container>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).OrderBy(a => a.T_CREATE, OrderByType.Asc).ToList();
                if (cntrList.Count < 1)
                {
                    LogHelper.Info($"检测原材料产线下线附近是否有空位,起点{startLoc.S_CODE}未找到货位容器关系信息");
                    return;
                }
                string cntrString = "";
                for (int i = 0; i < cntrList.Count; i++)
                {
                    if (i == cntrList.Count - 1)//最后一个字符串连接不加逗号
                    {
                        cntrString += cntrList[i].S_CNTR_CODE;
                    }
                    else
                    {
                        cntrString += cntrList[i].S_CNTR_CODE + ",";
                    }
                }
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, "空托自动上线", 3, cntrString))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"检测原材料产线下线附近是否有空位,生成空托自动上线任务成功,容器:{cntrString},起点:{startLoc.S_CODE}");
                }
                else
                {
                    LogHelper.Info($"检测原材料产线下线附近是否有空位,生成空托自动上线任务失败,容器:{cntrString},起点:{startLoc.S_CODE}");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message, ex);
            }
        }
        /// <summary>
        /// 线边满托货位自动解绑
        /// </summary>
        internal static void XBChekcFull()
        {
            try
            {
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// 在复检区检测物品合格,合格的物品自动回库
        /// </summary>
        internal static void CGOkCheck()
        {
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                var startLoc = db.Queryable<TN_Location>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE)
                    .LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE)
                    .Where((o, i, s) =>
                    s.N_ITEM_STATE == 6 && s.S_ITEM_STATE == "E级料"
                    && o.S_AREA_CODE == Settings.Areas[7] && o.N_CURRENT_NUM > 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                var typename = "复检E级料自动回库";
                if (startLoc == null)
                {
                    startLoc = db.Queryable<TN_Location>()
                     .LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE)
                     .LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE)
                     .Where((o, i, s) =>
                     s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格"
                     && o.S_AREA_CODE == Settings.Areas[7] && o.N_CURRENT_NUM > 0
                     && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                    typename = "复检合格自动回库";
                }
                if (startLoc== null)
                {
                    LogHelper.Info("复检区没有合格的或E级料的物品,无需自动返回");
                    return;
                }
                var endLoc = db.Queryable<TN_Location>()
                .Where(a => a.S_AREA_CODE == Settings.Areas[1]
                && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无"
                && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货
                ).OrderBy(a => a.N_LAYER, OrderByType.Asc).First();
                if (endLoc == null)
                {
                    LogHelper.Info("终点库区已满或者已全部锁住");
                    return;
                }
                var cginfo = db.Queryable<TN_CG_Detail>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CNTR_CODE == i.S_CNTR_CODE)
                    .Where((o, i) => i.S_LOC_CODE == startLoc.S_CODE).First();
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, typename, 3, cginfo.S_CNTR_CODE, out string taskNo, cginfo.S_SPE))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成{typename}任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task99 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo("自动轮询", typename, cginfo.S_CNTR_CODE);
                    });
                    Task task27 = Task.Run(() =>
                    {
                        var target = new TN_InventoryM()
                        {
                            S_ID = cginfo.S_ID,
                            RFID = cginfo.S_CNTR_CODE,
                            SPEC = cginfo.S_SPE,
                            WEIGHT = cginfo.F_QTY,
                            ITEMSTATE = cginfo.S_ITEM_STATE,
                            ITEMCODE = cginfo.S_ITEM_CODE,
                            LOGINNAME = "自动轮询",
                            SHIFT = "无",
                            STARTLOC = startLoc.S_CODE,
                        };
                        SpecHelper.InsertInventoryM(target);
                    });
                    return ;
                }
                else
                {
                    LogHelper.Info($"生成{typename}任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return;
                }
            }
            catch(Exception ex)
            {
                LogHelper.Error("CGOkCheck发生了异常", ex);
            }
        }
        /// <summary>
        /// 在复检区检测物品回炉胶还是报废
        /// </summary>
        public static void CGNGCheck()
        {
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                // 废料直接删除
                var locCntFeiLiao = db.Queryable<TN_CG_Detail>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CNTR_CODE == i.S_CNTR_CODE)
                    .LeftJoin<TN_Location>((o, i, s) => i.S_LOC_CODE == s.S_CODE)
                    .Where((o, i, s) =>
                    o.N_ITEM_STATE == 9 && o.S_ITEM_STATE == "废料"
                    && s.S_AREA_CODE == Settings.Areas[7] && s.N_CURRENT_NUM > 0
                    && s.N_LOCK_STATE == 0 && s.S_LOCK_STATE == "无").First();
                if (locCntFeiLiao != null)
                {
                    var reuslt1 = db.Deleteable<TN_CG_Detail>().Where(a => a.S_CNTR_CODE == locCntFeiLiao.S_CNTR_CODE).ExecuteCommand();
                    var reuslt2 = db.Deleteable<TN_Loc_Container>().Where(a => a.S_CNTR_CODE == locCntFeiLiao.S_CNTR_CODE).ExecuteCommand();
                    LogHelper.Info($"删除了废料{locCntFeiLiao.S_CNTR_CODE},影响的行数:{reuslt1}、{reuslt2}");
                }
                var startLoc = db.Queryable<TN_Location>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CODE == i.S_LOC_CODE)
                    .LeftJoin<TN_CG_Detail>((o, i, s) => i.S_CNTR_CODE == s.S_CNTR_CODE)
                    .Where((o, i, s) =>
                    s.N_ITEM_STATE == 8 && s.S_ITEM_STATE == "回炉胶"
                    && o.S_AREA_CODE == Settings.Areas[7] && o.N_CURRENT_NUM > 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                var typename = "复检区回炉胶自动回炉";
                if (startLoc == null)
                {
                    LogHelper.Info("复检区没有回炉胶,无需自动返回");
                    return;
                }
                var cginfo = db.Queryable<TN_CG_Detail>()
                    .LeftJoin<TN_Loc_Container>((o, i) => o.S_CNTR_CODE == i.S_CNTR_CODE)
                    .Where((o, i) => i.S_LOC_CODE == startLoc.S_CODE).First();
                if (cginfo == null)
                {
                    LogHelper.Info($"未找到起点{startLoc.S_CODE}的物料信息");
                    return;
                }
                var endArea = db.Queryable<TN_TN_SPE>().First(a => a.S_SPE == cginfo.S_SPE || a.S_SPE == cginfo.S_ITEM_SPEC);
                if (endArea == null || string.IsNullOrWhiteSpace(endArea.S_RETURN_AREA))
                {
                    LogHelper.Info($"未找到规格{cginfo.S_SPE}、{cginfo.S_ITEM_SPEC}的规格配置信息,报该物料未配置回炉库区");
                    return;
                }
                var endLoc = db.Queryable<TN_Location>()
                .Where(a => a.S_AREA_CODE == endArea.S_RETURN_AREA
                && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无"
                && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货
                ).OrderBy(a => a.N_LAYER, OrderByType.Asc).First();
                if (endLoc == null)
                {
                    LogHelper.Info($"回炉终点库区{endArea.S_RETURN_AREA}已满或者已全部锁住");
                    return;
                }
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, typename, 3, cginfo.S_CNTR_CODE, out string taskNo, cginfo.S_SPE))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成{typename}任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task99 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo("自动轮询", typename, cginfo.S_CNTR_CODE);
                    });
                    return;
                }
                else
                {
                    LogHelper.Info($"生成{typename}任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("CGNGCheck发生了异常", ex);
            }
        }
        /// <summary>
        /// 满托过期出库 过期合格回库,过期次品回炉
        /// </summary>
        internal static void FullOutTime()
@@ -366,8 +669,9 @@
                if (startLoc_1 != null)
                {
                    var endLoc_1 = db.Queryable<TN_Location>()
                        .First(o => o.S_AREA_CODE == Settings.Areas[12] &&
                        o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无");
                        .Where(o => o.S_AREA_CODE == Settings.Areas[12]
                         && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货
                        && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                    if (endLoc_1 != null)
                    {
@@ -378,11 +682,6 @@
                            LocationHelper.LockLoc(startLoc_1.S_CODE, 2);//起点出库锁,
                            LocationHelper.LockLoc(endLoc_1.S_CODE, 1);//终点入库锁
                            LogHelper.Info($"生成满托过期出库任务成功,容器号{outTimeCg.S_CNTR_CODE},起点{startLoc_1.S_CODE},终点{endLoc_1.S_CODE}");
                            Task task27 = Task.Run(() =>
                            {
                                SpecHelper.DeleteInventoryM(outTimeCg.S_ID);
                            });
                        }
                    }
                }
@@ -399,8 +698,10 @@
                if (startLoc_2 != null)
                {
                    var endLoc_2 = db.Queryable<TN_Location>()
                     .First(o => o.S_AREA_CODE == Settings.Areas[2] &&
                     o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无");
                     .Where(o => o.S_AREA_CODE == Settings.Areas[2]
                      && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货
                     && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无")
                     .First();
                    if (endLoc_2 != null)
                    {
@@ -423,6 +724,7 @@
                                    ITEMCODE = outTimeCg.S_ITEM_CODE,
                                    LOGINNAME = "过期合格回库轮询",
                                    SHIFT = "None",
                                    STARTLOC = startLoc_2.S_CODE,
                                };
                                SpecHelper.InsertInventoryM(target);
                            });
@@ -443,14 +745,15 @@
                if (startLoc_3 != null)
                {
                    var endLoc_3 = db.Queryable<TN_Location>()
                     .First(o => o.S_AREA_CODE == Settings.Areas[11] &&
                     o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无");
                     .Where(o => o.S_AREA_CODE == Settings.Areas[11]
                     && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货
                     && o.N_CURRENT_NUM == 0 && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                    if (endLoc_3 != null)
                    {
                        var cntCode = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == startLoc_3.S_CODE);
                        var outTimeCg = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == cntCode.S_CNTR_CODE);
                        if (WCSHelper.CreateTask(startLoc_3.S_CODE, endLoc_3.S_CODE, "过期次品回炉", 3, outTimeCg.S_CNTR_CODE,out string taskno, outTimeCg.S_SPE))
                        if (WCSHelper.CreateTask(startLoc_3.S_CODE, endLoc_3.S_CODE, "过期次品回炉", 3, outTimeCg.S_CNTR_CODE, out string taskno, outTimeCg.S_SPE))
                        {
                            LocationHelper.LockLoc(startLoc_3.S_CODE, 2);//起点出库锁,
                            LocationHelper.LockLoc(endLoc_3.S_CODE, 1);//终点入库锁
@@ -513,9 +816,13 @@
                    db.Updateable<TN_EquipProDetail>(targetEPD).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand();
                    var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetEPD.S_ID);
                    cginfo.S_ITEM_STATE = "过期";
                    cginfo.N_ITEM_STATE = 3;
                    db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                    if (cginfo != null)
                    {
                        cginfo.S_ITEM_STATE = "过期";
                        cginfo.N_ITEM_STATE = 3;
                        db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                    }
                }
                // 同步 TN_InventoryM 与 TN_CG_Detail
@@ -528,34 +835,48 @@
                    db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand();
                }
                targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                   Where((o, i) => System.DateTime.Now >= o.EXPIRATION && i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1).First();
                   Where((o, i) => System.DateTime.Now >= o.EXPIRATION
                  && ((i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1)
                   || (i.S_ITEM_STATE == "合格" && i.N_ITEM_STATE == 0))
                   ).First();
                if (targetInM != null)//检测出已过期的货品
                {
                    targetInM.ITEMSTATE = "过期";
                    targetInM.EXPIRATION_DAY = 0;
                    targetInM.EXPIRATION_DAY = "0";
                    db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand();
                    var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetInM.S_ID);
                    cginfo.S_ITEM_STATE = "过期";
                    cginfo.N_ITEM_STATE = 3;
                    db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                    if (cginfo != null)
                    {
                        cginfo.S_ITEM_STATE = "过期";
                        cginfo.N_ITEM_STATE = 3;
                        db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                    }
                }
                targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                 Where((o, i) => System.DateTime.Now < o.EXPIRATION && i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1).First();
               var targetInMList = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                 Where((o, i) => System.DateTime.Now < o.EXPIRATION
                   && ((i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1)
                   || (i.S_ITEM_STATE == "合格" && i.N_ITEM_STATE == 0))
                 ).ToList();
                if (targetInM != null)//检测出快过期的货品
                if (targetInMList.Count > 0)//检测出快过期的货品
                {
                    targetInM.EXPIRATION_DAY = SpecHelper.CalculateDaysDifference(System.DateTime.Now,targetInM.EXPIRATION);
                    db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.EXPIRATION_DAY }).ExecuteCommand();
                    foreach (var item in targetInMList)
                    {
                        item.EXPIRATION_DAY = SpecHelper.CalculateDaysDifference(System.DateTime.Now, item.EXPIRATION).ToString();
                    }
                    db.Updateable<TN_InventoryM>(targetInMList).UpdateColumns(it => new { it.EXPIRATION_DAY }).ExecuteCommand();
                }
                targetInM = db.Queryable<TN_InventoryM>().First(a => a.EXPIRATION_DAY > 0 && a.ITEMSTATE == "过期");//已过期的货品,剩余天数改为0
                if (targetInM != null)
                targetInM = db.Queryable<TN_InventoryM>().First(a => Convert.ToInt32(a.EXPIRATION_DAY) > 0 && a.ITEMSTATE == "过期");
                if (targetInM != null)//已过期的货品,剩余天数改为0
                {
                    targetInM.EXPIRATION_DAY = 0;
                    targetInM.EXPIRATION_DAY = "0";
                    db.Updateable<TN_InventoryM>(targetInM).UpdateColumns(it => new { it.EXPIRATION_DAY }).ExecuteCommand();
                }
@@ -590,14 +911,14 @@
                            }
                            else
                            {
                                LogHelper.Info("重量相等,同步TN_DayProDetail跳过");
                                //LogHelper.Info("重量相等,同步TN_DayProDetail跳过");
                            }
                        }
                    }
                }
                else
                {
                    LogHelper.Info("当天的货品规格列表为0,同步TN_DayProDetail跳过");
                    //LogHelper.Info("当天的货品规格列表为0,同步TN_DayProDetail跳过");
                }
                // 同步 TN_WeekProSpcDetail
@@ -628,14 +949,14 @@
                            }
                            else
                            {
                                LogHelper.Info("重量相等,同步TN_WeekProSpcDetail跳过");
                                //LogHelper.Info("重量相等,同步TN_WeekProSpcDetail跳过");
                            }
                        }
                    }
                }
                else
                {
                    LogHelper.Info("当周的货品规格列表为0,同步TN_WeekProSpcDetail跳过");
                    //LogHelper.Info("当周的货品规格列表为0,同步TN_WeekProSpcDetail跳过");
                }
                // 同步 TN_MonthProSpcDetail
@@ -666,14 +987,14 @@
                            }
                            else
                            {
                                LogHelper.Info("重量相等,同步TN_MonthProSpcDetail跳过");
                                //LogHelper.Info("重量相等,同步TN_MonthProSpcDetail跳过");
                            }
                        }
                    }
                }
                else
                {
                    LogHelper.Info("当月的货品规格列表为0,同步TN_MonthProSpcDetail跳过");
                    //LogHelper.Info("当月的货品规格列表为0,同步TN_MonthProSpcDetail跳过");
                }
                // 同步 TN_YearProSpcDetail
@@ -705,19 +1026,34 @@
                            }
                            else
                            {
                                LogHelper.Info("重量相等,同步TN_YearProSpcDetail跳过");
                                //LogHelper.Info("重量相等,同步TN_YearProSpcDetail跳过");
                            }
                        }
                    }
                }
                else
                {
                    LogHelper.Info("当年的货品规格列表为0,同步TN_YearProSpcDetail跳过");
                    //LogHelper.Info("当年的货品规格列表为0,同步TN_YearProSpcDetail跳过");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"发生了异常,同步TN_EquipProDetail异常,{ex.Message}", ex);
                // 获取最内层异常(通常是实际引发问题的异常)
                Exception innerEx = ex;
                while (innerEx.InnerException != null)
                {
                    innerEx = innerEx.InnerException;
                }
                // 获取堆栈帧信息
                var stackTrace = new System.Diagnostics.StackTrace(innerEx, true);
                var stackFrame = stackTrace.GetFrame(0); // 获取最顶层的堆栈帧
                // 获取文件名和行号
                string fileName = stackFrame.GetFileName();
                int lineNumber = stackFrame.GetFileLineNumber();
                LogHelper.Error($"发生了异常,同步TN_EquipProDetail异常,文件:{fileName}, 行号:{lineNumber}, 错误:{ex.Message}\r\n{ex.StackTrace}", ex);
            }
        }
@@ -776,7 +1112,7 @@
        }
        /// <summary>
        /// 检测满托缓存库区不合格的物品,满托出库复检
        /// 检测满托缓存库区不合格的物品,满托出库到复检区,替代了拆盘出库
        /// </summary>
        internal static void CheckNoOkCg()
        {
@@ -797,7 +1133,11 @@
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.S_AREA_CODE == Settings.Areas[7]);
                var endLoc = db.Queryable<TN_Location>()
                    .Where(a => a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无"
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()//不能有货
                    && a.S_AREA_CODE == Settings.Areas[7]).First();
                if (endLoc == null)
                {
                    LogHelper.Info($"未找到合适的终点货位,要求a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == 无 && a.S_AREA_CODE == Settings.Areas[7]");
@@ -819,11 +1159,6 @@
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成满托出库复检任务成功,容器:{cntId.S_CNTR_CODE},起点:{startLoc.S_CODE},终点:{endLoc.S_CODE}");
                    Task task27 = Task.Run(() =>
                    {
                         SpecHelper.DeleteInventoryM(cgInfo.S_ID);
                    });
                }
                else
                {
@@ -858,9 +1193,29 @@
                }
                var endLoc = db.Queryable<TN_Location>().
                    Where(a => a.S_AREA_CODE == Settings.Areas[4] && a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0).
                    OrderBy(a => a.N_CURRENT_NUM, OrderByType.Asc).
                    First();
                    Where(a => a.S_AREA_CODE == Settings.Areas[15] && a.N_LOCK_STATE == 0
                    && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()
                    ).First();//先找 原材料产线附近空托库区
                if (endLoc == null)
                {
                    endLoc = db.Queryable<TN_Location>().
                    Where(a => a.S_AREA_CODE == Settings.Areas[16] && a.N_LOCK_STATE == 0
                    && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()
                    ).First();
                }// 再找 空托货架库区
                if (endLoc == null)
                {
                    endLoc = db.Queryable<TN_Location>().
                    Where(a => a.S_AREA_CODE == Settings.Areas[4] && a.N_LOCK_STATE == 0
                    && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y" && a.N_CURRENT_NUM == 0
                    && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == a.S_CODE).NotAny()
                    ).First();
                }// 最后找 空托缓存库区
                if (endLoc == null)
                {