kazelee
2025-05-30 6b43055b5aa32dbea0dacee5a0235b0d5a76c293
优化后台报错信息,空箱入库容器号增加检查逻辑
3个文件已添加
9个文件已修改
4个文件已删除
588 ■■■■ 已修改文件
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/0e784c8d-2ea0-45e5-8726-82d212591fce.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3908d945-9e88-4170-b92a-f2cf0dcb5e54.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/541e9f47-0b5c-4a4e-9982-872d7ed880d7.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/687ebc79-98fe-4ac4-b909-c9e972afad42.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c746dfc7-35d0-465f-9364-9d1f640d45c0.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e95c9dfb-066e-4e8f-a68a-626ca63d579a.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/fb5893ae-54ab-4004-9fc4-c8a740b25317.vsidx 补丁 | 查看 | 原始文档 | blame | 历史
Models/TN_Location.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiHelper.cs 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/ApiModel.cs 204 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
api/DebugController.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/Monitor.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
core/WCSCore.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/LocationHelper.cs 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/SYSHelper.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
wms/WCSHelper.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/0e784c8d-2ea0-45e5-8726-82d212591fce.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/3908d945-9e88-4170-b92a-f2cf0dcb5e54.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/541e9f47-0b5c-4a4e-9982-872d7ed880d7.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/687ebc79-98fe-4ac4-b909-c9e972afad42.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c746dfc7-35d0-465f-9364-9d1f640d45c0.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/e95c9dfb-066e-4e8f-a68a-626ca63d579a.vsidx
Binary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/fb5893ae-54ab-4004-9fc4-c8a740b25317.vsidx
Binary files differ
Models/TN_Location.cs
@@ -61,7 +61,7 @@
        public int N_ROADWAY { get; set; } = 1;
        public string S_PURPOSE { get; set; } = "存储";
        public string S_TYPE { get; set; } = "常规";
        public string S_WH_CODE { get; set; } = "独山子石化";
        public string S_WH_CODE { get; set; } = "DSZSH";
        // END
        /// <summary>
api/ApiHelper.cs
@@ -1,55 +1,49 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HH.WCS.Mobox3.DSZSH.models;
using HH.WCS.Mobox3.DSZSH.util;
using HH.WCS.Mobox3.DSZSH.wms;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Tsp;
using SqlSugar;
using Swashbuckle.Swagger;
using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
using static HH.WCS.Mobox3.DSZSH.api.OtherModel;
using static HH.WCS.Mobox3.DSZSH.Config;
namespace HH.WCS.Mobox3.DSZSH.api {
    public class ApiHelper {
        /// <summary>
        /// 好运箱-满箱下线入库(PDA)
        /// </summary>
        /// <param name="model"></param>
        /// <param name="model">包含:物料信息、起点货位</param>
        /// <returns></returns>
        public static SimpleResult GoodpackOffline(GoodpackOfflineInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            var taskName = TaskName.H好运箱_满箱下线入库; // 用于生成任务类型、打印日志信息
            var startAreaName = AreaName.M满箱操作区;
            var endAreaName = AreaName.M满箱货架区;
            var startAreaName = AreaName.M满箱操作区; // 起点货区
            var endAreaName = AreaName.M满箱货架区; // 终点货区
            try {
                // 贴标机会提前将物料信息写入CG_Detail表中
                // 将PDA提供的物料编码与贴标机的信息比对
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 指定:物料编码、批次号
                    .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检") // 新增物料,故物料状态应该为 1待检
                    // TODO model 中 数量、规格是否也参与比对 待后续要求
                    .First();
                // 如果找不到指定的物料,说明信息不一致,报错
                if (cgDetail == null) {
                    info = $"PDA扫码物料信息与贴标机传递的信息不一致:" + JsonConvert.SerializeObject(model);
                    LogHelper.Info(info);
                    return NewSimpleResult(2, info);
                }
                // 起点货位绑定后,可以不立即设置N_CURRENT_NUM为1
                // 因为AGV取货后就会恢复0,而且货位上锁后不会被访问到
                // 查询起点货位,是否符合要求(初次下线要求货位无容器)
                var startLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_CODE == model.StartLoc) // 指定:起点货位号
                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁
@@ -63,7 +57,7 @@
                    return NewSimpleResult(3, info);
                }
                // 绑定货位和容器号
                // 绑定货位和容器号(满箱下线到操作区,此时尚未绑定)
                var locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.StartLoc,
                    S_CNTR_CODE = cgDetail.S_CNTR_CODE,
@@ -87,8 +81,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
@@ -121,7 +115,7 @@
                        LogHelper.Info(info);
                        return NewSimpleResult(5, info);
                    }
                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = $"生成任务'{taskName}'失败,容器号{cntId},起点{startLoc.S_CODE},终点货架{endLoc.S_CODE}";
@@ -165,12 +159,28 @@
                    .First();
                if (startLoc == null) {
                    info = $"起点位置{model.StartLoc}不存在或不具备取货要求";
                    info = $"在'{startAreaName}'中没有找到起点货位{model.StartLoc},或不具备要求:未上锁、绑定前无货物";
                    LogHelper.Info(info);
                    return NewSimpleResult(2, info);
                }
                // 绑定货位和容器号
                //// 查看容器是否已有物料绑定
                //var cgDetail = db.Queryable<TN_CG_Detail>()
                //    .Where(d => d.S_CNTR_CODE == model.CntrCode).First();
                //// 如果有绑定物料,报错,因为空托不应该有物料
                //if (cgDetail != null) {
                //    info = $"容器{model.CntrCode}已经绑定了物料{cgDetail.S_ITEM_CODE},不是空托无法入库";
                //    LogHelper.Info(info);
                //    return NewSimpleResult(3, info);
                //}
                // 假定人工不会将有物料的箱子放在空箱入库接驳位,没有必要检查
                // 如果人工将出库后的托盘入库,这时物料信息并没有删除,需要将托盘物料的关系解除
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_CNTR_CODE == model.CntrCode).First();
                var needDeleteDetail = cgDetail != null;
                // 绑定货位和容器号(PDA在接驳位绑定
                var locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.StartLoc,
                    S_CNTR_CODE = model.CntrCode,
@@ -194,15 +204,15 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
                        info = $"插入货位容器关系失败:" + JsonConvert.SerializeObject(locCntrRel);
                        tran.RollbackTran();
                        LogHelper.Info(info);
                        return NewSimpleResult(4, info);
                        return NewSimpleResult(5, info);
                    }
                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -214,7 +224,7 @@
                        tran.RollbackTran();
                        info = $"生成任务'{taskName}'失败:更新起点货位{startLoc.S_CODE}锁状态失败";
                        LogHelper.Info(info);
                        return NewSimpleResult(4, info);
                        return NewSimpleResult(5, info);
                    }
                    if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new {
@@ -226,14 +236,14 @@
                        tran.RollbackTran();
                        info = $"生成任务'{taskName}'失败:更新终点货位{endLoc.S_CODE}锁状态失败";
                        LogHelper.Info(info);
                        return NewSimpleResult(4, info);
                        return NewSimpleResult(5, info);
                    }
                    if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = $"生成任务'{taskName}'失败,容器号{cntId},起点{startLoc.S_CODE},终点货架{endLoc.S_CODE}";
                        LogHelper.Info(info);
                        return NewSimpleResult(4, info);
                        return NewSimpleResult(5, info);
                    }
                    tran.CommitTran();
@@ -275,6 +285,16 @@
                    return NewSimpleResult(2, info);
                }
                // 查看容器是否已有物料绑定
                var cgDetail = db.Queryable<TN_CG_Detail>()
                    .Where(d => d.S_CNTR_CODE == model.CntrCode).First();
                // 如果有绑定物料,报错,因为空箱不应该有物料
                if (cgDetail != null) {
                    info = $"容器{model.CntrCode}已经绑定了物料{cgDetail.S_ITEM_CODE},不是空箱无法入库";
                    LogHelper.Info(info);
                    return NewSimpleResult(3, info);
                }
                // 绑定货位和容器号
                var locCntrRel = new TN_Loc_Container {
                    S_LOC_CODE = model.StartLoc,
@@ -299,8 +319,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) {
@@ -365,6 +385,7 @@
            var taskName = TaskName.T托盘_空托上线;
            var startAreaName = AreaName.K空托存放区;
            var endAreaName = AreaName.B包装区;
            try {
                // 查容器-物料类型表
@@ -394,7 +415,7 @@
                }
                var endLoc = db.Queryable<TN_Location>()
                    //.Where(l => Settings.AreaMap[AreaName.B包装区].Contains(l.S_AREA_CODE))
                    .Where(l => Settings.AreaMap[endAreaName].Contains(l.S_AREA_CODE))
                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁
                    .Where(l => l.N_CURRENT_NUM == 0) // 筛选:空货位
                    .First();
@@ -408,8 +429,8 @@
                var cntId = model.CntId;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -467,6 +488,7 @@
            var taskName = TaskName.H好运箱_空箱上线;
            var startAreaName = AreaName.K空托存放区;
            var endAreaName = AreaName.K空箱操作区;
            try {
                var startLoc = db.Queryable<TN_Location>()
@@ -484,7 +506,7 @@
                }
                var endLoc = db.Queryable<TN_Location>()
                    //.Where(l => Settings.AreaMap[AreaName.B包装区].Contains(l.S_AREA_CODE))
                    .Where(l => Settings.AreaMap[endAreaName].Contains(l.S_AREA_CODE))
                    .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁
                    .Where(l => l.N_CURRENT_NUM == 0)
                    .First();
@@ -498,8 +520,8 @@
                var cntId = model.CntId;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -616,8 +638,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
@@ -672,9 +694,11 @@
            }
        }
        public static SimpleResult UnqualifiedShift(UnqualifiedShiftInfo model) {
            var taskName = TaskName.C抽检_不合格移库;
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            var taskName = TaskName.C抽检_不合格移库;
            try {
                if (!Settings.AreaMap[AreaName.C抽检异常区].Contains(model.EndArea)) {
@@ -731,8 +755,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_CG_Detail>(cgDetail).UpdateColumns(it =>
@@ -788,9 +812,11 @@
        }
        public static SimpleResult RestBack(RestBackInfo model) {
            var taskName = TaskName.W尾箱回库;
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            var taskName = TaskName.W尾箱回库;
            try {
                var startLoc = db.Queryable<TN_Location>()
                    .Where(l => l.S_CODE == model.StartLoc)
@@ -835,8 +861,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new {
@@ -885,7 +911,7 @@
        }
        /// <summary>
        /// 成品胶出库(WMS)
        /// 成品胶出库(PDA)
        /// </summary>
        /// <remarks>
        /// WMS提供出库的物料类型与数量,调用接口由WCS生成具体的出库任务,然后WCS后台轮询处理
@@ -894,14 +920,12 @@
        /// <returns></returns>
        public static SimpleResult FinishedOutbound(FinishedOutboundInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var orderNo = GenerateOrderNo("出库单号", "ON");
            var info = "";
            var taskName = TaskName.C成品胶出库;
            try {
                if (string.IsNullOrEmpty(orderNo)) {
                    info = "出库单号不能为空";
                    LogHelper.Info(info);
                    return NewSimpleResult(2, info);
                }
                var orderNo = GenerateOrderNo("出库单号", "ON");
                var cgDetailList = SelectCgByTotalQty(model);
@@ -916,7 +940,6 @@
                    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
                };
@@ -951,7 +974,9 @@
                    tran.CommitTran();
                }
                return NewSimpleResult(0, "生成出库单成功");
                info = "生成出库单成功";
                LogHelper.Info(info);
                return NewSimpleResult(0, info);
            }
            catch (Exception ex) {
                info = $"发生了异常:{ex.Message}";
@@ -966,54 +991,63 @@
        /// <returns></returns>
        public static SimpleResult FinishedOutboundForce(FinishedOutboundInfo model) {
            var db = new SqlHelper<object>().GetInstance();
            var orderNo = GenerateOrderNo("出库单号", "ON");
            var info = "";
            var taskName = TaskName.C成品胶出库;
            try {
                if (string.IsNullOrEmpty(orderNo)) {
                    return NewSimpleResult(2, "出库单号不能为空");
                var orderNo = GenerateOrderNo("出库单号", "ON");
                var cgDetailList = SelectCgByTotalQty(model);
                if (cgDetailList.Count == 0) {
                    info = "没有合适的物料可以出库";
                    LogHelper.Info(info);
                    return NewSimpleResult(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,
                    S_END_AREA = model.EndArea
                };
                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()) {
                    var cgDetailList = SelectCgByTotalQty(model);
                    if (cgDetailList.Count == 0) {
                        return NewSimpleResult(3, "没有合适的物料可以出库");
                    }
                    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,
                            S_END_AREA = model.EndArea
                        };
                        if (db.Insertable<TN_Outbound_Detail>(detail).ExecuteCommand() <= 0) {
                            tran.RollbackTran();
                            return NewSimpleResult(4, "生成出库单明细失败:" + JsonConvert.SerializeObject(detail));
                        }
                    }
                    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
                    };
                    if (db.Insertable<TN_Outbound_Order>(order).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        return NewSimpleResult(5, "生成出库单失败:" + JsonConvert.SerializeObject(order));
                        info = "生成出库单失败:" + JsonConvert.SerializeObject(order);
                        LogHelper.Info(info);
                        return NewSimpleResult(2, info);
                    }
                    if (db.Insertable<TN_Outbound_Detail>(detailList).ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        info = "生成出库单明细失败";
                        LogHelper.Info(info);
                        return NewSimpleResult(4, info);
                    }
                    tran.CommitTran();
                }
                return NewSimpleResult(0, "生成出库单成功");
                info = "生成出库单成功";
                LogHelper.Info(info);
                return NewSimpleResult(0, info);
            }
            catch (Exception ex) {
                info = $"发生了异常:{ex.Message}";
api/ApiModel.cs
@@ -106,8 +106,6 @@
            /// 订单当前的目的地
            /// </summary>
            public string currentDes { get; set; }
            /// <summary>
            /// 当前指令
            /// </summary>
@@ -151,9 +149,8 @@
    }
    public class OtherModel {
        #region PDA 数据
        /// <summary>
        /// 好运箱-满托下线入库(PDA)数据类
        /// 好运箱-满箱下线入库(PDA)数据类
        /// </summary>
        public class GoodpackOfflineInfo {
            /// <summary>
@@ -161,11 +158,6 @@
            /// </summary>
            [JsonProperty("s_item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
@@ -182,71 +174,12 @@
            [JsonProperty("n_num")]
            public int Num { get; set; }
            /// <summary>
            /// 起点货位信息
            /// 起点货位信息(起点货位货区要求:MXCZQ 满箱操作区)
            /// </summary>
            [JsonProperty("s_start_loc")]
            public string StartLoc { get; set; }
        }
        /// <summary>
        /// 空托/空箱入库绑定(PDA)数据类
        /// </summary>
        public class EmptyBindInfo {
            /// <summary>
            /// 容器编码
            /// </summary>
            [JsonProperty("s_cntr_code")]
            public string CntrCode { get; set; }
            /// <summary>
            /// 容器类型
            /// </summary>
            [JsonProperty("s_cntr_type")]
            public string CntrType { get; set; }
            ///// <summary>
            ///// 托盘数量(仅当容器类型为托盘时使用)
            ///// </summary>
            //[JsonProperty("pallet_count", NullValueHandling = NullValueHandling.Ignore)]
            //public int PalletCount { get; set; }
            /// <summary>
            /// 货位编码
            /// </summary>
            [JsonProperty("s_loc_code")]
            public string LocCode { get; set; }
        }
        /// <summary>
        /// 空托绑定
        /// </summary>
        public class EmptyBindPalletInfo {
            /// <summary>
            /// 容器编码
            /// </summary>
            public string CntrCode { get; set; }
            /// <summary>
            /// 托盘数量
            /// </summary>
            public int PalletCount { get; set; }
            /// <summary>
            /// 货位编码
            /// </summary>
            public string LocCode { get; set; }
        }
        /// <summary>
        /// 空箱绑定
        /// </summary>
        public class EmptyBindGoodpackInfo {
            /// <summary>
            /// 容器编码
            /// </summary>
            public string CntrCode { get; set; }
            /// <summary>
            /// 货位编码
            /// </summary>
            public string LocCode { get; set; }
        }
        /// <summary>
        /// 空托/空箱入库(PDA)数据类
        /// </summary>
@@ -257,77 +190,57 @@
            [JsonProperty("cntr_code")]
            public string CntrCode { get; set; }
            /// <summary>
            /// 容器类型
            /// 容器类型(必须为 '空托盘’ 或 ‘空好运箱')
            /// </summary>
            [JsonProperty("cntr_type")]
            public string CntrType { get; set; }
            /// <summary>
            /// 终点库区编码
            /// 终点库区编码(托盘是 KTCFQ 空托存放区;好运箱是 CXHJQ 空箱货架区)
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
            /// <summary>
            /// 起点货位
            /// 起点货位(托盘是 KTJBQ 空托入库接驳区;好运箱是 KXJBQ 空箱入库接驳区)
            /// </summary>
            [JsonProperty("start_loc")]
            public string StartLoc { get; set; }
        }
        public class EmptyOnlinePalletInfo {
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            [JsonProperty("batch_no")]
            public string BatchNo { get; set; }
            [JsonProperty("spe")]
            public string Spec { get; set; } // 物料规格
            [JsonProperty("cnt_id")]
            public string CntId { get; set; } // 容器类型 = 托盘
        }
        public class EmptyOnlineGoodpackInfo {
            [JsonProperty("cnt_id")]
            public string CntId { get; set; } // 容器类型 = 好运箱
        }
        /// <summary>
        /// 抽检-创建抽检单(WMS)数据类
        /// 空箱上线信息
        /// </summary>
        public class CreateCheckOrderInfo {
        public class EmptyOnlinePalletInfo {
            /// <summary>
            /// 物料编码
            /// </summary>
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("batch_no")]
            public string BatchNo { get; set; }
            /// <summary>
            /// 物料规格
            /// </summary>
            [JsonProperty("spe")]
            public string Spe { get; set; }
            public string Spec { get; set; }
            /// <summary>
            /// 批次号
            /// 容器号
            /// </summary>
            [JsonProperty("batch_no")]
            public string BatchNo { get; set; }
            /// <summary>
            /// 需出库数量
            /// </summary>
            [JsonProperty("qty")]
            public int Qty { get; set; }
            /// <summary>
            /// 容器类型
            /// </summary>
            [JsonProperty("cntr_type")]
            public string CntrType { get; set; }
            /// <summary>
            /// 出库终点货区
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
            [JsonProperty("cnt_id")]
            public string CntId { get; set; } // 容器类型 = 托盘
        }
        /// <summary>
        /// 空好运箱上线信息
        /// </summary>
        public class EmptyOnlineGoodpackInfo {
            /// <summary>
            /// 容器号
            /// </summary>
            [JsonProperty("cnt_id")]
            public string CntId { get; set; } // 容器类型 = 好运箱
        }
        /// <summary>
        /// 抽检-合格回库(PDA) 数据类
        /// </summary>
@@ -344,21 +257,17 @@
            public string CntrCode { get; set; }
        }
        /// <summary>
        /// 不合格移库数据类
        /// </summary>
        public class UnqualifiedShiftInfo : QualifiedBackInfo {
            /// <summary>
            /// 不合格移库终点库区
            /// 不合格移库终点库区(必须是 CJYCQ 抽检异常区)
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
        }
        public class CheckShiftInfo : UnqualifiedShiftInfo {
            public bool Qualified { get; set; }
        }
        #endregion
        #region WMS 数据
        /// <summary>
        /// 成品胶出库(PDA)
        /// </summary>
@@ -368,11 +277,6 @@
            /// </summary>
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
            /// 物料规格
            /// </summary>
@@ -404,35 +308,6 @@
            [JsonProperty("force_out")]
            public bool ForcedOut { get; set; }
        }
        /// <summary>
        /// 移库-创建移库任务数据类
        /// </summary>
        public class CreateShiftOrderInfo {
            /// <summary>
            /// 物料编码
            /// </summary>
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("batch_no")]
            public string BatchNo { get; set; }
            /// <summary>
            /// 移库终点货区
            /// </summary>
            [JsonProperty("end_area")]
            public string EndArea { get; set; }
        }
        /// <summary>
        /// 余料尾箱回库(PDA)数据类
@@ -444,16 +319,24 @@
            [JsonProperty("start_loc")]
            public string StartLoc { get; set; }
        }
        #endregion
        /// <summary>
        /// 物料信息下发同步 数据类
        /// </summary>
        public class CgInfoSyncInfo {
            /// <summary>
            /// 物料名称
            /// </summary>
            [JsonProperty("itemName")]
            public string ItemName { get; set; }
            /// <summary>
            /// 物料编码
            /// </summary>
            [JsonProperty("itemCode")]
            public string ItemCode { get; set; }
            /// <summary>
            /// 批次号
            /// </summary>
            [JsonProperty("batchNo")]
            public string BatchNo { get; set; }
@@ -531,11 +414,6 @@
            /// </summary>
            [JsonProperty("item_code")]
            public string ItemCode { get; set; }
            ///// <summary>
            ///// 物料名称
            ///// </summary>
            //[JsonProperty("item_name")]
            //public string ItemName { get; set; }
            /// <summary>
            /// 物料规格
            /// </summary>
api/DebugController.cs
@@ -64,6 +64,66 @@
        }
        /// <summary>
        /// AGV状态一键回报134
        /// </summary>
        /// <param name="model">容器号</param>
        /// <returns></returns>
        [HttpPost]
        [Route("AGVSeriesReports14")]
        public ReturnResults AGVSeriesReports14(UpdateTaskState model) {
            var agvTaskState = new AgvTaskState() {
                task_no = model.TaskID,
                forklift_no = model.ForkliftNo,
                state = 1
            };
            ReturnResults returnResult = new ReturnResults();
            returnResult.ResultList = new List<ReturnResult>();
            var temp1 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp1);
            agvTaskState.state = 3;
            var temp3 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp3);
            agvTaskState.state = 4;
            var temp4 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp4);
            return returnResult;
        }
        /// <summary>
        /// AGV状态一键回报562
        /// </summary>
        /// <param name="model">容器号</param>
        /// <returns></returns>
        [HttpPost]
        [Route("AGVSeriesReports62")]
        public ReturnResults AGVSeriesReports62(UpdateTaskState model) {
            var agvTaskState = new AgvTaskState() {
                task_no = model.TaskID,
                forklift_no = model.ForkliftNo,
                state = 5
            };
            ReturnResults returnResult = new ReturnResults();
            returnResult.ResultList = new List<ReturnResult>();
            var temp5 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp5);
            agvTaskState.state = 6;
            var temp6 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp6);
            agvTaskState.state = 2;
            var temp2 = WCSCore.OperateAgvTaskStatus(agvTaskState);
            returnResult.ResultList.Add(temp2);
            return returnResult;
        }
        /// <summary>
        /// 初始化数据库
        /// </summary>
        /// <returns></returns>
@@ -186,7 +246,6 @@
            var db = new SqlHelper<object>().GetInstance();
            try {
                using (var tran = db.UseTran()) {
                    LogHelper.Info("LogCntrCg:" + JsonConvert.SerializeObject(locCntrCg));
@@ -322,6 +381,11 @@
            }
        }
        /// <summary>
        /// DEBUG:模拟输送线产线满托盘下线流程
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [Route("AddInboundTask")]
        public string AddInboundTask(AddInboundTaskInfo model) {
@@ -397,8 +461,8 @@
                var cntId = locCntrRel.S_CNTR_CODE;
                var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                using (var tran = db.Ado.UseTran()) {
                    if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
@@ -480,9 +544,21 @@
    }
    public class AddInboundTaskInfo {
        /// <summary>
        /// 物料编码
        /// </summary>
        public string ItemCode { get; set; }
        /// <summary>
        /// 批次号
        /// </summary>
        public string BatchNo { get; set; }
        /// <summary>
        /// 容器编码
        /// </summary>
        public string CntrCode { get; set; }
        /// <summary>
        /// 起始货位
        /// </summary>
        public string StartLoc { get; set; }
    }
core/Monitor.cs
@@ -124,8 +124,8 @@
                    var cntId = locCntrRel.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Insertable<TN_CG_Detail>(cgDetail).ExecuteCommand() <= 0) {
@@ -294,8 +294,8 @@
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
@@ -451,8 +451,8 @@
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_SpotCheck_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
@@ -575,8 +575,8 @@
                    var cntId = detail.S_CNTR_CODE;
                    var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName);
                    LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁
                    LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁
                    LocationHelper.LockStartLoc(ref startLoc); // 起点出库锁
                    LocationHelper.LockEndLoc(ref endLoc); // 终点入库锁
                    using (var tran = db.Ado.UseTran()) {
                        if (db.Updateable<TN_RelocationList_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
core/WCSCore.cs
@@ -131,6 +131,7 @@
        private static void RecordTaskTable(TN_Task task) {
            var db = new SqlHelper<object>().GetInstance();
            var info = "";
            try {
                var cgDetail = new TN_CG_Detail();
                
@@ -172,6 +173,7 @@
                    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) {
wms/LocationHelper.cs
@@ -127,21 +127,34 @@
        }
        /// <summary>
        /// 入库锁定终点,出库锁定起点
        /// 你创建任务锁定货位的时候,把锁的来源就是任务号也写上去(加锁的方法加个参数,可空的参数),解锁的时候把来源置空。
        /// 起点出库锁
        /// </summary>
        /// <param name="loc"></param>
        /// <param name="lockState">1:入库锁、2:出库锁、3:其它锁</param>
        /// <param name="lockSource">锁的来源=任务号</param>
        /// <param name="lockSource"></param>
        /// <returns></returns>
        public static bool LockLoc(ref TN_Location loc, int lockState, string lockSource = "") {
        public static bool LockStartLoc(ref TN_Location loc, string lockSource = "") {
            if (loc == null || loc.N_LOCK_STATE != 0) {
                return false;
            }
            if (loc != null && loc.N_LOCK_STATE == 0) {
                loc.N_LOCK_STATE = lockState;
                loc.S_LOCK_STATE = TN_Location.GetLockStateStr(lockState);
                loc.N_LOCK_STATE = 2; // 起点出库锁
                loc.S_LOCK_STATE = TN_Location.GetLockStateStr(2); // 起点出库锁
                loc.S_LOCK_OP = lockSource;
                loc.T_MODIFY = System.DateTime.Now;
            }
            return true;
        }
        public static bool LockEndLoc(ref TN_Location loc, string lockSource = "") {
            if (loc == null || loc.N_LOCK_STATE != 0) {
                return false;
            }
            if (loc != null && loc.N_LOCK_STATE == 0) {
                loc.N_LOCK_STATE = 1; // 终点出库锁
                loc.S_LOCK_STATE = TN_Location.GetLockStateStr(1); // 终点出库锁
                loc.S_LOCK_OP = lockSource;
                loc.T_MODIFY = System.DateTime.Now;
            }
@@ -159,7 +172,7 @@
        /// <param name="lockState">1:入库锁、2:出库锁、3:其它锁</param>
        /// <param name="lockSource">锁的来源=任务号</param>
        /// <returns></returns>
        public static bool LockLoc(string loc, int lockState, string lockSource = "")
        private static bool LockLoc(string loc, int lockState, string lockSource = "")
        {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
wms/SYSHelper.cs
@@ -27,38 +27,8 @@
                    sId.CN_T_LAST = DateTime.Now;
                    if (db.Ado.ExecuteCommand($"update OI_SYS_MAXID set CN_N_MAX={sId.CN_N_MAX}, CN_T_LAST='{sId.CN_T_LAST}' where CN_S_TYPE='{snType}' and CN_S_PRE='{prefix}' ") > 0) {
                        //LogHelper.Info($"set cn_n_max {sId.CN_N_MAX}");
                        result = sId.CN_N_MAX;
                    }
                    //if (db.Updateable<OI_SYS_MAXID>(sId).UpdateColumns(it => new { it.CN_N_MAX, it.CN_T_LAST}).ExecuteCommand() > 0) {
                    //    result = sId.CN_N_MAX;
                    //}
                    //if (db.Updateable<OI_SYS_MAXID>()
                    //    .SetColumns(it => it.CN_N_MAX == sId.CN_N_MAX && it.CN_T_LAST == sId.CN_T_LAST)
                    //    .Where(it => it.CN_S_TYPE == sId.CN_S_TYPE && it.CN_S_PRE == sId.CN_S_TYPE)
                    //    .ExecuteCommand() > 0) {
                    //    result = sId.CN_N_MAX;
                    //}
                    //var parameters = new[] {
                    //    new SugarParameter("@CN_N_MAX", sId.CN_N_MAX),
                    //    new SugarParameter("@CN_T_LAST", sId.CN_T_LAST),
                    //    new SugarParameter("@CN_S_TYPE", sId.CN_S_TYPE),
                    //    new SugarParameter("@CN_S_PRE", sId.CN_S_TYPE)
                    //};
                    //var sql = @"UPDATE OI_SYS_MAXID
                    //    SET CN_N_MAX = @CN_N_MAX, CN_T_LAST = @CN_T_LAST
                    //    WHERE CN_S_TYPE = @CN_S_TYPE AND CN_S_PRE = @CN_S_PRE";
                    //if (db.Ado.ExecuteCommand(sql, parameters) > 0) {
                    //    result = sId.CN_N_MAX;
                    //    LogHelper.Info($"set cn_n_max {sId.CN_N_MAX}");
                    //}
                }
                else {
                    //插入表
wms/WCSHelper.cs
@@ -82,25 +82,6 @@
            return TN_Task;
        }
        public static TN_Task BuildTask(TN_Loc_Container locCntrRel, TN_Location endLoc, string cntId, string type) {
            var fromLoc = LocationHelper.GetLocation(locCntrRel.S_LOC_CODE);
            TN_Task TN_Task = new TN_Task() {
                S_CODE = GenerateTaskNo(),
                S_START_AREA = fromLoc.S_AREA_CODE,
                S_END_AREA = endLoc.S_AREA_CODE,
                S_START_LOC = fromLoc.S_CODE,
                S_END_LOC = endLoc.S_CODE,
                S_TYPE = type,
                N_PRIORITY = 3, // 初始优先级默认为:3
                N_SCHEDULE_TYPE = 3, // 国自
                N_B_STATE = 0,
                S_CNTR_CODE = cntId,
            };
            return TN_Task;
        }
        /// <summary>
        /// 创建搬送任务
        /// </summary>