杨张扬
2025-05-15 ba51d2ed8f5d96c7d86da68ef2c966d9c17f299f
双钱-AGV软件文件变更
19个文件已修改
942 ■■■■■ 已修改文件
Program.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 372 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/MoboxController.cs 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 234 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_CG_Detail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Component_Detail.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_DayProDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_EquipProDetail.cs 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_InventoryM.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_MonthProDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_RemeltDetail.cs 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_SurplusDetail.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_WeekProDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_YearProDetail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/SpecHelper.cs 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/WMSHelper.cs 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Program.cs
@@ -143,7 +143,7 @@
                tasks.Add(GetTask(Monitor.SynchronizationEquipPro));//同步 TN_EquipProDetail  TN_InventoryM
                tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 满托过期回库,满托过期回炉
                tasks.Add(GetTask(Monitor.FullOutTime));//满托过期出库 过期合格回库,过期次品回炉
                Task.WaitAll(tasks.ToArray());
            }
api/ApiHelper.cs
@@ -116,13 +116,13 @@
        }
        /// <summary>
        /// PDA满托抽检判断
        /// PDA满托复检判断
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult PDAFullCheckIn(PDAFullCheckInfo model)
        {
            LogHelper.Info("触发API:PDA满托抽检判断" + JsonConvert.SerializeObject(model), "API");
            LogHelper.Info("触发API:PDA满托复检判断" + JsonConvert.SerializeObject(model), "API");
            var db = new SqlHelper<object>().GetInstance();
            var result = new SimpleResult();//返回结果
            try
@@ -150,7 +150,7 @@
                if (startLoc == null)
                {
                    result.resultCode = 3;
                    result.resultMsg = $"起点货位{locCnt.S_LOC_CODE}未解锁,或者不属于抽检区";
                    result.resultMsg = $"起点货位{locCnt.S_LOC_CODE}未解锁,或者不属于复检区";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -164,6 +164,14 @@
                            Where(o => o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 4)//技术合格回库
                {
                    cG_Detail.N_ITEM_STATE = 4;
                    cG_Detail.S_ITEM_STATE = "技术合格";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[8] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 2)//不合格回炉
                {
                    cG_Detail.N_ITEM_STATE = 2;
@@ -172,10 +180,18 @@
                            Where(o => o.S_AREA_CODE == Settings.Areas[8] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else if (model.cgState == 5)//混合也回库,通过点对点再发线边
                {
                    cG_Detail.N_ITEM_STATE = 5;
                    cG_Detail.S_ITEM_STATE = "混合";
                    endLoc = db.Queryable<TN_Location>().
                            Where(o => o.S_AREA_CODE == Settings.Areas[2] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y" && o.N_CURRENT_NUM == 0).
                            OrderBy(o => o.T_MODIFY, OrderByType.Asc).First();//查询合适的终点货位
                }
                else
                {
                    result.resultCode = 6;
                    result.resultMsg = $"物料状态只能为0或2,即参数cgState = 2 或 = 0,如果为其他值,则不处理,0合格,2不合格";
                    result.resultMsg = $"物料状态只能为0、2、4、5,如果为其他值,则不处理,0合格,2不合格,4技术合格,5混合";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
@@ -188,7 +204,9 @@
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var typeName = (model.cgState == 0) ? "人工抽检回库" : "人工抽检回炉";
                var typeName = (model.cgState == 0) ? "人工复检回库" : "人工复检回炉";
                //创建人工拆盘出库任务
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, typeName, 3, locCnt.S_CNTR_CODE,out string taskNo,cG_Detail.S_SPE))//创建搬送任务,起点终点容器
                {
@@ -209,17 +227,36 @@
                        {
                            var target = new TN_RemeltDetail()
                            {
                                CntCode = locCnt.S_CNTR_CODE,
                                StartLoc = startLoc.S_CODE,
                                LoginName = model.staff,
                                ItemCode = cG_Detail.S_ITEM_CODE,
                                Spec = cG_Detail.S_SPE,
                                CarCode = cG_Detail.S_CAR_CODE,
                                Weight = cG_Detail.F_QTY,
                                RemeltTime = DateTime.Now,
                                TaskNo = taskNo
                                CNTCODE = locCnt.S_CNTR_CODE,
                                STARTLOC = startLoc.S_CODE,
                                LOGINNAME = model.staff,
                                ITEMCODE = cG_Detail.S_ITEM_CODE,
                                SPEC = cG_Detail.S_SPE,
                                CARCODE = cG_Detail.S_CAR_CODE,
                                WEIGHT = cG_Detail.F_QTY,
                                REMELTTIME = DateTime.Now,
                                TASKNO = taskNo
                            };
                            SpecHelper.InsertRemeltDetail(target);
                        }
                    });
                    Task task27 = Task.Run(() =>
                    {
                        if (model.cgState != 2)
                        {
                            var target = new TN_InventoryM()
                            {
                                S_ID = cG_Detail.S_ID,
                                RFID = cG_Detail.S_CNTR_CODE,
                                SPEC = cG_Detail.S_SPE,
                                WEIGHT = cG_Detail.F_QTY,
                                ITEMSTATE = cG_Detail.S_ITEM_STATE,
                                ITEMCODE = cG_Detail.S_ITEM_CODE,
                                LOGINNAME = model.staff,
                                SHIFT = "None",
                            };
                            SpecHelper.InsertInventoryM(target);
                        }
                    });
@@ -234,7 +271,6 @@
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
            }
            catch (Exception ex)
            {
@@ -365,18 +401,34 @@
                            WMSHelper.InsertOpInfo(model.staff, "人工次品回炉", locCnt.S_CNTR_CODE);
                        });
                        Task task2 = Task.Run(() =>
                        {
                            var target = new TN_RemeltDetail()
                            {
                                TASKNO = task1.S_CODE,
                                CNTCODE = model.rfId,
                                STARTLOC = model.startLoc,
                                LOGINNAME = model.staff,
                                ITEMCODE = cgInfo.S_ITEM_CODE,
                                SPEC = cgInfo.S_SPE,
                                CARCODE = cgInfo.S_CAR_CODE,
                                WEIGHT = cgInfo.F_QTY,
                                REMELTTIME = DateTime.Now
                            };
                            SpecHelper.InsertRemeltDetail(target);
                        });
                        tran.CommitTran();
                        result.resultCode = 0;
                        result.resultMsg = "成功";
                        LogHelper.Info($"生成满托下线入库任务成功,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}");
                        LogHelper.Info($"生成人工次品回炉任务成功,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}");
                        return result;
                    }
                    else
                    {
                        tran.RollbackTran();
                        result.resultCode = 7;
                        result.resultMsg = $"生成满托下线入库任务失败,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}";
                        result.resultMsg = $"生成人工次品回炉任务失败,容器:{model.rfId},起点:{model.startLoc},终点:{endLoc.S_CODE}";
                        LogHelper.Info(result.resultMsg);
                        return result;
                    }
@@ -386,7 +438,7 @@
            catch(Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"发生了异常:{ex.Message}";
                result.resultMsg = $"生成人工次品回炉任务失败,发生了异常:{ex.Message}";
                LogHelper.Info(result.resultMsg);
                return result;
            }
@@ -722,16 +774,16 @@
                                                    var target = new TN_EquipProDetail()
                                                    {
                                                        S_ID = tN_CG_Detail.S_ID,
                                                        TaskType = "PDA满托下线入库",
                                                        TASKTYPE = "PDA满托下线入库",
                                                        RFID = model.RfId,
                                                        Spec = woInfo.S_ITEM_SPEC,
                                                        CarCode = model.CarCode,
                                                        Weight = modelWeight,
                                                        ItemState = "待检",
                                                        ItemCode = woInfo.S_ITEM_CODE,
                                                        LoginName = model.staff,
                                                        Shift = "None",
                                                        StartLoc = startLoc.S_CODE,
                                                        SPEC = woInfo.S_ITEM_SPEC,
                                                        CARCODE = model.CarCode,
                                                        WEIGHT = modelWeight,
                                                        ITEMSTATE = "待检",
                                                        ITEMCODE = woInfo.S_ITEM_CODE,
                                                        LOGINNAME = model.staff,
                                                        SHIFT = "None",
                                                        STARTLOC = startLoc.S_CODE,
                                                    };
                                                    SpecHelper.InsertEquipProDetail(target);
                                                });
@@ -742,12 +794,12 @@
                                                    {
                                                        S_ID = tN_CG_Detail.S_ID,
                                                        RFID = model.RfId,
                                                        Spec = woInfo.S_ITEM_SPEC,
                                                        Weight = modelWeight,
                                                        ItemState = "待检",
                                                        ItemCode = woInfo.S_ITEM_CODE,
                                                        LoginName = model.staff,
                                                        Shift = "None",
                                                        SPEC = woInfo.S_ITEM_SPEC,
                                                        WEIGHT = modelWeight,
                                                        ITEMSTATE = "待检",
                                                        ITEMCODE = woInfo.S_ITEM_CODE,
                                                        LOGINNAME = model.staff,
                                                        SHIFT = "None",
                                                    };
                                                    SpecHelper.InsertInventoryM(target);
                                                });
@@ -923,16 +975,28 @@
                var waitTime = SpecHelper.GetWaitTime(model.Spe);
                //查询符合规格的物料所在的未锁定已启用指定货区的货位,起点
                //优先技术合格
                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) => o.N_CURRENT_NUM > 0 && o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y"
                    && (s.S_ITEM_SPEC == model.Spe || s.S_SPE == model.Spe)//指定规格
                    && s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格" //合格的
                    && s.T_MODIFY.AddMinutes(waitTime) <= System.DateTime.Now).//根据规格的不同静置不同分钟才能出库
                    OrderBy((o, i, s) => s.T_CREATE, OrderByType.Asc).//先进先出
                    && s.N_ITEM_STATE == 4 && s.S_ITEM_STATE == "技术合格"). //技术合格
                    First();//筛选有容器货位关系表信息,筛选有容器货品明细表信息
                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) => o.N_CURRENT_NUM > 0 && o.S_AREA_CODE == Settings.Areas[1] && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无" && o.C_ENABLE == "Y"
                       && (s.S_ITEM_SPEC == model.Spe || s.S_SPE == model.Spe)//指定规格
                       && s.N_ITEM_STATE == 0 && s.S_ITEM_STATE == "合格" //合格的
                       && s.T_MODIFY.AddMinutes(waitTime) <= System.DateTime.Now).//根据规格的不同静置不同分钟才能出库
                       OrderBy((o, i, s) => s.T_CREATE, OrderByType.Asc).//先进先出
                       First();//筛选有容器货位关系表信息,筛选有容器货品明细表信息
                }
                if (startLoc == null)
                {
@@ -970,15 +1034,21 @@
                    {
                        var target = new TN_Component_Detail()
                        {
                           ItemCode = cgInfo.S_ITEM_CODE,
                           CntrCode = container,
                           EndLoc = endLoc.S_CODE,
                           Staff = model.staff,
                           Weight = cgInfo.F_QTY,
                           Spec = model.Spe,
                           TaskNo = taskNo,
                           ITEMCODE = cgInfo.S_ITEM_CODE,
                           CNTRCODE = container,
                           CARCODE = cgInfo.S_CAR_CODE,
                           ENDLOC = endLoc.S_CODE,
                           STAFF = model.staff,
                           WEIGHT = cgInfo.F_QTY,
                           SPEC = model.Spe,
                           TASKNO = taskNo,
                        };
                        SpecHelper.InsertComponentDetail(target);
                    });
                    Task task27 = Task.Run(() =>
                    {
                        SpecHelper.DeleteInventoryM(cgInfo.S_ID);
                    });
                }
                else
@@ -1215,17 +1285,33 @@
                    {
                        var target = new TN_SurplusDetail()
                        {
                            CntCode = model.cntID,
                            StartLoc = startLoc_New.S_CODE,
                            LoginName = model.staff,
                            ItemCode = cG_Detail.S_ITEM_CODE,
                            Spec = cG_Detail.S_SPE,
                            CarCode = cG_Detail.S_CAR_CODE,
                            Weight = cG_Detail.F_QTY,
                            RemeltTime = DateTime.Now,
                            TaskNo = taksNo
                            CNTCODE = model.cntID,
                            STARTLOC = startLoc_New.S_CODE,
                            LOGINNAME = model.staff,
                            ITEMCODE = cG_Detail.S_ITEM_CODE,
                            SPEC = cG_Detail.S_SPE,
                            CARCODE = cG_Detail.S_CAR_CODE,
                            WEIGHT = cG_Detail.F_QTY,
                            REMELTTIME = DateTime.Now,
                            TASKNO = taksNo
                        };
                        SpecHelper.InsertSurplusDetail(target);
                    });
                    Task task27 = Task.Run(() =>
                    {
                        var target = new TN_InventoryM()
                        {
                            S_ID = cG_Detail.S_ID,
                            RFID = cG_Detail.S_CNTR_CODE,
                            SPEC = cG_Detail.S_SPE,
                            WEIGHT = cG_Detail.F_QTY,
                            ITEMSTATE = cG_Detail.S_ITEM_STATE,
                            ITEMCODE = cG_Detail.S_ITEM_CODE,
                            LOGINNAME = model.staff,
                            SHIFT = "None",
                        };
                        SpecHelper.InsertInventoryM(target);
                    });
                }
                else
@@ -1432,7 +1518,7 @@
                var locCntrRel_New1 = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.new_CntIds);
                if (locCntrRel_New1 != null)
                {
                    LocationHelper.ErrorLocCntReset(new ErrorLocCntResetInfo() { cntID = model.new_CntIds ,reqCode=2});
                    LocationHelper.PdaUnBind(new PdaUnBindInfo() { cntID = model.new_CntIds ,reqCode=1});
                    result.resultCode = 6;
                    result.resultMsg = $"拆分后的新托盘存在残留的货位容器关系表,已解绑重置,容器号{model.new_CntIds},货位{locCntrRel_New1.S_LOC_CODE}";
                    LogHelper.Info(result.resultMsg);
@@ -1441,7 +1527,7 @@
                var locCntrRel_Old1 = db.Queryable<TN_Loc_Container>().First(a => a.S_CNTR_CODE == model.old_CntId);
                if (locCntrRel_Old1 != null)
                {
                    LocationHelper.ErrorLocCntReset(new ErrorLocCntResetInfo() { cntID = model.old_CntId, reqCode = 2 });
                    LocationHelper.PdaUnBind(new PdaUnBindInfo() { cntID = model.old_CntId, reqCode = 1 });
                    result.resultCode = 6;
                    result.resultMsg = $"被拆的旧托盘存在残留的货位容器关系表,已解绑重置,容器号{model.old_CntId},货位{locCntrRel_Old1.S_LOC_CODE}";
                    LogHelper.Info(result.resultMsg);
@@ -1599,15 +1685,15 @@
                                {
                                    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
                                        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
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
@@ -1615,17 +1701,51 @@
                                {
                                    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
                                        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
                                    };
                                    SpecHelper.InsertRemeltDetail(target);
                                }
                            });
                            Task task27 = Task.Run(() =>
                            {
                                if (model.old_IsOK == 1)
                                {
                                    var target = new TN_InventoryM()
                                    {
                                        S_ID = cG_old_Detail.S_ID,
                                        RFID = cG_old_Detail.S_CNTR_CODE,
                                        SPEC = cG_old_Detail.S_SPE,
                                        WEIGHT = cG_old_Detail.F_QTY,
                                        ITEMSTATE = cG_old_Detail.S_ITEM_STATE,
                                        ITEMCODE = cG_old_Detail.S_ITEM_CODE,
                                        LOGINNAME = model.staff,
                                        SHIFT = "None",
                                    };
                                    SpecHelper.InsertInventoryM(target);
                                }
                                if (model.new_IsOK == 1)
                                {
                                    var target = new TN_InventoryM()
                                    {
                                        S_ID = cG_new_Detail_Ins.S_ID,
                                        RFID = cG_new_Detail_Ins.S_CNTR_CODE,
                                        SPEC = cG_new_Detail_Ins.S_SPE,
                                        WEIGHT = cG_new_Detail_Ins.F_QTY,
                                        ITEMSTATE = cG_new_Detail_Ins.S_ITEM_STATE,
                                        ITEMCODE = cG_new_Detail_Ins.S_ITEM_CODE,
                                        LOGINNAME = model.staff,
                                        SHIFT = "None",
                                    };
                                    SpecHelper.InsertInventoryM(target);
                                }
                            });
                        }
@@ -1658,5 +1778,111 @@
            return result;
        }
        /// <summary>
        /// 人工创建点到点任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult CreateP2PTask(CreateP2PTaskInfo model)
        {
            LogHelper.Info("触发API:人工创建点到点任务" + JsonConvert.SerializeObject(model), "API");
            var result = new SimpleResult();
            var db = new SqlHelper<object>().GetInstance();
            try
            {
                var startLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.startLoc);
                if(!(startLoc != null && startLoc.N_CURRENT_NUM > 0 && startLoc.N_LOCK_STATE == 0 && startLoc.S_LOCK_STATE == "无"))
                {
                    result.resultCode = 1;
                    result.resultMsg = $"起始位置{model.startLoc}不满足条件:startLoc != null && startLoc.N_CURRENT_NUM > 0 && startLoc.N_LOCK_STATE == 0 && startLoc.S_LOCK_STATE == 无";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var endLoc = db.Queryable<TN_Location>().First(a => a.S_CODE == model.endLoc);
                if (!(endLoc != null && endLoc.N_CURRENT_NUM == 0 && endLoc.N_LOCK_STATE == 0 && endLoc.S_LOCK_STATE == "无"))
                {
                    result.resultCode = 2;
                    result.resultMsg = $"终点位置{model.endLoc}不满足条件:endLoc != null && endLoc.N_CURRENT_NUM == 0 && endLoc.N_LOCK_STATE == 0 && endLoc.S_LOCK_STATE == 无";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                var startLocCnt = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == model.startLoc);
                if (startLocCnt == null)
                {
                    result.resultCode = 3;
                    result.resultMsg = $"起始位置{model.startLoc}未绑定容器";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
                //创建点对点任务
                if (WCSHelper.CreateTask(startLoc.S_CODE, endLoc.S_CODE, "点对点", 3, startLocCnt.S_CNTR_CODE))//创建搬送任务,起点终点容器
                {
                    LocationHelper.LockLoc(startLoc.S_CODE, 2);//起点出库锁,
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成点对点任务成功,容器号{startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    Task task1 = Task.Run(() =>
                    {
                        WMSHelper.InsertOpInfo(model.staff, "点对点", startLocCnt.S_CNTR_CODE);
                    });
                    var cginfo = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == startLocCnt.S_CNTR_CODE);
                    Task task27 = Task.Run(() =>
                    {
                        if (endLoc.S_AREA_CODE == Settings.Areas[2] && cginfo != null)
                        {
                            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 = model.staff,
                                SHIFT = "None",
                            };
                            SpecHelper.InsertInventoryM(target);
                        }
                    });
                    Task task26 = Task.Run(() =>
                    {
                        if (startLoc.S_AREA_CODE == Settings.Areas[2] && cginfo != null)
                        {
                            SpecHelper.DeleteInventoryM(cginfo.S_ID);
                        }
                    });
                    result.resultCode = 0;
                    result.resultMsg =  "成功";
                    LogHelper.Info($"生成点对点失败,容器号{ startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}");
                    return result;
                }
                else
                {
                    result.resultCode = 9;
                    result.resultMsg = $"生成点对点失败,容器号{ startLocCnt.S_CNTR_CODE},起点{startLoc.S_CODE},终点{endLoc.S_CODE}";
                    LogHelper.Info(result.resultMsg);
                    return result;
                }
            }
            catch (Exception ex)
            {
                result.resultCode = -1;
                result.resultMsg = $"人工创建点到点任务,发生了异常,{ex.Message}";
                LogHelper.Error(result.resultMsg, ex);
                return result;
            }
        }
    }
}
api/ApiModel.cs
@@ -435,7 +435,7 @@
            public int new_IsOK { get; set; }//新容器ID的货品的0合格1不合格?
            public string staff { get; set; } = "None";//操作人
        }
        public class UpCgDetailModel
        {
            public string cntID { get; set; }//容器ID
@@ -444,5 +444,12 @@
            public string staff { get; set; } = "None";//操作人
        }
        public class CreateP2PTaskInfo
        {
            public string startLoc { get; set; }//起点
            public string endLoc { get; set; }//终点
            public string staff { get; set; } = "None";//操作人
        }
    }
}
api/MoboxController.cs
@@ -48,12 +48,12 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("UpCgDetailModel")]
        public SimpleResult UpCgDetailModel(UpCgDetailModel model)
        {
            return ApiHelper.UpCgDetailModel(model);
        }
        //[HttpPost]
        //[Route("UpCgDetailModel")]
        //public SimpleResult UpCgDetailModel(UpCgDetailModel model)
        //{
        //    return ApiHelper.UpCgDetailModel(model);
        //}
        /// <summary>
        /// 满托出库上线
@@ -120,24 +120,26 @@
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("EmptyUnBind")]
        public SimpleResult EmptyUnBind(EmptyUnBindInfo model)
        {
            return LocationHelper.EmptyUnBind(model);
        }
        //[HttpPost]
        //[Route("EmptyUnBind")]
        //public SimpleResult EmptyUnBind(EmptyUnBindInfo model)
        //{
        //    return LocationHelper.EmptyUnBind(model);
        //}
        /// <summary>
        /// 人工手动PDA解绑:删除货位/容器/货品三方信息,1=解绑货位与容器,2=解绑容器与货品
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("PdaUnBind")]
        public SimpleResult PdaUnBind(PdaUnBindInfo model)
        {
            return LocationHelper.PdaUnBind(model);
        }
        //[HttpPost]
        //[Route("PdaUnBind")]
        //public SimpleResult PdaUnBind(PdaUnBindInfo model)
        //{
        //    return LocationHelper.PdaUnBind(model);
        //}
        /// <summary>
        /// 人工手动PDA取消任务:1=发给AGV取消任务
@@ -176,7 +178,7 @@
        //}
        /// <summary>
        /// PDA满托抽检判断
        /// PDA满托复检判断
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
@@ -210,5 +212,17 @@
        {
            return ApiHelper.PDAReturnReset(model);
        }
        /// <summary>
        /// 人工创建点到点任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("CreateP2PTask")]
        public SimpleResult CreateP2PTask(CreateP2PTaskInfo model)
        {
            return ApiHelper.CreateP2PTask(model);
        }
    }
}
core/Monitor.cs
@@ -197,16 +197,16 @@
                                                                var target = new TN_EquipProDetail()
                                                                {
                                                                    S_ID = tN_CG_Detail.S_ID,
                                                                    TaskType = "PLC满托下线入库",
                                                                    TASKTYPE = "PLC满托下线入库",
                                                                    RFID = result.RfidData,
                                                                    Spec = woInfo.S_ITEM_SPEC,
                                                                    CarCode = modelCI.S_CAR_CODE,
                                                                    Weight = result.Weight,
                                                                    ItemState = "待检",
                                                                    ItemCode = woInfo.S_ITEM_CODE,
                                                                    LoginName = woInfo.S_LINE_NO,
                                                                    Shift = "None",
                                                                    StartLoc = startLoc.S_CODE,
                                                                    SPEC = woInfo.S_ITEM_SPEC,
                                                                    CARCODE = modelCI.S_CAR_CODE,
                                                                    WEIGHT = result.Weight,
                                                                    ITEMSTATE = "待检",
                                                                    ITEMCODE = woInfo.S_ITEM_CODE,
                                                                    LOGINNAME = woInfo.S_LINE_NO,
                                                                    SHIFT = "None",
                                                                    STARTLOC = startLoc.S_CODE,
                                                                };
                                                                SpecHelper.InsertEquipProDetail(target);
                                                            });
@@ -217,12 +217,12 @@
                                                                {
                                                                    S_ID = tN_CG_Detail.S_ID,
                                                                    RFID = result.RfidData,
                                                                    Spec = woInfo.S_ITEM_SPEC,
                                                                    Weight = result.Weight,
                                                                    ItemState = "待检",
                                                                    ItemCode = woInfo.S_ITEM_CODE,
                                                                    LoginName = woInfo.S_LINE_NO,
                                                                    Shift = "None",
                                                                    SPEC = woInfo.S_ITEM_SPEC,
                                                                    WEIGHT = result.Weight,
                                                                    ITEMSTATE = "待检",
                                                                    ITEMCODE = woInfo.S_ITEM_CODE,
                                                                    LOGINNAME = woInfo.S_LINE_NO,
                                                                    SHIFT = "None",
                                                                };
                                                                SpecHelper.InsertInventoryM(target);
                                                            });
@@ -347,7 +347,7 @@
        }
        /// <summary>
        /// 满托过期出库 满托过期回库,满托过期回炉
        /// 满托过期出库 过期合格回库,过期次品回炉
        /// </summary>
        internal static void FullOutTime()
        {
@@ -378,12 +378,17 @@
                            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);
                            });
                        }
                    }
                }
                //满托过期回库
                //过期合格回库
                var startLoc_2 = 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)
@@ -391,10 +396,91 @@
                    && o.S_AREA_CODE == Settings.Areas[12] && o.N_CURRENT_NUM > 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                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 == "无");
                    if (endLoc_2 != null)
                    {
                        var cntCode = db.Queryable<TN_Loc_Container>().First(a => a.S_LOC_CODE == startLoc_2.S_CODE);
                        var outTimeCg = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == cntCode.S_CNTR_CODE);
                        if (WCSHelper.CreateTask(startLoc_2.S_CODE, endLoc_2.S_CODE, "过期合格回库", 3, outTimeCg.S_CNTR_CODE, outTimeCg.S_SPE))
                        {
                            LocationHelper.LockLoc(startLoc_2.S_CODE, 2);//起点出库锁,
                            LocationHelper.LockLoc(endLoc_2.S_CODE, 1);//终点入库锁
                            Task task27 = Task.Run(() =>
                            {
                                var target = new TN_InventoryM()
                                {
                                    S_ID = outTimeCg.S_ID,
                                    RFID = outTimeCg.S_CNTR_CODE,
                                    SPEC = outTimeCg.S_SPE,
                                    WEIGHT = outTimeCg.F_QTY,
                                    ITEMSTATE = outTimeCg.S_ITEM_STATE,
                                    ITEMCODE = outTimeCg.S_ITEM_CODE,
                                    LOGINNAME = "过期合格回库轮询",
                                    SHIFT = "None",
                                };
                                SpecHelper.InsertInventoryM(target);
                            });
                            LogHelper.Info($"生成过期合格回库任务成功,容器号{outTimeCg.S_CNTR_CODE},起点{startLoc_2.S_CODE},终点{endLoc_2.S_CODE}");
                        }
                    }
                }
                //过期次品回炉
                var startLoc_3 = 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 == 2 && s.S_ITEM_STATE == "不合格"
                    && o.S_AREA_CODE == Settings.Areas[12] && o.N_CURRENT_NUM > 0
                    && o.N_LOCK_STATE == 0 && o.S_LOCK_STATE == "无").First();
                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 == "无");
                    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))
                        {
                            LocationHelper.LockLoc(startLoc_3.S_CODE, 2);//起点出库锁,
                            LocationHelper.LockLoc(endLoc_3.S_CODE, 1);//终点入库锁
                            Task task2 = Task.Run(() =>
                            {
                                var target = new TN_RemeltDetail()
                                {
                                    TASKNO = taskno,
                                    CNTCODE = outTimeCg.S_CNTR_CODE,
                                    STARTLOC = startLoc_3.S_CODE,
                                    LOGINNAME = "过期次品回炉轮询",
                                    ITEMCODE = outTimeCg.S_ITEM_CODE,
                                    SPEC = outTimeCg.S_SPE,
                                    CARCODE = outTimeCg.S_CAR_CODE,
                                    WEIGHT = outTimeCg.F_QTY,
                                    REMELTTIME = DateTime.Now
                                };
                                SpecHelper.InsertRemeltDetail(target);
                            });
                            LogHelper.Info($"生成过期次品回炉任务成功,容器号{outTimeCg.S_CNTR_CODE},起点{startLoc_3.S_CODE},终点{endLoc_3.S_CODE}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error($"发生了异常,满托过期出库 满托过期回库,满托过期回炉 异常,{ex.Message}", ex);
                LogHelper.Error($"发生了异常,满托过期出库 过期合格回库,过期次品回炉 异常,{ex.Message}", ex);
            }
        }
@@ -409,48 +495,75 @@
                // 同步 TN_EquipProDetail 与 TN_CG_Detail
                var targetEPD = db.Queryable<TN_EquipProDetail>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                   Where((o, i) => o.ItemState != i.S_ITEM_STATE && i.S_ITEM_STATE != "待检").First();
                   Where((o, i) => o.ITEMSTATE != i.S_ITEM_STATE && i.S_ITEM_STATE != "待检" && i.N_ITEM_STATE != 1).First();
                if (targetEPD != null)
                {
                    targetEPD.ItemState = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetEPD.S_ID).S_ITEM_STATE;
                    db.Updateable<TN_EquipProDetail>(targetEPD).ExecuteCommand();
                    targetEPD.ITEMSTATE = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetEPD.S_ID).S_ITEM_STATE;
                    db.Updateable<TN_EquipProDetail>(targetEPD).UpdateColumns(it => new { it.ITEMSTATE }).ExecuteCommand();
                }
                targetEPD = db.Queryable<TN_EquipProDetail>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                    Where((o, i) => System.DateTime.Now >= o.Expiration).First();
                    Where((o, i) => System.DateTime.Now >= o.EXPIRATION && i.S_ITEM_STATE == "待检" && i.N_ITEM_STATE == 1).First();
                if (targetEPD != null)
                {
                    targetEPD.ItemState = "过期";
                    db.Updateable<TN_EquipProDetail>(targetEPD).ExecuteCommand();
                    targetEPD.ITEMSTATE = "过期";
                    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).ExecuteCommand();
                    db.Updateable<TN_CG_Detail>(cginfo).UpdateColumns(it => new { it.S_ITEM_STATE, it.N_ITEM_STATE }).ExecuteCommand();
                }
                // 同步 TN_InventoryM 与 TN_CG_Detail
                var targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                   Where((o, i) => o.ITEMSTATE != i.S_ITEM_STATE && i.S_ITEM_STATE != "待检" && i.N_ITEM_STATE != 1).First();
                if (targetInM != null)
                {
                    targetInM.ITEMSTATE = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetInM.S_ID).S_ITEM_STATE;
                    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();
                if (targetInM != null)
                {
                    targetInM.ITEMSTATE = "过期";
                    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();
                }
                //  同步 TN_DayProDetail
                var curDay = System.DateTime.Now.Date;
                var targetDay = db.Queryable<TN_DayProDetail>().First(a => a.DayTime == curDay);
                var targetDay = db.Queryable<TN_DayProDetail>().First(a => a.DAYTIME == curDay);
                if (targetDay == null)
                {
                    targetDay = new TN_DayProDetail()
                    {
                        DayTime = curDay,
                        DAYTIME = curDay,
                    };
                    db.Insertable(targetDay).ExecuteCommand();
                }
                var targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DownLineTime >= curDay && a.DownLineTime <= curDay.AddDays(1)).ToList();
                var targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DOWNLINETIME >= curDay && a.DOWNLINETIME <= curDay.AddDays(1)).ToList();
                var sumWeight = targetEPDs.Sum(a => a.Weight);
                var sumWeight = targetEPDs.Sum(a => a.WEIGHT);
                if (targetEPDs.Count > 0)
                {
                    if (targetDay.Weight != sumWeight)
                    if (targetDay.WEIGHT != sumWeight)
                    {
                        targetDay.Weight = sumWeight;
                        targetDay.WEIGHT = sumWeight;
                        db.Updateable(targetDay).ExecuteCommand();
                    }
@@ -458,88 +571,66 @@
                // 同步 TN_WeekProSpcDetail
                var curWeek = System.DateTime.Now.Date.AddDays(-(int)System.DateTime.Now.DayOfWeek + 1);
                var targetWeek = db.Queryable<TN_WeekProDetail>().First(a => a.DayTime == curWeek);
                var targetWeek = db.Queryable<TN_WeekProDetail>().First(a => a.DAYTIME == curWeek);
                if (targetWeek == null)
                {
                    targetWeek = new TN_WeekProDetail()
                    {
                        DayTime = curWeek,
                        DAYTIME = curWeek,
                    };
                    db.Insertable(targetWeek).ExecuteCommand();
                }
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DownLineTime >= curWeek && a.DownLineTime <= curWeek.AddDays(7)).ToList();
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DOWNLINETIME >= curWeek && a.DOWNLINETIME <= curWeek.AddDays(7)).ToList();
                if (targetEPDs.Count > 0)
                {
                    if (targetWeek.Weight != sumWeight)
                    if (targetWeek.WEIGHT != sumWeight)
                    {
                        targetWeek.Weight = sumWeight;
                        targetWeek.WEIGHT = sumWeight;
                        db.Updateable(targetWeek).ExecuteCommand();
                    }
                }
                // 同步 TN_MonthProSpcDetail
                var curMonth = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).Date;
                var targetMonth = db.Queryable<TN_MonthProDetail>().First(a => a.DayTime == curMonth);
                var targetMonth = db.Queryable<TN_MonthProDetail>().First(a => a.DAYTIME == curMonth);
                if (targetMonth == null)
                {
                    targetMonth = new TN_MonthProDetail()
                    {
                        DayTime = curMonth,
                        DAYTIME = curMonth,
                    };
                    db.Insertable(targetMonth).ExecuteCommand();
                }
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DownLineTime >= curMonth && a.DownLineTime <= curMonth.AddMonths(1)).ToList();
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DOWNLINETIME >= curMonth && a.DOWNLINETIME <= curMonth.AddMonths(1)).ToList();
                if (targetEPDs.Count > 0)
                {
                    if (targetMonth.Weight != sumWeight)
                    if (targetMonth.WEIGHT != sumWeight)
                    {
                        targetMonth.Weight = sumWeight;
                        targetMonth.WEIGHT = sumWeight;
                        db.Updateable(targetMonth).ExecuteCommand();
                    }
                }
                // 同步 TN_YearProSpcDetail
                var curYear = new DateTime(DateTime.Now.Year, 1, 1).Date;
                var targetYear = db.Queryable<TN_YearProDetail>().First(a => a.DayTime == curYear);
                var targetYear = db.Queryable<TN_YearProDetail>().First(a => a.DAYTIME == curYear);
                if (targetYear == null)
                {
                    targetYear = new TN_YearProDetail()
                    {
                        DayTime = curYear,
                        DAYTIME = curYear,
                    };
                    db.Insertable(targetYear).ExecuteCommand();
                }
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DownLineTime >= curYear && a.DownLineTime <= curYear.AddYears(1)).ToList();
                targetEPDs = db.Queryable<TN_EquipProDetail>().Where(a => a.DOWNLINETIME >= curYear && a.DOWNLINETIME <= curYear.AddYears(1)).ToList();
                if (targetEPDs.Count > 0)
                {
                    if (targetYear.Weight != sumWeight)
                    if (targetYear.WEIGHT != sumWeight)
                    {
                        targetYear.Weight = sumWeight;
                        targetYear.WEIGHT = sumWeight;
                        db.Updateable(targetYear).ExecuteCommand();
                    }
                }
                // 同步 TN_InventoryM 与 TN_CG_Detail
                var targetInM = db.Queryable<TN_InventoryM>().LeftJoin<TN_CG_Detail>((o, i) => o.S_ID == i.S_ID).
                   Where((o, i) => o.ItemState != i.S_ITEM_STATE && i.S_ITEM_STATE != "待检").First();
                if (targetInM != null)
                {
                    targetInM.ItemState = db.Queryable<TN_CG_Detail>().First(a => a.S_ID == targetInM.S_ID).S_ITEM_STATE;
                    db.Updateable<TN_InventoryM>(targetInM).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).First();
                if (targetInM != null)
                {
                    targetInM.ItemState = "过期";
                    db.Updateable<TN_InventoryM>(targetInM).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).ExecuteCommand();
                }
            }
            catch (Exception ex)
@@ -643,6 +734,11 @@
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"生成满托出库复检任务成功,容器:{cntId.S_CNTR_CODE},起点:{startLoc.S_CODE}");
                    Task task27 = Task.Run(() =>
                    {
                         SpecHelper.DeleteInventoryM(cgInfo.S_ID);
                    });
                }
                else
                {
core/WCSCore.cs
@@ -86,7 +86,7 @@
                                    {
                                        returnS7Ok(TN_Task);
                                    });
                                    break;
                                case 5:
                                    WCSHelper.UpdateStatus(TN_Task, "开始卸货");//任务状态改成开始卸货
@@ -141,6 +141,14 @@
                                        }
                                    });
                                    Task task19 = Task.Run(() =>
                                    {
                                        if (TN_Task.S_END_AREA == Settings.Areas[2])
                                        {
                                            SpecHelper.UpdateInventoryM_RuKu(TN_Task.S_CNTR_CODE);
                                        }
                                    });
                                    break;
                                case 2:
                                    WCSHelper.End(TN_Task);//任务状态改成结束
models/TN_CG_Detail.cs
@@ -27,12 +27,12 @@
        public string S_SPE { get; set; }//货品规格
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期
        /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合
        /// </summary>
        public string S_ITEM_STATE { get; set; }//货品状态
        /// <summary>
        /// 0合格1待检2不合格,下线即待检,3过期
        /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合
        /// </summary>
        public int N_ITEM_STATE { get; set; }//货品状态_字典
        public string S_BATCH_NO { get; set; }//批次号
models/TN_Component_Detail.cs
@@ -16,62 +16,62 @@
        /// <summary>
        /// 出库时间
        /// </summary>
        public DateTime OutAreaTime { get; set; }
        public DateTime OUTAREATIME { get; set; }
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { get; set; }
        public string SHIFT { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { get; set; }
        public string ITEMCODE { get; set; }
        /// <summary>
        /// 物料规格
        /// </summary>
        public string Spec { get; set; }
        public string SPEC { get; set; }
        /// <summary>
        /// 车次
        /// 车号
        /// </summary>
        public string CarCode { get; set; }
        public string CARCODE { get; set; }
        /// <summary>
        /// 终点
        /// </summary>
        public string EndLoc { get; set; }
        public string ENDLOC { get; set; }
        /// <summary>
        /// 操作人员姓名
        /// </summary>
        public string Staff { get; set; }
        public string STAFF { get; set; }
        /// <summary>
        /// 容器编码
        /// </summary>
        public string CntrCode { get; set; }
        public string CNTRCODE { get; set; }
        /// <summary>
        /// 重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public string Type { get; set; }
        public string TYPE { get; set; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { get; set; }
        public string TASKNO { get; set; }
        /// <summary>
        /// 送达时间
        /// </summary>
        public DateTime EndTime { get; set; }
        public DateTime ENDTIME { get; set; }
    }
models/TN_DayProDetail.cs
@@ -16,12 +16,12 @@
        /// <summary>
        /// 当天零点
        /// </summary>
        public DateTime DayTime { get; set; }
        public DateTime DAYTIME { get; set; }
        /// <summary>
        /// 总重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
    }
}
models/TN_EquipProDetail.cs
@@ -16,12 +16,12 @@
        /// <summary>
        /// 任务类型
        /// </summary>
        public string TaskType { get; set; }
        public string TASKTYPE { get; set; }
        /// <summary>
        /// 下线时间
        /// </summary>
        public DateTime DownLineTime { get; set; } = DateTime.Now;
        public DateTime DOWNLINETIME { get; set; } = DateTime.Now;
        /// <summary>
        /// 容器号
@@ -31,46 +31,46 @@
        /// <summary>
        /// 登录姓名
        /// </summary>
        public string LoginName { get; set; }
        public string LOGINNAME { get; set; }
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { get; set; }
        public string SHIFT { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { get; set; }
        public string ITEMCODE { get; set; }
        /// <summary>
        /// 规格
        /// </summary>
        public string Spec { get; set; }
        public string SPEC { get; set; }
        /// <summary>
        /// 车号
        /// </summary>
        public string CarCode { get; set; }
        public string CARCODE { get; set; }
        /// <summary>
        /// 重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
        /// <summary>
        /// 物料状态
        /// </summary>
        public string ItemState { get; set; }
        /// <summary>
        /// 起点货位
        /// </summary>
        public string StartLoc { get; set; }
        public string ITEMSTATE { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime Expiration { get; set; }
        public DateTime EXPIRATION { get; set; }
        /// <summary>
        /// 起点货位
        /// </summary>
        public string STARTLOC { get; set; }
    }
}
models/TN_InventoryM.cs
@@ -1,9 +1,5 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HH.WCS.Mobox3.DoubleCoin.models
{
@@ -16,7 +12,7 @@
        /// <summary>
        /// 入库时间
        /// </summary>
        public DateTime InAreaTime { get; set; }
        public DateTime INAREATIME { get; set; }
        /// <summary>
        /// 容器号
@@ -26,36 +22,36 @@
        /// <summary>
        /// 登录姓名
        /// </summary>
        public string LoginName { get; set; }
        public string LOGINNAME { get; set; }
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { get; set; }
        public string SHIFT { get; set; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { get; set; }
        public string ITEMCODE { get; set; }
        /// <summary>
        /// 规格
        /// </summary>
        public string Spec { get; set; }
        public string SPEC { get; set; }
        /// <summary>
        /// 重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
        /// <summary>
        /// 物料状态
        /// </summary>
        public string ItemState { get; set; }
        public string ITEMSTATE { get; set; }
        /// <summary>
        /// 过期时间
        /// </summary>
        public DateTime Expiration { get; set; }
        public DateTime EXPIRATION { get; set; }
    }
}
models/TN_MonthProDetail.cs
@@ -16,12 +16,12 @@
        /// <summary>
        /// 每月1号零点
        /// </summary>
        public DateTime DayTime { get; set; }
        public DateTime DAYTIME { get; set; }
        /// <summary>
        /// 总重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
    }
}
models/TN_RemeltDetail.cs
@@ -16,56 +16,56 @@
        /// <summary>
        /// 回炉时间
        /// </summary>
        public DateTime RemeltTime { set; get;}
        public DateTime REMELTTIME { set; get;}
        /// <summary>
        /// 托盘号
        /// </summary>
        public string CntCode { set; get;}
        public string CNTCODE { set; get;}
        /// <summary>
        /// 操作人姓名
        /// </summary>
        public string LoginName { set; get;}
        public string LOGINNAME { set; get;}
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { set; get;}
        public string SHIFT { set; get;}
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { set; get;}
        public string ITEMCODE { set; get;}
        /// <summary>
        /// 物料规格
        /// </summary>
        public string Spec { set; get;}
        public string SPEC { set; get;}
        /// <summary>
        /// 车次
        /// </summary>
        public string CarCode { set; get;}
        public string CARCODE { set; get;}
        /// <summary>
        /// 重量
        /// </summary>
        public float Weight { set; get;}
        public float WEIGHT { set; get;}
        /// <summary>
        /// 回炉机台
        /// </summary>
        public string StartLoc { set; get;}
        public string STARTLOC { set; get;}
        /// <summary>
        /// 送达时间
        /// </summary>
        public DateTime EndTime { set; get;}
        public DateTime ENDTIME { set; get;}
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { set; get; }
        public string TASKNO { set; get; }
    }
}
models/TN_SurplusDetail.cs
@@ -8,7 +8,7 @@
namespace HH.WCS.Mobox3.DoubleCoin.models
{
    /// <summary>
    /// 余料回库明细
    /// 余料回库(返回胶)明细
    /// </summary>
    [SugarTable("TN_SurplusDetail")]
    public class TN_SurplusDetail : BaseModel
@@ -16,56 +16,56 @@
        /// <summary>
        /// 回库时间
        /// </summary>
        public DateTime RemeltTime { set; get; }
        public DateTime REMELTTIME { set; get; }
        /// <summary>
        /// 托盘号
        /// </summary>
        public string CntCode { set; get; }
        public string CNTCODE { set; get; }
        /// <summary>
        /// 操作人姓名
        /// </summary>
        public string LoginName { set; get; }
        public string LOGINNAME { set; get; }
        /// <summary>
        /// 班次
        /// </summary>
        public string Shift { set; get; }
        public string SHIFT { set; get; }
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { set; get; }
        public string ITEMCODE { set; get; }
        /// <summary>
        /// 物料规格
        /// </summary>
        public string Spec { set; get; }
        public string SPEC { set; get; }
        /// <summary>
        /// 车次
        /// </summary>
        public string CarCode { set; get; }
        public string CARCODE { set; get; }
        /// <summary>
        /// 二次称重重量
        /// </summary>
        public float Weight { set; get; }
        public float WEIGHT { set; get; }
        /// <summary>
        /// 返回机台
        /// </summary>
        public string StartLoc { set; get; }
        public string STARTLOC { set; get; }
        /// <summary>
        /// 二次入库时间
        /// </summary>
        public DateTime EndTime { set; get; }
        public DateTime ENDTIME { set; get; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskNo { set; get; }
        public string TASKNO { set; get; }
    }
}
models/TN_WeekProDetail.cs
@@ -16,12 +16,12 @@
        /// <summary>
        /// 周一零点
        /// </summary>
        public DateTime DayTime { get; set; }
        public DateTime DAYTIME { get; set; }
        /// <summary>
        /// 总重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
    }
}
models/TN_YearProDetail.cs
@@ -16,12 +16,12 @@
        /// <summary>
        /// 每年1月1号零点
        /// </summary>
        public DateTime DayTime { get; set; }
        public DateTime DAYTIME { get; set; }
        /// <summary>
        /// 总重量
        /// </summary>
        public float Weight { get; set; }
        public float WEIGHT { get; set; }
    }
}
wms/LocationHelper.cs
@@ -365,7 +365,6 @@
        /// <summary>
        /// 人工手动PDA解绑:删除货位/容器/货品三方信息,1=解绑货位与容器,2=解绑容器与货品
        /// </summary>
        /// <param name="model"></EmptyUnBind>
        /// <returns></returns>
        internal static SimpleResult PdaUnBind(PdaUnBindInfo model)
        {
@@ -580,7 +579,7 @@
        public string rfId { get; set; }//容器号
        /// <summary>
        /// 0合格1待检2不合格,下线即待检
        /// 0合格1待检2不合格,下线即待检,3过期,4技术合格,5混合
        /// </summary>
        public int cgState { get; set; }//物料状态
wms/SpecHelper.cs
@@ -77,7 +77,7 @@
                var log = JsonConvert.SerializeObject(model);
                if (model != null)
                {
                    model.Expiration = System.DateTime.Now.AddMinutes(GetExportTime(model.Spec));
                    model.EXPIRATION = System.DateTime.Now.AddMinutes(GetExportTime(model.SPEC));
                    if (db.Insertable<TN_EquipProDetail>(model).ExecuteCommand() > 0)
                    {
@@ -87,27 +87,6 @@
                    {
                        LogHelper.Info($"插入设备生产明细失败,{log}");
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("插入设备生产明细失败", ex);
            }
        }
        /// <summary>
        /// 更新设备生产明细的过期时间
        /// </summary>
        public static void UpdateEquipProDetail(string cg_SID)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target = db.Queryable<TN_EquipProDetail>().First(a => a.S_ID == cg_SID);
                if (target != null)
                {
                    target.Expiration = System.DateTime.Now.AddMinutes(GetExportTime(target.Spec));
                    db.Updateable<TN_EquipProDetail>().UpdateColumns(it => new { it.Expiration }).ExecuteCommand();
                }
            }
            catch (Exception ex)
@@ -129,8 +108,8 @@
                var log = JsonConvert.SerializeObject(model);
                if (model != null)
                {
                    model.OutAreaTime = System.DateTime.Now;
                    model.Type = "满托出库上线";
                    model.OUTAREATIME = System.DateTime.Now;
                    model.TYPE = "满托出库上线";
                    if (db.Insertable<TN_Component_Detail>(model).ExecuteCommand() > 0)
                    {
@@ -156,11 +135,11 @@
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target  = db.Queryable<TN_Component_Detail>().First(o => o.TaskNo == taskNo);
                var target  = db.Queryable<TN_Component_Detail>().First(o => o.TASKNO == taskNo);
                if (target != null)
                {
                    target.EndTime = System.DateTime.Now;
                    target.ENDTIME = System.DateTime.Now;
                    if (db.Updateable<TN_Component_Detail>(target).ExecuteCommand() > 0)
                    {
@@ -191,7 +170,7 @@
                var log = JsonConvert.SerializeObject(model);
                if (model != null)
                {
                    model.RemeltTime = System.DateTime.Now;
                    model.REMELTTIME = System.DateTime.Now;
                    if (db.Insertable<TN_RemeltDetail>(model).ExecuteCommand() > 0)
                    {
@@ -217,11 +196,11 @@
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target = db.Queryable<TN_RemeltDetail>().First(o => o.TaskNo == taskNo);
                var target = db.Queryable<TN_RemeltDetail>().First(o => o.TASKNO == taskNo);
                if (target != null)
                {
                    target.EndTime = System.DateTime.Now;
                    target.ENDTIME = System.DateTime.Now;
                    if (db.Updateable<TN_RemeltDetail>(target).ExecuteCommand() > 0)
                    {
@@ -252,7 +231,7 @@
                var log = JsonConvert.SerializeObject(model);
                if (model != null)
                {
                    model.RemeltTime = System.DateTime.Now;
                    model.REMELTTIME = System.DateTime.Now;
                    if (db.Insertable<TN_SurplusDetail>(model).ExecuteCommand() > 0)
                    {
@@ -278,11 +257,11 @@
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target = db.Queryable<TN_SurplusDetail>().First(o => o.TaskNo == taskNo);
                var target = db.Queryable<TN_SurplusDetail>().First(o => o.TASKNO == taskNo);
                if (target != null)
                {
                    target.EndTime = System.DateTime.Now;
                    target.ENDTIME = System.DateTime.Now;
                    if (db.Updateable<TN_SurplusDetail>(target).ExecuteCommand() > 0)
                    {
@@ -308,11 +287,11 @@
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target = db.Queryable<TN_SurplusDetail>().First(o => o.TaskNo == taskNo);
                var target = db.Queryable<TN_SurplusDetail>().First(o => o.TASKNO == taskNo);
                if (target != null)
                {
                    target.Weight = weight;
                    target.WEIGHT = weight;
                    if (db.Updateable<TN_SurplusDetail>(target).ExecuteCommand() > 0)
                    {
                        LogHelper.Info($"更新余料回库明细成功,{taskNo}");
@@ -347,7 +326,7 @@
                    {
                        db.Deleteable<TN_InventoryM>(target).ExecuteCommand();
                    }
                    model.Expiration = System.DateTime.Now.AddMinutes(GetExportTime(model.Spec));
                    model.EXPIRATION = System.DateTime.Now.AddMinutes(GetExportTime(model.SPEC));
                    if (db.Insertable<TN_InventoryM>(model).ExecuteCommand() > 0)
                    {
                        LogHelper.Info($"插入WMS库存明细成功,{log}");
@@ -364,25 +343,60 @@
            }
        }
        /// <summary>
        /// 更新WMS库存明细的过期时间
        /// 更新WMS库存明细的入库时间
        /// </summary>
        public static void UpdateInventoryM(string cg_SID)
        public static void UpdateInventoryM_RuKu(string cntId)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                var target = db.Queryable<TN_InventoryM>().First(a => a.S_ID == cg_SID);
                var target = db.Queryable<TN_CG_Detail>().First(a => a.S_CNTR_CODE == cntId);
                if (target != null)
                {
                    target.Expiration = System.DateTime.Now.AddMinutes(GetExportTime(target.Spec));
                    db.Updateable<TN_InventoryM>().UpdateColumns(it => new { it.Expiration }).ExecuteCommand();
                    var targetM = db.Queryable<TN_InventoryM>().First(a => a.S_ID == target.S_ID);
                    if (targetM != null)
                    {
                        targetM.INAREATIME = System.DateTime.Now;
                        if(db.Updateable<TN_InventoryM>(targetM).UpdateColumns(it => new { it.INAREATIME }).ExecuteCommand() > 0)
                        {
                            LogHelper.Info($"更新WMS库存明细的入库时间,成功,容器号:{cntId}");
                        }
                        else
                        {
                            LogHelper.Info($"更新WMS库存明细的入库时间,失败,容器号:{cntId}");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("插入设备生产明细失败", ex);
                LogHelper.Error("更新WMS库存明细的入库时间失败", ex);
            }
        }
        /// <summary>
        /// 删除WMS库存明细
        /// </summary>
        public static void DeleteInventoryM(string cg_SID)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                if(db.Deleteable<TN_InventoryM>().Where(it => it.S_ID == cg_SID).ExecuteCommand() > 0)
                {
                    LogHelper.Info($"删除WMS库存明细,成功,物料主键:{cg_SID}");
                }
                else
                {
                    LogHelper.Info($"删除WMS库存明细,失败,物料主键:{cg_SID}");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("更新WMS库存明细的过期时间失败", ex);
            }
        }
    }
wms/WMSHelper.cs
@@ -1,15 +1,7 @@
using HH.WCS.Mobox3.DoubleCoin.api;
using HH.WCS.Mobox3.DoubleCoin.dispatch;
using HH.WCS.Mobox3.DoubleCoin.dispatch;
using HH.WCS.Mobox3.DoubleCoin.models;
using HH.WCS.Mobox3.DoubleCoin.util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using static HH.WCS.Mobox3.DoubleCoin.api.ApiModel;
namespace HH.WCS.Mobox3.DoubleCoin.wms
@@ -89,7 +81,13 @@
            }
        }
        /// <summary>
        /// 插入操作员信息
        /// </summary>
        /// <param name="staff"></param>
        /// <param name="type"></param>
        /// <param name="cntrCode"></param>
        /// <param name="qty"></param>
        public static void InsertOpInfo(string staff, string type , string cntrCode ="",int qty = 0)
        {
            try
@@ -123,5 +121,7 @@
                LogHelper.Error($"插入操作员信息,发生了异常,{ex.Message}",ex);
            }
        }
    }
}