kazelee
2025-06-10 570a2d760cc1f2b78922d91d941ef81f01199e4c
完善ERP下发信息的处理和出库单生成流程
3个文件已添加
10个文件已修改
3个文件已删除
417 ■■■■ 已修改文件
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3051f4c7-a03d-4ed5-a59d-3d04bff3e616.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/83dde277-5a65-4de9-9767-687a4e67f7ac.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b2279396-cedf-4e13-9379-f9b937f2b7c7.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b390e7fe-a07b-4bb1-b189-3369e1fec281.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/bfedc8a7-5d30-4f46-ba09-dd908b77cc68.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c17e55d3-cccd-4fba-9a50-2551ca54ee71.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
api/AgvController.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 255 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
config/config.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Outbound_Detail.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Outbound_Plan.cs 106 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Record_Table.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
models/TN_Task.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/WCSHelper.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3051f4c7-a03d-4ed5-a59d-3d04bff3e616.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/83dde277-5a65-4de9-9767-687a4e67f7ac.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b2279396-cedf-4e13-9379-f9b937f2b7c7.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/b390e7fe-a07b-4bb1-b189-3369e1fec281.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/bfedc8a7-5d30-4f46-ba09-dd908b77cc68.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c17e55d3-cccd-4fba-9a50-2551ca54ee71.vsidx
Binary files differ
api/AgvController.cs
@@ -21,6 +21,7 @@
        /// <returns></returns>
        [HttpPost]
        [Route("AGVCallbackState")]
        public ReturnResult AGVCallbackState(AgvTaskState model)
        {
            LogHelper.Info("NDC HostToAGV 任务状态回报:" + JsonConvert.SerializeObject(model), "HosttoagvTask");
api/ApiHelper.cs
@@ -1200,9 +1200,9 @@
            var taskName = TaskName.C成品胶出库;
            try {
                var orderNo = GenerateOrderNo("出库单号", "ON");
                var orderNo = GenerateOrderNo("出库单号", "CKD");
                var cgDetailList = SelectCgByTotalQty(model);
                var cgDetailList = SelectCgByTotalQty(model.Qty, model.ItemCode, model.BatchNo, model.CntrType, model.ForcedOut);
                if (cgDetailList.Count == 0) {
                    info = "没有合适的物料可以出库";
@@ -1271,9 +1271,9 @@
            var taskName = TaskName.C成品胶出库;
            try {
                var orderNo = GenerateOrderNo("出库单号", "ON");
                var orderNo = GenerateOrderNo("出库单号", "CKD");
                var cgDetailList = SelectCgByTotalQty(model);
                var cgDetailList = SelectCgByTotalQty(model.Qty, model.ItemCode, model.BatchNo, model.CntrType, model.ForcedOut);
                if (cgDetailList.Count == 0) {
                    info = "没有合适的物料可以出库";
@@ -1331,14 +1331,14 @@
            }
        }
        public static List<TN_CG_Detail> SelectCgByTotalQty(FinishedOutboundInfo model) {
        public static List<TN_CG_Detail> SelectCgByTotalQty(int qty, string itemCode, string batchNo, string cntrType = "", bool forcedOut = true) {
            var db = new SqlHelper<object>().GetInstance();
            var result = new List<TN_CG_Detail>();
            var targetNum = model.Qty;
            var targetNum = qty;
            var info = "";
            try {
                var targetCg = db.Queryable<TN_CG_Detail>()
                    .Where(a => a.S_ITEM_CODE == model.ItemCode && a.S_BATCH_NO == model.BatchNo)
                    .Where(a => a.S_ITEM_CODE == itemCode && a.S_BATCH_NO == batchNo)
                    .Where(a => a.N_ITEM_NUM > targetNum)
                    .OrderBy(a => a.N_ITEM_NUM, OrderByType.Asc).First();
                if (targetCg != null) //刚好有一行满足条件
@@ -1351,10 +1351,18 @@
                var sortedMaterials = new List<TN_CG_Detail>();
                if (model.ForcedOut) {
                var cntrTypeList = new List<string>();
                if (cntrType == "") {
                    cntrTypeList = new List<string> { "托盘", "好运箱" }; // 不指定托盘类型,二者均可
                }
                else {
                    cntrTypeList.Add(cntrType);
                }
                if (forcedOut) {
                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                    .Where(d => d.S_ITEM_CODE == itemCode && d.S_BATCH_NO == batchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => cntrTypeList.Contains(c.S_CNTR_TYPE))
                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格"
                             || d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检")
                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
@@ -1362,13 +1370,12 @@
                }
                else {
                    sortedMaterials = db.Queryable<TN_CG_Detail, TN_Loc_Container>((d, c) => d.S_CNTR_CODE == c.S_CNTR_CODE)
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => c.S_CNTR_TYPE == model.CntrType)
                    .Where(d => d.S_ITEM_CODE == itemCode && d.S_BATCH_NO == batchNo && d.N_ITEM_NUM > 0)
                    .Where((d, c) => cntrTypeList.Contains(c.S_CNTR_TYPE))
                    .Where(d => d.N_ITEM_STATE == 0 && d.S_ITEM_STATE == "合格")
                    .OrderBy(d => d.N_ITEM_NUM, OrderByType.Desc)
                    .OrderBy(d => d.N_ITEM_STATE, OrderByType.Asc).ToList();
                }
                if (sortedMaterials.Count == 0) //没有满足条件的
                {
@@ -1481,124 +1488,124 @@
        public static ErpResult ErpSendOutboundPlan(ErpSendOutboundPlanInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var orderNo = GenerateOrderNo("出库单号", "ON");
            var orderNo = GenerateOrderNo("出库单号", "CKD");
            var info = "";
            try {
                if (string.IsNullOrEmpty(orderNo)) {
                    info = "出库单号不能为空";
                // 参数合法性确认部分:错误编码:400
                if (model.pzsl <= 0) {
                    info = $"物料数量(pzsl){model.pzsl}不合法:物料数量应该大于 0";
                    LogHelper.Info(info);
                    return NewErpResult(400, info);
                }
                var outboundPlan = new TN_Outbound_Plan {
                    JHDH = model.jhdh, // 计划单号(唯一标识)
                    CKZT = model.ckzt, // 出库状态
                    JHLB = model.jhlb, // 计划类别
                    CKDH = model.ckdh, // 参考单号
                    CPH = model.cph, // 车牌号
                    YSFS = model.ysfs, // 运输方式
                    CPZT = model.cpzt, // 产品状态
                    MDDW = model.mddw, // 买断单位
                    CPDM = model.cpdm, // 产品代码
                    CPLB = model.cplb, // 产品类别
                    CPLBMX = model.cplbmx, // 产品类别明细
                    PP = model.pp, // 品牌
                    DJ = model.dj, // 等级
                    GH = model.gh, // 罐号
                    PH = model.ph, // 批号
                    BZLX = model.bzlx, // 包装类型
                    PZDH = model.pzdh, // 派装单号
                    PZD_DW = model.pzd_dw, // 派装单单位
                    PZD_DYBH = model.pzd_dybh, // 派装单调运编号
                    PZJS = model.pzjs, // 派装件数
                    PZSL = model.pzsl, // 派装数量
                    PZ_RQ = model.pz_rq, // 派装日期(yyyy-mm-dd)
                    PZ_CZRQ = model.pz_czrq, // 派装操作日期
                    PZ_ZFBJ = model.pz_zfbj, // 派装作废标记
                    PZ_ZFRQ = model.pz_zfrq, // 派装作废日期
                    PZ_BZ = model.pz_bz, // 派装备注
                    CKDBH = model.ckdbh, // 出库单编号
                    SFJS = model.sfjs, // 实发件数
                    SFSL = model.sfsl, // 实发数量
                    SFCS = model.sfcs, // 实发车数
                    ZCSJ = model.zcsj, // 装车时间
                    JLDW = model.jldw, // 计量单位
                    FHRQ = model.fhrq, // 发货日期
                    CKDM = model.ckdm, // 仓库代码
                    FHR = model.fhr, // 发货人
                    CZYDM = model.czydm, // 操作员
                    SHR_USERNAME = model.shr_username, // 审核人
                    SHRQ = model.shrq, // 审核日期
                    ZFBJ = model.zfbj, // 作废标记
                    ZFRQ = model.zfrq, // 作废日期
                    JSDW = model.jsdw, // 结算单位
                    SHDW = model.shdw, // 收货单位
                    YSDW = model.ysdw, // 运输单位
                    LXR = model.lxr, // 联系人
                    RY_ZXG = model.ry_zxg, // 装卸工
                    RY_CCSJ = model.ry_ccsj, // 叉车司机
                    ERPHX_JHDH = model.erphx_jhdh, // erp交货单号
                    ERPHX_WLBM = model.erphx_wlbm, // erp物料编码
                    ERPHX_WLMC = model.erphx_wlmc, // erp物料名称
                    ERPHX_CJRQ = model.erphx_cjrq, // erp创建日期
                    HW = model.hw, // 货位
                    HWZT = model.hwzt // 货位状态
                };
                var cgDetailList = SelectCgByTotalQty(
                    qty: (int)model.pzsl,
                    itemCode: model.cpdm,
                    batchNo: model.ph
                    );
                if (cgDetailList.Count == 0) {
                    info = "没有合适的物料可以出库";
                    LogHelper.Info(info);
                    return NewErpResult(3, info);
                }
                var order = new TN_Outbound_Order {
                    S_NO = orderNo,
                    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_BS_NO = model.jhdh,
                    S_BS_TYPE = "ERP",
                };
                var detailList = new List<TN_Outbound_Detail>();
                foreach (var cgDetail in cgDetailList) {
                    var detail = new TN_Outbound_Detail {
                        S_OO_NO = orderNo,
                        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                        S_BATCH_NO = cgDetail.S_BATCH_NO,
                        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                        N_COUNT = cgDetail.N_ITEM_NUM,
                        S_END_AREA = order.S_END_AREA, // order为detail的每一个货位设置终点值
                        S_BS_NO = order.S_BS_NO,
                        S_BS_TYPE= order.S_BS_TYPE,
                    };
                    detailList.Add(detail);
                }
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = "生成出库单失败:" + JsonConvert.SerializeObject(order);
                    LogHelper.Info(info);
                    return NewErpResult(2, info);
                }
                var outboundPlan = new TN_Outbound_Plan {
                    jhdh = model.jhdh,
                    ckzt = model.ckzt,
                    jhlb = model.jhlb,
                    ckdh = model.ckdh,
                    cph = model.cph,
                    ysfs = model.ysfs,
                    cpzt = model.cpzt,
                    mddw = model.mddw,
                    cpdm = model.cpdm,
                    cplb = model.cplb,
                    cplbmx = model.cplbmx,
                    pp = model.pp,
                    dj = model.dj,
                    gh = model.gh,
                    ph = model.ph,
                    bzlx = model.bzlx,
                    pzdh = model.pzdh,
                    pzd_dw = model.pzd_dw,
                    pzd_dybh = model.pzd_dybh,
                    pzjs = model.pzjs,
                    pzsl = model.pzsl,
                    pz_rq = model.pz_rq,
                    pz_czrq = model.pz_czrq,
                    pz_zfbj = model.pz_zfbj,
                    pz_zfrq = model.pz_zfrq,
                    pz_bz = model.pz_bz,
                    ckdbh = model.ckdbh,
                    sfjs = model.sfjs,
                    sfsl = model.sfsl,
                    sfcs = model.sfcs,
                    zcsj = model.zcsj,
                    jldw = model.jldw,
                    fhrq = model.fhrq,
                    ckdm = model.ckdm,
                    fhr = model.fhr,
                    czydm = model.czydm,
                    shr_username = model.shr_username,
                    shrq = model.shrq,
                    zfbj = model.zfbj,
                    zfrq = model.zfrq,
                    jsdw = model.jsdw,
                    shdw = model.shdw,
                    ysdw = model.ysdw,
                    lxr = model.lxr,
                    ry_zxg = model.ry_zxg,
                    ry_ccsj = model.ry_ccsj,
                    erphx_jhdh = model.erphx_jhdh,
                    erphx_wlbm = model.erphx_wlbm,
                    erphx_wlmc = model.erphx_wlmc,
                    erphx_cjrq = model.erphx_cjrq,
                    hw = model.hw,
                    hwzt = model.hwzt
                };
                    if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = "生成出库单明细失败";
                        LogHelper.Info(info);
                        return NewErpResult(4, info);
                    }
                //var cgDetailList = SelectCgByTotalQty(new FinishedOutboundInfo {
                //    BatchNo = model.BatchNo,
                //    CntrType= model.CntrType,
                //    ItemCode= model.ItemCode,
                //    EndArea= model.EndArea,
                //    ForcedOut= model.ForcedOut,
                //    Qty= model.Qty,
                //    Spe = model.Spe
                //});
                //if (cgDetailList.Count == 0) {
                //    info = "没有合适的物料可以出库";
                //    LogHelper.Info(info);
                //    return NewErpResult(3, info);
                //}
                //var order = new TN_Outbound_Order {
                //    S_NO = orderNo,
                //    S_ITEM_CODE = model.ItemCode,
                //    S_BATCH = model.BatchNo,
                //    N_END_NUM = model.Qty,
                //    //F_OUT_QTY = cgDetailList.Sum(a => a.N_QTY),
                //    S_END_AREA = model.EndArea,
                //    S_BS_NO = model.ErpNo,
                //    S_BS_TYPE = "ERP",
                //};
                //var detailList = new List<TN_Outbound_Detail>();
                //foreach (var cgDetail in cgDetailList) {
                //    var detail = new TN_Outbound_Detail {
                //        S_OO_NO = orderNo,
                //        S_ITEM_CODE = cgDetail.S_ITEM_CODE,
                //        S_BATCH_NO = cgDetail.S_BATCH_NO,
                //        S_CNTR_CODE = cgDetail.S_CNTR_CODE,
                //        N_COUNT = cgDetail.N_ITEM_NUM,
                //        S_END_AREA = model.EndArea
                //    };
                //    detailList.Add(detail);
                //}
                using (var tran = db.Ado.UseTran()) {
                    //if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
                    //    tran.RollbackTran();
                    //    info = "生成出库单失败:" + JsonConvert.SerializeObject(order);
                    //    LogHelper.Info(info);
                    //    return NewErpResult(2, info);
                    //}
                    //if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
                    //    tran.RollbackTran();
                    //    info = "生成出库单明细失败";
                    //    LogHelper.Info(info);
                    //    return NewErpResult(4, info);
                    //}
                    if (db.Insertable<TN_Outbound_Plan>(outboundPlan).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = "生成出库单计划记录表失败";
config/config.json
@@ -1,5 +1,5 @@
{
    "WebApiUrl": "http://192.168.1.141: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;",
core/Monitor.cs
@@ -300,7 +300,9 @@
                    detail.N_B_STATE = 2;
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    var erp_no = string.IsNullOrEmpty(detail.S_BS_NO) ? "" : detail.S_BS_NO;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName, detail.S_OO_NO, erp_no);
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
@@ -324,6 +326,7 @@
                            LogHelper.Info(info);
                            continue;
                        }
                        if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
                            it.N_LOCK_STATE,
@@ -412,7 +415,7 @@
                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 执行中
                    var allCount = db.Queryable<TN_SpotCheck_Detail>()
                        .Count(d => d.S_OO_NO == order.S_NO);
                    LogHelper.Info($"轮询--{taskName}--统计{taskName}单'{order.S_NO}'任务已下发:{doingCount}/{allCount}");
                    LogHelper.Info($"轮询:{taskName}:统计{taskName}单'{order.S_NO}'任务已下发:{doingCount}/{allCount}");
                    if (doingCount == allCount) {
                        order.N_B_STATE = 2; // 所有任务都已执行
@@ -425,7 +428,7 @@
                        .ToList();
                    if (checkDetailList.Count == 0) {
                        LogHelper.Info($"轮询--{taskName}--仍有任务未执行完成,但当前没有已下发的任务");
                        LogHelper.Info($"轮询:{taskName}:仍有任务未执行完成,但当前没有已下发的任务");
                        continue;
                    }
@@ -441,7 +444,7 @@
                        .First();
                    if (startLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的起点货位!");
                        LogHelper.Info($"轮询:{taskName}:没有找到合适的起点货位!");
                        continue;
                    }
@@ -451,14 +454,14 @@
                        .Where(a => a.N_CURRENT_NUM == 0).First();
                    if (endLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的终点货位!");
                        LogHelper.Info($"轮询:{taskName}:没有找到合适的终点货位!");
                        continue;
                    }
                    detail.N_B_STATE = 2;
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName, detail.S_OO_NO);
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
@@ -466,7 +469,7 @@
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_SpotCheck_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            LogHelper.Info($"轮询--{taskName}:修改{taskName}单明细表状态为完成--失败!");
                            LogHelper.Info($"轮询:{taskName}:修改{taskName}单明细表状态为完成--失败!");
                            continue;
                        }
@@ -524,7 +527,7 @@
                    .ToList();
                if (orderList.Count == 0) {
                    LogHelper.Info($"轮询--{taskName}--暂无待执行的{taskName}单");
                    LogHelper.Info($"轮询:{taskName}:暂无待执行的{taskName}单");
                    return;
                }
@@ -534,7 +537,7 @@
                        .Count(d => d.S_OO_NO == order.S_NO && d.N_B_STATE >= 2); // 执行中
                    var allCount = db.Queryable<TN_RelocationList_Detail>()
                        .Count(d => d.S_OO_NO == order.S_NO);
                    LogHelper.Info($"轮询--{taskName}--统计{taskName}单'{order.S_NO}'任务已下发:{doingCount}/{allCount}");
                    LogHelper.Info($"轮询:{taskName}:统计{taskName}单'{order.S_NO}'任务已下发:{doingCount}/{allCount}");
                    if (doingCount == allCount) {
                        order.N_B_STATE = 2; // 所有任务都已执行
@@ -547,7 +550,7 @@
                        .ToList();
                    if (checkDetailList.Count == 0) {
                        LogHelper.Info($"轮询--{taskName}--仍有任务未执行完成,但当前没有已下发的任务");
                        LogHelper.Info($"轮询:{taskName}:仍有任务未执行完成,但当前没有已下发的任务");
                        continue;
                    }
@@ -565,7 +568,7 @@
                        .First();
                    if (startLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的起点货位!");
                        LogHelper.Info($"轮询:{taskName}:没有找到合适的起点货位!");
                        continue;
                    }
@@ -575,14 +578,14 @@
                        .Where(a => a.N_CURRENT_NUM == 0).First();
                    if (endLoc == null) {
                        LogHelper.Info($"轮询--{taskName}:没有找到合适的终点货位!");
                        LogHelper.Info($"轮询:{taskName}:没有找到合适的终点货位!");
                        continue;
                    }
                    detail.N_B_STATE = 2;
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName, detail.S_OO_NO);
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
@@ -590,7 +593,7 @@
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_RelocationList_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            LogHelper.Info($"轮询--{taskName}:修改{taskName}单明细表状态为完成--失败!");
                            LogHelper.Info($"轮询:{taskName}:修改{taskName}单明细表状态为完成--失败!");
                            continue;
                        }
core/WCSCore.cs
@@ -175,8 +175,9 @@
                    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, // 出库/抽检/移库单
                };
                // 数据库操作
models/TN_Outbound_Detail.cs
@@ -11,6 +11,10 @@
        /// </summary>
        public string S_OO_NO { get; set; }
        public string S_BS_TYPE { get; set; } = string.Empty; // ERP
        public string S_BS_NO { get; set; } = string.Empty; // ERP 单号(来源单号)
        /// <summary>
        /// 业务状态:0待执行 1已下发 2执行中 3已完成
        /// </summary>
models/TN_Outbound_Plan.cs
@@ -11,265 +11,265 @@
    /// 出库计划实体类
    /// </summary>
    [SugarTable("TN_Outbound_Plan")]
    public class TN_Outbound_Plan {
    public class TN_Outbound_Plan : BaseModel {
        /// <summary>
        /// 计划单号(唯一标识)
        /// </summary>
        public string jhdh { get; set; }
        public string JHDH { get; set; }
        /// <summary>
        /// 出库状态
        /// </summary>
        public string ckzt { get; set; }
        public string CKZT { get; set; }
        /// <summary>
        /// 计划类别
        /// </summary>
        public string jhlb { get; set; }
        public string JHLB { get; set; }
        /// <summary>
        /// 参考单号
        /// </summary>
        public string ckdh { get; set; }
        public string CKDH { get; set; }
        /// <summary>
        /// 车牌号
        /// </summary>
        public string cph { get; set; }
        public string CPH { get; set; }
        /// <summary>
        /// 运输方式
        /// </summary>
        public string ysfs { get; set; }
        public string YSFS { get; set; }
        /// <summary>
        /// 产品状态
        /// </summary>
        public string cpzt { get; set; }
        public string CPZT { get; set; }
        /// <summary>
        /// 买断单位
        /// </summary>
        public string mddw { get; set; }
        public string MDDW { get; set; }
        /// <summary>
        /// 产品代码
        /// </summary>
        public string cpdm { get; set; }
        public string CPDM { get; set; }
        /// <summary>
        /// 产品类别
        /// </summary>
        public string cplb { get; set; }
        public string CPLB { get; set; }
        /// <summary>
        /// 产品类别明细
        /// </summary>
        public string cplbmx { get; set; }
        public string CPLBMX { get; set; }
        /// <summary>
        /// 品牌
        /// </summary>
        public string pp { get; set; }
        public string PP { get; set; }
        /// <summary>
        /// 等级
        /// </summary>
        public string dj { get; set; }
        public string DJ { get; set; }
        /// <summary>
        /// 罐号
        /// </summary>
        public string gh { get; set; }
        public string GH { get; set; }
        /// <summary>
        /// 批号
        /// </summary>
        public string ph { get; set; }
        public string PH { get; set; }
        /// <summary>
        /// 包装类型
        /// </summary>
        public string bzlx { get; set; }
        public string BZLX { get; set; }
        /// <summary>
        /// 派装单号
        /// </summary>
        public string pzdh { get; set; }
        public string PZDH { get; set; }
        /// <summary>
        /// 派装单单位
        /// </summary>
        public string pzd_dw { get; set; }
        public string PZD_DW { get; set; }
        /// <summary>
        /// 派装单调运编号
        /// </summary>
        public string pzd_dybh { get; set; }
        public string PZD_DYBH { get; set; }
        /// <summary>
        /// 派装件数
        /// </summary>
        public double pzjs { get; set; }
        public double PZJS { get; set; }
        /// <summary>
        /// 派装数量
        /// </summary>
        public decimal pzsl { get; set; }
        public decimal PZSL { get; set; }
        /// <summary>
        /// 派装日期(yyyy-mm-dd)
        /// </summary>
        public string pz_rq { get; set; }
        public string PZ_RQ { get; set; }
        /// <summary>
        /// 派装操作日期
        /// </summary>
        public long pz_czrq { get; set; }
        public long PZ_CZRQ { get; set; }
        /// <summary>
        /// 派装作废标记
        /// </summary>
        public int pz_zfbj { get; set; }
        public int PZ_ZFBJ { get; set; }
        /// <summary>
        /// 派装作废日期
        /// </summary>
        public long pz_zfrq { get; set; }
        public long PZ_ZFRQ { get; set; }
        /// <summary>
        /// 派装备注
        /// </summary>
        public string pz_bz { get; set; }
        public string PZ_BZ { get; set; }
        /// <summary>
        /// 出库单编号
        /// </summary>
        public string ckdbh { get; set; }
        public string CKDBH { get; set; }
        /// <summary>
        /// 实发件数
        /// </summary>
        public double sfjs { get; set; }
        public double SFJS { get; set; }
        /// <summary>
        /// 实发数量
        /// </summary>
        public decimal sfsl { get; set; }
        public decimal SFSL { get; set; }
        /// <summary>
        /// 实发车数
        /// </summary>
        public int sfcs { get; set; }
        public int SFCS { get; set; }
        /// <summary>
        /// 装车时间
        /// </summary>
        public string zcsj { get; set; }
        public string ZCSJ { get; set; }
        /// <summary>
        /// 计量单位
        /// </summary>
        public string jldw { get; set; }
        public string JLDW { get; set; }
        /// <summary>
        /// 发货日期
        /// </summary>
        public long fhrq { get; set; }
        public long FHRQ { get; set; }
        /// <summary>
        /// 仓库代码
        /// </summary>
        public string ckdm { get; set; }
        public string CKDM { get; set; }
        /// <summary>
        /// 发货人
        /// </summary>
        public string fhr { get; set; }
        public string FHR { get; set; }
        /// <summary>
        /// 操作员
        /// </summary>
        public string czydm { get; set; }
        public string CZYDM { get; set; }
        /// <summary>
        /// 审核人
        /// </summary>
        public string shr_username { get; set; }
        public string SHR_USERNAME { get; set; }
        /// <summary>
        /// 审核日期
        /// </summary>
        public long shrq { get; set; }
        public long SHRQ { get; set; }
        /// <summary>
        /// 作废标记
        /// </summary>
        public long zfbj { get; set; }
        public long ZFBJ { get; set; }
        /// <summary>
        /// 作废日期
        /// </summary>
        public long zfrq { get; set; }
        public long ZFRQ { get; set; }
        /// <summary>
        /// 结算单位
        /// </summary>
        public string jsdw { get; set; }
        public string JSDW { get; set; }
        /// <summary>
        /// 收货单位
        /// </summary>
        public string shdw { get; set; }
        public string SHDW { get; set; }
        /// <summary>
        /// 运输单位
        /// </summary>
        public string ysdw { get; set; }
        public string YSDW { get; set; }
        /// <summary>
        /// 联系人
        /// </summary>
        public string lxr { get; set; }
        public string LXR { get; set; }
        /// <summary>
        /// 装卸工
        /// </summary>
        public string ry_zxg { get; set; }
        public string RY_ZXG { get; set; }
        /// <summary>
        /// 叉车司机
        /// </summary>
        public string ry_ccsj { get; set; }
        public string RY_CCSJ { get; set; }
        /// <summary>
        /// erp交货单号
        /// </summary>
        public string erphx_jhdh { get; set; }
        public string ERPHX_JHDH { get; set; }
        /// <summary>
        /// erp物料编码
        /// </summary>
        public string erphx_wlbm { get; set; }
        public string ERPHX_WLBM { get; set; }
        /// <summary>
        /// erp物料名称
        /// </summary>
        public string erphx_wlmc { get; set; }
        public string ERPHX_WLMC { get; set; }
        /// <summary>
        /// erp创建日期
        /// </summary>
        public string erphx_cjrq { get; set; }
        public string ERPHX_CJRQ { get; set; }
        /// <summary>
        /// 货位
        /// </summary>
        public string hw { get; set; }
        public string HW { get; set; }
        /// <summary>
        /// 货位状态
        /// </summary>
        public string hwzt { get; set; }
        public string HWZT { get; set; }
    }
}
models/TN_Record_Table.cs
@@ -13,6 +13,10 @@
    [SugarTable("TN_Record_Table")]
    public class TN_Record_Table : BaseModel {
        /// <summary>
        /// 业务单号
        /// </summary>
        public string S_NO { get; set; }
        /// <summary>
        /// 任务号
        /// </summary>
        public string S_TASK_NO { get; set; }
models/TN_Task.cs
@@ -78,6 +78,10 @@
        public string S_EQ_TASK_CODE { get; set; }
        public string S_CNTR_CODE { get; set; }
        /// <summary>
        /// 作业编码
        /// </summary>
        public string S_OP_CODE { get; set; }
        public string S_OP_NAME { get; set; }
    
        public int N_START_LAYER { get; internal set; }
wms/WCSHelper.cs
@@ -63,7 +63,7 @@
            return TN_Task;
        }
        public static TN_Task BuildErpTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type, string erpNo) {
        public static TN_Task BuildTask(TN_Location startLoc, TN_Location endLoc, string cntId, string type, string op_no, string erp_no = "") {
            TN_Task TN_Task = new TN_Task() {
                S_CODE = GenerateTaskNo(),
                S_START_AREA = startLoc.S_AREA_CODE,
@@ -75,8 +75,9 @@
                N_SCHEDULE_TYPE = 1, // NDC
                N_B_STATE = 0,
                S_CNTR_CODE = cntId,
                S_BS_NO = erpNo,
                S_BS_TYPE = "ERP",
                S_OP_CODE = op_no,
                S_BS_NO = erp_no,
                S_BS_TYPE = erp_no == "" ? "" : "ERP",
            };
            return TN_Task;