diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index b1a35715..17cc6c79 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -1866,21 +1866,70 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { try { - List wmsDistaskHs = db_ElevatorTaskExceptionHandle.Queryable() + List elevatorTasks = db_ElevatorTaskExceptionHandle.Queryable() .Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null).ToList(); - LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{wmsDistaskHs.Count}条 {string.Join(',', wmsDistaskHs.Select(x => x.bill_code))}"); - foreach (WmsDistaskH wmsDistaskH in wmsDistaskHs) - { - ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskH.endlocation_id, taskCode = wmsDistaskH.bill_code }; + LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}"); - LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}"); - var e = await _wareHouseService.FindElevatorFromPars(q); - LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}"); - if (e == null) - continue; - wmsDistaskH.device_id = e.device_id; - await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskH); + + if (elevatorTasks?.Count > 0) + { + List> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList(); + foreach (IGrouping group in elevatorTaskGroup) + { + List wmsDistaskHs = group.ToList(); + ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code }; + LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}"); + var e = await _wareHouseService.FindElevatorFromPars(q); + LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}"); + + // 三、四号梯发货带两托货 + string[] doubleCarryRunElevators = + { + "Elevator3","Elevator4" + }; + if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1) + { + // 电梯内放置两托货呼叫电梯下 + if (group.Count() == 2) + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + wmsDistaskHs[1].device_id = e.device_id; + } + await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs); + } + // 一托货 + else if (group.Count() == 1) + { + // 如果当前电梯没有执行中的任务 则呼叫电梯下 + + if (db_ElevatorTaskExceptionHandle.Queryable().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID + && r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0) + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + } + await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs); + } + } + else + { + LoggerElevatorTask.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托"); + } + } + else + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + } + await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs); + } + + } } } catch (Exception ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs index 51b84b39..4eea13b3 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs @@ -11,7 +11,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// /// 单号 /// - public string? outsource_order { get; set; } + public string? transfer_order { get; set; } /// /// 联系人 @@ -23,6 +23,16 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// public string? tel { get; set; } + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + /// /// 出库组织编号 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs index f53d0e64..c5c735cd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockH.cs @@ -109,4 +109,14 @@ public partial class WmsRawmatTransferinstockH : BaseEntity /// public string? erp_bill_code { get; set; } + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs index 5a4b020b..edf8e70c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumTaskChainType.cs @@ -9,6 +9,6 @@ KIVA = 2, AGV = 3, 电梯 = 4, - 输送线 = 5, + 电梯载两托货 = 5, } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index e7c7ecf5..180542c7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -183,7 +183,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// /// - Task ExecuteTargetFloorTask(WmsDistaskH disTask); + Task ExecuteTargetFloorTask(List disTasks); Task FindElevatorFromPars(ElevagorInfoQuery input); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index 977a1e94..917e7118 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -52,6 +52,9 @@ namespace Tnb.WarehouseMgr public static SemaphoreSlim _s_taskExecuteSemaphore_YCLOutstock = new(1); + public static SemaphoreSlim _s_taskExecuteSemaphore_F1ZCCInstock = new(1); + public static SemaphoreSlim _s_taskExecuteSemaphore_F1ZCCOutstock = new(1); + protected static Dictionary _s_eleUseStatusDic; protected IEventPublisher? EventPublisher { set; get; } @@ -189,25 +192,49 @@ namespace Tnb.WarehouseMgr /// /// [NonAction] - protected Task GetRealFloor(int floor) + protected Task GetRealFloor(string elevator_code, int floor) { int realFloor = 0; - if (floor == 4) + + if (elevator_code == "Elevator1") { - realFloor = 5; + if (floor == 4) + { + realFloor = 6; + } + else if (floor == 3) + { + realFloor = 5; + } + else if (floor == 2) + { + realFloor = 4; + } + else if (floor == 1) + { + realFloor = 1; + } } - else if (floor == 3) + else { - realFloor = 4; - } - else if (floor == 2) - { - realFloor = 3; - } - else if(floor == 1) - { - realFloor = 1; + if (floor == 4) + { + realFloor = 5; + } + else if (floor == 3) + { + realFloor = 4; + } + else if (floor == 2) + { + realFloor = 3; + } + else if (floor == 1) + { + realFloor = 1; + } } + return Task.FromResult(realFloor); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 44a4019e..c35a16f6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -172,7 +172,7 @@ namespace Tnb.WarehouseMgr (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}"); { - var curFloor = await GetRealFloor(elevator.end_floor); + var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor); /* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); Logger.Information($"当前取货设备ID:{elevator.device_id}"); var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; @@ -368,7 +368,7 @@ namespace Tnb.WarehouseMgr Logger.Information($"【UnloadConfirm】 发送AGVControl 切换电梯{devName}控制模式结果 {JsonConvert.SerializeObject(res)}"); } - var curFloor = await GetRealFloor(elevator.end_floor); + var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor); Logger.Information($"【UnloadConfirm】 电梯状态 {s_eleUseStatusDic[elevator.device_id]} 当前楼层:{curFloor},电梯所在楼层:{floorNo}"); @@ -397,7 +397,11 @@ namespace Tnb.WarehouseMgr if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯 && doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲) { - await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.占用).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); + await _db.Updateable().SetColumns(r => new WmsElevatorH + { + is_use = (int)EnumElevatorUseStatus.占用, + use_tasks = $"','{ r.use_tasks }".Trim(',') + }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}"); return await ToApiResult(HttpStatusCode.OK, "成功"); @@ -698,14 +702,7 @@ namespace Tnb.WarehouseMgr { var disTask = await _db.Queryable().FirstAsync(it => it.bill_code == input.taskCode); - /* 20240627 记录异常情况: WCS给我们发取货完成信号之后,如果我们返回了异常 WCS会一直重试20次,但是AGV已经取货走了,并成功送到库位,此时会给我们反馈放货信号, - * 但是由于取货信号一直返回异常,WCS还是会一直重试,会出现我们收到到货信号后又会收到取货信号的异常情况,这里加个任务执行状态判断,用于避免这种情况 - */ - //if (disTask.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) - //{ - // return await ToApiResult(HttpStatusCode.OK, "此任务"); - //} - + Logger.Information($"【TaskCallback】 【接收】{input.taskCode} WCS信号 任务状态上报->接收参数:{JsonConvert.SerializeObject(input)}"); try { @@ -735,7 +732,11 @@ namespace Tnb.WarehouseMgr Logger.Information($"【TaskCallback】 根据任务单查找电梯结果 {JsonConvert.SerializeObject(elevator)}"); if (!elevator?.device_id.IsNullOrEmpty() ?? false) { - await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.空闲).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); + await _db.Updateable().SetColumns(r => new WmsElevatorH + { + is_use = (int)EnumElevatorUseStatus.空闲, + use_tasks = "" + }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; // 根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("") var devName = s_elevatorMap[elevator.device_id]?.ToString(); @@ -811,7 +812,7 @@ namespace Tnb.WarehouseMgr [HttpPost] - public async Task WmsElevatorUnlock(WmsElevatorUnlockInput input) + public async Task WmsElevatorUnlock(WmsElevatorUnlockInput input) { try { @@ -822,7 +823,11 @@ namespace Tnb.WarehouseMgr throw new Exception($"未找到电梯{input.elevator_code}的配置"); } Logger.Information($"【WmsElevatorUnlock】操作电梯{input.elevator_code}手动解锁"); - await _db.Updateable().SetColumns(r => r.is_use == (int)EnumElevatorUseStatus.空闲) + await _db.Updateable().SetColumns(r => new WmsElevatorH + { + is_use = (int)EnumElevatorUseStatus.空闲, + use_tasks = "" + }) .Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync(); s_eleUseStatusDic[wmsElevatorH.elevator_id] = (int)EnumElevatorUseStatus.空闲; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index fc3fe93a..029d0687 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -849,13 +849,15 @@ namespace Tnb.WarehouseMgr Code = await _billRuleService.GetBillNumber("WmsRawMatTransferInstock"); wmsRawmatTransferinstockH.bill_code = Code; - wmsRawmatTransferinstockH.erp_bill_code = input.outsource_order; + wmsRawmatTransferinstockH.erp_bill_code = input.transfer_order; wmsRawmatTransferinstockH.contact_person = input.contact_person; wmsRawmatTransferinstockH.tel = input.tel; wmsRawmatTransferinstockH.outstockorg_code = input.outstockorg_code; wmsRawmatTransferinstockH.erp_pk = input.erp_pk; wmsRawmatTransferinstockH.create_id = WmsWareHouseConst.ErpUserId; wmsRawmatTransferinstockH.create_time = DateTime.Now; + wmsRawmatTransferinstockH.dept_code = input.dept_code; + wmsRawmatTransferinstockH.biller = input.biller; await db.Insertable(wmsRawmatTransferinstockH).ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index d36b6cb1..56d97b43 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -56,6 +56,7 @@ using Tnb.WarehouseMgr.Interfaces; using static NPOI.HSSF.Util.HSSFColor; using Tnb.BasicData; using System.Reflection; +using NPOI.SS.Format; namespace Tnb.WarehouseMgr { @@ -98,6 +99,17 @@ namespace Tnb.WarehouseMgr get { return _s_taskExecuteSemaphore_YCLOutstock; } } + public SemaphoreSlim s_taskExecuteSemaphore_F1ZCCInstock + { + get { return _s_taskExecuteSemaphore_F1ZCCInstock; } + } + + public SemaphoreSlim s_taskExecuteSemaphore_F1ZCCOutstock + { + get { return _s_taskExecuteSemaphore_F1ZCCOutstock; } + } + + public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, StackExRedisHelper redisData, IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService, IWmsCarryBindService wmsCarryBindService, @@ -1014,6 +1026,7 @@ namespace Tnb.WarehouseMgr Logger.Information($"SsxControlLOAD:{JsonConvert.SerializeObject(dicCommand)}"); var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); Logger.Information($"SsxControlLOAD:{str}"); + Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}"); } } else if (action == "UNLOAD")//放货 @@ -1031,6 +1044,7 @@ namespace Tnb.WarehouseMgr Logger.Information($"SsxControlUNLOAD:{JsonConvert.SerializeObject(dicCommand)}"); var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); Logger.Information($"SsxControlUNLOAD:{str}"); + Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}"); } } @@ -1535,7 +1549,7 @@ namespace Tnb.WarehouseMgr var tags = _eleCtlCfg.tags; (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(e.elevator_code, tags, CancellationToken.None); Logger.Information($"【GenTaskExecute】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[e.device_id]}"); - var curFloor = await GetRealFloor(e.end_floor); + var curFloor = await GetRealFloor(e.elevator_code, e.end_floor); if (e != null && s_eleUseStatusDic[e.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { @@ -1569,18 +1583,60 @@ namespace Tnb.WarehouseMgr Logger.Information($"【GenTaskExecute】当前电梯任务数:{elevatorTasks?.Count ?? 0}"); if (elevatorTasks?.Count > 0) { - foreach (WmsDistaskH? elevatorTask in elevatorTasks) + List> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList(); + foreach (IGrouping group in elevatorTaskGroup) { - ElevagorInfoQuery q = new() { endlocation_id = elevatorTask.endlocation_id, taskCode = elevatorTask.bill_code}; + List wmsDistaskHs = group.ToList(); + ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code }; Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}"); var e = await FindElevatorFromPars(q); Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}"); - if (e != null) - { - elevatorTask.device_id = e.device_id; - } - _ = ExecuteTargetFloorTask(elevatorTask); + // 三、四号梯发货带两托货 + string[] doubleCarryRunElevators = new string[2] + { + "Elevator3","Elevator4" + }; + if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1) + { + // 电梯内放置两托货呼叫电梯下 + if (group.Count() == 2) + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + wmsDistaskHs[1].device_id = e.device_id; + } + _ = ExecuteTargetFloorTask(wmsDistaskHs); + } + // 一托货 + else if (group.Count() == 1) + { + // 如果当前电梯没有执行中的任务 则呼叫电梯下 + + if (_db.Queryable().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID + && r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0) + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + } + _ = ExecuteTargetFloorTask(wmsDistaskHs); + } + } + else + { + Logger.LogError($"电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托"); + } + } + else + { + if (e != null) + { + wmsDistaskHs[0].device_id = e.device_id; + } + _ = ExecuteTargetFloorTask(wmsDistaskHs); + } } } List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); @@ -2034,7 +2090,7 @@ namespace Tnb.WarehouseMgr Logger.Information($"【CallingLanding】 任务开始目标楼层为:{floorNO}"); - int floorN = await GetRealFloor(floorNO); + int floorN = await GetRealFloor(devName, floorNO); //如果电梯在当前楼层则不呼梯 if (floorN == eleStatusMulti.curFloorNo) { @@ -2092,10 +2148,12 @@ namespace Tnb.WarehouseMgr /// /// /// - public async Task ExecuteTargetFloorTask(WmsDistaskH disTask) + public async Task ExecuteTargetFloorTask(List disTasks) { //收到放货确认通知,向电梯发送到3楼的指令 - Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}"); + Logger.Information($"开始执行电梯任务,任务:{string.Join(",", disTasks.Select(r => r.bill_code))}"); + + var disTask = disTasks[0]; try { if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode)) @@ -2136,7 +2194,7 @@ namespace Tnb.WarehouseMgr } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); - int floor = await GetRealFloor(disTask.end_floor); + int floor = await GetRealFloor(devName, disTask.end_floor); //电梯任务手动执行任务状态上报 (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1); @@ -2158,8 +2216,7 @@ namespace Tnb.WarehouseMgr if (tuple.sysStatus.ToEnum() == EnumSysStatus.正常状态 && tuple.runStatus.ToEnum() == EnumRunStatus.停梯) { Logger.Information($"disTask.require_id={disTask.require_id}"); - List disTaskIds = new() { disTask.id }; - var upInput = new { disTaskIds = disTask.id }; + List disTaskIds = new() { disTasks[0].id, disTasks[1].id }; TaskExecuteAfterUpInput teaUpInput = new() { disTaskIds = disTaskIds, @@ -2200,6 +2257,13 @@ namespace Tnb.WarehouseMgr //floor2.Add("AS02"); //floor2.Add("AX01"); //floor2.Add("AX02"); + + // 三、四号梯发货带两托货 + string[] doubleCarryRunElevators = + { + "29815764588053","29815767573013" + }; + //调用AGV创建任务链接口 try { @@ -2222,24 +2286,31 @@ namespace Tnb.WarehouseMgr foreach ((string k, object v) in taskChainCodeDic) { - var typeflag = false; var dis = disTasks.Where(p => p.groups == k).First(); + + dynamic reqBody = new ExpandoObject(); + reqBody.taskChainCode = k; + reqBody.type = (int)EnumTaskChainType.AGV; + + if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code) //|| floor2.Contains(dis.startlocation_code) || floor2.Contains(dis.endlocation_code) ) { - typeflag = true; + reqBody.type = (int)EnumTaskChainType.KIVA; } // 如果管理区是E(二楼暂存仓和二楼缓存仓) 统一发KIVA if (dis.area_code == "E") { - typeflag = true; + reqBody.type = (int)EnumTaskChainType.KIVA; } - dynamic reqBody = new ExpandoObject(); - reqBody.taskChainCode = k; - reqBody.type = typeflag ? (int)EnumTaskChainType.KIVA : (int)EnumTaskChainType.AGV; + // 三四号电梯出货 + if (doubleCarryRunElevators.Contains(dis.device_id) && dis.end_floor == 1) + { + reqBody.type = (int)EnumTaskChainType.电梯载两托货; + } // 原材料仓使用优先级 if (dis.area_code == "A") @@ -3226,6 +3297,9 @@ namespace Tnb.WarehouseMgr BasLocation startLocation = null; int index = 0; + + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); + await _db.Ado.BeginTranAsync(); foreach (WmsCarryD wmsCarryD in wmsCarryCodes) { @@ -3316,6 +3390,7 @@ namespace Tnb.WarehouseMgr } finally { + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); s_floor2CreatePretask.Release(); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs index 39295b61..c1c8d476 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs @@ -68,6 +68,10 @@ namespace Tnb.WarehouseMgr } public async Task WmsEmptyIn(VisualDevModelDataCrInput input) { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); + } try { await _db.Ado.BeginTranAsync(); @@ -217,6 +221,10 @@ namespace Tnb.WarehouseMgr } finally { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); + } //向队列写入消息 await InvokeGenPretaskExcute(); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index 0dc25481..aface6f8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -65,7 +65,10 @@ namespace Tnb.WarehouseMgr public async Task WmsEmptyOut(VisualDevModelDataCrInput input) { - + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); + } try { await _db.Ado.BeginTranAsync(); @@ -257,6 +260,10 @@ namespace Tnb.WarehouseMgr } finally { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); + } await InvokeGenPretaskExcute(); } return Task.FromResult(true); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 94f7b913..101b9668 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -468,7 +468,7 @@ namespace Tnb.WarehouseMgr } }); - await s_taskDistributeYCL2ZCC.WaitAsync(); + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); @@ -561,7 +561,7 @@ namespace Tnb.WarehouseMgr } finally { - _ = s_taskDistributeYCL2ZCC.Release(); + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); InvokeGenPretaskExcute(); } @@ -1111,7 +1111,7 @@ namespace Tnb.WarehouseMgr [HttpPost, NonUnify, AllowAnonymous] public async Task DistributeToZCC(MaterialTransferDistributeToZCCInput input) { - s_taskDistributeToZCC.Wait(); + await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); try { @@ -1239,7 +1239,7 @@ namespace Tnb.WarehouseMgr } finally { - s_taskDistributeToZCC.Release(); + _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); InvokeGenPretaskExcute(); } return await ToApiResult(HttpStatusCode.OK, "成功"); @@ -1254,7 +1254,7 @@ namespace Tnb.WarehouseMgr [HttpPost, NonUnify, AllowAnonymous] public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input) { - s_taskDistributeZCCToYCL.Wait(); + await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); try { @@ -1375,7 +1375,7 @@ namespace Tnb.WarehouseMgr } finally { - s_taskDistributeZCCToYCL.Release(); + _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); ; InvokeGenPretaskExcute(); } return await ToApiResult(HttpStatusCode.OK, "成功"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs index 387af090..1b46ef5e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyInstockService.cs @@ -57,7 +57,10 @@ namespace Tnb.WarehouseMgr private async Task PDAWmsEmptyIn(VisualDevModelDataCrInput input) { - + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); + } try { await _db.Ado.BeginTranAsync(); @@ -178,6 +181,10 @@ namespace Tnb.WarehouseMgr } finally { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); + } await InvokeGenPretaskExcute(); } return Task.FromResult(true); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs index 8a95534d..1c580d87 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs @@ -59,6 +59,10 @@ namespace Tnb.WarehouseMgr private async Task PDAWmsEmptyOut(VisualDevModelDataCrInput input) { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); + } try { Logger.Information("开始PDA空载具出库"); @@ -231,6 +235,10 @@ namespace Tnb.WarehouseMgr } finally { + if (input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString() == WmsWareHouseConst.WAREHOUSE_ZC_ID) + { + _s_taskExecuteSemaphore_F1ZCCOutstock.Release(); + } await InvokeGenPretaskExcute(); } return Task.FromResult(true); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs index 4868a0e2..43ac200e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs @@ -60,6 +60,8 @@ namespace Tnb.WarehouseMgr var db = _db; if (dbConn != null) db = dbConn; + + string type = ""; try { await db.Ado.BeginTranAsync(); @@ -67,7 +69,6 @@ namespace Tnb.WarehouseMgr WmsPrdInstockH prdInstockH = db.Queryable().Where(r => r.prd_bill_code == input.prd_bill_code).First(); string prd_instock_code_id = ""; - string type = ""; // 新建主表 if (prdInstockH == null) { @@ -142,6 +143,19 @@ namespace Tnb.WarehouseMgr await db.Insertable(WmsPrdInstockCodes).ExecuteCommandAsync(); + if (type == "25019163616533") + { + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); + } + else if (type == "25019172714005") + { + await _s_taskExecuteSemaphore_F1ZCCInstock.WaitAsync(); + } + else if (type == "25019191681045") + { + + } + foreach (WmsPrdInstockD wmsPrdInstockD in WmsPrdInstockDs) { //入库取终点 @@ -275,6 +289,19 @@ namespace Tnb.WarehouseMgr } finally { + if (type == "25019163616533") + { + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); + } + else if (type == "25019172714005") + { + _s_taskExecuteSemaphore_F1ZCCInstock.Release(); + } + else if (type == "25019191681045") + { + + } + _wareHouseService.GenTaskExecute(); }