杨前锦
1 天以前 06a8b6963d6d4f229d4e196b4b09ce57e2cbf2dd
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -16,6 +16,7 @@
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using System.Threading.Tasks;
using static HH.WCS.Mobox3.FJJT.api.ApiModel;
using static HH.WCS.Mobox3.FJJT.api.OtherModel;
using static HH.WCS.Mobox3.FJJT.api.WmsController;
@@ -52,17 +53,18 @@
                throw new BusinessException($"空工装出库,终点货位:{model.endLocCode}处于锁定状态");
            }
            var areaCodes = Settings.getRelAreaCodes(endLoc.S_AREA_CODE);
            if (areaCodes.Count == 0)
            // 查询缓存配置
            var bufferLocConfig = WMSHelper.GetBufferLocConfig(model.endLocCode);
            if (bufferLocConfig == null)
            {
                WMSHelper.addAlarmRecord("流程异常", "低", $"空工装出库,未配置库区:{endLoc.S_AREA_CODE}的关联关系");
                throw new BusinessException($"空工装出库,未配置库区:{endLoc.S_AREA_CODE}的关联关系");
                WMSHelper.addAlarmRecord("流程异常", "低", $"空工装出库,未查询到直连缓存位:{model.endLocCode}的配置信息");
                throw new BusinessException($"空工装出库,未查询到直连缓存位:{model.endLocCode}的配置信息");
            }
            Location startLoc = WMSHelper.getOutStockStartLoc(areaCodes[0], null);
            Location startLoc = WMSHelper.getOutStockStartLoc(bufferLocConfig.S_AREA_CODE, null);
            if (startLoc == null)
            {
                WMSHelper.addAlarmRecord("流程异常", "低", $"空工装出库,库区:{areaCodes[0]}未查询到空工装");
                WMSHelper.addAlarmRecord("流程异常", "低", $"空工装出库,库区:{bufferLocConfig.S_AREA_CODE}未查询到空工装");
                throw new BusinessException($"空工装出库,未查询到空工装,立库可能缺少空工装");
            }
@@ -227,18 +229,16 @@
        /// <returns></returns>
        public static ResponseResult offLineProcess(OffLineRequest model) {
            ResponseResult responseResult = new ResponseResult();
            var areaCodes = Settings.areaPropertyList.Select(a => a.areaCode).ToList();
            var isExistCntr = LocationHelper.checkAreaExistCntr(areaCodes,model.cntrNo);
            if (!isExistCntr)
            var offLineLoc = LocationHelper.GetLoc(model.loc);
            if (offLineLoc != null)
            {
                // 查询起点货位是否存在已存在任务,防止任务重复发起
                var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc);
                if (existWmsTask == null)
                var areaCodes = Settings.areaRelevanceList.Select(a => a.areaCode).ToList();
                var isExistCntr = LocationHelper.checkAreaExistCntr(areaCodes, model.cntrNo);
                if (!isExistCntr)
                {
                    // 查询对应机台的物料下线配置信息
                    var logicConfig = WMSHelper.getLogicConfigByJtCode(model.jtNo);
                    if (logicConfig != null)
                    // 查询起点货位是否存在已存在任务,防止任务重复发起
                    var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc);
                    if (existWmsTask == null)
                    {
                        Container container = ContainerHelper.GetCntr(model.cntrNo);
                        if (container == null || !model.isNormal)
@@ -248,33 +248,34 @@
                            WMSHelper.addRfidAnomalyRecord(model.cntrNo, 1, model.loc, null);
                        }
                        // 根据物料下线配置信息,判断任务类型是直连下线还是非直连下线
                        if (logicConfig.S_TASK_TYPE == "1" || logicConfig.S_TASK_TYPE == "2")
                        var areaRelevance = Settings.areaRelevanceList.Where(a => a.xxAreaCode == offLineLoc.S_AREA_CODE).First();
                        if (areaRelevance == null)
                        {
                            triggerItemOffLineFlow(model.loc, model.cntrNo, logicConfig);
                            // 满料下线(直连)
                            triggerItemOffLineFlow(model.loc, model.cntrNo, model.jtNo);
                        }
                        else
                        {
                            // 满料下线(非直连)
                            triggerItemOffLineFlow4(model.loc, model.cntrNo, logicConfig);
                            triggerItemOffLineFlow4(model.loc, model.cntrNo);
                        }
                    }
                    else
                    {
                        WMSHelper.addAlarmRecord("流程异常", "高", $"机台号{model.jtNo},没有可用的逻辑线路,请联系管理人员");
                        throw new BusinessException($"机台号{model.jtNo},没有可用的逻辑线路,请联系管理人员");
                        WMSHelper.addAlarmRecord("流程异常", "低", $"下线货位:{model.loc}已有任务,请勿重复下发任务");
                        throw new BusinessException($"下线货位:{model.loc}已有任务,请勿重复下发任务");
                    }
                }
                else
                {
                    WMSHelper.addAlarmRecord("流程异常", "低", $"下线货位:{model.loc}已有任务,请勿重复下发任务");
                    throw new BusinessException($"下线货位:{model.loc}已有任务,请勿重复下发任务");
                    WMSHelper.addAlarmRecord("流程异常", "高", $"工装:{model.cntrNo}已入库,请勿重复入库");
                    throw new BusinessException($"工装:{model.cntrNo}已入库,请勿重复入库");
                }
            }
            else 
            {
                WMSHelper.addAlarmRecord("流程异常", "高", $"工装:{model.cntrNo}已入库,请勿重复入库");
                throw new BusinessException($"工装:{model.cntrNo}已入库,请勿重复入库");
                WMSHelper.addAlarmRecord("流程异常", "高", $"下线货位:{model.loc}不存在,请检查");
                throw new BusinessException($"下线货位:{model.loc}不存在,请检查");
            }
            return responseResult;
        }
@@ -288,106 +289,22 @@
        /// 4.作业创建完成后,读取中间表,更新中间表状态
        /// </summary>
        /// <param name="offLineLoc"></param>
        /// <param name="logicConfig"></param>
        /// <param name="mesTask"></param>
        /// <param name="cntrNo"></param>
        /// <returns></returns>
        public static bool triggerItemOffLineFlow4(string offLineLoc,string cntrNo, LogicConfig logicConfig ,LjMesTask mesTask = null)
        public static bool triggerItemOffLineFlow4(string offLineLoc,string cntrNo ,LjMesTask mesTask = null)
        {
            bool result = true;
            try
            {
                if (mesTask == null)
                {
                    mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo);
                }
                mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo);
                if (mesTask != null)
                {
                    // 2.判断是否需要补空工装,需要,则创建空工装出库任务
                    bool photoStatus = false;
                    var hcLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC);
                    if (hcLoc != null)
                    {
                        if (hcLoc.N_CURRENT_NUM != 0 && hcLoc.N_LOCK_STATE == 0)
                        {
                            hcLoc = LocationHelper.GetEmptyLoc(hcLoc.S_AREA_CODE);
                        }
                        if (hcLoc != null)
                        {
                            var bufferLocConfig = Settings.GetBufferLocConfig(hcLoc.S_CODE);  // 缓存位关联属性
                            if (bufferLocConfig != null || hcLoc.N_CURRENT_NUM == 0)
                            {
                                photoStatus = true;
                                // 方案1,如果非直连的缓存位有光电信号,则查询设备状态判断是否需要补空工装
                                /*   var deviceStatusDatas = WCSDispatch.getDeviceStatus(new List<string>() { bufferLocConfig.deviceNo });
                                   if (deviceStatusDatas != null && deviceStatusDatas.Count > 0)
                                   {
                                       var deviceStatus = deviceStatusDatas[0];
                                       if (deviceStatus.workStatus == 1 && deviceStatus.manualStatus == 0)
                                       {
                                           photoStatus = deviceStatus.photoStatus == 1;
                                       }
                                       else
                                       {
                                           WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},设备当前处于不可用状态,请联系管理人员调整设备状态");
                                           throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},设备当前处于不可用状态,请联系管理人员调整设备状态");
                                       }
                                   }
                                   else
                                   {
                                       WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                                       throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                                   }*/
                            }
                            else
                            {
                                WMSHelper.addAlarmRecord("流程异常", "高", $"缓存位:{logicConfig.S_LKBKHCLOC},没有配置属性信息,请联系管理人员配置");
                                throw new BusinessException($"缓存位:{logicConfig.S_LKBKHCLOC},没有配置属性信息,请联系管理人员配置");
                            }
                        }
                    }
                    else
                    {
                        WMSHelper.addAlarmRecord("流程异常", "高", $"缓存位:{logicConfig.S_LKBKHCLOC},没有WMS系统中录入");
                        throw new BusinessException($"缓存位:{logicConfig.S_LKBKHCLOC},没有WMS系统中录入");
                    }
                    // 空工装出库判断条件
                    Location kgzStartLoc = null;
                    Location kgzEndLoc = null;
                    string kgzCntrCode = null;
                    if (photoStatus)
                    {
                        kgzStartLoc = LocationHelper.GetLoc(logicConfig.S_LKKTJBLOC);
                        kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC);
                        if (kgzStartLoc == null)
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"空工装出库站台:{logicConfig.S_LKKTJBLOC},没有在WMS系统中录入");
                            photoStatus = false;
                        }
                        if (kgzEndLoc == null)
                        {
                            WMSHelper.addAlarmRecord("流程异常", "中", $"空工装缓存位:{logicConfig.S_LKBKHCLOC},没有在WMS系统中录入");
                            photoStatus = false;
                        }
                        var locCntrRels = LocationHelper.GetLocCntr(kgzStartLoc.S_CODE);
                        if (locCntrRels.Count > 0)
                        {
                            kgzCntrCode = locCntrRels[0].S_CNTR_CODE;
                        }
                        else
                        {
                            kgzCntrCode = "虚拟容器";
                            WMSHelper.addAlarmRecord("流程异常", "低", $"空工装出库站台:{logicConfig.S_LKKTJBLOC},没有空工装");
                        }
                    }
                    string cntrCode = mesTask.PALLET_ID;
                    Location startLoc = LocationHelper.GetLoc(offLineLoc);
                    if (startLoc != null)
                    if (startLoc != null)
                    {
                        string cntrCode = mesTask.PALLET_ID;
                        var areaRelevance = Settings.areaRelevanceList.Where(a => a.xxAreaCode == startLoc.S_AREA_CODE).FirstOrDefault();
                        // 1.创建满料下线作业
                        var wmsTask = new WMSTask()
                        {
@@ -404,32 +321,58 @@
                        };
                        if (WMSHelper.CreateWmsTask(wmsTask))
                        {
                            bool photoStatus = false;
                            int priority = 10;
                            // 2.判断是否需要补空工装,需要则创建空工装补缓存位任务
                            if (photoStatus)
                            // 2.判断是否需要补空工装,需要,则创建空工装出库任务
                            var bufferLoc = WMSHelper.getEmptyBufferLoc(areaRelevance.hcAreaCode);
                            if (bufferLoc != null)
                            {
                                WCSTask kgzWcsTask = new WCSTask()
                                var fixedOutLoc = WMSHelper.GetFullFixedOutLoc(areaRelevance.jbAreaCode);
                                if (fixedOutLoc != null)
                                {
                                    S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                    S_OP_CODE = wmsTask.S_CODE,
                                    S_CODE = WCSHelper.GenerateTaskNo(),
                                    S_CNTR_CODE = kgzCntrCode,
                                    S_TYPE = "空工装出库任务",
                                    S_START_LOC = kgzStartLoc.S_CODE,
                                    S_START_AREA = kgzStartLoc.S_AREA_CODE,
                                    S_END_LOC = kgzEndLoc.S_CODE,
                                    S_END_AREA = kgzEndLoc.S_AREA_CODE,
                                    S_SCHEDULE_TYPE = "AGV",
                                    N_PRIORITY = priority,
                                    T_START_TIME = DateTime.Now,
                                };
                                    // 空工装出库判断条件
                                    string kgzCntrCode = null;
                                    var locCntrRels = LocationHelper.GetLocCntr(fixedOutLoc.S_CODE);
                                    if (locCntrRels.Count > 0)
                                    {
                                        kgzCntrCode = locCntrRels[0].S_CNTR_CODE;
                                        WCSTask kgzWcsTask = new WCSTask()
                                        {
                                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                            S_OP_CODE = wmsTask.S_CODE,
                                            S_CODE = WCSHelper.GenerateTaskNo(),
                                            S_CNTR_CODE = kgzCntrCode,
                                            S_TYPE = "空工装出库任务",
                                            S_START_LOC = fixedOutLoc.S_CODE,
                                            S_START_AREA = fixedOutLoc.S_AREA_CODE,
                                            S_END_LOC = bufferLoc.S_CODE,
                                            S_END_AREA = bufferLoc.S_AREA_CODE,
                                            S_SCHEDULE_TYPE = "AGV",
                                            N_PRIORITY = priority,
                                            T_START_TIME = DateTime.Now,
                                        };
                                if (WCSHelper.CreateTask(kgzWcsTask))
                                {
                                    // 起点、终点加锁
                                    LocationHelper.LockLoc(kgzWcsTask.S_START_LOC, 2);
                                    LocationHelper.LockLoc(kgzWcsTask.S_END_LOC, 1);
                                        if (WCSHelper.CreateTask(kgzWcsTask))
                                        {
                                            // 起点、终点加锁
                                            LocationHelper.LockLoc(kgzWcsTask.S_START_LOC, 2);
                                            LocationHelper.LockLoc(kgzWcsTask.S_END_LOC, 1);
                                        }
                                        photoStatus = true;
                                    }
                                    else
                                    {
                                        WMSHelper.addAlarmRecord("流程异常", "高", $"查询固定空工装出库站台错误,请开发排查");
                                    }
                                }
                                else
                                {
                                    WMSHelper.addAlarmRecord("流程异常", "中", $"接驳库区:{areaRelevance.jbAreaCode}的固定空工装站台没有空工装");
                                }
                            }
                            else
                            {
                                WMSHelper.addAlarmRecord("流程异常", "中", $"缓存库区:{areaRelevance.hcAreaCode}没有空货位");
                            }
                            // 3.创建满料工装入库任务(如需要补空工装,则将任务状态改为预创建,等待补空工装任务完成后触发)
@@ -470,11 +413,6 @@
                            }
                        }
                    }
                    else
                    {
                        WMSHelper.addAlarmRecord("流程异常", "中", $"下线位:{offLineLoc},没有在WMS系统中录入");
                        throw new BusinessException($"下线位:{offLineLoc},没有在WMS系统中录入");
                    }
                }
                else
                {
@@ -505,194 +443,147 @@
        /// </summary>
        /// <param name="offLineLoc">下线货位</param>
        /// <param name="cntrNo">下线容器编码</param>
        /// <param name="logicConfig">逻辑配置</param>
        /// <param name="jtNo">机台号</param>
        /// <returns></returns>
        public static bool triggerItemOffLineFlow(string offLineLoc, string cntrNo, LogicConfig logicConfig ) {
        public static bool triggerItemOffLineFlow(string offLineLoc, string cntrNo ,string jtNo) {
            bool result = true;
            try
            {
                // 2.判断是否需要补空工装,需要,则创建空工装出库任务
                bool photoStatus = false;
                var hcLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC);
                if (hcLoc != null)
                var startLoc = LocationHelper.GetLoc(offLineLoc);
                if (startLoc != null)
                {
                    var bufferLocConfig = Settings.GetBufferLocConfig(hcLoc.S_CODE);
                    if (bufferLocConfig != null)
                    var areaRelevance = Settings.areaRelevanceList.Where(a => a.xxAreaCode == startLoc.S_AREA_CODE).FirstOrDefault();
                    if (areaRelevance != null)
                    {
                        // 测试代码
                        photoStatus = true;
                       /* // 业务代码,勿删
                        var deviceStatusDatas = WCSDispatch.getDeviceStatus(new List<string>() { bufferLocConfig.deviceNo });
                        if (deviceStatusDatas != null && deviceStatusDatas.Count > 0)
                        Location endLoc = WMSHelper.getInStockEndLoc(areaRelevance.areaCode, 1);
                        if (endLoc != null)
                        {
                            var deviceStatus = deviceStatusDatas[0];
                            if (deviceStatus.workStatus == 1 && deviceStatus.manualStatus == 0)
                            LjMesTask mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo);
                            // 1.创建满料下线作业
                            var wmsTask = new WMSTask()
                            {
                                photoStatus = deviceStatus.photoStatus == 1;
                            }
                            else
                            {
                                WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},设备当前处于不可用状态,请联系管理人员调整设备状态");
                                throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},设备当前处于不可用状态,请联系管理人员调整设备状态");
                            }
                        }
                        else
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                            throw new BusinessException($"设备号:{bufferLocConfig.deviceNo},查询设备状态失败,请联系工作人员查看设备是否正常");
                        }*/
                    }
                    else
                    {
                        WMSHelper.addAlarmRecord("流程异常", "高", $"缓存位:{logicConfig.S_LKBKHCLOC},没有配置属性信息,请联系管理人员配置");
                        throw new BusinessException($"缓存位:{logicConfig.S_LKBKHCLOC},没有配置属性信息,请联系管理人员配置");
                    }
                }
                else
                {
                    WMSHelper.addAlarmRecord("流程异常", "高", $"缓存位:{logicConfig.S_LKBKHCLOC},没有在WMS系统中录入");
                    throw new BusinessException($"缓存位:{logicConfig.S_LKBKHCLOC},没有在WMS系统中录入");
                }
                Location startLoc = LocationHelper.GetLoc(offLineLoc);
                if (startLoc == null)
                {
                    WMSHelper.addAlarmRecord("流程异常", "中", $"下线位:{offLineLoc},没有在WMS系统中录入");
                    throw new BusinessException($"下线位:{offLineLoc},没有在WMS系统中录入");
                }
                Location endLoc = WMSHelper.getInStockEndLoc(logicConfig.S_AREA_CODE, 1);
                if (endLoc == null)
                {
                    WMSHelper.addAlarmRecord("流程异常", "高", $"库内没有空余货位");
                    throw new BusinessException($"库内没有空余货位");
                }
                LjMesTask mesTask = WMSHelper.getLjMesTaskByCntr(cntrNo);
                // 1.创建满料下线作业
                var wmsTask = new WMSTask()
                {
                    S_CNTR_CODE = cntrNo,
                    S_CODE = WMSHelper.GenerateTaskNo(),
                    S_START_LOC = startLoc.S_CODE,
                    S_START_AREA = startLoc.S_AREA_CODE,
                    S_END_LOC = endLoc.S_CODE,
                    S_END_AREA = endLoc.S_AREA_CODE,
                    S_TYPE = "满料/异常工装入库任务(直连)",
                    S_OP_DEF_NAME = "满料/异常工装入库任务(直连)",
                    S_OP_DEF_CODE = mesTask != null ? mesTask.ID.ToString() : null,
                    T_START_TIME = DateTime.Now,
                };
                if (WMSHelper.CreateWmsTask(wmsTask))
                {
                    int priority = 10;
                    Dictionary<int, WCSTask> taskDic = new Dictionary<int, WCSTask>();
                    // 是否创建空工装出口任务
                    if (photoStatus || true )
                    {
                        Location kgzStartLoc = WMSHelper.getOutStockStartLoc(logicConfig.S_AREA_CODE, null);
                        Location kgzEndLoc = LocationHelper.GetLoc(logicConfig.S_LKBKHCLOC);
                        if (kgzStartLoc == null)
                        {
                            WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                            WMSHelper.addAlarmRecord("流程异常", "高", $"库区:{logicConfig.S_AREA_CODE},没有可用的空工装");
                            throw new BusinessException($"库区:{logicConfig.S_AREA_CODE},没有可用的空工装");
                        }
                        if (kgzEndLoc == null)
                        {
                            WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                            WMSHelper.addAlarmRecord("流程异常", "中", $"空工装缓存位:{logicConfig.S_LKBKHCLOC},没有在WMS系统中录入");
                            throw new BusinessException($"空工装缓存位:{logicConfig.S_LKBKHCLOC},没有在WMS系统中录入");
                        }
                        var locCntrRels = LocationHelper.GetLocCntr(kgzStartLoc.S_CODE);
                        if (locCntrRels.Count > 0)
                        {
                            string kgzCntrCode = locCntrRels[0].S_CNTR_CODE;
                            // 如是胎侧直连模式,则提高空工装出库任务优先级
                            if (logicConfig.S_TASK_TYPE == "1")
                            {
                                priority = 99;
                            }
                            WCSTask kgzWcsTask = new WCSTask()
                            {
                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                S_OP_CODE = wmsTask.S_CODE,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = kgzCntrCode,
                                S_TYPE = "空工装出库任务",
                                S_START_LOC = kgzStartLoc.S_CODE,
                                S_START_AREA = kgzStartLoc.S_AREA_CODE,
                                S_END_LOC = kgzEndLoc.S_CODE,
                                S_END_AREA = kgzEndLoc.S_AREA_CODE,
                                S_SCHEDULE_TYPE = "WCS",
                                N_PRIORITY = priority,
                                S_CNTR_CODE = cntrNo,
                                S_CODE = WMSHelper.GenerateTaskNo(),
                                S_START_LOC = startLoc.S_CODE,
                                S_START_AREA = startLoc.S_AREA_CODE,
                                S_END_LOC = endLoc.S_CODE,
                                S_END_AREA = endLoc.S_AREA_CODE,
                                S_TYPE = "满料/异常工装入库任务(直连)",
                                S_OP_DEF_NAME = "满料/异常工装入库任务(直连)",
                                S_OP_DEF_CODE = mesTask != null ? mesTask.ID.ToString() : null,
                                T_START_TIME = DateTime.Now,
                            };
                            taskDic.Add(priority, kgzWcsTask);
                            if (WMSHelper.CreateWmsTask(wmsTask))
                            {
                                WCSTask wcsTask = new WCSTask()
                                {
                                    S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                    S_OP_CODE = wmsTask.S_CODE,
                                    S_CODE = WCSHelper.GenerateTaskNo(),
                                    S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                    S_TYPE = wmsTask.S_TYPE,
                                    S_START_LOC = startLoc.S_CODE,
                                    S_START_AREA = startLoc.S_AREA_CODE,
                                    S_END_LOC = endLoc.S_CODE,
                                    S_END_AREA = endLoc.S_AREA_CODE,
                                    S_SCHEDULE_TYPE = "WCS",
                                    N_PRIORITY = 100,
                                    T_START_TIME = DateTime.Now,
                                };
                                if (WCSHelper.CreateTask(wcsTask))
                                {
                                    // 起点、终点加锁
                                    LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                                    LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                                }
                                // 2.判断是否需要补空工装,需要,则创建空工装出库任务
                                var bufferLocConfig = WMSHelper.GetBufferLocConfigByJtNo(jtNo);
                                if (bufferLocConfig != null)
                                {
                                    var bufferLoc = LocationHelper.GetLoc(bufferLocConfig.S_LOC_CODE);
                                    if (bufferLoc != null)
                                    {
                                        Location kgzStartLoc = WMSHelper.getOutStockStartLoc(areaRelevance.areaCode, null);
                                        if (kgzStartLoc == null)
                                        {
                                            WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                                            WMSHelper.addAlarmRecord("流程异常", "高", $"库区:{areaRelevance.areaCode},没有可用的空工装");
                                            throw new BusinessException($"库区:{areaRelevance.areaCode},没有可用的空工装");
                                        }
                                        var locCntrRels = LocationHelper.GetLocCntr(kgzStartLoc.S_CODE);
                                        if (locCntrRels.Count > 0)
                                        {
                                            string kgzCntrCode = locCntrRels[0].S_CNTR_CODE;
                                            WCSTask kgzWcsTask = new WCSTask()
                                            {
                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                                S_OP_CODE = wmsTask.S_CODE,
                                                S_CODE = WCSHelper.GenerateTaskNo(),
                                                S_CNTR_CODE = kgzCntrCode,
                                                S_TYPE = "空工装出库任务",
                                                S_START_LOC = kgzStartLoc.S_CODE,
                                                S_START_AREA = kgzStartLoc.S_AREA_CODE,
                                                S_END_LOC = bufferLoc.S_CODE,
                                                S_END_AREA = bufferLoc.S_AREA_CODE,
                                                S_SCHEDULE_TYPE = "WCS",
                                                N_PRIORITY = 10,
                                                T_START_TIME = DateTime.Now,
                                            };
                                            if (WCSHelper.CreateTask(kgzWcsTask))
                                            {
                                                // 起点、终点加锁
                                                LocationHelper.LockLoc(kgzWcsTask.S_START_LOC, 2);
                                                LocationHelper.LockLoc(kgzWcsTask.S_END_LOC, 1);
                                            }
                                        }
                                        else
                                        {
                                            WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                                            WMSHelper.addAlarmRecord("流程异常", "中", $"查询空工装货位错误,货位:{kgzStartLoc.S_CODE}没有空工装");
                                        }
                                    }
                                    else
                                    {
                                        WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                                        WMSHelper.addAlarmRecord("流程异常", "低", $"缓存区:{areaRelevance.hcAreaCode}没有空货位");
                                    }
                                }
                                // 更新作业任务状态
                                wmsTask.N_B_STATE = 1;
                                WMSHelper.UpdateTaskState(wmsTask);
                                // 5.作业创建完成后,读取中间表,更新中间表状态
                                if (mesTask != null)
                                {
                                    WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, mesTask.ID);
                                }
                                else
                                {
                                    ContainerHelper.UpdateCntrState(cntrNo, 1);
                                    WMSHelper.addRfidAnomalyRecord(cntrNo, 3, offLineLoc, null);
                                }
                            }
                        }
                        else
                        {
                            WMSHelper.DeleteWmsTask(wmsTask.S_CODE);
                            WMSHelper.addAlarmRecord("流程异常", "高", $"查询空工装货位错误,货位:{kgzStartLoc.S_CODE}没有空工装");
                            throw new BusinessException($"查询空工装货位错误,货位:{kgzStartLoc.S_CODE}没有空工装");
                            WMSHelper.addAlarmRecord("流程异常", "高", $"库区:{areaRelevance.areaCode}没有空余货位");
                            throw new BusinessException($"库区:{areaRelevance.areaCode}没有空余货位");
                        }
                    }
                    // 如是帘布直连模式则,提高满料入库优先级
                    if (logicConfig.S_TASK_TYPE == "2")
                    {
                        priority = 99;
                    }
                    else
                    {
                        priority = 10;
                    }
                    WCSTask wcsTask = new WCSTask()
                    {
                        S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                        S_OP_CODE = wmsTask.S_CODE,
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                        S_TYPE = wmsTask.S_TYPE,
                        S_START_LOC = startLoc.S_CODE,
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_LOC = endLoc.S_CODE,
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_SCHEDULE_TYPE = "WCS",
                        N_PRIORITY = priority,
                        T_START_TIME = DateTime.Now,
                    };
                    taskDic.Add(priority, wcsTask);
                    var tasks = taskDic.OrderByDescending(a => a.Key).Select(a => a.Value).ToList();
                    foreach (var task in tasks)
                    {
                        if (WCSHelper.CreateTask(task))
                        {
                            // 起点、终点加锁
                            LocationHelper.LockLoc(task.S_START_LOC, 2);
                            LocationHelper.LockLoc(task.S_END_LOC, 1);
                        }
                    }
                    // 更新作业任务状态
                    wmsTask.N_B_STATE = 1;
                    WMSHelper.UpdateTaskState(wmsTask);
                    // 5.作业创建完成后,读取中间表,更新中间表状态
                    if (mesTask != null)
                    {
                        WMSHelper.readLjMesOffItemTask(wmsTask.S_CODE, mesTask.ID);
                    }
                    else 
                    {
                        ContainerHelper.UpdateCntrState(cntrNo, 1);
                        WMSHelper.addRfidAnomalyRecord(cntrNo, 3, offLineLoc, null);
                        WMSHelper.addAlarmRecord("流程异常", "高", $"未配置下线库区:{startLoc.S_AREA_CODE}的关联关系");
                        throw new BusinessException($"未配置下线库区:{startLoc.S_AREA_CODE}的关联关系");
                    }
                }
                else
                {
                    WMSHelper.addAlarmRecord("流程异常", "中", $"下线位:{offLineLoc},没有在WMS系统中录入");
                    throw new BusinessException($"下线位:{offLineLoc},没有在WMS系统中录入");
                }
            }
            catch (BusinessException be) 
@@ -753,7 +644,7 @@
                    return responseResult;
                }
                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 , 2);
                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2 );
                if (middleLoc == null) {
                    WMSHelper.addAlarmRecord("流程异常", "高", $"MES叫料任务{mesTask.ID},立库接驳位可能处于锁定或禁用状态,请查看");
                    responseResult.code = 1;
@@ -1054,7 +945,7 @@
            Location endLoc = null;
            if (applyType == "1")
            {
                if (mst.S_TYPE == "余料/空工装入库")
                if (cst.S_TYPE.Contains("余料/空工装入库"))
                {
                    var bo = int.TryParse(mst.S_OP_DEF_CODE, out int mesId);
                    if (bo) 
@@ -1082,6 +973,7 @@
                if (applyType == "2")
                {
                    cst.S_TYPE = cst.S_TYPE + "【异常】";
                    mst.S_TYPE = mst.S_TYPE + "【异常】";
                    msg = "工装异常";
                }
@@ -1159,7 +1051,7 @@
                        wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                        if (wmsEndLoc != null)
                        {
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                            if (agvEndLoc != null)
                            {
                                LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV");
@@ -1178,6 +1070,7 @@
                                    S_SCHEDULE_TYPE = "WCS",
                                    N_PRIORITY = 10,
                                    N_B_STATE = -1,
                                    S_B_STATE = "预创建",
                                    T_START_TIME = DateTime.Now,
                                };
                                if (WCSHelper.CreateTask(wcsTask))
@@ -1235,7 +1128,7 @@
                        wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                        if (wmsEndLoc != null)
                        {
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                            agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                            if (agvEndLoc != null)
                            {
                                LogHelper.Info($"创建立库站台到立库的预创建任务,agv终点货位:{agvEndLoc.S_CODE},立库终点货位:{wmsEndLoc.S_CODE}", "AGV");
@@ -1246,7 +1139,7 @@
                                    S_OP_CODE = mst.S_CODE,
                                    S_CODE = WCSHelper.GenerateTaskNo(),
                                    S_CNTR_CODE = cst.S_CNTR_CODE,
                                    S_TYPE = cst.S_TYPE + "【异常】",
                                    S_TYPE = "异常工装入库",
                                    S_START_LOC = agvEndLoc.S_CODE,
                                    S_START_AREA = agvEndLoc.S_AREA_CODE,
                                    S_END_LOC = wmsEndLoc.S_CODE,
@@ -1297,15 +1190,7 @@
                    if (mst.S_TYPE.Contains("满料/异常工装入库任务") && cst.S_TYPE.Contains("空工装出库任务"))
                    {
                        LogHelper.Info($"满料/异常工装入库任务异常,再次发起满料/异常工装入库任务", "AGV");
                        var logicConfig = WMSHelper.getLogicConfigByJtCode(mesTask.EQP);
                        if (logicConfig != null)
                        {
                            triggerItemOffLineFlow4(mesTask.POSITION_ID, mst.S_CNTR_CODE, logicConfig, mesTask);
                        }
                        else
                        {
                            WMSHelper.addAlarmRecord("流程异常", "高", $"MES任务{mesTask.ID},机台号:{mesTask.EQP},未查询到逻辑线路", "AGV");
                        }
                        triggerItemOffLineFlow4(mesTask.POSITION_ID, mst.S_CNTR_CODE, mesTask);
                    }
                }
            }
@@ -1348,7 +1233,7 @@
                        if (locCntrRels.Count > 0)
                        {
                            cntrCode = locCntrRels[0].S_CNTR_CODE;
                            middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                            middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2);
                            if (middleLoc != null)
                            {
                                // 1.创建成新机叫料作业
@@ -1523,7 +1408,7 @@
                            Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP);
                            if (endLoc != null)
                            {
                                middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                                middleLoc = WMSHelper.GetMinTaskTransfeLoc(startLoc.S_AREA_CODE, 2);
                                if (middleLoc != null)
                                {
                                    // 1.创建成新机叫料作业
@@ -1710,54 +1595,35 @@
            // 斜裁立库
            if (mst.S_OP_DEF_NAME.Contains("斜裁"))
            {
                // TODO 反馈斜裁立库异常,请求斜裁入库终点
                agvEndLoc = null;
                // TODO 请求斜裁入库终点
                string locCode = "XCCRKZTKQ-1-1";
                agvEndLoc = LocationHelper.GetLoc(locCode);
                wmsEndLoc = agvEndLoc;
                if (agvEndLoc != null) 
                {
                    // 预先生成入库站台-立库终点的搬运任务
                    WCSTask wcsTask = new WCSTask()
                    var wmsTask = new WMSTask()
                    {
                        S_OP_NAME = mst.S_OP_DEF_NAME,
                        S_OP_CODE = mst.S_CODE,
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_CNTR_CODE = cst.S_CNTR_CODE,
                        S_TYPE = "不合格品入库任务",
                        S_CODE = WMSHelper.GenerateTaskNo(),
                        S_START_LOC = startLoc.S_CODE,
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_LOC = agvEndLoc.S_CODE,
                        S_END_AREA = agvEndLoc.S_AREA_CODE,
                        S_SCHEDULE_TYPE = "AGV",
                        N_PRIORITY = 10,
                        S_END_LOC = wmsEndLoc.S_CODE,
                        S_END_AREA = wmsEndLoc.S_AREA_CODE,
                        S_TYPE = "不合格品入库任务",
                        S_OP_DEF_NAME = "不合格品回库",
                        T_START_TIME = DateTime.Now,
                    };
                    if (WCSHelper.CreateTask(wcsTask))
                    {
                        // 起点、接驳点、终点加锁
                        LocationHelper.LockLoc(wcsTask.S_START_LOC, 1);
                        LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                    }
                }
            }
            else
            {
                Container container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                if (wmsEndLoc != null)
                {
                    agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1, 2);  // 1.立库接驳位 1.入库 2.非直连
                    if (agvEndLoc != null)
                    if (WMSHelper.CreateWmsTask(wmsTask))
                    {
                        // 预先生成入库站台-立库终点的搬运任务
                        WCSTask oneWcsTask = new WCSTask()
                        WCSTask wcsTask = new WCSTask()
                        {
                            S_OP_NAME = mst.S_OP_DEF_NAME,
                            S_OP_CODE = mst.S_CODE,
                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                            S_OP_CODE = wmsTask.S_CODE,
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = cst.S_CNTR_CODE,
                            S_TYPE = "不合格品入库任务",
                            S_TYPE = wmsTask.S_TYPE,
                            S_START_LOC = startLoc.S_CODE,
                            S_START_AREA = startLoc.S_AREA_CODE,
                            S_END_LOC = agvEndLoc.S_CODE,
@@ -1767,37 +1633,93 @@
                            T_START_TIME = DateTime.Now,
                        };
                        if (WCSHelper.CreateTask(oneWcsTask))
                        if (WCSHelper.CreateTask(wcsTask))
                        {
                            // 起点、接驳点、终点加锁
                            LocationHelper.LockLoc(oneWcsTask.S_START_LOC, 1);
                            LocationHelper.LockLoc(oneWcsTask.S_END_LOC, 1);
                        }
                            LocationHelper.LockLoc(wcsTask.S_START_LOC, 1);
                            LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                        // 预先生成入库站台-立库终点的搬运任务
                        WCSTask twoWcsTask = new WCSTask()
                            wmsTask.N_B_STATE = 1;
                            WMSHelper.UpdateTaskState(wmsTask);
                        }
                    }
                }
            }
            else
            {
                Container container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                wmsEndLoc = WMSHelper.getInStockEndLoc(null, container.N_DETAIL_COUNT == 0 ? 0 : 1, container.N_TYPE);
                if (wmsEndLoc != null)
                {
                    agvEndLoc = WMSHelper.GetMinTaskTransfeLoc(wmsEndLoc.S_AREA_CODE, 1);
                    if (agvEndLoc != null)
                    {
                        var wmsTask = new WMSTask()
                        {
                            S_OP_NAME = mst.S_OP_DEF_NAME,
                            S_OP_CODE = mst.S_CODE,
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = cst.S_CNTR_CODE,
                            S_TYPE = "不合格品入库任务",
                            S_START_LOC = agvEndLoc.S_CODE,
                            S_START_AREA = agvEndLoc.S_AREA_CODE,
                            S_CODE = WMSHelper.GenerateTaskNo(),
                            S_START_LOC = startLoc.S_CODE,
                            S_START_AREA = startLoc.S_AREA_CODE,
                            S_END_LOC = wmsEndLoc.S_CODE,
                            S_END_AREA = wmsEndLoc.S_AREA_CODE,
                            S_SCHEDULE_TYPE = "WCS",
                            N_PRIORITY = 10,
                            N_B_STATE = -1,
                            S_TYPE = "不合格品入库任务",
                            S_OP_DEF_NAME = "不合格品回库",
                            T_START_TIME = DateTime.Now,
                        };
                        if (WCSHelper.CreateTask(twoWcsTask))
                        if (WMSHelper.CreateWmsTask(wmsTask))
                        {
                            // 起点、接驳点、终点加锁
                            LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 1);
                            LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1);
                        }
                            // 预先生成入库站台-立库终点的搬运任务
                            WCSTask oneWcsTask = new WCSTask()
                            {
                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                S_OP_CODE = wmsTask.S_CODE,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = cst.S_CNTR_CODE,
                                S_TYPE = "不合格品入库任务",
                                S_START_LOC = startLoc.S_CODE,
                                S_START_AREA = startLoc.S_AREA_CODE,
                                S_END_LOC = agvEndLoc.S_CODE,
                                S_END_AREA = agvEndLoc.S_AREA_CODE,
                                S_SCHEDULE_TYPE = "AGV",
                                N_PRIORITY = 10,
                                T_START_TIME = DateTime.Now,
                            };
                            if (WCSHelper.CreateTask(oneWcsTask))
                            {
                                // 起点、接驳点、终点加锁
                                LocationHelper.LockLoc(oneWcsTask.S_START_LOC, 1);
                                LocationHelper.LockLoc(oneWcsTask.S_END_LOC, 1);
                            }
                            // 预先生成入库站台-立库终点的搬运任务
                            WCSTask twoWcsTask = new WCSTask()
                            {
                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                S_OP_CODE = wmsTask.S_CODE,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = cst.S_CNTR_CODE,
                                S_TYPE = "不合格品入库任务",
                                S_START_LOC = agvEndLoc.S_CODE,
                                S_START_AREA = agvEndLoc.S_AREA_CODE,
                                S_END_LOC = wmsEndLoc.S_CODE,
                                S_END_AREA = wmsEndLoc.S_AREA_CODE,
                                S_SCHEDULE_TYPE = "WCS",
                                N_PRIORITY = 10,
                                N_B_STATE = -1,
                                T_START_TIME = DateTime.Now,
                            };
                            if (WCSHelper.CreateTask(twoWcsTask))
                            {
                                // 起点、接驳点、终点加锁
                                LocationHelper.LockLoc(twoWcsTask.S_START_LOC, 1);
                                LocationHelper.LockLoc(twoWcsTask.S_END_LOC, 1);
                            }
                            wmsTask.N_B_STATE = 1;
                            WMSHelper.UpdateTaskState(wmsTask);
                        }
                    }
                }
@@ -2101,7 +2023,7 @@
            {
                var transfeRelevance = WMSHelper.GetTransfeRelevance(model.locCode);  // 接驳位属性
                LogHelper.Info($"原站台属性:{JsonConvert.SerializeObject(transfeRelevance)}", "WMS");
                if (transfeRelevance != null && transfeRelevance.N_PROPERTY == 2)
                if (transfeRelevance != null)
                {
                    if (model.signalType == "1")
                    {