diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index ae168134..2ec8664b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Aliyun.OSS; using JNPF; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; @@ -276,15 +277,36 @@ namespace Tnb.WarehouseMgr if (elevatorQueueItem != null) { var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id); - if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) + //if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) { var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus); if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持) { await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令 } - //发送到3楼的指令 - var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, 4); + var floor = disTask.end_floor.ParseToInt(); + if (floor == 4) + floor = 5; + else if (floor == 3) + floor = 4; + else if (floor == 2) + floor = 3; + //发送到目标楼的指令 + CancellationTokenSource cts = new(); + var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor); + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1); + await Task.Run(async () => + { + do + { + tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, cts.Token); + } while (tuple.sysStatus != 3 && tuple.runStatus != 0 && tuple.floorNo != disTask.end_floor.ParseToInt()); + + }, cts.Token); + + if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 && +agvStatus.ToEnum() != EnumAgvStatus.AGV运行状态 && floorNo != 4) + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 0b81f967..9b62c128 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -340,11 +340,21 @@ namespace Tnb.WarehouseMgr //呼梯操作 //获取目标库位为电梯库位的任务 - var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList(); + var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList(); if (endLocCodes?.Count > 0) { await CallingLanding(endLocCodes); } + //执行电梯任务 + var elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + if (elevatorTasks?.Count > 0) + { + foreach (var elevatorTask in elevatorTasks) + { + await ExecuteTargetFloorTask(elevatorTask); + } + + } ////调用AGV创建任务链接口 await AgvDispatch(disTasks, agvCts.Token); @@ -370,7 +380,7 @@ namespace Tnb.WarehouseMgr /// /// /// - private async Task CallingLanding(List<(string endlocation_code, string device_id, string id)> endLocCodes) + private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes) { try { @@ -386,14 +396,15 @@ namespace Tnb.WarehouseMgr } } { - foreach (var (_, devId, disTaskId) in endLocCodes) + foreach (var (_, devId, disTaskId, floorNO) in endLocCodes) { + var floorN = await GetRealFloor(floorNO.ParseToInt()); WmsElevatorUnexecute elevatorQueueItem = new() { distask_id = disTaskId, elevator_id = devId, elevator_code = _elevatorMap[devId].ToString(), - floor = 5, //5代表4楼 + floor = floorN, //5代表4楼 task_status = "待执行", create_id = _userManager.UserId, create_time = DateTime.Now @@ -420,6 +431,78 @@ namespace Tnb.WarehouseMgr } } /// + /// 根据当前目标楼层获取,电梯接口真正的楼层 + /// + /// + /// + private Task GetRealFloor(int floor) + { + var realFloor = 0; + if (floor == 4) + { + realFloor = 5; + } + else if (floor == 3) + { + realFloor = 4; + } + else if (floor == 2) + { + realFloor = 3; + } + return Task.FromResult(realFloor); + } + /// + /// 执行到目标楼层电梯任务 + /// + /// + /// + private async Task ExecuteTargetFloorTask(WmsDistaskH disTask) + { + //收到放货确认通知,向电梯发送到3楼的指令 + try + { + var elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTask.id == it.distask_id && it.task_status == "执行中"); + if (elevatorQueueItem != null) + { + //var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id); + //if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) + { + var doorStatus = -1; + await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令 + do + { + doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus); + } while (doorStatus != 4); + var floor = await GetRealFloor(disTask.end_floor.ParseToInt()); + //发送到目标楼的指令 + var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor); + //电梯任务手动执行任务状态上报 + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1); + + do + { + tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, CancellationToken.None); + } while (tuple.sysStatus != 3 && tuple.runStatus != 0 && tuple.floorNo != disTask.end_floor.ParseToInt()); + + if (tuple.sysStatus.ToEnum() == EnumSysStatus.正常状态 && tuple.runStatus.ToEnum() == EnumRunStatus.停梯 + && tuple.floorNo == disTask.end_floor.ParseToInt()) + { + dynamic input = new ExpandoObject(); + input.disTaskIds = new List { disTask.id }; + await TaskExecuteAfter(input); + await TaskComplate(input); + } + } + } + } + catch (Exception ex) + { + Log.Error("执行到目标楼层电梯任务失败", ex); + throw; + } + } + /// /// Agv调度 /// ///