杨张扬
2025-06-13 c3202f7d43746c084066d88e58913d85c0173d88
core/Monitor.cs
@@ -350,6 +350,84 @@
        }
        /// <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 == 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();
                if (startLoc== null)
                {
                    LogHelper.Info("复检区没有合格的物品,无需自动返回");
                    return;
                }
                var endLoc = db.Queryable<TN_Location>().First(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()//不能有货
                );
                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, "复检自动合格回库", 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($"生成复检自动合格回库任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task99 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo("自动轮询", "复检自动合格回库", 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 = "无",
                        };
                        SpecHelper.InsertInventoryM(target);
                    });
                    return ;
                }
                else
                {
                    LogHelper.Info($"生成复检自动合格回库任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return;
                }
            }
            catch(Exception ex)
            {
                LogHelper.Error("CGOkCheck发生了异常", ex);
            }
        }
        /// <summary>
        /// 满托过期出库 过期合格回库,过期次品回炉
        /// </summary>
        internal static void FullOutTime()