杨前锦
2025-06-19 d42ad8b01195def2a9309930e14f90ff13ad47b1
印尼佳通出入库策略优化
37个文件已修改
1054 ■■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/config/config.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/api/WmsController.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/core/Monitor.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/process/TaskProcess.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/Monitor.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/WCSCore.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/process/TaskProcess.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/wms/WMSHelper.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/config/config.json 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/dispatch/NDCApi.cs 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/App.config 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/HH.WCS.Mobox3.YNJT_PT.csproj 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/Program.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs 189 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/MoboxController.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/config/config.json 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/core/WCSCore.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/core/WMSCore.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/Container.cs 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/GreenTireInformation.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/OffLineRecord.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/Overage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/WCSTask.cs 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/packages.config 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/process/TaskProcess.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/util/Settings.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/util/SqlHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/ContainerHelper.cs 161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/SYSHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WCSHelper.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -363,7 +363,7 @@
                        kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC);
                        if (kgzStartLoc == null)
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"库区:{logicConfig.S_AREA_CODE},没有可用的空工装");
                            WMSHelper.addAlarmRecord("流程异常", "高", $"空工装出库站台:{logicConfig.S_LKKTJBLOC},没有在WMS系统中录入");
                            photoStatus = false;
                        }
                        if (kgzEndLoc == null)
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/config/config.json
@@ -86,7 +86,7 @@
    {
      "areaCode": "ZZFZLCK",
      "areaName": "中转库(非直连)",
      "cntrType": [ 7 ],
      "cntrType": [ 0 ],
      "type": 2
    }
  ],
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/core/Monitor.cs
@@ -266,17 +266,17 @@
        public static void UpdateInventoryRegularly()
        {
            var db = new SqlHelper<object>().GetInstance();
            var areaCodeList = Settings.areaPropertyList.Select(a => a.areaCode).ToList();
            var locations = db.Queryable<Location>()
                .LeftJoin<LjLotOnhand>((a, b) => a.S_CODE == b.STORAGE_LOCATION)
                .LeftJoin<LocCntrRel>((a, b, c) => a.S_CODE == c.S_LOC_CODE)
                .Where((a, b, c) => b.PALLET_ID != c.S_CNTR_CODE)
                .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                .Where((a,b) => a.N_CURRENT_NUM > 0 && b.S_CNTR_CODE != null && areaCodeList.Contains(a.S_AREA_CODE) )
                .ToList();
            foreach (var loc in locations)
            {
                var lotOnhand = db.Queryable<LjLotOnhand>().Where(a => a.STORAGE_LOCATION == loc.S_CODE).First();
                if (lotOnhand != null) { 
                    db.Deleteable(lotOnhand).ExecuteCommand();
                    db.Deleteable<LjLotOnhand>().Where(a => a.ID == lotOnhand.ID).ExecuteCommand();
                }
                var locCntrRels = LocationHelper.GetLocCntr(loc.S_CODE);
@@ -289,16 +289,19 @@
                            var material = WMSHelper.GetMaterial(cntrItem.S_ITEM_CODE);
                            LjLotOnhand ljLotOnhand = new LjLotOnhand()
                            {
                                ID = WMSHelper.GenerateStockRecordNo(),
                                MATERIAL_CODE = cntrItem.S_ITEM_CODE,
                                LOT_NAME = cntrItem.S_BATCH_NO,
                                PALLET_ID = cntrItem.S_CNTR_CODE,
                                STORAGE_LOCATION = loc.S_CODE,
                                QC_STATUS = cntrItem.S_ITEM_STATE,
                                UNIT = material.S_UNIT,
                                UNIT = material == null ? "":material.S_UNIT,
                                QTY = cntrItem.F_QTY,
                                IN_DATE = cntrItem.T_INBOUND_TIME,
                                IN_DATE = cntrItem.T_INBOUND_TIME.ToString("yyyy-MM-dd"),
                                CREATION_DATE = DateTime.Now,
                                WAREHOUSE_TYPE = "2"
                            };
                            db.Insertable(lotOnhand).ExecuteCommand();
                            db.Insertable(ljLotOnhand).ExecuteCommand();
                        }
                    });
                }
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/LjLotOnhand.cs
@@ -22,7 +22,7 @@
        public string QC_STATUS { get; set; } //状态
        public string UNIT { get; set; } //单位
        public float QTY { get; set; } //数量
        public DateTime IN_DATE { get; set; } //入库时间
        public string IN_DATE { get; set; } //入库时间
        public DateTime CREATION_DATE { get; set; } //创建日期
        public string WAREHOUSE_TYPE { get; set; } //区分不同厂家(1/思尔特,2/杭叉)
    }
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -33,6 +33,10 @@
            var date = DateTime.Now.ToString("yyMMdd");
            return $"SO{date}{id.ToString().PadLeft(4, '0')}";
        }
        internal static int GenerateStockRecordNo()
        {
            return SYSHelper.GetSerialNumber("库存记录号", "SR");
        }
        internal static string GenerateAlarmNo()
        {
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/api/WmsController.cs
@@ -63,6 +63,7 @@
                result.success = false;
                result.message = "内部异常,请联系开发人员处理";
                LogHelper.Info($"内部异常,错误信息:{ex.Message}", "车间控制器");
                LogHelper.Info(ex.StackTrace, "车间控制器");
            }
            LogHelper.Info("创建入库搬运任务-createInOrder 出参:" + JsonConvert.SerializeObject(result), "车间控制器");
            return result;
@@ -96,6 +97,7 @@
                result.success = false;
                result.message = "内部异常,请联系开发人员处理";
                LogHelper.Info($"内部异常,错误信息:{ex.Message}", "车间控制器");
                LogHelper.Info(ex.StackTrace, "车间控制器");
            }
            
            LogHelper.Info("创建出库搬运任务-createOutOrder 出参:" + JsonConvert.SerializeObject(result), "车间控制器");
@@ -602,6 +604,20 @@
                        if (wcsTask.S_SCHEDULE_TYPE.Contains("LD"))
                        {
                            if (wcsTask.S_TYPE.Contains("出库"))
                            {
                                var locCntrs = LocationHelper.GetLocCntrRel(wcsTask.S_START_LOC);
                                if (locCntrs.Count > 0)
                                {
                                    var cntrList = locCntrs.Select(a => a.S_CNTR_CODE).ToList();
                                    if (cntrList.Contains(wcsTask.S_CNTR_CODE))
                                    {
                                        var linePlcInfo = WCSHelper.GetLinePlcInfo(wcsTask.S_START_LOC);
                                        triggerAlarmCommand(linePlcInfo , 1);
                                    }
                                }
                            }
                            LocationHelper.UnBindingLoc(wcsTask.S_START_LOC, new List<string>() { wcsTask.S_CNTR_CODE });
                            LocationHelper.UnBindingLoc(wcsTask.S_END_LOC, new List<string>() { wcsTask.S_CNTR_CODE });
@@ -619,7 +635,11 @@
                                    ContainerHelper.deleteCntrItem(wmsTask.S_CNTR_CODE);
                                }
                            }
                        }
                        WCSHelper.Fail(wcsTask);
                        LocationHelper.UnLockLoc(wcsTask.S_START_LOC);
                        LocationHelper.UnLockLoc(wcsTask.S_END_LOC);
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/core/Monitor.cs
@@ -498,6 +498,16 @@
            S7Helper.WriteInt(line.deviceNo, 101, line.writeAddr + 8, command); // 下发指令(默认=0 入库=2 出库=1 不合格退回=3)
        }
        /// <summary>
        /// 清除输送线命令
        /// </summary>
        /// <param name="line"></param>
        /// <param name="command"> 1.agv任务异常取消</param>
        public static void triggerAlarmCommand(LinePlcInfo line, short command)
        {
            S7Helper.WriteDint(line.deviceNo, 101, line.writeAddr + 20, command); // 任务号
        }
        public class SSXStatusInfo {
            public string deviceNo { get; set; }
            public string status { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.HD/process/TaskProcess.cs
@@ -240,7 +240,6 @@
                            else {
                                Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】");
                            }
                        }
                    }
                }
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/Monitor.cs
@@ -149,7 +149,7 @@
                                        {
                                            
                                            float weight = pipelineSignalInfo.weight / trayCodes.Count;
                                            float furWeight =  WMSHelper.getFurWeight(child.LOTATT09);  // 毛皮重量
                                            float furWeight =  WMSHelper.getFurWeight(child.LOTATT10);  // 毛皮重量
                                            child.F_NET_WEIGHT = weight - furWeight;
                                            asnNo = child.S_ASN_NO;
                                            orientSign = child.LOTATT18;
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/core/WCSCore.cs
@@ -312,6 +312,25 @@
                            ContainerHelper.deleteCntrItem(cntrCode);
                        }
                    }
                    if (wst.S_TYPE == "出库任务")
                    {
                        var child = WMSHelper.getOutstockListChild(wst.S_OP_DEF_CODE, cst.S_DATA);
                        var cntrCodeList = cst.S_CNTR_CODE.Split(',').ToList();
                        // 更新出库数量
                        float qty = 0;
                        for (int i = 0; i < cntrCodeList.Count; i++)
                        {
                            var cntrItemRels = ContainerHelper.GetCntrItemRel(cntrCodeList[i]);
                            foreach (var cntrItemRel in cntrItemRels)
                            {
                                qty -= cntrItemRel.F_QTY;
                            }
                        }
                        child.PRE_COMPLETED_QTY = child.PRE_COMPLETED_QTY + qty;
                        WMSHelper.updateOutStockListChild(child);
                    }
                }
            }
        }
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/process/TaskProcess.cs
@@ -280,7 +280,7 @@
                                var cntrItemRel = ContainerHelper.GetCntrItemRel(downCntr.S_CNTR_CODE).FirstOrDefault();
                                if (cntrItemRel != null)
                                {
                                    float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT09);
                                    float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT10);
                                    mst.S_START_LOC = mst.S_START_LOC + "-" + height;
                                }
                            }
@@ -291,7 +291,7 @@
                        if (endLocCntrRels != null && endLocCntrRels.Count == 1) {
                            var cntrItemRel = ContainerHelper.GetCntrItemRel(endLocCntrRels[0].S_CNTR_CODE).FirstOrDefault();
                            if (cntrItemRel != null) {
                                float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT09);
                                float height = WMSHelper.getFurHeight(cntrItemRel.LOTATT10);
                                mst.S_END_LOC = mst.S_END_LOC + "-" + height;
                            }
                        }
HH.WCS.Mobox3/HH.WCS.Mobox3.SXJK/wms/WMSHelper.cs
@@ -1360,12 +1360,22 @@
                }
                // 查询同批次入库锁数量,如果锁数量 >= 2 ,则不再从【空排】入库
                int lockNum = db.Queryable<Location>().Where(a => a.N_LOCK_STATE == 1 && a.S_LOCK_OP.Trim() == asnNo).Count();
                LogHelper.Info("同批次入库锁数量:" + lockNum, "Mobox");
                if (end == null && rowNum < 2 && lockNum < 2 )
                var lockRow = db.Queryable<Location>().Where(a => a.N_LOCK_STATE == 1 && a.S_LOCK_OP.Trim() == asnNo).Take(1).PartitionBy(l => new { l.S_AREA_CODE, l.N_ROW }).ToList();
                LogHelper.Info("同批次入库锁数量:" + lockRow.Count, "Mobox");
                if (end == null && rowNum < 2 && lockRow.Count < 2 )
                {
                    string fullerCode = null;
                    if (rowNum == 1)
                    if (lockRow.Count > 0)
                    {
                        var maxLoc = lockRow[0];
                        var fuller = db.Queryable<TN_Fuller>().Where(a => a.S_AREA_CODE == maxLoc.S_AREA_CODE && a.N_ROW == maxLoc.N_ROW).First();
                        if (fuller != null)
                        {
                            fullerCode = fuller.FULLER_CODE;
                        }
                    }
                    if (fullerCode == null && rowNum > 0 )
                    {
                        var maxLoc = listMaxCol[0];
                        var fuller = db.Queryable<TN_Fuller>().Where(a => a.S_AREA_CODE == maxLoc.S_AREA_CODE && a.N_ROW == maxLoc.N_ROW).First();
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/config/config.json
@@ -1,6 +1,7 @@
{
  "HostToAgvServerUrl": "http://192.168.1.146:9988/HostToAGV.cgi",
  "HASeverUrl": "http://172.16.10.41",
  "NDCApiUrl": "",
  "SqlServer": "server=192.168.1.204;uid=root;pwd=yn123456;database=oimobox",
  "SqlServer1": "Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015",
  "ApiPort": 8901,
@@ -8,24 +9,24 @@
  "WHCode": "IW001",
  "NDCApiUrl": "",
  "baseTrayBufferLoc": [
    {
    {
      "bufferOutLoc": "SeA26",
      "bufferInLoc": "PPA06-12-1-2"
    },
    {
    {
      "bufferOutLoc": "SeA27",
      "bufferInLoc": "PPA07-13-1-1"
    },
    {
    {
      "bufferOutLoc": "SeA28",
      "bufferInLoc": "PPA07-13-1-2"
    },
    {
    {
      "bufferOutLoc": "SeA29",
      "bufferInLoc": "PPA07-14-1-1"
    },
    {
    {
      "bufferOutLoc": "SeA231",
      "bufferInLoc": "PPA07-14-1-2"
    }
@@ -69,7 +70,7 @@
    },
    {
      "locCode": "SeA05",
      "roadway": [ 2],
      "roadway": [ 2 ],
      "action": 1
    },
    {
@@ -94,7 +95,7 @@
    },
    {
      "locCode": "SeA10",
      "roadway": [  3 ],
      "roadway": [ 3 ],
      "action": 1
    },
    {
@@ -189,22 +190,22 @@
    },
    {
      "locCode": "SeA29",
      "roadway": [ 6,7 ],
      "roadway": [ 6, 7 ],
      "action": 1
    },
    {
      "locCode": "SeA30",
      "roadway": [ 6,7 ],
      "roadway": [ 6, 7 ],
      "action": 2
    },
    {
      "locCode": "SeA31",
      "roadway": [ 6,7 ],
      "roadway": [ 6, 7 ],
      "action": 1
    },
    {
      "locCode": "SeA32",
      "roadway": [ 6,7 ],
      "roadway": [ 6, 7 ],
      "action": 2
    }
  ]
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/dispatch/NDCApi.cs
@@ -8,6 +8,7 @@
{
    public class NDCApi
    {
        private static readonly HttpHelper apiHelper = new HttpHelper();
        public static string NDCApiUrl { set; get; }
        static NDCApi() {
@@ -20,20 +21,19 @@
        /// <param name="ts"></param>
        /// <param name="pri"></param>
        /// <param name="taskNo"></param>
        /// <param name="param"></param>
        /// <param name="paramList"></param>
        /// <returns></returns>
        public static AgvApiResult AddOrderNew(int ts, int pri, string taskNo, List<Param> paramList) 
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            var model = new AddOrderNewModel();
            model.ts_no = ts;
            model.pri = pri;
            model.task_no = taskNo;
            model.paramList = paramList;
            model.param = paramList;
            try {
                LogHelper.Info($"任务{taskNo}下发,{JsonConvert.SerializeObject(model)}" , "NDC");
                var result = httpH.WebPost(NDCApiUrl + "Add",JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "Add",JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务下发结果res={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
@@ -53,15 +53,12 @@
        /// <returns></returns>
        public static AgvApiResult AddOrderNew(AddOrderNewModel model)
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            try
            {
                LogHelper.Info($"任务{model.task_no}下发,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}下发,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "Add", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "Add", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务下发结果res={result}", "NDC");
                Console.WriteLine($"任务下发结果res={result}");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -82,7 +79,6 @@
        /// <returns></returns>
        public static AgvApiResult CancelOrder(string tsNo, bool is_force) 
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            var model = new CancelOrderModel();
            model.task_no = tsNo;
@@ -90,7 +86,7 @@
            try {
                LogHelper.Info($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}取消结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}取消结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
@@ -111,15 +107,12 @@
        /// <returns></returns>
        public static AgvApiResult CancelOrder(CancelOrderModel model)
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            try
            {
                LogHelper.Info($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}取消,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "Cancel", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}取消结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}取消结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -141,7 +134,6 @@
        /// <returns></returns>
        public static AgvApiResult ChangeOrderPri(string taskNo, int newPri)
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            var model = new ChangePriModel();
            model.task_no = taskNo;
@@ -149,10 +141,8 @@
            try
            {
                LogHelper.Info($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}优先级更改结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}优先级更改结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -172,15 +162,12 @@
        /// <returns></returns>
        public static AgvApiResult ChangeOrderPri(ChangePriModel model)
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            try
            {
                LogHelper.Info($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}优先级更改,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "ChangePri", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}优先级更改结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}优先级更改结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -202,7 +189,6 @@
        /// <returns></returns>
        public static AgvApiResult ChangeOrderParam(string taskNo,int paramNo, string paramStr) 
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            var model = new ChangeParamModel();
            model.task_no = taskNo;
@@ -210,10 +196,8 @@
            model.param = paramStr;
            try {
                LogHelper.Info($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}参数更改结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}参数更改结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -232,15 +216,12 @@
        /// <returns></returns>
        public static AgvApiResult ChangeOrderParam(ChangeParamModel model)
        {
            var httpH = new HttpHelper();
            var agvApiResult = new AgvApiResult();
            try
            {
                LogHelper.Info($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC");
                Console.WriteLine($"任务{model.task_no}参数更改,{JsonConvert.SerializeObject(model)}", "NDC");
                var result = httpH.WebPost(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model));
                var result = apiHelper.Post(NDCApiUrl + "ChangeParam", JsonConvert.SerializeObject(model));
                LogHelper.Info($"任务{model.task_no}参数更改结果={result}", "NDC");
                Console.WriteLine($"任务{model.task_no}参数更改结果={result}", "NDC");
                agvApiResult = JsonConvert.DeserializeObject<AgvApiResult>(result);
                return agvApiResult;
            }
@@ -269,7 +250,7 @@
        public int ts_no { set; get; }//TS 号,必须有值    
        public int pri { set; get; }//优先级
        public string task_no { set; get; }//上游任务编码,如果 no_feedback = 1 时,可以为空
        public List<Param> paramList { set; get; } = new List<Param>();//参数列表
        public List<Param> param { set; get; } = new List<Param>();//参数列表
    }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs
@@ -255,7 +255,7 @@
                        };
                        paramList.Add(param);
                    }
                    model.paramList = paramList;
                    model.param = paramList;
                    LogHelper.Info($"向AGV下发任务,任务参数:{model}", "WMS");
                    var res = NDCApi.AddOrderNew(model);
                    if (res != null && res.err_code == 0 || true)
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/App.config
@@ -37,6 +37,14 @@
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.9.0" newVersion="5.2.9.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-8.0.30.0" newVersion="8.0.30.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/HH.WCS.Mobox3.YNJT_PT.csproj
@@ -35,8 +35,23 @@
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
      <HintPath>packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll</HintPath>
    </Reference>
    <Reference Include="EasyModbus, Version=5.6.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.dll</HintPath>
    </Reference>
    <Reference Include="Google.Protobuf, Version=3.19.4.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
      <HintPath>packages\Google.Protobuf.3.19.4\lib\net45\Google.Protobuf.dll</HintPath>
    </Reference>
    <Reference Include="K4os.Compression.LZ4, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
      <HintPath>packages\K4os.Compression.LZ4.1.2.6\lib\net46\K4os.Compression.LZ4.dll</HintPath>
    </Reference>
    <Reference Include="K4os.Compression.LZ4.Streams, Version=1.2.6.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
      <HintPath>packages\K4os.Compression.LZ4.Streams.1.2.6\lib\net46\K4os.Compression.LZ4.Streams.dll</HintPath>
    </Reference>
    <Reference Include="K4os.Hash.xxHash, Version=1.0.6.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL">
      <HintPath>packages\K4os.Hash.xxHash.1.0.6\lib\net46\K4os.Hash.xxHash.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.7.0.0\lib\netstandard2.0\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
@@ -52,6 +67,9 @@
    </Reference>
    <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
    </Reference>
    <Reference Include="MySql.Data, Version=8.0.30.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
      <HintPath>packages\MySql.Data.8.0.30\lib\net452\MySql.Data.dll</HintPath>
    </Reference>
    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\ConsoleApp1\packages\Newtonsoft.Json.13.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
@@ -82,10 +100,13 @@
    <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
    </Reference>
    <Reference Include="System.ComponentModel, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
    <Reference Include="System.ComponentModel.DataAnnotations" />
    <Reference Include="System.Configuration" />
    <Reference Include="System.Configuration.Install" />
    <Reference Include="System.Core" />
    <Reference Include="System.IO.Compression" />
    <Reference Include="System.Management" />
    <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
    </Reference>
@@ -109,6 +130,7 @@
    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
    </Reference>
    <Reference Include="System.Transactions" />
    <Reference Include="System.Web" />
    <Reference Include="System.Web.Http, Version=5.2.9.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\System.Web.Http.dll</HintPath>
@@ -132,9 +154,15 @@
    <Reference Include="Topshelf.NLog, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b800c4cfcdeea87b, processorArchitecture=MSIL">
      <HintPath>..\packages\Topshelf.NLog.4.3.0\lib\net452\Topshelf.NLog.dll</HintPath>
    </Reference>
    <Reference Include="Ubiety.Dns.Core, Version=2.2.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
      <HintPath>packages\MySql.Data.8.0.30\lib\net452\Ubiety.Dns.Core.dll</HintPath>
    </Reference>
    <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL">
      <HintPath>..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath>
    </Reference>
    <Reference Include="ZstdNet, Version=1.4.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
      <HintPath>packages\MySql.Data.8.0.30\lib\net452\ZstdNet.dll</HintPath>
    </Reference>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="api\MoboxController.cs" />
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/Program.cs
@@ -22,6 +22,8 @@
    internal class Program
    {
        static void Main(string[] args) {
            Settings.Init();
            //1.0 开启api
            Startup();
            //2.0 开启tcp
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -4,6 +4,7 @@
using HH.WCS.Mobox3.YNJT_PT.process;
using HH.WCS.Mobox3.YNJT_PT.util;
using HH.WCS.Mobox3.YNJT_PT.wms;
using MySqlX.XDevAPI.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
@@ -52,7 +53,7 @@
                    N_IS_URGENT = model.isUrgent,
                    T_OFF_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    N_IS_FULL = model.isFull,
                    S_LOC = model.loc
                };
                WMSHelper.addOffLineRecord(record);
            }
@@ -118,6 +119,26 @@
                                                var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                                if (itemBarcodeInfo != null)
                                                {
                                                    itemBarcodeInfo.N_URGENT_FLAG = offLineRecord.N_IS_URGENT;
                                                    // 计算生效时间、失效时间
                                                    var overage = WMSHelper.getOverage(itemBarcodeInfo.BARCODE);
                                                    LogHelper.Info($"计算生效时间、失效时间,返回值:{JsonConvert.SerializeObject(overage)}", "WMS");
                                                    if (overage != null)
                                                    {
                                                        DateTime txndate = DateTime.Parse(itemBarcodeInfo.TXNDATE);
                                                        DateTime minTime = txndate.AddHours(overage.MINHOUR);
                                                        DateTime maxTime = txndate.AddDays(overage.OVERAGE);
                                                        itemBarcodeInfo.S_EFFECTIVE_TIME = minTime.ToString("yyyy-MM-dd HH:mm:ss");
                                                        itemBarcodeInfo.S_EXPIRATION_TIME = maxTime.ToString("yyyy-MM-dd HH:mm:ss");
                                                    }
                                                    else
                                                    {
                                                        response.code = 1;
                                                        response.msg = $"未查询到物料存放时间配置信息,条形码:{itemBarcodeInfo.BARCODE}";
                                                        return response;
                                                    }
                                                    ContainerHelper.addCntrItemRel(rfid, itemBarcodeInfo);
                                                    barcodeList.Add(ext);
                                                }
                                                else
@@ -203,9 +224,9 @@
                                                wmsTask.N_B_STATE = 1;
                                                WMSHelper.UpdateTaskState(wmsTask);
                                                // 绑定容器物料信息
                                                /*// 绑定容器物料信息
                                                var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                                WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo);
                                                WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo);*/
                                            }
                                        }
                                    }
@@ -213,8 +234,8 @@
                                else
                                {
                                    // 异常托盘排除
                                    var middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                    endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                                    var middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.排出位
                                    endLoc = WMSHelper.getOnlneLoc(2);  // 2.空托上线位(排出的托盘都出库到空托上线位进行处理)
                                    if (endLoc != null && middleLoc != null)
                                    {
                                        var wmsTask = new WMSTask()
@@ -287,6 +308,7 @@
        /// <summary>
        /// 读码请求
        /// 场景:1.
        /// </summary>
        public static ResponseResult readCodeRequest(NotifyDeviceSignalModel model) 
        {
@@ -295,63 +317,74 @@
            {
                verifyResult = true
            };
            var wmsTask = WMSHelper.GetWmsTask(model.taskNo);
            if (wmsTask != null)
            var wcsTask = WCSHelper.GetTask(model.taskNo);
            var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE);
            if (wcsTask != null && wmsTask != null)
            {
                if (wmsTask.S_TYPE != "异常托盘出库任务")
                Location endLoc = LocationHelper.GetLoc(wmsTask.S_END_LOC);   // 原终点
                if (wcsTask.S_TYPE == "满料下线入库任务")
                {
                    Location endLoc = null;
                    Location middleLoc = null;
                    // 判断rfid是否异常
                    if (model.cntrNo != wmsTask.S_CNTR_CODE)
                    if (model.cntrNo != wcsTask.S_CNTR_CODE)
                    {
                        endLoc = LocationHelper.GetLoc(wmsTask.S_END_LOC);
                        var connectLoc = Settings.connectLocList.Where(a => a.roadway == endLoc.N_ROADWAY && a.type == 1).FirstOrDefault();
                        middleLoc = LocationHelper.GetLoc(connectLoc.locCode);
                        endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                        // 查询排出口
                        Location middleLoc = WMSHelper.getMinTaskMiddleLoc(1, 0, endLoc.N_ROADWAY);
                        // 查询新终点
                        endLoc = WMSHelper.getOnlneLoc(2);
                        wcsTask.S_END_LOC = middleLoc.S_CODE;
                        wcsTask.S_END_AREA = middleLoc.S_AREA_CODE;
                        WCSHelper.updateTaskEnd(wcsTask);
                        wmsTask.S_END_LOC = endLoc.S_CODE;
                        wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
                        WMSHelper.UpdateTaskEnd(wmsTask);
                        var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE);
                        if (wcsTask != null)
                        {
                            wcsTask.S_END_LOC = middleLoc.S_CODE;
                            wcsTask.S_END_AREA = middleLoc.S_AREA_CODE;
                            WCSHelper.updateTaskEnd(wcsTask);
                        }
                        readCodeFeedbackResponse.verifyResult = false;
                        readCodeFeedbackResponse.endLoc = middleLoc.S_CODE;
                        response.data = readCodeFeedbackResponse;
                    }
                }
                else if (wcsTask.S_TYPE == "胚胎叫料出库任务")
                {
                    if (model.cntrNo != wcsTask.S_CNTR_CODE)
                    {
                        // 计算排出口
                        endLoc = WMSHelper.getCallOutLoc(endLoc.N_ROW);
                        wcsTask.S_END_LOC = endLoc.S_CODE;
                        wcsTask.S_END_AREA = endLoc.S_AREA_CODE;
                        WCSHelper.updateTaskEnd(wcsTask);
                        wmsTask.S_END_LOC = endLoc.S_CODE;
                        wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
                        WMSHelper.UpdateTaskEnd(wmsTask);
                        readCodeFeedbackResponse.verifyResult = false;
                        readCodeFeedbackResponse.endLoc = endLoc.S_CODE;
                    }
                    else 
                    {
                        var cntrItemRels = ContainerHelper.GetCntrItemRel(wmsTask.S_CNTR_CODE);
                        if (cntrItemRels.Count > 0)
                        var cntrItemRels = ContainerHelper.GetCntrItemRel(wcsTask.S_CNTR_CODE);
                        if (cntrItemRels.Count > 0)
                        {
                            if (cntrItemRels[0].S_ITEM_STATE != "OK")
                            if (cntrItemRels[0].S_ITEM_STATE != "OK")
                            {
                                middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                                endLoc = WMSHelper.getMinTaskMiddleLoc(1,endLoc.N_ROADWAY); ;
                                wcsTask.S_END_LOC = endLoc.S_CODE;
                                wcsTask.S_END_AREA = endLoc.S_AREA_CODE;
                                WCSHelper.updateTaskEnd(wcsTask);
                                wmsTask.S_END_LOC = endLoc.S_CODE;
                                wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
                                WMSHelper.UpdateTaskEnd(wmsTask);
                                var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE);
                                if (wcsTask != null)
                                {
                                    wcsTask.S_END_LOC = middleLoc.S_CODE;
                                    wcsTask.S_END_AREA = middleLoc.S_AREA_CODE;
                                    WCSHelper.updateTaskEnd(wcsTask);
                                }
                                readCodeFeedbackResponse.verifyResult = false;
                                readCodeFeedbackResponse.endLoc = middleLoc.S_CODE;
                                response.data = readCodeFeedbackResponse;
                                readCodeFeedbackResponse.endLoc = endLoc.S_CODE;
                            }
                        }
                    }
                }
            }
            else 
@@ -361,6 +394,63 @@
            }
            response.data = readCodeFeedbackResponse;
            return response;
        }
        /// <summary>
        /// 申请新终点
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ResponseResult applyDest(ApplyDestModel model)
        {
            ResponseResult response = new ResponseResult();
            ApplyDest applyDest = new ApplyDest();
            var wcsTask = WCSHelper.GetTask(model.taskNo);
            if (wcsTask != null)
            {
                var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE);
                if (wcsTask != null)
                {
                    string itemCode = null;
                    var endLoc = LocationHelper.GetLoc(wcsTask.S_END_LOC);
                    var cntrItemRels = ContainerHelper.GetCntrItemRel(wcsTask.S_CNTR_CODE);
                    if (cntrItemRels.Count > 0)
                    {
                        itemCode = cntrItemRels[0].S_ITEM_CODE;
                    }
                    if (model.applyType == 1)
                    {
                        LocationHelper.LockLoc(wcsTask.S_END_LOC, 3);  // 将原货位锁定(其他锁)
                        var endLocGroup = WMSHelper.getInStockEndLoc(1, itemCode, endLoc.N_ROADWAY);
                        if (endLocGroup.endLocList.Count > 0)
                        {
                            endLoc = endLocGroup.endLocList[0];
                            applyDest.endLoc = endLoc.S_CODE;
                        }
                    }
                    else if (model.applyType == 2)
                    {
                        var endLocGroup = WMSHelper.getInStockEndLoc(1, cntrItemRels[0].S_ITEM_CODE, 0, endLoc.N_ROADWAY);
                        if (endLocGroup.endLocList.Count > 0)
                        {
                            endLoc = endLocGroup.endLocList[0];
                            applyDest.endLoc = endLoc.S_CODE;
                        }
                    }
                }
            }
            else
            {
                response.code = 1;
                response.msg = $"任务:{model.taskNo}不存在";
            }
            return response;
        }
        public class ApplyDest
        {
            public string endLoc { get; set; }
        }
        /// <summary>
@@ -444,9 +534,9 @@
                                    S_START_AREA = startLoc.S_AREA_CODE,
                                    S_END_LOC = endLoc.S_CODE,
                                    S_END_AREA = endLoc.S_AREA_CODE,
                                    S_TYPE = "满料下线入库任务",
                                    S_TYPE = "胚胎叫料出库任务",
                                    S_OP_DEF_CODE = model.reqId,
                                    S_OP_DEF_NAME = "成型机满料下线入库",
                                    S_OP_DEF_NAME = "硫化机呼叫胚胎出库",
                                    N_PRIORITY = 1,
                                    T_START_TIME = DateTime.Now,
                                    S_GROUP_NO = groupNo,
@@ -642,7 +732,7 @@
            if (locCntrs.Count == 1)
            {
                Location startLoc = LocationHelper.GetLoc(locCntrs[0].S_LOC_CODE);
                var connectLoc = Settings.connectLocList.Where(a => a.roadway == startLoc.N_ROADWAY && a.type == 1).First();
                var connectLoc = Settings.connectLocList.Where(a => a.roadway == startLoc.N_ROADWAY).First();
                Location middleLoc = LocationHelper.GetLoc(connectLoc.locCode);
                Location endLoc = LocationHelper.GetLoc("");
                if (endLoc != null)
@@ -767,11 +857,21 @@
                        if (model.status == 2 || model.status == 8)
                        {
                            if (mst != null)
                            if (mst != null && mst.N_B_STATE != 2)
                            {
                                if (mst.N_B_STATE != 2)
                                if (mst.S_END_LOC != cst.S_END_LOC)
                                {
                                    WCSCore.createLastTask(cst.S_END_LOC, mst);
                                }
                                else
                                {
                                    mst.N_B_STATE = 2;
                                    WMSHelper.UpdateTaskState(mst);
                                }
                                if (mst.S_TYPE == "呼叫空托出库")
                                {
                                    LocationHelper.UnBindingLoc(mst.S_END_LOC, new List<string>() { mst.S_CNTR_CODE });
                                }
                            }
                        }
@@ -958,6 +1058,7 @@
        public class OffLineModel
        {
            public string loc { get; set; } // 下线位
            public string rfid { get; set; } // 托盘号
            public string deviceNo { get; set; } // 机台号
            public int isUrgent { get; set; } // N_IS_URGENT 是否加急(0.否 1.是)
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/MoboxController.cs
@@ -26,7 +26,9 @@
            var result = new SimpleResult();
            var task = WCSHelper.GetTask(model.TaskNo);
            if (task != null) {
                if (task.N_B_STATE == 0) {
                if (task.N_B_STATE == 0)
                {
                    //等待直接修改状态为取消
                    WCSHelper.UpdateStatus(model.TaskNo, "取消");
                    LocationHelper.UnLockLoc(task.S_START_LOC);
@@ -35,15 +37,27 @@
                    /*LocationHelper.UnBindingLoc(task.S_START_LOC, new List<string> { task.S_CNTR_CODE });*/
                    result.resultMsg = "任务等待,直接取消";
                }
                else if (task.N_B_STATE < 3) {
                    //已推送但是没有完成或者取消,通知hosttoagv
                    NDCHelper.Cancel(task.S_CODE);
                    result.resultMsg = "任务取消已经发送给小车";
                else if (task.N_B_STATE < 3)
                {
                    if (task.S_SCHEDULE_TYPE == "AGV")
                    {
                        //已推送但是没有完成或者取消,通知hosttoagv
                        NDCHelper.Cancel(task.S_CODE);
                        result.resultMsg = "任务取消已经发送给小车";
                    }
                    else if (task.S_SCHEDULE_TYPE == "WCS")
                    {
                    }
                }
                else {
                else
                {
                    result.resultCode = 1;
                    result.resultMsg = "任务已结束";
                }
            }
            else {
                result.resultCode = 1;
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/WmsController.cs
@@ -66,6 +66,7 @@
            catch (Exception ex)
            {
                LogHelper.Info($"WMS内部错误,错误原因:{ex.Message}", "WMS");
                LogHelper.Info(ex.StackTrace, "WMS");
                responseResult.code = 500;
                responseResult.msg = $"WMS内部错误,请联系开发人员处理";
            }
@@ -74,7 +75,22 @@
        }
        /// <summary>
        /// 3.硫化机呼叫胚胎出库
        /// 3.申请终点
        /// 场景:1.堆垛机放货异常申请新终点; 2.堆垛机入库输送线堵塞申请新终点
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ResponseResult applyDest(ApplyDestModel model)
        {
            LogHelper.Info("【3.申请终点】applyDest 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.applyDest(model);
            LogHelper.Info("【3.申请终点】applyDest 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 4.硫化机呼叫胚胎出库
        /// 逻辑:
        /// 1.根据机台号查询【硫化机工单表】、【胚胎已完成的条码中间表】筛选当前班次的生产计划数量是否满足,当预计生产数量 = 实际数+在途数量 ,则停止叫料
        /// 2.查询机台号在【硫化机工单表】对应的物料编码,
@@ -84,71 +100,71 @@
        /// <returns></returns>
        public ResponseResult callItemOutStock(CallItemModel model ) 
        {
            LogHelper.Info("【3.硫化机呼叫胚胎出库】callItemOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【4.硫化机呼叫胚胎出库】callItemOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.callItemOutStock(model);
            LogHelper.Info("【3.硫化机呼叫胚胎出库】callItemOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            LogHelper.Info("【4.硫化机呼叫胚胎出库】callItemOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 4.空托回立库
        /// 5.空托回立库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ResponseResult emptyTrayInStock(EmptyTrayInStockModel model ) 
        {
            LogHelper.Info("【4.空托回立库】emptyTrayInStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【5.空托回立库】emptyTrayInStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.emptyTrayInStock(model);
            LogHelper.Info("【4.空托回立库】emptyTrayInStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            LogHelper.Info("【5.空托回立库】emptyTrayInStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 5.成型机呼叫空托
        /// 6.成型机呼叫空托
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ResponseResult callEmptyTrayOutStock(CallEmptyTrayOutStockModel model)
        {
            LogHelper.Info("【5.成型机呼叫空托】callEmptyTrayOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【6.成型机呼叫空托】callEmptyTrayOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.callEmptyTrayOutStock(model);
            LogHelper.Info("【5.成型机呼叫空托】callEmptyTrayOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            LogHelper.Info("【6.成型机呼叫空托】callEmptyTrayOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 6.胎胚立库抽检出库、人工出库胎胚
        /// 7.胎胚立库抽检出库、人工出库胎胚
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ResponseResult embryoCheckOutStock(EmbryoCheckOutStockModel model)
        {
            LogHelper.Info("【6.胎胚立库抽检出库】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【7.胎胚立库抽检出库】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.embryoCheckOutStock(model);
            LogHelper.Info("【 6.胎胚立库抽检出库】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            LogHelper.Info("【 7.胎胚立库抽检出库】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 7.异常回库流程
        /// 8.异常回库流程
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ResponseResult anomalyTrayInStock(AnomalyTrayInStockModel model) 
        {
            LogHelper.Info("【7.异常回库流程】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【8.异常回库流程】embryoCheckOutStock 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ResponseResult responseResult = new ResponseResult();
            responseResult = ApiHelper.anomalyTrayInStock(model);
            LogHelper.Info("【7.异常回库流程】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            LogHelper.Info("【8.异常回库流程】embryoCheckOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS");
            return responseResult;
        }
        /// <summary>
        /// 8.WCS 任务状态反馈
        /// 9.WCS 任务状态反馈
        /// 业务场景:WCS在执行任务时,回报任务状态
        /// </summary>
        /// <param name="model"></param>
@@ -157,14 +173,14 @@
        /*[Route("notifyTaskStatus")]*/
        public ReturnResult notifyTaskStatus(TaskStatusFeedbackModel model)
        {
            LogHelper.Info("【8.WCS任务状态反馈】Request:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【9.WCS任务状态反馈】Request:" + JsonConvert.SerializeObject(model), "WMS");
            var result = ApiHelper.taskStatusFeedback(model);
            LogHelper.Info("【8.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS");
            LogHelper.Info("【9.WCS任务状态反馈】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
        /// <summary>
        /// 9.空托盘解绑
        /// 10.空托盘解绑
        /// 业务场景:空托盘回主线
        /// </summary>
        /// <param name="model"></param>
@@ -172,9 +188,9 @@
        [HttpPost]
        public ReturnResult emptyTrayUnBind(EmptyTrayUnBindModel model)
        {
            LogHelper.Info("【9.空托盘解绑】Request:" + JsonConvert.SerializeObject(model), "WMS");
            LogHelper.Info("【10.空托盘解绑】Request:" + JsonConvert.SerializeObject(model), "WMS");
            var result = ApiHelper.emptyTrayUnBind(model);
            LogHelper.Info("【9.空托盘解绑】response:" + JsonConvert.SerializeObject(result), "WMS");
            LogHelper.Info("【10.空托盘解绑】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
@@ -226,6 +242,15 @@
            public string trayCode { get; set; } // 容器编码
        }
        public class ApplyDestModel
        {
            public string reqId { get; set; }
            public string reqTime { get; set; }
            public string taskNo { get; set; }  // 任务号
            public int applyType { get; set; }  //申请类型 1.堆垛机放货异常申请新终点; 2.堆垛机入库输送线堵塞申请新终点
            public string loc { get; set; }
        }
        public class CallItemModel 
        {
            public string reqId { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/config/config.json
@@ -1,25 +1,82 @@
{
  "HostToAgvServerUrl": "http://192.168.1.146:9988/HostToAGV.cgi",
  "HASeverUrl": "http://172.16.10.41",
  "SqlServer": "Data Source=192.168.1.188;Initial Catalog=OIMobox;User ID=sa;Password=Am123123",
  "SqlServer": "server=192.168.1.204;uid=root;pwd=yn123456;database=oimobox",
  "SqlServer1": "Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015",
  "ApiPort": 8901,
  "FacCode": "1122",
  "WHCode": "TSCK",
  "StockArea": "area2",
  "AbnormalArea": "area1", // 异常区
  "StockArea": "SSA",
  // 接驳位 type 1.排出口
  // 接驳位 type 1.立库前排出口 2.满料上线位 3.空托上线位 4.硫化机前排除口
  "ConnectLoc": [
    {
      "locCode": "loc1",
      "roadway": 1,
      "locCode": "OA1-1-1-1",
      "roadway": 1
    },
    {
      "locCode": "OA1-1-2-1",
      "roadway": 2
    },
    {
      "locCode": "OA1-1-3-1",
      "roadway": 3
    },
    {
      "locCode": "OA1-1-4-1",
      "roadway": 4
    },
    {
      "locCode": "OA1-1-5-1",
      "roadway": 5
    },
    {
      "locCode": "OA1-1-6-1",
      "roadway": 6
    },
    {
      "locCode": "OA1-1-7-1",
      "roadway": 7
    },
    {
      "locCode": "OA1-1-8-1",
      "roadway": 8
    }
  ],
  // 上(输送)线货位 type 1.满料上线位 2.空托上线位
  "OnLineLoc": [
    {
      "locCode": "UCL1-1-1-1",
      "type": 1
    },
    {
      "locCode": "loc1",
      "roadway": 2,
      "locCode": "UCL1-1-2-1",
      "type": 1
    },
    {
      "locCode": "UCL1-1-3-1",
      "type": 2
    }
  ],
  // 叫料异常排除位
  "CallOutLoc": [
    {
      "locCode": "OA1-2-1-1",
      "row": 1
    },
    {
      "locCode": "OA1-2-2-1",
      "row": 2
    },
    {
      "locCode": "OA1-2-3-1",
      "row": 3
    },
    {
      "locCode": "OA1-2-4-1",
      "roadway": 4
    }
  ]
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/core/WCSCore.cs
@@ -70,6 +70,16 @@
                            //安全请求等
                            TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData);
                        }
                        if (model.State == 2)
                        {
                            var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE);
                            if (mst.S_END_LOC == TN_Task.S_END_LOC)
                            {
                                mst.N_B_STATE = 2;
                                WMSHelper.UpdateTaskState(mst);
                            }
                        }
                    }
                }
            }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/core/WMSCore.cs
@@ -80,7 +80,6 @@
                                S_START_LOC = a.S_START_LOC,
                                S_END_LOC = a.S_END_LOC,
                                S_SCHEDULE_TYPE = "杭奥",
                                N_CNTR_COUNT = 1,
                                S_CNTR_CODE = a.S_CNTR_CODE,
                            };
@@ -123,7 +122,7 @@
                                    S_START_LOC = a.S_START_LOC,
                                    S_END_LOC = a.S_END_LOC,
                                    S_SCHEDULE_TYPE = "杭奥",
                                    N_CNTR_COUNT = 1,
                                    S_CNTR_CODE = a.S_CNTR_CODE,
                                };
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/Container.cs
@@ -11,28 +11,10 @@
        public string S_CODE { get; set; }
        public string S_TYPE { get; set; }
        public string S_SPEC { get; set; }
        public float F_WEIGHT { get; set; }
        public float F_LOAD_WEIGHT { get; set; }
        public float F_MAX_WEIGHT { get; set; }
        public int N_LENGTH { get; set; }
        public int N_WIDTH { get; set; }
        public int N_HEIGHT { get; set; }
        public string C_IS_VIRTUAL { get; set; } = "N";
        public int N_TYPE { get; set; }
        public string C_ENABLE { get; set; } = "Y";
        public string S_STATE_PRE { get; set; }
        public int N_REVIEW_RESULT { get; set; }
        public int N_DETAIL_COUNT { get; set; }
        public int N_B_STATE { get; set; }
        public string S_LOCK_OP_CODE { get; set; }
        public string S_LOCK_STATE { get; set; }
        public int N_LOCK_STATE { get; set; }
        /// <summary>
        /// 码盘时候标记
        /// </summary>
        public string S_SRC { get; internal set; }
        public string S_DEST { get; internal set; }
        [SugarColumn(IsIgnore = true)]
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/GreenTireInformation.cs
@@ -22,5 +22,12 @@
        public int QTY { get; set; } // 数量
        public string TXNDATE { get; set; } // 生产时间
        public string DATE_SHIFT { get; set; } // 转班日期
        [SugarColumn(IsIgnore = true)]
        public string S_EFFECTIVE_TIME { get; set; } // 生效时间
        [SugarColumn(IsIgnore = true)]
        public string S_EXPIRATION_TIME { get; set; } // 失效时间
        [SugarColumn(IsIgnore = true)]
        public int N_URGENT_FLAG { get; set; } = 0; // 加急标识
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/OffLineRecord.cs
@@ -15,7 +15,8 @@
    {
        public string S_RFID { get; set; } // 托盘号
        public string S_LOC { get; set; } // 下线货位
        public string S_DEVICE_NO { get; set; } // 下线货位
        public string S_ITEM_STATUS { get; set; } = "OK"; // 下线货位
        public string S_DEVICE_NO { get; set; } // 设备号
        public int N_IS_URGENT { get; set; } // N_IS_URGENT 是否加急(0.否 1.是)
        public string T_OFF_TIME { get; set; } // 下线时间
        public int N_IS_FULL { get; set; } // 是否满拖 0.否 1.是
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/Overage.cs
@@ -11,7 +11,7 @@
    [SugarTable("TN_standard_overage")]
    internal class Overage : BaseModel
    {
        public string MCNGRP { get; set; } //生产流程组
        public string MCNGRP { get; set; } //生产流程组    0.硫化机 1.半制品
        public string ITEMPATT { get; set; } // 物料前缀
        public int OVERAGE { get; set; }  // 最大保存时间
        public float MINHOUR { get; set; } // 多久后生效
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/models/WCSTask.cs
@@ -50,12 +50,7 @@
        public string S_OP_NAME { get; set; }
        public string S_WORKSHOP_NO { get; set; }
        public string S_WORKSHOP_NAME { get; set; }
        // 起点层数
        public int N_START_LAYER { get; internal set; }
        // 终点层数
        public int N_END_LAYER { get; internal set; }
        // 容器数量
        public int N_CNTR_COUNT { get; internal set; }
        internal static string GetStateStr(int state) {
            //0等待      1已推送        2执行    3完成    4错误
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/packages.config
@@ -1,6 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EasyModbusTCP" version="5.6.0" targetFramework="net461" />
  <package id="Google.Protobuf" version="3.19.4" targetFramework="net461" />
  <package id="K4os.Compression.LZ4" version="1.2.6" targetFramework="net461" />
  <package id="K4os.Compression.LZ4.Streams" version="1.2.6" targetFramework="net461" />
  <package id="K4os.Hash.xxHash" version="1.0.6" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.9" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.9" targetFramework="net461" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.9" targetFramework="net461" />
@@ -19,11 +23,13 @@
  <package id="Microsoft.Owin.Host.HttpListener" version="4.2.2" targetFramework="net461" />
  <package id="Microsoft.Owin.Hosting" version="4.2.2" targetFramework="net461" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net461" />
  <package id="MySql.Data" version="8.0.30" targetFramework="net461" />
  <package id="Newtonsoft.Json" version="13.0.2" targetFramework="net461" />
  <package id="NLog" version="5.1.1" targetFramework="net452" requireReinstallation="true" />
  <package id="NModbus" version="3.0.81" targetFramework="net461" />
  <package id="NModbus4" version="2.1.0" targetFramework="net461" />
  <package id="Owin" version="1.0" targetFramework="net461" />
  <package id="Portable.BouncyCastle" version="1.9.0" targetFramework="net461" />
  <package id="S7netplus" version="0.20.0" targetFramework="net461" />
  <package id="SqlSugar" version="5.1.3.47" targetFramework="net461" />
  <package id="Swashbuckle" version="5.6.0" targetFramework="net461" />
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/process/TaskProcess.cs
@@ -20,7 +20,6 @@
        /// <param name="mst"></param>
        /// <param name="v"></param>
        internal static void CacheBitUpdate(WCSTask mst, bool load) {
            var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
            if (load) {
                Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
@@ -245,79 +244,7 @@
                var endLoc = LocationHelper.GetLocation(mst.S_END_LOC);
                if (mst.S_SCHEDULE_TYPE == "NDC") {
                    Console.WriteLine($"SendTask {mst.S_CODE}");
                    var dic = new Dictionary<string, string>();
                    dic.Add("No", mst.S_CODE);
                    dic.Add("Pri", mst.N_PRIORITY.ToString());
                    dic.Add("From", startLoc.S_AGV_SITE);
                    dic.Add("To", endLoc.S_AGV_SITE);
                    if (mst.S_TYPE == "移库")
                    {
                        dic.Add("FUNC", "32");
                    }
                    else
                    {
                        dic.Add("FUNC", "0");
                    }
                    var data = mst.N_END_LAYER + 16 * mst.N_START_LAYER;
                    // 参数4
                    dic.Add("DATA", data.ToString());
                    //物料信息中获取
                    //先获取托盘信息
                    var itemInfo = LocationHelper.GetCntrItem(mst.S_CNTR_CODE);
                    if (itemInfo != null) {
                        // 参数5
                        dic.Add("ItemHeight", itemInfo.N_TS_HEIGHT);
                        //参数6 默认值
                        string[] parts = itemInfo.Item_Spec.Split('*');
                        if (parts.Length > 1)
                        {
                            if (parts[1].Equals("1200"))
                            {
                                dic.Add("TrayType", "1");
                            }
                            else if (parts[1].Equals("1210"))
                            {
                                dic.Add("TrayType", "2");
                            }
                        }
                    }
                    //获取参数7和8
                    dic.Add("FromCol", "0");
                    dic.Add("ToCol", "0");
                    //改起点
                    var flb1 = GetFreeLineBit(startLoc.S_AREA_CODE, startLoc.N_ROW, startLoc.N_COL);
                    if (flb1 != null) {
                        dic["FromCol"] = (startLoc.N_COL - flb1.minCol).ToString();
                        if (mst.N_START_LAYER == 1) {
                            dic["From"] = flb1.bit1.ToString();
                        }
                        else {
                            dic["From"] = flb1.bit2.ToString();
                        }
                    }
                    //改终点
                    var flb = GetFreeLineBit(endLoc.S_AREA_CODE, endLoc.N_ROW, endLoc.N_COL);
                    if (flb != null) {
                        dic["ToCol"] = (endLoc.N_COL - flb.minCol).ToString();
                        if (mst.N_END_LAYER == 1) {
                            dic["To"] = flb.bit1.ToString();
                        }
                        else {
                            dic["To"] = flb.bit2.ToString();
                        }
                    }
                    var res = NDC.AddNewOrderNew(5, mst.N_PRIORITY, mst.S_CODE, dic);
                    if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) {
                        //推送成功,修改任务优先级
                        mst.N_B_STATE = 1;
                        WCSHelper.UpdateStatus(mst);
                        result = true;
                    }
                }
                else if (mst.S_SCHEDULE_TYPE == "杭奥") {
                    //调第三方接口
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/util/Settings.cs
@@ -13,13 +13,14 @@
    {
        public static string HostToAgvServerUrl { get; set; }
        public static string HASeverUrl { get; set; }
        public static string SqlServer { get; set; }
        public static string SqlServer  { get; set; }
        public static string SqlServer1 { get; set; }
        public static List<ConnectLoc> connectLocList { get; set; }
        public static List<OnLineLoc> onLineLocList { get; set; }
        public static List<CallOutLoc> callOutLocList { get; set; }
        public static int port { get; set; }
        public static string WHCode { get; set; }
        public static string FacCode { get; set; }
        public static string abnormalArea { get; set; }
        public static string stockArea { get; set; }
@@ -56,9 +57,13 @@
                            if (keyValue.Name == "ConnectLoc") {
                                connectLocList = JsonConvert.DeserializeObject<List<ConnectLoc>>(keyValue.Value.ToString());
                            }
                            if (keyValue.Name == "AbnormalArea")
                            if (keyValue.Name == "OnLineLoc")
                            {
                                abnormalArea = keyValue.Value.ToString();
                                onLineLocList = JsonConvert.DeserializeObject<List<OnLineLoc>>(keyValue.Value.ToString());
                            }
                            if (keyValue.Name == "CallOutLoc")
                            {
                                callOutLocList = JsonConvert.DeserializeObject<List<CallOutLoc>>(keyValue.Value.ToString());
                            }
                            if (keyValue.Name == "StockArea")
                            {
@@ -81,8 +86,19 @@
        {
            public string locCode { get; set; }
            public int roadway { get; set; }
        }
        public class OnLineLoc
        {
            public string locCode { get; set; }
            public int type { get; set; }
        }
        public class CallOutLoc
        {
            public string locCode { get; set; }
            public int row { get; set; }
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/util/SqlHelper.cs
@@ -116,7 +116,7 @@
            {
                ConnectionString = string.IsNullOrEmpty(url) ? Settings.SqlServer : url,
                //ConnectionString = @"Data Source=192.168.1.198\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015",
                DbType = DbType.SqlServer,
                DbType = DbType.MySql,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
            });
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/ContainerHelper.cs
@@ -1,4 +1,5 @@
using HH.WCS.Mobox3.YNJT_PT.models.other;
using HH.WCS.Mobox3.YNJT_PT.models;
using HH.WCS.Mobox3.YNJT_PT.models.other;
using HH.WCS.Mobox3.YNJT_PT.util;
using System;
using System.Collections.Generic;
@@ -17,20 +18,7 @@
            var date = DateTime.Now.ToString("yyMMdd");
            return $"TP{date}{id.ToString().PadLeft(4, '0')}";
        }
        /// <summary>
        /// 根据容器类型、目的地、状态查询容器
        /// </summary>
        /// <param name="dest"></param>
        /// <param name="cntrType"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        internal static List<Container> GetCntrListByPurpose(string dest, string cntrType, int state) {
            //1.0 查货位容器表
            var db = new SqlHelper<object>().GetInstance();
            var list = db.Queryable<Container>().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList();
            return list;
        }
        /// <summary>
        /// TN_ContainerHelper.test("4L天然水箱装6入", 50, "335ml东方树叶15入", 30);
        /// </summary>
@@ -144,113 +132,54 @@
        }
        /// <summary>
        /// 根据容器来源和状态获取托盘
        /// 添加容器物料信息
        /// </summary>
        /// <param name="src"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        internal static List<Container> GetCntr(string dest, int state, string cntrType = "") {
        public static bool addCntrItemRel( string cntrCode,GreenTireInformation info)
        {
            bool res = false;
            var db = new SqlHelper<object>().GetInstance();
            if (cntrType == "") {
                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList();
            }
            else {
                return db.Queryable<Container>().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
            }
        }
        internal static bool UpdateCntr(List<string> cntrs, string dest, int state) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
            if (models.Count > 0) {
                models.ForEach(a => {
                    a.S_DEST = dest; a.N_B_STATE = state;
                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand();
                });
                res = true;
            }
            return res;
        }
        internal static bool UpdateCntrDest(List<string> cntrs, string dest) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
            if (models.Count > 0) {
                models.ForEach(a => {
                    a.S_DEST = dest;
                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand();
                });
                res = true;
            }
            return res;
        }
        /// <summary>
        /// 更新托盘来源
        /// </summary>
        /// <param name="cntr"></param>
        /// <param name="src"></param>
        /// <returns></returns>
        internal static bool UpdateCntrSrc(string cntr, string src) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
            if (model != null) {
                model.S_SRC = src;
                model.T_MODIFY = DateTime.Now;
                res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0;
            }
            return res;
        }
        internal static bool UpdateCntrState(List<string> cntrs, int state) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
            if (models.Count > 0) {
                models.ForEach(a => {
                    a.N_B_STATE = state;
                    db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand();
                });
                res = true;
            }
            return res;
        }
            var container = ContainerHelper.GetCntr(cntrCode);
            if (container != null)
            {
                try
                {
                    db.BeginTran();
                    db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand();
        internal static bool UpdateCntr(List<string> cntrs, string src, string dest, int state) {
            var res = false;
            var db = new SqlHelper<object>().GetInstance();
            var models = db.Queryable<Container>().Where(a => cntrs.Contains(a.S_CODE)).ToList();
            if (models.Count > 0) {
                models.ForEach(a => {
                    a.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src;
                    db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand();
                });
                res = true;
                    CntrItemRel cntrItemRel = new CntrItemRel()
                    {
                        S_CG_ID = info.BARCODE,
                        S_CNTR_CODE = cntrCode,
                        S_ITEM_CODE = info.ITEMCODE,
                        S_CELL_NO = info.TIRECODE,
                        F_QTY = info.QTY,
                        S_MCN = info.MCN,
                        S_OPR = info.OPR,
                        S_OPR02 = info.OPR02,
                        S_OPR03 = info.OPR03,
                        S_OPR04 = info.OPR04,
                        S_WINDUP = info.WINDUP,
                        S_TXNDATE = info.TXNDATE,
                        S_DATE_SHIFT = info.DATE_SHIFT,
                        S_EFFECTIVE_TIME = info.S_EFFECTIVE_TIME,
                        S_EXPIRATION_TIME = info.S_EXPIRATION_TIME,
                        N_URGENT_FLAG = info.N_URGENT_FLAG,
                    };
                    db.Insertable(cntrItemRel).ExecuteCommand();
                    container.N_DETAIL_COUNT = 1;
                    db.Updateable(container).ExecuteCommand();
                    db.CommitTran();
                    res = true;
                }
                catch (Exception ex)
                {
                    db.RollbackTran();
                }
            }
            return res;
        }
        public static bool ClearCntrInfo(string cntr) {
            var db = new SqlHelper<object>().GetInstance();
            var model = db.Queryable<Container>().Where(a => a.S_CODE == cntr).First();
            if (model != null) {
                model.S_SRC = "";
                model.S_DEST = "";
                model.N_B_STATE = 0;
                model.T_MODIFY = DateTime.Now;
            }
            db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand();
            return db.Deleteable<CntrItemRel>().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0;
        }
        internal static List<Container> GetCntrBySrc(string src, int state, string cntrType = "") {
            var db = new SqlHelper<object>().GetInstance();
            if (cntrType == "") {
                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList();
            }
            else {
                return db.Queryable<Container>().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList();
            }
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/SYSHelper.cs
@@ -32,7 +32,7 @@
            return result;
        }
        [SugarTable("dbo.OI_SYS_MAXID")]
        [SugarTable("OI_SYS_MAXID")]
        public class OI_SYS_MAXID
        {
            public string CN_S_TYPE { get; set; }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WCSHelper.cs
@@ -109,9 +109,6 @@
                N_SCHEDULE_TYPE=1,
                S_B_STATE = "等待",
                S_CNTR_CODE = cntrInfo,
                N_START_LAYER = startLayer,
                N_END_LAYER = endLayer,
                N_CNTR_COUNT = cntrCount
            };
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs
@@ -507,15 +507,31 @@
        /// </summary>
        /// <param name="locNum"></param>
        /// <param name="itemCode"></param>
        /// <param name="roadway"></param>
        /// <param name="excludeRoadway"></param>
        /// <returns></returns>
        public static EndLocGroup getInStockEndLoc(int locNum, string itemCode)
        public static EndLocGroup getInStockEndLoc(int locNum, string itemCode , int roadway = 0 ,int excludeRoadway = 0)
        {
            var db = new SqlHelper<object>().GetInstance();
            EndLocGroup endLocGroup = new EndLocGroup { endLocList = new List<Location>() };
            // 1. 获取候选巷道列表(物料均衡或巷道均衡)
            var candidateRoadways = GetCandidateRoadways(db, itemCode);
            if (candidateRoadways.Count == 0) return endLocGroup;
            List<int> candidateRoadways = new List<int>();
            if (roadway == 0)
            {
                candidateRoadways = GetCandidateRoadways(db, itemCode);
                if (candidateRoadways.Count == 0) return endLocGroup;
                if (excludeRoadway != 0)
                {
                    candidateRoadways.Remove(excludeRoadway);
                }
            }
            else
            {
                candidateRoadways.Add(roadway);
            }
            // 2. 处理单货位入库
            if (locNum == 1)
@@ -532,38 +548,62 @@
        /// </summary>
        private static List<int> GetCandidateRoadways(SqlSugarClient db, string itemCode)
        {
            var list = new List<int>();
            // 策略1:巷道内同规格物料 < 10 的巷道(按数量升序)
            var materialRoadways = db.Queryable<Location>()
                .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
                .Where((a, b, c) =>
                    a.S_AREA_CODE == Settings.stockArea &&
                    a.N_CURRENT_NUM == 1 &&
                    a.N_LOCK_STATE == 0 &&
                    a.C_ENABLE == "Y" &&
                    b.S_CNTR_CODE != null &&
                    c.S_ITEM_CODE == itemCode)
                .GroupBy(a => a.N_ROADWAY)
                .Having(a => SqlFunc.AggregateCount(a.S_CODE) < 10)
                .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) })
                .OrderBy(a => a.Count)
                .Select(a => a.Roadway)
                .ToList();
            var materialRoadwayGroup = db.Queryable<Location>()
                        // 表别名:a = Location, b = LocCntrRel, c = CntrItemRel
                        .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                        .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
            if (materialRoadways.Count > 0) return materialRoadways;
                        // 基础筛选条件(所有位置)
                        .Where((a, b, c) =>
                            a.S_AREA_CODE == Settings.stockArea &&  // 指定区域
                            a.N_LOCK_STATE == 0 &&                 // 未锁定
                            a.C_ENABLE == "Y")                     // 启用状态
            // 策略2:所有巷道按空货位数降序排序
            return db.Queryable<Location>()
                .Where(a =>
                    a.S_AREA_CODE == Settings.stockArea &&
                    a.N_CURRENT_NUM == 0 &&
                    a.N_LOCK_STATE == 0 &&
                    a.C_ENABLE == "Y")
                .GroupBy(a => a.N_ROADWAY)
                .Select(a => new { Roadway = a.N_ROADWAY, Count = SqlFunc.AggregateCount(a.S_CODE) })
                .OrderByDescending(a => a.Count)
                .Select(a => a.Roadway)
                .ToList();
                        // 按巷道分组(使用原始表字段)
                        .GroupBy((a, b, c) => a.N_ROADWAY)
                        // 选择分组结果(包含聚合计算)
                        .Select((a, b, c) => new
                        {
                            Roadway = a.N_ROADWAY,  // 巷道编号
                            // 统计满足特定条件的数量:
                            // 1. 当前数量=1 (a.N_CURRENT_NUM == 1)
                            // 2. 物料匹配 (c.S_ITEM_CODE == itemCode)
                            // 3. 容器关联存在 (b.S_CNTR_CODE != null)
                            validCount = SqlFunc.AggregateSum(SqlFunc.IIF(
                                a.N_CURRENT_NUM == 1 &&
                                c.S_ITEM_CODE == itemCode &&
                                b.S_CNTR_CODE != null,
                                1, 0))
                        })
                       .ToList();
            if (materialRoadwayGroup.Count > 0)
            {
                list = materialRoadwayGroup.Where(a => a.validCount < 10).OrderBy(a => a.validCount).Select(a => a.Roadway).ToList();
            }
            if (list.Count == 0)
            {
                // 策略2:所有巷道按空货位数降序排序
                materialRoadwayGroup = db.Queryable<Location>()
                    .Where(a =>
                        a.S_AREA_CODE == Settings.stockArea &&
                        a.N_CURRENT_NUM == 0 &&
                        a.N_LOCK_STATE == 0 &&
                        a.C_ENABLE == "Y")
                    .GroupBy(a => a.N_ROADWAY)
                    .Select(a => new { Roadway = a.N_ROADWAY, validCount = SqlFunc.AggregateCount(a.S_CODE) })
                    .ToList();
                list = materialRoadwayGroup.OrderByDescending(a => a.validCount).Select(a => a.Roadway).ToList();
            }
            return list;
        }
        /// <summary>
@@ -657,6 +697,7 @@
            // 按层->列排序,便于查找相邻
            var sorted = locations
                .OrderBy(l => l.N_LAYER)
                .ThenBy(l => l.N_ROW)
                .ThenBy(l => l.N_COL)
                .ToList();
@@ -741,12 +782,13 @@
                {
                    // 查询巷道是否正常,异常跳过
                    var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY);
                    if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3")
                    if ( false  /*stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3"*/)
                    {
                        continue;
                    }
                    startLoc = loc;
                    break;
                }
            }
            return startLoc;
@@ -775,25 +817,32 @@
        /// 查询巷道任务最少的接驳位
        /// </summary>
        /// <returns></returns>
        public static Location getMinTaskMiddleLoc(int type)
        public static Location getMinTaskMiddleLoc(int type , int roadway = 0 , int excludeRoadway = 0)
        {
            Location location = new Location();
            var db = new SqlHelper<object>().GetInstance();
            var roadwayGroup = db.Queryable<Location>()
            var query = db.Queryable<Location>()
                    .LeftJoin<WCSTask>((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3)
                    .Where((a, b) => a.S_AREA_CODE == Settings.stockArea)
                    .GroupBy((a, b) => a.N_ROADWAY)
                    .Where((a, b) => a.S_AREA_CODE == Settings.stockArea);
            if (roadway != 0)
            {
                query = query.Where((a, b) => a.N_ROADWAY == roadway);
            }
            if (excludeRoadway != 0)
            {
                query = query.Where((a, b) => a.N_ROADWAY != excludeRoadway);
            }
            var roadwayGroup = query.GroupBy((a, b) => a.N_ROADWAY)
                    .Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) })
                    .OrderBy(a => a.num)
                    .ToList();
            foreach (var item in roadwayGroup)
            {
                // 1.查询巷道内的堆垛机状态是否正常
                // 2.查询接驳位
                var connectLoc = Settings.connectLocList.Where(a => a.type == type && a.roadway == item.roadway).FirstOrDefault();
                var connectLoc = Settings.connectLocList.Where(a => a.roadway == item.roadway).FirstOrDefault();
                if (connectLoc != null) 
                {
                    location = LocationHelper.GetLoc(connectLoc.locCode);
@@ -804,6 +853,38 @@
        }
        /// <summary>
        /// 查询上线货位
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static Location getOnlneLoc(int type)
        {
            Location location = null;
            var connectLoc = Settings.onLineLocList.Where(a => a.type == type).FirstOrDefault();
            if (connectLoc != null)
            {
                location = LocationHelper.GetLoc(connectLoc.locCode);
            }
            return location;
        }
        /// <summary>
        /// 查询叫料异常排出位
        /// </summary>
        /// <param name="row"></param>
        /// <returns></returns>
        public static Location getCallOutLoc(int row)
        {
            Location location = null;
            var connectLoc = Settings.callOutLocList.Where(a => a.row == row).FirstOrDefault();
            if (connectLoc != null)
            {
                location = LocationHelper.GetLoc(connectLoc.locCode);
            }
            return location;
        }
        /// <summary>
        /// 查询物料存放时间配置信息
        /// </summary>
        /// <param name="bc_entried"></param>