kazelee
2025-05-30 6b43055b5aa32dbea0dacee5a0235b0d5a76c293
core/WCSCore.cs
@@ -4,6 +4,7 @@
using System.Text;
using System.Threading.Tasks;
using HH.WCS.Mobox3.DSZSH.api;
using HH.WCS.Mobox3.DSZSH.device;
using HH.WCS.Mobox3.DSZSH.models;
using HH.WCS.Mobox3.DSZSH.process;
@@ -83,10 +84,13 @@
                    WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
                    TaskProcess.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
                    if (TN_Task.S_TYPE == TaskName.成品胶出库) {
                    if (TN_Task.S_TYPE == TaskName.C成品胶出库) {
                        var nextOutboundTask = Task.Run(() => {
                            UpdateOutboundTaskState(3);
                        });
                        //var pickUpReturnErpTask = Task.Run(() => {
                        //    PickUpReturnErp(TN_Task);
                        //});
                    }
                    break;
@@ -106,6 +110,10 @@
                    //    });
                    //}
                    var recordTask = Task.Run(() => {
                        RecordTaskTable(TN_Task);
                    });
                    break;
                case 7: // 异常
                    TaskProcess.OperateStatus(TN_Task, 7); // 异常处理
@@ -118,6 +126,68 @@
            //调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表
            return true;
        }
        private static void RecordTaskTable(TN_Task task) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            try {
                var cgDetail = new TN_CG_Detail();
                var emptyTask = false;
                if (task.S_TYPE != TaskName.H好运箱_空箱上线 && task.S_TYPE != TaskName.H好运箱_空箱入库 &&
                    task.S_TYPE != TaskName.T托盘_空托上线 && task.S_TYPE != TaskName.T托盘_空托入库) {
                    // 非空托任务(空托任务无法在CGDetail查到物料信息)
                    emptyTask= true;
                    cgDetail = db.Queryable<TN_CG_Detail>()
                        .Where(d => d.S_CNTR_CODE == task.S_CNTR_CODE)
                        .First();
                    if (cgDetail == null) {
                        info = $"任务{task.S_CODE}完成,记录出入库失败:无法在容器货品明细表中找到托盘{task.S_CNTR_CODE}对应的物料";
                        LogHelper.Info(info);
                    }
                }
                var isInbound = false;
                var inboundTasks = new List<string> {
                    TaskName.H好运箱_满箱下线入库, TaskName.H好运箱_空箱入库, TaskName.T托盘_满托下线入库, TaskName.T托盘_空托入库,
                    TaskName.C抽检_合格回库, TaskName.C抽检_不合格移库, TaskName.Y移库
                };
                if (inboundTasks.Contains(task.S_TYPE)) {
                    isInbound= true;
                }
                var record = new TN_Record_Table {
                    S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                    S_BATCH_NO = cgDetail.S_BATCH_NO,
                    S_ITEM_NAME = cgDetail.S_ITEM_NAME,
                    S_LOC_CODE = isInbound ? task.S_END_LOC : task.S_START_LOC, // 入库记录终点货位,出库记录起点货位
                    S_CNTR_CODE = task.S_CNTR_CODE,
                    S_ITEM_SPEC = cgDetail.S_ITEM_SPEC,
                    S_NET_WEIGHT = cgDetail.S_NET_WEIGHT,
                    S_QUALITY_GRADE = cgDetail.S_QUALITY_GRADE,
                    S_STANDARD = cgDetail.S_STANDARD,
                    S_TASK_NO = task.S_CODE,
                    T_RECORD_TIME = DateTime.Now,
                    S_TYPE = task.S_TYPE,
                    S_BS_CODE = task.S_BS_TYPE,
                    N_QTY = cgDetail.N_ITEM_NUM,
                };
                if (db.Insertable<TN_Record_Table>(record).ExecuteCommand() <= 0) {
                    info = "插入出入库记录表失败:" + JsonConvert.SerializeObject(record);
                    LogHelper.Info(info);
                    return;
                }
                info = "插入出入库记录表成功";
                LogHelper.Info(info);
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
@@ -215,13 +285,14 @@
        }
        public static void UpdateOutboundTaskState(int spotStateCode) {
            var taskName = TaskName.C成品胶出库;
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Outbound_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("出库--AGV取货--查询Detail:当前没有 执行中 的Detail表!");
                LogHelper.Info($"{taskName}--AGV取货--查询明细单:当前没有执行中的明细单");
                return;
            }
@@ -229,14 +300,14 @@
                detail.N_B_STATE = spotStateCode;
                if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("出库--AGV取货:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    LogHelper.Info($"{taskName}--AGV取货:修改明细单状态为3任务执行完成--失败!");
                    return;
                }
                var finishedCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3);
                var allCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO);
                LogHelper.Info($"出库--AGV取货--统计任务已完成:{finishedCount} / {allCount}");
                LogHelper.Info($"{taskName}--AGV取货--统计任务已完成:{finishedCount}/{allCount}");
                if (finishedCount == allCount) { // 当前出库单下的所有明细单,任务都已经完成
@@ -245,7 +316,7 @@
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("出库--AGV取货--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        LogHelper.Info($"{taskName}--AGV取货--所有任务完成时:修改单据状态为3任务执行完成--失败!");
                        return;
                    }
                }
@@ -254,83 +325,17 @@
            }
        }
        public static void UpdateCheckTaskState(int spotStateCode) {
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Check_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("抽检--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!");
                return;
        public static void PickUpReturnErp(TN_Task task) {
            var httpH = new HttpHelper();
            var model = new OtherModel.PickUpReturnErpInfo();
            model.LocCode = task.S_START_LOC;
            try {
                var jsonInfo = JsonConvert.SerializeObject(model);
                var result = httpH.WebPost(Settings.ErpApiUrl + "PickUpReturn", jsonInfo);
                // TODO
            }
            using (var tran = db.Ado.UseTran()) {
                detail.N_B_STATE = spotStateCode;
                if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("抽检--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    return;
                }
                var finishedCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
                var allCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO);
                LogHelper.Info($"抽检--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}");
                if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成
                    if (db.Updateable<TN_Check_Order>().SetColumns(it => it.N_B_STATE == 3)
                        .Where(it => it.S_NO == detail.S_NO)
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("抽检--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        return;
                    }
                }
                tran.CommitTran();
            }
        }
        public static void UpdateShiftTaskState(int spotStateCode) {
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Shift_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("移库--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!");
                return;
            }
            detail.N_B_STATE = spotStateCode;
            var finishedCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
            var allCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO);
            LogHelper.Info($"移库--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}");
            using (var tran = db.Ado.UseTran()) {
                if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("移库--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    return;
                }
                if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成
                    if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == 3)
                        .Where(it => it.S_NO == detail.S_NO)
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("移库--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        return;
                    }
                }
                tran.CommitTran();
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
@@ -347,12 +352,13 @@
                    //使用自定义任务推送
                    TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备
                    //TaskProcess.SendGZTask(task);///调度国自设备
                });
            }
            else {
                LogHelper.Info("暂无任务");
            }
        }
    }
}