kazelee
2025-06-16 0b679c8b18e2b598ff27cff2fa9ade2c46bde3be
优化AGV调试和出库逻辑,完成部分ERP反馈代码
4个文件已添加
8个文件已修改
3个文件已删除
568 ■■■■■ 已修改文件
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/389a9ecd-a526-48f5-a8fc-7674b5b1ccbb.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/5bebbc83-b7b9-4df0-ac76-c479ffe00afd.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/60d0bfba-4866-48d3-9cce-4f08e36a5c1a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72b74e1b-3ce7-462f-a4d7-ab0ffca83287.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/8fff2f95-d6df-452f-ad7d-079ab21a0f28.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/d49484c3-00c1-4b7d-9deb-0d030288ff5a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f0bbbb2f-3b58-4dfe-8ac7-534413626ac1.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/DebugController.cs 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.comment.json 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/WCSHelper.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/389a9ecd-a526-48f5-a8fc-7674b5b1ccbb.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/5bebbc83-b7b9-4df0-ac76-c479ffe00afd.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/60d0bfba-4866-48d3-9cce-4f08e36a5c1a.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/72b74e1b-3ce7-462f-a4d7-ab0ffca83287.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/8fff2f95-d6df-452f-ad7d-079ab21a0f28.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/d49484c3-00c1-4b7d-9deb-0d030288ff5a.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f0bbbb2f-3b58-4dfe-8ac7-534413626ac1.vsidx
Binary files differ
api/ApiHelper.cs
@@ -1515,8 +1515,7 @@
                    S_ITEM_CODE = model.cpdm,
                    S_BATCH = model.ph,
                    N_END_NUM = (int)model.pzsl,
                    //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                    S_END_AREA = model.ysfs == "汽车" ? "QCCKQ" : "HCCKQ", // 暂时用运输方式(火车/汽车)来区分终点货区
                    S_END_AREA = "QCCKQ", // ERP下发出库任务为汽车出库区
                    S_BS_NO = model.jhdh,
                    S_BS_TYPE = "ERP",
                };
api/ApiModel.cs
@@ -699,8 +699,265 @@
        }
        public class PickUpReturnErpInfo {
            public string LocCode { get; set; }
            /// <summary>
            /// 计划单号(唯一标识)
            /// </summary>
            public string jhdh { get; set; }
            /// <summary>
            /// 出库状态
            /// </summary>
            public string ckzt { get; set; }
            /// <summary>
            /// 计划类别
            /// </summary>
            public string jhlb { get; set; }
            /// <summary>
            /// 参考单号
            /// </summary>
            public string ckdh { get; set; }
            /// <summary>
            /// 车牌号
            /// </summary>
            public string cph { get; set; }
            /// <summary>
            /// 运输方式
            /// </summary>
            public string ysfs { get; set; }
            /// <summary>
            /// 产品状态
            /// </summary>
            public string cpzt { get; set; }
            /// <summary>
            /// 买断单位
            /// </summary>
            public string mddw { get; set; }
            /// <summary>
            /// 产品代码
            /// </summary>
            public string cpdm { get; set; }
            /// <summary>
            /// 产品类别
            /// </summary>
            public string cplb { get; set; }
            /// <summary>
            /// 产品类别明细
            /// </summary>
            public string cplbmx { get; set; }
            /// <summary>
            /// 品牌
            /// </summary>
            public string pp { get; set; }
            /// <summary>
            /// 等级
            /// </summary>
            public string dj { get; set; }
            /// <summary>
            /// 罐号
            /// </summary>
            public string gh { get; set; }
            /// <summary>
            /// 批号
            /// </summary>
            public string ph { get; set; }
            /// <summary>
            /// 包装类型
            /// </summary>
            public string bzlx { get; set; }
            /// <summary>
            /// 派装单号
            /// </summary>
            public string pzdh { get; set; }
            /// <summary>
            /// 派装单单位
            /// </summary>
            public string pzd_dw { get; set; }
            /// <summary>
            /// 派装单调运编号
            /// </summary>
            public string pzd_dybh { get; set; }
            /// <summary>
            /// 派装件数
            /// </summary>
            public double pzjs { get; set; }
            /// <summary>
            /// 派装数量
            /// </summary>
            public decimal pzsl { get; set; }
            /// <summary>
            /// 派装日期(yyyy-mm-dd)
            /// </summary>
            public string pz_rq { get; set; }
            /// <summary>
            /// 派装操作日期
            /// </summary>
            public long pz_czrq { get; set; }
            /// <summary>
            /// 派装作废标记
            /// </summary>
            public int pz_zfbj { get; set; }
            /// <summary>
            /// 派装作废日期
            /// </summary>
            public long pz_zfrq { get; set; }
            /// <summary>
            /// 派装备注
            /// </summary>
            public string pz_bz { get; set; }
            /// <summary>
            /// 出库单编号
            /// </summary>
            public string ckdbh { get; set; }
            /// <summary>
            /// 实发件数
            /// </summary>
            public double sfjs { get; set; }
            /// <summary>
            /// 实发数量
            /// </summary>
            public decimal sfsl { get; set; }
            /// <summary>
            /// 实发车数
            /// </summary>
            public int sfcs { get; set; }
            /// <summary>
            /// 装车时间
            /// </summary>
            public string zcsj { get; set; }
            /// <summary>
            /// 计量单位
            /// </summary>
            public string jldw { get; set; }
            /// <summary>
            /// 发货日期
            /// </summary>
            public long fhrq { get; set; }
            /// <summary>
            /// 仓库代码
            /// </summary>
            public string ckdm { get; set; }
            /// <summary>
            /// 发货人
            /// </summary>
            public string fhr { get; set; }
            /// <summary>
            /// 操作员
            /// </summary>
            public string czydm { get; set; }
            /// <summary>
            /// 审核人
            /// </summary>
            public string shr_username { get; set; }
            /// <summary>
            /// 审核日期
            /// </summary>
            public long shrq { get; set; }
            /// <summary>
            /// 作废标记
            /// </summary>
            public long zfbj { get; set; }
            /// <summary>
            /// 作废日期
            /// </summary>
            public long zfrq { get; set; }
            /// <summary>
            /// 结算单位
            /// </summary>
            public string jsdw { get; set; }
            /// <summary>
            /// 收货单位
            /// </summary>
            public string shdw { get; set; }
            /// <summary>
            /// 运输单位
            /// </summary>
            public string ysdw { get; set; }
            /// <summary>
            /// 联系人
            /// </summary>
            public string lxr { get; set; }
            /// <summary>
            /// 装卸工
            /// </summary>
            public string ry_zxg { get; set; }
            /// <summary>
            /// 叉车司机
            /// </summary>
            public string ry_ccsj { get; set; }
            /// <summary>
            /// erp交货单号
            /// </summary>
            public string erphx_jhdh { get; set; }
            /// <summary>
            /// erp物料编码
            /// </summary>
            public string erphx_wlbm { get; set; }
            /// <summary>
            /// erp物料名称
            /// </summary>
            public string erphx_wlmc { get; set; }
            /// <summary>
            /// erp创建日期
            /// </summary>
            public string erphx_cjrq { get; set; }
            /// <summary>
            /// 货位
            /// </summary>
            public string hw { get; set; }
            /// <summary>
            /// 货位状态
            /// </summary>
            public string hwzt { get; set; }
        }
    }
}
api/DebugController.cs
@@ -11,6 +11,8 @@
using Newtonsoft.Json;
using SqlSugar;
using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
using static HH.WCS.Mobox3.DSZSH.core.Monitor;
@@ -19,8 +21,7 @@
    /// 测试用:如果项目中要和设备对接,前期设备无法测试,用接口模拟
    /// </summary>
    [RoutePrefix("api")]
    public class DebugController : ApiController
    {
    public class DebugController : ApiController {
        /// <summary>
        /// AGV状态一键回报134562
        /// </summary>
@@ -29,22 +30,15 @@
        [HttpPost]
        [Route("AGVSeriesReports")]
        public ReturnResults AGVSeriesReports(UpdateTaskState model) {
            //var db = new SqlHelper<object>().GetInstance();
            //var task = db.Queryable<TN_Task>().Where(t => t.S_CODE == model.TaskID).First();
            //if (task == null) return new ReturnResults();
            //if (task.S_B_STATE == "完成" && task.N_B_STATE == 3 || task.S_B_STATE == "错误" && task.N_B_STATE == 4) {
            //    return new ReturnResults();
            //}
            ReturnResults returnResult = new ReturnResults();
            returnResult.ResultList = new List<ReturnResult>();
            var agvTaskState = new AgvTaskState() {
                task_no = model.TaskID,
                forklift_no = model.ForkliftNo,
                state = 1
            };
            ReturnResults returnResult = new ReturnResults();
            returnResult.ResultList = new List<ReturnResult>();
            agvTaskState.state = 1;
            var temp1 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp1);
@@ -67,6 +61,67 @@
            agvTaskState.state = 2;
            var temp2 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp2);
            return returnResult;
        }
        [HttpPost]
        [Route("AgvReports")]
        public ReturnResults AgvReports(AgvReportsInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            ReturnResults returnResult = new ReturnResults();
            returnResult.ResultList = new List<ReturnResult>();
            var agvTaskState = new AgvTaskState() {
                task_no = model.TaskId,
                forklift_no = model.ForkliftNo,
            };
            var taskAction = db.Queryable<TN_Task_Action>()
                .Where(t => t.S_TASK_CODE == model.TaskId)
                .OrderBy(t => new { create = SqlFunc.Desc(t.T_CREATE) }).First(); // 最后一个Action状态
            var lastState = taskAction?.N_ACTION_CODE ?? 0;
            if (model.NextState <= 0 || model.NextState >= 7) {
                LogHelper.Info("小车回报状态不在134562的范围内");
            }
            // 0 ==> 1,3,4,5,6,2
            if (lastState == 0 && model.NextState >= 1) {
                agvTaskState.state = 1;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            // 0,1 ==> 3,4,5,6,2
            if (lastState < 2 && model.NextState >= 2) {
                agvTaskState.state = 3;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            // 0,1,3 ==> 4,5,6,2
            if (lastState < 4 && lastState != 2 && (model.NextState >= 3 || model.NextState == 2)) {
                agvTaskState.state = 4;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            // 0,1,3,4 ==> 5,6,2
            if (lastState < 5 && lastState != 2 && (model.NextState >= 4 || model.NextState == 2)) {
                agvTaskState.state = 5;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            // 0,1,3,4,5 ==> 6,2
            if (lastState < 6 && lastState != 2 && (model.NextState >= 5 || model.NextState == 2)) {
                agvTaskState.state = 6;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            // 0,1,3,4,5,6 ==> 2
            if (lastState != 2 && model.NextState == 2) {
                agvTaskState.state = 2;
                var temp = WCSCore.OperateAgvTaskStatus(agvTaskState);
                returnResult.ResultList.Add(temp);
            }
            return returnResult;
        }
@@ -137,46 +192,12 @@
        /// <returns></returns>
        [HttpPost]
        [Route("CreateDatabase")]
        public string CreateDatabase(FalseOk model) {
        public string CreateDatabase() {
            try {
                if (model.JumpOut) {
                    return "跳出";
                }
                var db = new SqlHelper<object>().GetInstance();
                var entityTypes = new Type[] { 
                    //typeof(TN_CAR_IN),
                    //typeof(TN_CG_Detail),
                    //typeof(TN_Container),
                    //typeof(TN_Loc_Container),
                    //typeof(TN_Location),
                    //typeof(TN_Task),
                    //typeof(TN_Task_Action),
                    //typeof(SysHelper.OI_SYS_MAXID),
                    //typeof(TN_Inbound_Order),
                    //typeof(TN_Check_Detail),
                    //typeof(TN_Check_Order),
                    //typeof(TN_CNTR_ITEM),
                    //typeof(TN_Outbound_Detail),
                    //typeof(TN_Outbound_Order),
                    //typeof(TN_Shift_Order),
                    //typeof(TN_Shift_Detail)
                    //typeof(TN_Container_Item),
                };
                //using (var tran = db.Ado.UseTran()) {
                //    //db.CodeFirst.InitTables(entityTypes);
                //    if (db.Insertable<TN_Location>(locationList).ExecuteCommand() <= 0) {
                //        tran.RollbackTran();
                //        return "失败";
                //    }
                //    tran.CommitTran();
                //}
            }
            catch (Exception ex) {
@@ -203,45 +224,8 @@
            const string cntrType = "托盘";
            try {
                //var itemCode = model.ItemCode;
                //var batchNo = model.BatchNo;
                var cntrCode = model.CntrCode;
                var startLocCode = model.StartLoc;
                //var cgDetail = new TN_CG_Detail {
                //    S_ITEM_CODE = itemCode,
                //    S_BATCH_NO = batchNo,
                //    S_CNTR_CODE = cntrCode,
                //};
                //var needInsertContainer = false;
                //var needUpdateContainer = false;
                // 查容器信息表是否已经有这个容器
                //var cntr = db.Queryable<TN_Container>()
                //    .Where(c => c.S_CODE == cntrCode).First();
                // 如果找不到该容器,需要添加,并且将容器来源设置为任务名称
                //if (cntr == null) {
                //    needInsertContainer = true;
                //    LogHelper.Info($"轮询:{taskName}:容器:{cntrCode},在容器表中没有登记,登记并设置容器来源为:{taskName}");
                //    cntr = new TN_Container {
                //        S_CODE = cntrCode,
                //        S_TYPE = "托盘",
                //        S_SPEC = itemCode,
                //        S_SOURCE = taskName,
                //    };
                //}
                //else {
                //    // 如果找到该容器,但容器物料类型与下线物料不符,记录并直接覆盖(待定)
                //    if (!string.IsNullOrEmpty(cntr.S_SPEC) && cntr.S_SPEC != itemCode) {
                //        needUpdateContainer = true;
                //        LogHelper.Info($"轮询:{taskName}:容器表中容器{cntrCode}对应的物料信息:{cntr.S_SPEC}," +
                //            $"与所需要的物料信息{itemCode}不符,直接覆盖结果");
                //        cntr.S_SPEC = itemCode;
                //        cntr.S_SOURCE = taskName;
                //    }
                //}
                var startLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_CODE == startLocCode)
@@ -297,29 +281,6 @@
                            return info;
                        }
                    }
                    //if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
                    //    tran.RollbackTran();
                    //    info = $"插入容器货品信息表失败:物料编码{cgDetail.S_ITEM_CODE},容器编码{cgDetail.S_CNTR_CODE}";
                    //    LogHelper.Info(info);
                    //    return info;
                    //}
                    //if (needInsertContainer) {
                    //    if (db.Insertable<TN_Container>(cntr).ExecuteCommand() <= 0) {
                    //        info = $"插入容器表失败:" + JsonConvert.SerializeObject(cntr);
                    //        tran.RollbackTran();
                    //        LogHelper.Info(info);
                    //        return info;
                    //    }
                    //}
                    //else if (needUpdateContainer) {
                    //    if (db.Updateable<TN_Container>(cntr).ExecuteCommand() <= 0) {
                    //        info = $"更新容器表失败:" + JsonConvert.SerializeObject(cntr);
                    //        tran.RollbackTran();
                    //        LogHelper.Info(info);
                    //        return info;
                    //    }
                    //}
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
@@ -405,6 +366,21 @@
        //public int NextState { set; get; }
    }
    public class AgvReportsInfo {
        /// <summary>
        /// 任务号
        /// </summary>
        public string TaskId { set; get; }
        /// <summary>
        /// AGV 小车号
        /// </summary>
        public string ForkliftNo { get; set; }
        /// <summary>
        /// AGV 下一状态(任务回报号)
        /// </summary>
        public int NextState { set; get; } = 0;
    }
    public class FalseOk {
        public bool JumpOut { set; get; } = true;
    }
config/config.comment.json
@@ -1,9 +1,11 @@
{
    //"WebApiUrl": "http://192.168.1.141:8901",
    //"WebApiUrl": "http://192.168.1.67:8901",
    "WebApiUrl": "http://127.0.0.1:8901",
    "NdcApiUrl": "http://127.0.0.1:5201/api/order/",
    "ErpApiUrl": "http://127.0.0.1:8085/api/",
    "SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;",
    //"SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;",
    "SqlServer": "Data Source=(local);Initial Catalog=DSZSHTest;User ID=sa;Password=123456;",
    "TcpServerIp": "127.0.0.1",
    "TcpServerPort": 8085,
    "Areas": [
config/config.json
@@ -2,7 +2,7 @@
    "WebApiUrl": "http://127.0.0.1:8901",
    "NdcApiUrl": "http://127.0.0.1:5201/api/order/",
    "ErpApiUrl": "http://127.0.0.1:8085/api/",
    "SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;",
    "SqlServer": "Data Source=(local);Initial Catalog=DSZSHTest;User ID=sa;Password=123456;",
    "TcpServerIp": "127.0.0.1",
    "TcpServerPort": 8085,
    "Areas": [
core/Monitor.cs
@@ -65,41 +65,6 @@
                    var startLocCode = prod.OffLoc[0]; // 用于测试
                    //var startLocCode = "CX01"; // 用于测试
                    //var cgDetail = new TN_CG_Detail { // 空托上线时就绑定好了
                    //    S_ITEM_CODE = itemCode,
                    //    S_BATCH_NO = batchNo,
                    //    S_CNTR_CODE = cntrCode,
                    //};
                    //var needInsertContainer = false;
                    //var needUpdateContainer = false;
                    // TEMP 自动触发的托盘下线暂时不考虑判断,默认没有时写入
                    // 查容器信息表是否已经有这个容器
                    //var cntr = db.Queryable<TN_Container>()
                    //    .Where(c => c.S_CODE == cntrCode).First();
                    // 如果找不到该容器,需要添加,并且将容器来源设置为任务名称
                    //if (cntr == null) {
                    //    needInsertContainer = true;
                    //    LogHelper.Info($"轮询:{taskName}:容器:{cntrCode},在容器表中没有登记,登记并设置容器来源为:{taskName}");
                    //    cntr = new TN_Container {
                    //        S_CODE = cntrCode,
                    //        S_TYPE = cntrType,
                    //        S_SPEC = itemCode,
                    //    };
                    //}
                    //else {
                    //    如果找到该容器,但容器物料类型与下线物料不符,记录并直接覆盖(待定)
                    //    if (!string.IsNullOrEmpty(cntr.S_SPEC) && cntr.S_SPEC != itemCode) {
                    //        needUpdateContainer = true;
                    //        LogHelper.Info($"轮询:{taskName}:容器表中容器{cntrCode}对应的物料信息:{cntr.S_SPEC}," +
                    //            $"与所需要的物料信息{itemCode}不符,直接覆盖结果");
                    //        cntr.S_SPEC = itemCode;
                    //    }
                    //}
                    var startLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_CODE == startLocCode)
                    .Where(l => Settings.AreaMap[startAreaName].Contains(l.S_AREA_CODE))
@@ -142,9 +107,6 @@
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                    //cntr.S_SOURCE = task.S_CODE;
                    //cntr.T_MODIFY = DateTime.Now;
                    using (var tran = db.Ado.UseTran()) {
                        if (locCntrRelOld != null) {
                            if (db.Deleteable<TN_Loc_Container>(locCntrRelOld).ExecuteCommand() <= 0 &&
@@ -155,30 +117,6 @@
                                continue;
                            }
                        }
                        //if (needInsertContainer) {
                        //    if (db.Insertable<TN_Container>(cntr).ExecuteCommand() <= 0) {
                        //        info = $"插入容器表失败:" + JsonConvert.SerializeObject(cntr);
                        //        tran.RollbackTran();
                        //        LogHelper.Info(info);
                        //        continue;
                        //    }
                        //}
                        //else if (needUpdateContainer) {
                        //    if (db.Updateable<TN_Container>(cntr)
                        //        .UpdateColumns(c => new { c.S_SPEC, c.S_SOURCE, c.T_MODIFY }).ExecuteCommand() <= 0) {
                        //        info = $"更新容器表失败:" + JsonConvert.SerializeObject(cntr);
                        //        tran.RollbackTran();
                        //        LogHelper.Info(info);
                        //        continue;
                        //    }
                        //}
                        //if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
                        //    tran.RollbackTran();
                        //    info = $"插入容器货品信息表失败:物料编码{cgDetail.S_ITEM_CODE},容器编码{cgDetail.S_CNTR_CODE}";
                        //    LogHelper.Info(info);
                        //    continue;
                        //}
                        if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
@@ -374,6 +312,8 @@
                        LogHelper.Info(info);
                        continue;
                    }
                }
core/WCSCore.cs
@@ -20,7 +20,7 @@
        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
            var result = new ReturnResult();
            try {
                if (model.state > 0 && model.state < 1000) {
                if (model.state > 0) {
                    // AGV 执行任务的逻辑处理
                    if (!AgvTaskProcessOk(model)) {
                        // 执行不OK,说明没有找到任务
@@ -38,7 +38,7 @@
            }
            catch (Exception ex) {
                result.ResultCode = -1;
                result.ResultMsg = $"发生了异常:+{ex.Message}";
                result.ResultMsg = $"发生了异常:{ex.Message}";
                LogHelper.Info(result.ResultMsg, "Error");
                return result;
            }
@@ -76,9 +76,9 @@
                        var nextOutboundTask = Task.Run(() => {
                            UpdateOutboundTaskState(3);
                        });
                        //var pickUpReturnErpTask = Task.Run(() => {
                        //    PickUpReturnErp(TN_Task);
                        //});
                        var pickUpReturnErpTask = Task.Run(() => {
                            PickUpReturnErp(TN_Task);
                        });
                    }
                    break;
@@ -323,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);
wms/WCSHelper.cs
@@ -29,7 +29,7 @@
            var db = new SqlHelper<TN_Task>().GetInstance();
            task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE);
            task.T_MODIFY = DateTime.Now;
            db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand();
            res = db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand() > 0;
            return res;
        }
        internal static bool UpdateEQNo(TN_Task task) {
@@ -174,7 +174,6 @@
                    task.S_EQ_NO = forklift_no;
                    db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME, it.S_EQ_NO }).ExecuteCommand();
                }
            }
        }
        internal static void End(TN_Task task) {