增加空托堆叠和空托入货架的新逻辑,增加拆盘入库和回炉胶和废料的逻辑
9个文件已修改
319 ■■■■■ 已修改文件
Program.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_CG_Detail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_TN_SPE.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
process/TaskProcess.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Program.cs
@@ -138,17 +138,19 @@
                tasks.Add(GetTask(Monitor.CheckCntAndBoard));//同步  TN_Container 均要实时显示
                tasks.Add(GetTask(Monitor.CheckNoOkCg));//检测满托缓存库区不合格的物品,满托出库复检
                tasks.Add(GetTask(Monitor.CheckNoOkCg));//检测满托缓存库区不合格的物品,满托出库到复检区,替代了拆盘出库
                //根据S7/Modbus协议判断输送线的信号  原材料产线库区=>满托缓存库区,空托缓存库区=>原材料产线库区
                tasks.Add(GetTask(Monitor.CheckS7Devices));
                tasks.Add(GetTask(Monitor.SynchronizationEquipPro));//同步 TN_EquipProDetail  TN_InventoryM  年月日重量表
                tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 过期合格回库,过期次品回炉
                //tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 过期合格回库,过期次品回炉
                tasks.Add(GetTask(Monitor.CGOkCheck));// 在复检区检测物品合格,合格的物品自动回库
                tasks.Add(GetTask(Monitor.CGNGCheck));// 在复检区检测物品回炉胶还是报废
                //tasks.Add(GetTask(Monitor.XBChekcFull));//线边满托货位自动解绑
                Task.WaitAll(tasks.ToArray());
api/ApiHelper.cs
@@ -202,10 +202,10 @@
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 6)//一级料二级料回库
                else if (model.cgState == 6)//E级料二级料回库
                {
                    cG_Detail.N_ITEM_STATE = 6;
                    cG_Detail.S_ITEM_STATE = "一级料";
                    cG_Detail.S_ITEM_STATE = "E级料";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[2] 
                            && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
@@ -213,7 +213,7 @@
                            && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 7)//一级料二级料回库
                else if (model.cgState == 7)//E级料二级料回库
                {
                    cG_Detail.N_ITEM_STATE = 7;
                    cG_Detail.S_ITEM_STATE = "二级料";
@@ -227,7 +227,7 @@
                else
                {
                    result.resultCode = 6;
                    result.resultMsg = $"物料状态只能为0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料,如果为其他值,则不处理";
                    result.resultMsg = $"物料状态只能为0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料,如果为其他值,则不处理";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -421,7 +421,7 @@
                    if (
                        db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new { it.N_CURRENT_NUM, it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Loc_Container>(locCntList).ExecuteCommand() == 1 &&
                        db.Insertable<TN_Loc_Container>(locCntList).ExecuteCommand() == locCntList.Count &&
                        db.Insertable<TN_Task>(task).ExecuteCommand() == 1
                        )
                    {
@@ -1828,7 +1828,7 @@
                if (model.new_IsOK == model.old_IsOK)
                {
                    result.resultCode = 19;
                    result.resultMsg = $"人工拆盘入库,物料需要一个待检一个不合格";
                    result.resultMsg = $"人工拆盘入库,物料需要一个合格 和 一个不合格(回炉胶或废料)";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -1857,6 +1857,8 @@
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                cG_old_Detail.S_ITEM_SPEC = model.old_Spec;
                cG_old_Detail.S_SPE = model.old_Spec;
                var startLoc_Old = db.Queryable<TN_Location>().
                    First(o => o.S_CODE == model.old_StartLoc && o.N_CURRENT_NUM == 0 && o.S_AREA_CODE == Settings.Areas[5] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无");
@@ -1920,13 +1922,12 @@
                {
                    S_CNTR_CODE = model.new_CntIds,
                    S_BATCH_NO = cG_old_Detail.S_BATCH_NO,
                    S_ITEM_SPEC = cG_old_Detail.S_ITEM_SPEC,
                    S_SPE = cG_old_Detail.S_SPE,
                    S_ITEM_SPEC = model.new_Spec,
                    S_SPE = model.new_Spec,
                    S_ITEM_STATE = LocationHelper.GetStrByOk(model.new_IsOK),
                    N_ITEM_STATE = model.new_IsOK,
                    S_CAR_CODE = cG_old_Detail.S_CAR_CODE,
                    T_MODIFY = System.DateTime.Now,
                    //C_ITEM_MERGE = model.new_CntIds,
                    S_ITEM_CODE = cG_old_Detail.S_ITEM_CODE,
                    S_Separate_ID = cG_old_Detail.S_Separate_ID
                };
@@ -1936,7 +1937,7 @@
                if (db.Queryable<TN_Task>().Count(a => a.N_B_STATE < 3 && a.S_END_LOC == weightPoint) > 2)
                {
                    result.resultCode = 11;
                    result.resultMsg = $"终点称重货位{weightPoint}的正在执行的任务数量大于2";
                    result.resultMsg = $"终点称重货位{weightPoint}的正在执行的任务数量大于2,繁忙,请等待";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -1945,11 +1946,6 @@
                          First(o => o.S_AREA_CODE == Settings.Areas[9]
                          && o.S_CODE == weightPoint);//查询合适的终点货位,去称重
                var endLoc_NG = db.Queryable<TN_Location>().
                          Where(o => o.S_AREA_CODE == Settings.Areas[8]
                          && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无"
                          && SqlFunc.Subqueryable<TN_Loc_Container>().Where(b => b.S_LOC_CODE == o.S_CODE).NotAny()//不能有货
                          && o.N_CURRENT_NUM == 0).First();//查询合适的终点货位
                if (endLoc_Ok == null)
                {
@@ -1959,53 +1955,48 @@
                    return result;
                }
                if (endLoc_NG == null)
                {
                    result.resultCode = 16;
                    result.resultMsg = $"不合格的物料未找到合适的拆盘不合格区终点货位{Settings.Areas[8]}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var taskLog1_Old = $"旧容器号{model.old_CntId},旧容器号的起点{startLoc_Old.S_CODE},终点{endLoc_Ok.S_CODE}";
                var taskLog_New = $"新容器号{model.new_CntIds},新容器号的起点{model.new_StartLoc},终点{endLoc_NG.S_CODE}";
                var taskLog_New = $"新容器号{model.new_CntIds},新容器号的起点{model.new_StartLoc}";
                List<CreateTasks> modesCreateTask = new List<CreateTasks>();
                var newTaskCreate = new CreateTasks()
                if (model.new_IsOK == 0)
                {
                    taskNo = WCSHelper.GenerateTaskNo(),
                    from = model.new_StartLoc,
                    fromArea = startLoc_New.S_AREA_CODE,
                    to = (model.new_IsOK == 2) ? endLoc_NG.S_CODE : endLoc_Ok.S_CODE,
                    toArea = (model.new_IsOK == 2) ? endLoc_NG.S_AREA_CODE : endLoc_Ok.S_AREA_CODE,
                    taskType = (model.new_IsOK == 2) ? "人工拆盘回不合格区" : "人工拆盘回库",
                    pri = 3,
                    cntrInfo = model.new_CntIds,
                    spec = cG_new_Detail_Ins.S_SPE,
                };
                modesCreateTask.Add(newTaskCreate);
                var oldTaskCreate = new CreateTasks()
                    var newTaskCreate = new CreateTasks()
                    {
                        taskNo = WCSHelper.GenerateTaskNo(),
                        from = model.new_StartLoc,
                        fromArea = startLoc_New.S_AREA_CODE,
                        to =  endLoc_Ok.S_CODE,
                        toArea = endLoc_Ok.S_AREA_CODE,
                        taskType = "人工拆盘合格回库",
                        pri = 3,
                        cntrInfo = model.new_CntIds,
                        spec = cG_new_Detail_Ins.S_SPE,
                    };
                    modesCreateTask.Add(newTaskCreate);
                }
                else if (model.old_IsOK == 1)
                {
                    taskNo = WCSHelper.GenerateTaskNo(),
                    from = startLoc_Old.S_CODE,
                    fromArea = startLoc_Old.S_AREA_CODE,
                    to = (model.old_IsOK == 2) ? endLoc_NG.S_CODE : endLoc_Ok.S_CODE,
                    toArea = (model.old_IsOK == 2) ? endLoc_NG.S_AREA_CODE : endLoc_Ok.S_AREA_CODE,
                    taskType = (model.old_IsOK == 2) ? "人工拆盘回不合格区" : "人工拆盘回库",
                    pri = 3,
                    cntrInfo = model.old_CntId,
                    spec = cG_old_Detail.S_SPE,
                };
                modesCreateTask.Add(oldTaskCreate);
                    var newTaskCreate = new CreateTasks()
                    {
                        taskNo = WCSHelper.GenerateTaskNo(),
                        from = model.old_StartLoc,
                        fromArea = startLoc_Old.S_AREA_CODE,
                        to = endLoc_Ok.S_CODE,
                        toArea = endLoc_Ok.S_AREA_CODE,
                        taskType = "人工拆盘合格回库",
                        pri = 3,
                        cntrInfo = model.old_CntId,
                        spec = cG_old_Detail.S_SPE,
                    };
                    modesCreateTask.Add(newTaskCreate);
                }
                startLoc_Old.N_LOCK_STATE = 2;
                startLoc_Old.S_LOCK_STATE = "出库锁";
                startLoc_Old.N_CURRENT_NUM = 1;
                startLoc_New.N_LOCK_STATE = 2;
                startLoc_New.S_LOCK_STATE = "出库锁";
@@ -2041,49 +2032,11 @@
                        if (WCSHelper.CreateTask(modesCreateTask))//创建搬送任务,起点终点容器
                        {
                            tran.CommitTran();
                            LogHelper.Info($"生成人工拆盘入库任务成功," + taskLog_New + taskLog1_Old);
                            LogHelper.Info($"生成人工拆盘合格回库任务成功," + taskLog_New + taskLog1_Old);
                            Task task1 = Task.Run(() =>
                            {
                                WMSHelper.InsertOpInfo(model.staff, "人工拆盘入库", model.new_CntIds + "," + model.old_CntId);
                            });
                            Task task2 = Task.Run(() =>
                            {
                                if (model.old_IsOK == 1)
                                {
                                    var target = new TN_RemeltDetail()
                                    {
                                        TASKNO = oldTaskCreate.taskNo,
                                        CNTCODE = cG_old_Detail.S_CNTR_CODE,
                                        STARTLOC = startLoc_Old.S_CODE,
                                        LOGINNAME = model.staff,
                                        ITEMCODE = cG_old_Detail.S_ITEM_CODE,
                                        SPEC = cG_old_Detail.S_SPE,
                                        CARCODE = cG_old_Detail.S_CAR_CODE,
                                        WEIGHT = cG_old_Detail.F_QTY,
                                        REMELTTIME = DateTime.Now,
                                        SHIFT = model.shift,
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
                                if (model.new_IsOK == 1)
                                {
                                    var target = new TN_RemeltDetail()
                                    {
                                        TASKNO = newTaskCreate.taskNo,
                                        CNTCODE = cG_new_Detail_Ins.S_CNTR_CODE,
                                        STARTLOC = startLoc_New.S_CODE,
                                        LOGINNAME = model.staff,
                                        ITEMCODE = cG_new_Detail_Ins.S_ITEM_CODE,
                                        SPEC = cG_new_Detail_Ins.S_SPE,
                                        CARCODE = cG_new_Detail_Ins.S_CAR_CODE,
                                        WEIGHT = cG_new_Detail_Ins.F_QTY,
                                        REMELTTIME = DateTime.Now,
                                        SHIFT = model.shift,
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
                                WMSHelper.InsertOpInfo(model.staff, "人工拆盘合格回库", model.new_CntIds + "," + model.old_CntId);
                            });
                            Task task27 = Task.Run(() =>
@@ -2126,7 +2079,7 @@
                        {
                            tran.RollbackTran();
                            result.resultCode = 17;
                            result.resultMsg = $"生成人工拆盘入库任务失败," + taskLog_New + taskLog1_Old;
                            result.resultMsg = $"生成人工拆盘合格回库任务失败," + taskLog_New + taskLog1_Old;
                            LogHelper.Info(result.resultMsg);
                            return result;
                        }
@@ -2135,7 +2088,7 @@
                    {
                        tran.RollbackTran();
                        result.resultCode = 18;
                        result.resultMsg = $"生成人工拆盘入库任务失败," + taskLog_New + taskLog1_Old;
                        result.resultMsg = $"生成人工拆盘合格回库任务失败," + taskLog_New + taskLog1_Old;
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
api/ApiModel.cs
@@ -431,18 +431,27 @@
        {
            public string old_CntId { get; set; }//旧容器ID,被拆的
            public string old_StartLoc { get; set; }//旧容器的起点
            /// <summary>
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料、8回炉胶、9废料
            /// </summary>
            public int old_IsOK { get; set; }//旧容器ID,旧容器的货品的
            public string old_Spec { get; set; }//旧容器的货品的规格
            public string old_CarCode { get; set; }//旧容器的货品的车号
            public string new_CntIds { get; set; }//拆后的新容器ID
            public string new_StartLoc { get; set; }//新容器ID起点
            /// <summary>
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
            /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料、8回炉胶、9废料
            /// </summary>
            public int new_IsOK { get; set; }//新容器ID的货品的
            public string new_Spec { get; set; }//新容器的货品的规格
            public string new_CarCode { get; set; }//新容器的货品的车号
            public string staff { get; set; } = "None";//操作人
            public string shift { get; set; } = "None";//班次
        }
core/Monitor.cs
@@ -469,22 +469,38 @@
                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 == "合格"
                    .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("复检区没有合格的物品,无需自动返回");
                    LogHelper.Info("复检区没有合格的或E级料的物品,无需自动返回");
                    return;
                }
                var endLoc = db.Queryable<TN_Location>()
                     .OrderBy(a => a.N_LAYER, OrderByType.Asc)
                    .First(a => a.S_AREA_CODE == Settings.Areas[1]
                .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)
                {
@@ -496,15 +512,15 @@
                    .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))//创建搬送任务,起点终点容器
                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($"生成复检合格自动回库任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    LogHelper.Info($"生成{typename}任务成功,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task99 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo("自动轮询", "复检合格自动回库", cginfo.S_CNTR_CODE);
                        WMSHelper.InsertOpInfo("自动轮询", typename, cginfo.S_CNTR_CODE);
                    });
                    Task task27 = Task.Run(() =>
@@ -528,7 +544,7 @@
                }
                else
                {
                    LogHelper.Info($"生成复检合格自动回库任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    LogHelper.Info($"生成{typename}任务失败,容器号{cginfo.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return;
                }
@@ -536,6 +552,100 @@
            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);
            }
        }
@@ -643,7 +753,7 @@
                    {
                        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);//终点入库锁
@@ -1002,7 +1112,7 @@
        }
        /// <summary>
        /// 检测满托缓存库区不合格的物品,满托出库复检
        /// 检测满托缓存库区不合格的物品,满托出库到复检区,替代了拆盘出库
        /// </summary>
        internal static void CheckNoOkCg()
        {
core/WCSCore.cs
@@ -69,7 +69,11 @@
                                    WCSHelper.Begin(tN_Task, model.forklift_no);//已推送的任务的状态改成执行
                                    Task task4 = Task.Run(() =>
                                    {
                                        if (tN_Task.S_TYPE.Contains("点对点") || tN_Task.S_TYPE.Contains("满托出库上线") || tN_Task.S_TYPE.Contains("满托出库复检"))
                                        if (tN_Task.S_TYPE.Contains("点对点")
                                        || tN_Task.S_TYPE.Contains("满托出库上线")
                                        || tN_Task.S_TYPE.Contains("满托出库复检")
                                        || tN_Task.S_TYPE.Contains("空托")
                                        )
                                        {
                                            //不开启扫码
                                        }
models/TN_CG_Detail.cs
@@ -27,12 +27,12 @@
        public string S_SPE { get; set; }//货品规格
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料、8回炉胶、9废料
        /// </summary>
        public string S_ITEM_STATE { get; set; }//货品状态
        /// <summary>
        ///0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        ///0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料、8回炉胶、9废料
        /// </summary>
        public int N_ITEM_STATE { get; set; }//货品状态_字典
        public string S_BATCH_NO { get; set; }//批次号
models/TN_TN_SPE.cs
@@ -19,6 +19,11 @@
        public string S_SPE { get; set; }
        /// <summary>
        /// 对应的回炉区
        /// </summary>
        public string S_RETURN_AREA { get; set; }
        /// <summary>
        /// 过期时间,单位:小时
        /// </summary>
        public int? N_EXPIRE_TIME { get; set; }
process/TaskProcess.cs
@@ -155,7 +155,11 @@
                    dic.Add(new param() { name = "IKey", value = "IKey" });
                    dic.Add(new param() { name = "From", value = start.ToString() });
                    if (mst.S_TYPE.Contains("点对点") || mst.S_TYPE.Contains("满托出库上线") || mst.S_TYPE.Contains("满托出库复检"))
                    if (mst.S_TYPE.Contains("点对点")
                        || mst.S_TYPE.Contains("满托出库上线")
                        || mst.S_TYPE.Contains("满托出库复检")
                        || mst.S_TYPE.Contains("空托")
                        )
                    {
                        dic.Add(new param() { name = "FUNC", value = "0" });
                    }
wms/LocationHelper.cs
@@ -522,7 +522,7 @@
        }
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,下线即待检,3过期,4技术判定,5混合,6E级料、7二级料
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
@@ -554,7 +554,7 @@
            }
            if (state == 6)
            {
                return "一级料";
                return "E级料";
            }
            if (state == 7)
            {
@@ -610,7 +610,7 @@
        public string rfId { get; set; }//容器号
        /// <summary>
        /// 0合格1待检2不合格,3过期,4技术判定,5混合,6一级料、7二级料
        /// 0合格1待检2不合格,3过期,4技术判定,5混合,6E级料、7二级料
        /// </summary>
        public int cgState { get; set; }//物料状态