From ce2fc1b29b2e1d00ae6e0d75ca23fb50fb7d681c Mon Sep 17 00:00:00 2001 From: "yang.lee" Date: Mon, 27 Nov 2023 15:01:48 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B5=E6=A2=AFAgv=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Configs/ElevatorControlConfiguration.cs | 4 + .../IElevatorControlService.cs | 2 + .../Tnb.WarehouseMgr/DeviceProviderService.cs | 3 +- .../ElevatorControlService.cs | 21 +++- .../TimedTaskBackgroundService.cs | 117 +++++++----------- .../Tnb.WarehouseMgr/WareHouseService.cs | 2 - .../WmsPurchaseAndSaleCommonService.cs | 3 +- .../ElevatorControlSettings.json | 1 + apihost/Tnb.API.Entry/Startup.cs | 2 + 9 files changed, 80 insertions(+), 75 deletions(-) diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs index 32689bf4..0b9f0528 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs @@ -10,6 +10,10 @@ /// 4#梯设备名称 /// public string DevName4 { get; set; } + /// + /// 心跳检测设备名称集合 + /// + public List HeartbeatDevNames { get; set; } public string token { get; set; } /// /// 获取设备标签列表url diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs index 8e6cff4a..f42aacde 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs @@ -33,6 +33,8 @@ /// 获取到的状态值 Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable tags, CancellationToken token); + + Task> GetELevatorStatusMap(string devName,IEnumerable tags, CancellationToken token); /// /// 检查Agv状态 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 40430005..86a60422 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -222,7 +222,7 @@ namespace Tnb.WarehouseMgr { try { - Logger.Information($"任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); + Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); /*switch (input.status) { case "CREATED": break; @@ -318,6 +318,7 @@ namespace Tnb.WarehouseMgr { disTaskIds = disTasks.Select(x => x.id).ToList() }; + Logger.Information($"设备取返回输入参数:{JsonConvert.SerializeObject(taskExecuteAfterUpInput)}"); await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput); Logger.Information($"Agv取货完成,任务Id:{string.Join(",", disTasks.Select(x => x.id))}"); WmsElevatorUnexecute elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index f19b7cfc..7a54fecc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Dynamic; +using DingTalk.Api.Request; using JNPF; using JNPF.Common.Extension; using Microsoft.AspNetCore.Mvc; @@ -324,11 +325,29 @@ namespace Tnb.WarehouseMgr } } } - return (sysStatus: sysStatus, runStatus: runStatus, floorNo: floorNo, doorStatus: doorStatus, agvStatus: agvStatus); + return (sysStatus, runStatus, floorNo, doorStatus, agvStatus); } + public async Task> GetELevatorStatusMap(string devName, IEnumerable tags, CancellationToken token) + { + Task GetTag(string tag) + { + var dicCommand = new Dictionary + { + ["DevName"] = devName, + ["token"] = _elevatorCtlCfg.token, + ["TagName"] = tag + }; + return HttpClientHelper.GetAsync(_elevatorCtlCfg.GetTagUrl, pars: dicCommand); + } + + var tasks = tags.Select(tag => GetTag(tag)); + var results = await Task.WhenAll(tasks); + var statusMap = results?.Select(x => JObject.Parse(x)).ToDictionary(x => x.Value("Name"), x => x.Value("V")) ?? default; + return statusMap; + } /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index 8c8a275b..b1717e98 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -10,6 +10,7 @@ using NPOI.OpenXmlFormats.Dml.Diagram; using Tnb.Common.Extension; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities.Configs; +using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Entities.Exceptions; @@ -42,43 +43,21 @@ namespace Tnb.WarehouseMgr //电梯Agv心跳检测 _ = TimedTask(async token => { - Dictionary parameter = new() + foreach (var devName in _elevatorControlConfiguration.HeartbeatDevNames) { - ["DevName"] = _elevatorControlConfiguration.DevName3, - ["TagName"] = "AGVKeepalive", - ["Value"] = "123", - ["token"] = _elevatorControlConfiguration.token - }; - string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); - await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName3.Match(@"\d+")}#梯, 心跳检测结果:{result}"); - }, stoppingToken, 30, TimeSpanUnit.Seconds); - _ = TimedTask(async token => - { - Dictionary parameter = new() - { - ["DevName"] = _elevatorControlConfiguration.DevName4, - ["TagName"] = "AGVKeepalive", - ["Value"] = "123", - ["token"] = _elevatorControlConfiguration.token - }; - string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); - await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName4.Match(@"\d+")}#梯,心跳检测结果:{result}"); - }, stoppingToken, 30, TimeSpanUnit.Seconds); - ////齐套出库 - /*var kittingOutService = App.GetRequiredService(); - TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1); - TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1); - //齐套分拣 - var setSortingService = App.GetRequiredService(); - TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 2); - + Dictionary parameter = new() + { + ["DevName"] = devName, + ["TagName"] = ElevatorConsts.AGVKeepalive, + ["Value"] = "123", + ["token"] = _elevatorControlConfiguration.token + }; + string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); + await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}"); + } + }, stoppingToken, 30); - //最低库存检查 - var transferSignService = App.GetRequiredService(); - TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes);*/ - - }, stoppingToken); - + }); return timedTask; } @@ -86,14 +65,42 @@ namespace Tnb.WarehouseMgr private Task TimedTask(Func action, CancellationToken ct, int interval, TimeSpanUnit timeType = TimeSpanUnit.Seconds) { - CancellationToken token = ct; - return Task.Factory.StartNew(async () => + // CancellationToken token = ct; + // return Task.Factory.StartNew(async () => + // { + // while (!token.IsCancellationRequested) + // { + // await action(ct).Catch(async ex => + // { + + // if (ex is TimedTaskException timedTaskEx and not null) + // { + // await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity + // { + // Id = SnowflakeIdHelper.NextId(), + // Category = 4, + // UserId = timedTaskEx.UserId, + // UserName = timedTaskEx.UserName, + // IPAddress = NetHelper.Ip, + // RequestURL = timedTaskEx.RequestURL, + // RequestMethod = timedTaskEx.RequestMethod, + // Json = timedTaskEx + "\n" + timedTaskEx.InnerException?.StackTrace + "\n" + timedTaskEx?.TargetSite?.GetParameters().ToString(), + // //PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue), + // CreatorTime = DateTime.Now + // })); + // } + // }); + // await TaskDelay(timeType, interval); + // } + // }, ct, TaskCreationOptions.None, new CustomerTaskScheduler()); + + return Task.Run(async () => { - while (!token.IsCancellationRequested) + while (!ct.IsCancellationRequested) { + await action(ct).Catch(async ex => { - if (ex is TimedTaskException timedTaskEx and not null) { await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity @@ -113,37 +120,7 @@ namespace Tnb.WarehouseMgr }); await TaskDelay(timeType, interval); } - }, ct, TaskCreationOptions.None, new CustomerTaskScheduler()); - - #region ThreadPool 线程运行会导致线程饥饿 - //return Task.Run(async () => - //{ - // while (!token.IsCancellationRequested) - // { - - // await action(cts).Catch(async ex => - // { - // if (ex is TimedTaskException timedTaskEx and not null) - // { - // await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity - // { - // Id = SnowflakeIdHelper.NextId(), - // Category = 4, - // UserId = timedTaskEx.UserId, - // UserName = timedTaskEx.UserName, - // IPAddress = NetHelper.Ip, - // RequestURL = timedTaskEx.RequestURL, - // RequestMethod = timedTaskEx.RequestMethod, - // Json = timedTaskEx + "\n" + timedTaskEx.InnerException?.StackTrace + "\n" + timedTaskEx?.TargetSite?.GetParameters().ToString(), - // //PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue), - // CreatorTime = DateTime.Now - // })); - // } - // }); - // await TaskDelay(timeType, interval); - // } - //}, token); - #endregion + }, ct); } public override Task StopAsync(CancellationToken cancellationToken) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 1c8b1275..b4519d93 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -838,9 +838,7 @@ namespace Tnb.WarehouseMgr { upInput.loginType = "web"; }*/ - Logger.Information("loginType赋值前"); upInput.loginType = "web";//(!string.IsNullOrEmpty(_userManager?.LoginType) ? "app" : "web") ?? "web"; - Logger.Information($"upInput.loginType={upInput.loginType}"); if (dt.is_sign == 1 && dt.chain_type == "3") { Logger.Information("执行业务回更操作....."); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs index 9ec854e7..eaef030d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseAndSaleCommonService.cs @@ -111,7 +111,8 @@ namespace Tnb.WarehouseMgr { if (s_materialMap.Count == 0) { - s_materialMap = await _db.Queryable().ToDictionaryAsync(x => x.id, x => x.name); + //物料+规格型号+批次+箱号 + //s_materialMap = await _db.Queryable().ToDictionaryAsync(x => $"{}{}{}{}", x => x.name); } var list = await _db.Queryable().Where(it => it.bill_id == pkId) .Mapper(it => it.material_name = s_materialMap.ContainsKey(it.material_id) ? s_materialMap[it.material_id]?.ToString() ?? "" : "") diff --git a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json index fb0a3e53..80c31cd7 100644 --- a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json +++ b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json @@ -1,6 +1,7 @@ { "DevName3": "Elevator3", "DevName4": "Elevator4", + "HeartbeatDevNames": [ "Elevator3", "Elevator4" ], "token": "780BE4144636CF47DDF3920B0F1D069B", "GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList", "GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag", diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 1efe0fb4..2196fe41 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -58,6 +58,8 @@ public class Startup : AppStartup //定时任务 services.AddHostedService(); //services.AddHostedService(); + + }