kazelee
2025-06-16 0b679c8b18e2b598ff27cff2fa9ade2c46bde3be
core/WCSCore.cs
@@ -20,27 +20,15 @@
        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
            var result = new ReturnResult();
            try {
                switch (model.state) {
                    case 1023:
                        break;
                    case 1025:
                        break;
                    case 1012:
                        break;
                    case 1004:
                        break;
                    case 1103:
                        break;
                    default:
                        // AGV 执行任务的逻辑处理
                        if (!AgvTaskProcessOk(model)) {
                            // 执行不OK,说明没有找到任务
                            result.ResultCode = 1;
                            result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
                            LogHelper.Info(result.ResultMsg, "API");
                            return result;
                        }
                        break;
                if (model.state > 0) {
                    // AGV 执行任务的逻辑处理
                    if (!AgvTaskProcessOk(model)) {
                        // 执行不OK,说明没有找到任务
                        result.ResultCode = 1;
                        result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
                        LogHelper.Info(result.ResultMsg, "API");
                        return result;
                    }
                }
                result.ResultCode = 0;
@@ -50,7 +38,7 @@
            }
            catch (Exception ex) {
                result.ResultCode = -1;
                result.ResultMsg = $"发生了异常:+{ex.Message}";
                result.ResultMsg = $"发生了异常:{ex.Message}";
                LogHelper.Info(result.ResultMsg, "Error");
                return result;
            }
@@ -88,9 +76,9 @@
                        var nextOutboundTask = Task.Run(() => {
                            UpdateOutboundTaskState(3);
                        });
                        //var pickUpReturnErpTask = Task.Run(() => {
                        //    PickUpReturnErp(TN_Task);
                        //});
                        var pickUpReturnErpTask = Task.Run(() => {
                            PickUpReturnErp(TN_Task);
                        });
                    }
                    break;
@@ -133,25 +121,27 @@
            var info = "";
            try {
                var cgDetail = new TN_CG_Detail();
                var cgDetail = new TN_CG_Detail(); // 如果没有信息,默认就是空值,可以直接填入,不需要判断
                
                var emptyTask = false;
                //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查到物料信息)
                    //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}对应的物料";
                        info = $"任务{task.S_CODE}完成,记录出入库存在问题:无法在容器货品明细表中找到托盘{task.S_CNTR_CODE}对应的物料";
                        LogHelper.Info(info);
                        return;
                        //return;
                        cgDetail = new TN_CG_Detail() ;
                        cgDetail.S_ITEM_CODE = "异常";
                    }
                }
                var isInbound = false;
                var isInbound = false; // 入库类型的任务(包括移库类任务)
                var inboundTasks = new List<string> {
                    TaskName.H好运箱_满箱下线入库, TaskName.H好运箱_空箱入库, TaskName.T托盘_满托下线入库, TaskName.T托盘_空托入库,
                    TaskName.C抽检_合格回库, TaskName.C抽检_不合格移库, TaskName.Y移库
@@ -173,10 +163,12 @@
                    S_TASK_NO = task.S_CODE,
                    T_RECORD_TIME = DateTime.Now,
                    S_TYPE = task.S_TYPE,
                    S_BS_CODE = task.S_BS_TYPE,
                    S_BS_CODE = task.S_BS_NO, // ERP单号,默认为空
                    N_QTY = cgDetail.N_ITEM_NUM,
                    S_NO = task.S_OP_CODE, // 出库/抽检/移库单
                };
                // 数据库操作
                if (db.Insertable<TN_Record_Table>(record).ExecuteCommand() <= 0) {
                    info = "插入出入库记录表失败:" + JsonConvert.SerializeObject(record);
                    LogHelper.Info(info);
@@ -191,6 +183,11 @@
            }
        }
        /// <summary>
        /// AGV产线安全交互逻辑实现
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
@@ -252,7 +249,6 @@
                    info = $"向输送线写入允许取货信号成功";
                    LogHelper.Info(info);
                    return NewReturnResult(0, info);
                }
                else if (model.apply_code == "1") { // 请求卸货
                    if (prodLineDevice.AllowAgvPlacePallet != 1) {
@@ -293,7 +289,7 @@
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info($"{taskName}--AGV取货--查询明细单:当前没有执行中的明细单");
                LogHelper.Info($"{taskName}:AGV取货:查询明细单:当前没有执行中的明细单");
                return;
            }
@@ -301,14 +297,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($"{taskName}--AGV取货:修改明细单状态为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($"{taskName}--AGV取货--统计任务已完成:{finishedCount}/{allCount}");
                LogHelper.Info($"{taskName}:AGV取货:统计任务已完成:{finishedCount}/{allCount}");
                if (finishedCount == allCount) { // 当前出库单下的所有明细单,任务都已经完成
@@ -317,7 +313,7 @@
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info($"{taskName}--AGV取货--所有任务完成时:修改单据状态为3任务执行完成--失败!");
                        LogHelper.Info($"{taskName}:AGV取货:所有任务完成时:修改单据状态为3任务执行完成--失败!");
                        return;
                    }
                }
@@ -327,13 +323,40 @@
        }
        public static void PickUpReturnErp(TN_Task task) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            var httpH = new HttpHelper();
            var model = new OtherModel.PickUpReturnErpInfo();
            model.LocCode = task.S_START_LOC;
            try {
                var plan = db.Queryable<TN_Outbound_Plan>()
                    .Where(p => p.JHDH == task.S_BS_NO)
                    .First();
                if (plan == null) {
                    info = $"计划单号{task.S_BS_NO}不存在!";
                    LogHelper.Info(info);
                }
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_CNTR_CODE == task.S_CNTR_CODE)
                    .First();
                if (cgDetail == null) {
                    info = $"物料编码不存在!";
                    LogHelper.Info(info);
                }
                // TODO
                var model = new OtherModel.PickUpReturnErpInfo();
                model.sfjs = cgDetail.N_ITEM_NUM;
                model.sfsl = 0;
                //model.hw = task.S_START_LOC;
                //model.hwzt = "";
                var jsonInfo = JsonConvert.SerializeObject(model);
                var result = httpH.WebPost(Settings.ErpApiUrl + "PickUpReturn", jsonInfo);
                // TODO
                LogHelper.InfoApi("取货完成反馈ERP接口", model);
            }
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
@@ -358,8 +381,6 @@
            else {
                LogHelper.Info("暂无任务");
            }
        }
    }
}