diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs index 43dd3ebe..b89a6fb9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs @@ -1,5 +1,8 @@ using System.Text; using JNPF; +using JNPF.Common.Extension; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using SqlSugar; using Tnb.WarehouseMgr.Entities; @@ -16,6 +19,7 @@ namespace Tnb.WarehouseMgr private static SqlSugarScope context; private readonly ISqlSugarClient _db; public static Dictionary s_eleUseStatusDic = new(); + public static Dictionary s_loadedStatusDic = new(); static DevServBase() { @@ -55,16 +59,28 @@ namespace Tnb.WarehouseMgr /// endlocation_id:目标库位ID /// /// + protected async Task FindElevatorFromPars(ElevagorInfoQuery input) { + var whereExpable = Expressionable.Create() + .And((a, b, c) => a.enabled == 1); + if (!input.taskCode.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode); + } + if (!input.endlocation_id.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => b.location_id == input.endlocation_id); + } + if (!input.startlocation_id.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id); + } var ele = await _db.CopyNew().Queryable().InnerJoin((a, b) => a.id == b.bill_id) - .InnerJoin((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startpoint_code) - .Where((a, b, c) => a.enabled == 1) - .WhereIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode) - .WhereIF(!SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => b.location_id == input.endlocation_id) - .WhereIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id) + .InnerJoin((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code) + .Where(whereExpable.ToExpression()) .WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName) - .WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-C", input.sourceName), (a, b, c) => c.endpoint_code == input.sourceName) + //.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-C", input.sourceName), (a, b, c) => c.endpoint_code == input.sourceName) .Select((a, b, c) => new WmsElevatorH { bill_code = c.bill_code, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 564c2194..9b738213 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -45,7 +45,8 @@ namespace Tnb.WarehouseMgr private readonly IElevatorControlService _elevatorControlService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private readonly ILoggerFactory _loggerFactory; - + private static bool unLoadComplete = true; //是否放货完成 + @@ -67,6 +68,7 @@ namespace Tnb.WarehouseMgr foreach (var (k, _) in s_elevatorMap) { s_eleUseStatusDic[k] = 0; + s_loadedStatusDic[k] = 0; } } } @@ -109,7 +111,7 @@ namespace Tnb.WarehouseMgr .FirstAsync();*/ Logger.Information($"当前取货,子任务编号:{input.taskCode}"); - ElevagorInfoQuery q = new() { taskCode = input.taskCode }; + ElevagorInfoQuery q = new() { taskCode = input.taskCode, sourceName = input.sourceName }; WmsElevatorH elevator = await FindElevatorFromPars(q); if (elevator.IsNull()) { @@ -121,7 +123,7 @@ namespace Tnb.WarehouseMgr { if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { - s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; + //s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; string devName = elevatorCode?.ToString(); Logger.Information($"获取设备:{devName},状态"); var tags = _eleCtlCfg.tags; @@ -134,9 +136,9 @@ namespace Tnb.WarehouseMgr var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}"); */ - if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) + if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 &&curFloor != floorNo) { - _ = await _elevatorControlService.CallLift(devName, elevator.end_floor, CancellationToken.None); + _ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None); } if (curFloor != floorNo) { @@ -178,6 +180,7 @@ namespace Tnb.WarehouseMgr { Logger.Information("放货确认.................."); Logger.Information($"当前放货,任务编号:{input.taskCode}"); + try { /*var whereExp = Expressionable.Create() @@ -197,7 +200,7 @@ namespace Tnb.WarehouseMgr device_id = a.elevator_id, }, true) .FirstAsync();*/ - ElevagorInfoQuery q = new() { taskCode = input.taskCode }; + ElevagorInfoQuery q = new() { taskCode = input.taskCode, sourceName = input.sourceName }; WmsElevatorH elevator = await FindElevatorFromPars(q); if (elevator.IsNull()) { @@ -205,8 +208,14 @@ namespace Tnb.WarehouseMgr } if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { + string devName = elevatorCode?.ToString(); + + Logger.Information($"当前放货设备ID:{elevator.device_id}"); + var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "占用" : "空闲"; + Logger.Information($"{devName.Match(@"\d+")}#梯,状态-> {loadedStatus}"); Logger.Information($"获取设备:{devName},状态"); + //await Task.Delay(3000); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, _eleCtlCfg.tags, CancellationToken.None);//elevator.elevator_code Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}"); //判断Agv电梯是否进入状态 @@ -216,19 +225,22 @@ namespace Tnb.WarehouseMgr } var curFloor = await GetRealFloor(elevator.end_floor); - Logger.Information($"当前放货设备ID:{elevator.device_id}"); - var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "占用" : "空闲"; - Logger.Information($"{devName.Match(@"\d+")}#梯,状态-> {loadedStatus}"); + + if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { - _ = await _elevatorControlService.CallLift(devName, elevator.end_floor, CancellationToken.None); + _ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None); } if (curFloor != floorNo) { return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } + Logger.Information($"当前楼层:{curFloor},电梯所在楼层:{floorNo}"); + + + if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) { Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成"); @@ -241,7 +253,7 @@ namespace Tnb.WarehouseMgr } if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯 - && doorStatus == (int)EnumDoorStatus.开门到位保持) + && doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲) { s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; Logger.Information($"当前电梯状态:{s_eleUseStatusDic[elevator.device_id].ToEnum().ToString()}"); @@ -298,7 +310,9 @@ namespace Tnb.WarehouseMgr case "CANCELLED": break; case "SUCCEED": break; case "FAILURE": break; - case "FINISHED": break; + case "FINISHED": + + break; default: break; } @@ -351,7 +365,7 @@ namespace Tnb.WarehouseMgr List disTasks = new() { disTask }; if (input.action == "LOAD") { - + unLoadComplete = true; TaskExecuteAfterUpInput taskExecuteAfterUpInput = new() { disTaskIds = disTasks.Select(x => x.id).ToList() @@ -360,27 +374,33 @@ namespace Tnb.WarehouseMgr await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput); Logger.Information($"Agv取货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}"); - - if (disTask != null && !disTask.startlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)) - { - return await ToApiResult(HttpStatusCode.OK, "成功"); - } //根据Agv传递的参数获取,对应的电梯 - ElevagorInfoQuery q = new() { taskCode = input.taskCode }; - WmsElevatorH elevator = await FindElevatorFromPars(q); - //s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; - Logger.Information($"当前取货设备ID:{elevator.device_id}"); - //根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("") - var devName = s_elevatorMap[elevator.device_id]?.ToString(); - Logger.Information($"{devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程"); - int doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus); - Logger.Information($"设备:{devName},门状态:{doorStatus.ToEnum().ToString()}"); - if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持 - && !disTask.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) - ) + + if(!input.sourceName.IsNullOrWhiteSpace() && input.sourceName.Contains("DT-R", StringComparison.OrdinalIgnoreCase)) { - _ = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令 + ElevagorInfoQuery q = new() { taskCode = input.taskCode }; + if (!input.sourceName.IsNullOrEmpty()) + { + q = new() { taskCode = input.taskCode, sourceName = input.sourceName }; + } + WmsElevatorH elevator = await FindElevatorFromPars(q); + if (!elevator?.device_id.IsNullOrEmpty() ?? false) + { + s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; + // 根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("") + var devName = s_elevatorMap[elevator.device_id]?.ToString(); + Logger.Information($"{devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程"); + int doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus); + Logger.Information($"设备:{devName},门状态:{doorStatus.ToEnum().ToString()}"); + if (doorStatus.ToEnum() != EnumDoorStatus.关门到位保持 + )//&& !disTask.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) + { + _ = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令 + } + } } + + WmsElevatorUnexecute elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中"); if (elevatorQueueItem != null) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index de5d1395..3a54605b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -272,7 +272,7 @@ namespace Tnb.WarehouseMgr try { //一楼中储仓CTU - CTUTaskExecute(db); + //CTUTaskExecute(db); @@ -317,9 +317,9 @@ namespace Tnb.WarehouseMgr var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); var normalPreTasks = preTasks.Where(it => !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList(); - IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); +/* IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; - +*/ //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index 019c898d..ebe4e82b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -171,7 +171,7 @@ namespace Tnb.WarehouseMgr { preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 } - isOk = await _wareHouseService.GenPreTask(preTasks, null!); + isOk = await _wareHouseService.GenPreTask(preTasks, null!); } if (isOk) { @@ -213,14 +213,16 @@ namespace Tnb.WarehouseMgr } } } - else { + else + { throw new AppFriendlyException("没有匹配的空载具可以出库", 500); } - + await _db.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { + Logger.Information($"空载具出库错误", ex); await _db.Ado.RollbackTranAsync(); throw; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs index d9984fcc..02e57e70 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs @@ -115,20 +115,39 @@ namespace Tnb.WarehouseMgr return Task.FromResult(_configuration["TestLocation"]); } - public async Task GetElevatorByBillCode(ElevagorInfoQuery input) + [AllowAnonymous,HttpPost] + public async Task ElevatorByBillCode([FromBody]ElevagorInfoQuery input) { + var whereExpable = Expressionable.Create() + .And((a, b, c) => a.enabled == 1); + if (!input.taskCode.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode); + } + if (!input.endlocation_id.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => b.location_id == input.endlocation_id); + } + if (!input.startlocation_id.IsNullOrEmpty()) + { + whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id); + } var ele = await _db.CopyNew().Queryable().InnerJoin((a, b) => a.id == b.bill_id) - .InnerJoin((a, b, c) => b.location_code == c.endlocation_code) - .WhereIF(SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode) - .WhereIF(SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => c.endlocation_id == input.endlocation_id) - .Select((a, b, c) => new WmsElevatorH { bill_code = c.bill_code, device_id = a.elevator_id }, true) + .InnerJoin((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code) + .Where(whereExpable.ToExpression()) + .WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName) + .WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-C", input.sourceName), (a, b, c) => c.endpoint_code == input.sourceName) + .Select((a, b, c) => new WmsElevatorH + { + bill_code = c.bill_code, + device_id = a.elevator_id, + end_floor = c.end_floor + }, true) .FirstAsync(); - //_db.Aop.OnLogExecuting = (sql, args) => - //{ - // var q = sql; - // Console.WriteLine("sql stat:" + sql); - //}; + return ele; } + + } }