From 89e7f0dd5027cf2d5d5afdc2234fd08533d58c94 Mon Sep 17 00:00:00 2001 From: "yang.lee" Date: Wed, 13 Dec 2023 14:05:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A9=BA=E8=BD=BD=E5=85=B7=E5=85=A5=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E8=8E=B7=E5=8F=96=E7=9B=AE=E6=A0=87=E5=BA=93=E4=BD=8D?= =?UTF-8?q?=E9=9B=86=E5=90=88=E4=BB=A3=E7=A0=81=E8=BF=98=E5=8E=9F=EF=BC=8C?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E6=B5=8B=E8=AF=95CTU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dto/Queries/ElevagorInfoQuery.cs | 2 + .../Entity/WmsElevatorH.cs | 2 +- .../Tnb.WarehouseMgr/DevServBase`1.cs | 7 ++- .../Tnb.WarehouseMgr/DeviceProviderService.cs | 36 ++++++----- .../ElevatorControlService.cs | 3 +- .../Tnb.WarehouseMgr/WareHouseService.cs | 61 ++++++++++--------- .../WmsEmptyInstockService.cs | 4 +- 7 files changed, 65 insertions(+), 50 deletions(-) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs index 5f709c6d..d69dfd80 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs @@ -10,5 +10,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Queries { public string taskCode { get; set; } public string endlocation_id { get; set; } + public string startlocation_id { get; set; } + public string sourceName { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs index 83c7b068..e7edca99 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs @@ -23,7 +23,7 @@ public partial class WmsElevatorH : BaseEntity /// 电梯ID /// public string elevator_id { get; set; } = string.Empty; - + /// /// 电梯编号 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs index c20a445d..43dd3ebe 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs @@ -15,6 +15,7 @@ namespace Tnb.WarehouseMgr private static readonly Lazy initializationTask; private static SqlSugarScope context; private readonly ISqlSugarClient _db; + public static Dictionary s_eleUseStatusDic = new(); static DevServBase() { @@ -57,9 +58,13 @@ namespace Tnb.WarehouseMgr protected async Task FindElevatorFromPars(ElevagorInfoQuery input) { var ele = await _db.CopyNew().Queryable().InnerJoin((a, b) => a.id == b.bill_id) - .InnerJoin((a, b, c) => b.location_code == c.endlocation_code) + .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) + .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, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 521b78dc..564c2194 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -45,7 +45,7 @@ namespace Tnb.WarehouseMgr private readonly IElevatorControlService _elevatorControlService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private readonly ILoggerFactory _loggerFactory; - public static Dictionary s_eleUseStatusDic = new(); + @@ -108,30 +108,32 @@ namespace Tnb.WarehouseMgr }, true) .FirstAsync();*/ Logger.Information($"当前取货,子任务编号:{input.taskCode}"); - ElevagorInfoQuery q = new() { taskCode =input.taskCode }; + + ElevagorInfoQuery q = new() { taskCode = input.taskCode }; WmsElevatorH elevator = await FindElevatorFromPars(q); if (elevator.IsNull()) { Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务")); return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"); } + try { if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { + s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; string devName = elevatorCode?.ToString(); Logger.Information($"获取设备:{devName},状态"); var tags = _eleCtlCfg.tags; - await Task.Delay(1000); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo}"); { var curFloor = await GetRealFloor(elevator.end_floor); - Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); - Logger.Information($"当前放货设备ID:{elevator.device_id}"); - var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; - Logger.Information($"{devName.Match(@"\d+")}#梯,放货-> {loadedStatus}"); - + /* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); + 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); @@ -144,10 +146,11 @@ namespace Tnb.WarehouseMgr { _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } - if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) - { - await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); - } + //if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) + //{ + // Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成"); + // await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); + //} if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 && doorStatus == (int)EnumDoorStatus.开门到位保持) @@ -204,7 +207,6 @@ namespace Tnb.WarehouseMgr { string devName = elevatorCode?.ToString(); Logger.Information($"获取设备:{devName},状态"); - await Task.Delay(1000); (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电梯是否进入状态 @@ -229,10 +231,11 @@ namespace Tnb.WarehouseMgr Logger.Information($"当前楼层:{curFloor},电梯所在楼层:{floorNo}"); if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) { - await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); + Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成"); + return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } //电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态 - if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货 + if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货 { _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } @@ -241,6 +244,7 @@ namespace Tnb.WarehouseMgr && doorStatus == (int)EnumDoorStatus.开门到位保持) { s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; + Logger.Information($"当前电梯状态:{s_eleUseStatusDic[elevator.device_id].ToEnum().ToString()}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } } @@ -364,7 +368,7 @@ namespace Tnb.WarehouseMgr //根据Agv传递的参数获取,对应的电梯 ElevagorInfoQuery q = new() { taskCode = input.taskCode }; WmsElevatorH elevator = await FindElevatorFromPars(q); - s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; + //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(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index b2d76469..591832b1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -197,11 +197,9 @@ namespace Tnb.WarehouseMgr ["TagName"] = "DoorExecute", ["Value"] = value.ToString() }; - var eleStatusMap = await RedisHelper.HGetAllAsync(devName); try { _ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand); - //flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value); } catch (Exception) { @@ -488,6 +486,7 @@ namespace Tnb.WarehouseMgr } var tasks = ParallelWriteTagAsync(input); var writeRes = await Task.WhenAll(tasks); + var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; if (timedTaskSvc != null) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 40f67d91..cb2ed0b2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using System.Dynamic; using System.Linq.Expressions; +using Aliyun.OSS; using JNPF; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; @@ -233,7 +234,7 @@ namespace Tnb.WarehouseMgr /// 判断CTU是否可以放货 /// /// - [HttpPost] + /*[HttpPost] public async Task CheckPut(CheckPutInput input) { Dictionary dic = new Dictionary(); @@ -252,7 +253,7 @@ namespace Tnb.WarehouseMgr bool result = res != null && res["Value"] != null ? res.Value("Value") : false; if (!result) throw new AppFriendlyException("点位" + input.point_code + "不可放", 500); - } + }*/ /// /// 生成任务执行 @@ -438,25 +439,9 @@ namespace Tnb.WarehouseMgr var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - foreach (var task in agvDTTasks) - { - ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id }; - var e = await FindElevatorFromPars(q); - if (e != null) - { - task.device_id = e.device_id; - } - } + await SetEleDevId(agvDTTasks); - /*foreach (var at in agvDTTasks) - { - var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); - Logger.Information($"ele.elevator_id:{ele?.elevator_id},elevator_code:{ele?.elevator_code}"); - if (ele != null) - { - at.device_id = ele.elevator_id; - } - }*/ + List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); @@ -466,7 +451,7 @@ namespace Tnb.WarehouseMgr { if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) { - Logger.Information("呼梯操作"); + Logger.Information($"呼梯操作"); _ = CallingLanding(endLocCodes); } else @@ -482,6 +467,7 @@ namespace Tnb.WarehouseMgr if (elevatorTasks?.Count > 0) { Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}"); + await SetEleDevId(elevatorTasks); foreach (WmsDistaskH? elevatorTask in elevatorTasks) { _ = ExecuteTargetFloorTask(elevatorTask); @@ -496,6 +482,19 @@ namespace Tnb.WarehouseMgr } } } + + async Task SetEleDevId(List distaskList) + { + foreach (var task in distaskList) + { + ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id }; + var e = await FindElevatorFromPars(q); + if (e != null) + { + task.device_id = e.device_id; + } + } + } } catch (Exception ex) when (ex is HttpRequestException hReqEx) { @@ -606,16 +605,16 @@ namespace Tnb.WarehouseMgr private async Task ExecuteTargetFloorTask(WmsDistaskH disTask) { //收到放货确认通知,向电梯发送到3楼的指令 - Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}"); + Logger.Information($"开始执行电梯任务,任务ID:{disTask.id},设备ID:{disTask.device_id}"); try { if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode)) { return; } - string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3; + string devName = elevatorCode?.ToString(); - Logger.Information($"当前:{devName.Match(@"\d+")}#梯"); + Logger.Information($"当前设备{devName},{devName.Match(@"\d+")}#梯"); var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; (int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); @@ -623,8 +622,9 @@ namespace Tnb.WarehouseMgr { _ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); } + Logger.Information($"电梯当前状态->系统状态:{eleStatusMulti.sysStatus.ToEnum()},运行状态:{eleStatusMulti.runStatus.ToEnum().ToString()},门状态:{eleStatusMulti.doorStatus.ToEnum().ToString()},Agv状态:{eleStatusMulti.agvStatus.ToEnum().ToString()},当前楼层:{eleStatusMulti.curFloorNo}"); - if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) + if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.device_id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) { do { @@ -632,7 +632,7 @@ namespace Tnb.WarehouseMgr await Task.Delay(1000); } while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态); Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum()}"); - _elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus; + _elevatorAgvCtlStatusMap[disTask.device_id] = eleStatusMulti.agvStatus; } int doorStatus = -1; @@ -641,6 +641,7 @@ namespace Tnb.WarehouseMgr do { doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus); + Logger.Information($"关门结果:{closeDoorRes}"); await Task.Delay(1000); } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); @@ -824,9 +825,13 @@ namespace Tnb.WarehouseMgr _ = await _db.Updateable().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync(); //更新电梯任务数量 - var eles = await _db.Queryable().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync(); + var areaCodes = disTasks.Select(x => x.area_code).ToList(); + var eles = await _db.Queryable().Where(it => areaCodes.Contains(it.area_code)).ToListAsync(); if (eles?.Count > 0) - await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync(); + { + eles.ForEach(x => x.task_nums--); + await _db.Updateable(eles).UpdateColumns(it=>it.task_nums).ExecuteCommandAsync(); + } //更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs index 5bc60bf4..b997d297 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs @@ -76,8 +76,8 @@ namespace Tnb.WarehouseMgr //入库取终点 InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 }; //test - BasLocation llll = await _db.Queryable().FirstAsync(it=>it.location_code == _configuration["TestLocation"]); - List endLocations = new() { llll }; //await _wareHouseService.InStockStrategy(inStockStrategyInput); + BasLocation llll = await _db.Queryable().FirstAsync(it => it.location_code == _configuration["TestLocation"]); + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); //new() { llll }; WmsPointH? sPoint = null; WmsPointH? ePoint = null; if (input.data.ContainsKey(nameof(WmsPointH.location_id)))