From 08888ac4c294d6b290ec08d5507ec48da82380dc Mon Sep 17 00:00:00 2001 From: "yang.lee" Date: Thu, 30 Nov 2023 15:25:44 +0800 Subject: [PATCH] =?UTF-8?q?wms=E7=94=B5=E6=A2=AF=E8=AE=BE=E5=AE=9A?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=BC=80=E5=85=B3=E7=94=B5=E6=A2=AF?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dto/Inputs/CloseElevatorInput.cs | 15 ++++++ .../Entity/WmsDistaskH.cs | 4 +- .../IElevatorControlService.cs | 10 ++-- .../Tnb.WarehouseMgr/BaseWareHouseService.cs | 4 ++ .../Tnb.WarehouseMgr/DeviceProviderService.cs | 49 +++++++------------ .../ElevatorControlService.cs | 43 +++++++++++++++- .../Tnb.WarehouseMgr/Print/PPLBUtility.cs | 5 +- .../TimedTaskBackgroundService.cs | 25 +++++++--- .../Tnb.WarehouseMgr/WareHouseService.cs | 43 ++++++++++------ .../Tnb.WarehouseMgr/WmsDistaskService.cs | 1 + apihost/Tnb.API.Entry/Startup.cs | 17 +++++-- 11 files changed, 150 insertions(+), 66 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs new file mode 100644 index 00000000..a26991ce --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CloseElevatorInput.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CloseElevatorInput + { + public IEnumerable devNames { get; set; } + public int value { get; set; } + public string flag{ get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs index b6ef7fb4..62c5936b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsDistaskH.cs @@ -32,7 +32,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 起始楼层 /// - public string? start_floor { get; set; } + public int start_floor { get; set; } /// /// 目标库位ID @@ -42,7 +42,7 @@ public partial class WmsDistaskH : BaseEntity /// /// 目标楼层 /// - public string? end_floor { get; set; } + public int end_floor { get; set; } /// /// 起始点位ID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs index f42aacde..71d1b0b1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IElevatorControlService.cs @@ -1,4 +1,6 @@ -namespace Tnb.WarehouseMgr.Interfaces +using Tnb.WarehouseMgr.Entities.Dto.Inputs; + +namespace Tnb.WarehouseMgr.Interfaces { /// /// 电梯控制服务接口 @@ -31,10 +33,10 @@ /// 标签集合 /// 取消标志 /// 获取到的状态值 - Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable tags, CancellationToken token); + 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); + Task> GetELevatorStatusMap(string devName, IEnumerable tags, CancellationToken token); /// /// 检查Agv状态 /// @@ -61,5 +63,7 @@ /// Task CallLift(string devName, int floor, CancellationToken cancellationToken); + Task CloseElevatorControl(CloseElevatorInput input); + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index a51c8936..838ce1cb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -182,6 +182,10 @@ namespace Tnb.WarehouseMgr { 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 d1e943df..15b8b86f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -200,10 +200,8 @@ namespace Tnb.WarehouseMgr } } - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); - } catch (Exception ex) { @@ -223,53 +221,40 @@ namespace Tnb.WarehouseMgr try { Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}"); - /*switch (input.status) + switch (input.status) { case "CREATED": break; case "ALLOCATED": break; case "PROCESSING": - //if (await _cacheManager.GetAsync($"{input.taskChainCode}") == "任务链状态上报,上报状态PROCESSING") break; if (input.taskChainCode.Trim().IsNullOrEmpty()) { - break; + return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - TaskExecuteUpInput taskExecuteUpInput = new() + if (disTasks == null || disTasks.Count < 1) { - disTaskIds = disTasks.Select(x => x.id).ToList(), - EqpIds = eps.Select(x => x.id).ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); break; + Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); + } + if (disTasks?.Count > 0) + { + TaskExecuteUpInput taskExecuteUpInput = new() + { + disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), + }; + await _wareHouseService.TaskExecute(taskExecuteUpInput); + } + break; case "CANCELLED": break; case "SUCCEED": break; case "FAILURE": break; case "FINISHED": break; default: break; - }*/ - - - if (input.taskChainCode.Trim().IsNullOrEmpty()) - { - return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync(); - List eps = await _db.Queryable().Where(it => it.code.Contains(input.deviceID)).ToListAsync(); - if (disTasks == null || disTasks.Count < 1) - { - Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务"); - } - if (disTasks?.Count > 0) - { - TaskExecuteUpInput taskExecuteUpInput = new() - { - disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty().ToList(), - }; - await _wareHouseService.TaskExecute(taskExecuteUpInput); - } + + /*ConnectionConfigOptions opts = App.GetOptions(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index 9aefd605..2b42bb0c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -4,12 +4,14 @@ using DingTalk.Api.Request; using JNPF; using JNPF.Common.Extension; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json.Linq; using Tnb.Common.Extension; using Tnb.Common.Utils; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -24,11 +26,14 @@ namespace Tnb.WarehouseMgr private readonly BackgroundService _agvHeartbeatMonitor; private static readonly Dictionary> _fetchStartedStausValue = new(); private readonly bool isFrontDoorBit = false; //是否到前门位 + private readonly IServiceProvider _sp; + private readonly BackgroundService _backgudSvc; - public ElevatorControlService() + public ElevatorControlService(IServiceProvider sp, BackgroundService bgSvc) { _elevatorCtlCfg = App.Configuration.Build(); - //_agvHeartbeatMonitor = agvHeartbeatMonitorService; + _sp = sp; + _backgudSvc = bgSvc; } /// @@ -402,5 +407,39 @@ namespace Tnb.WarehouseMgr } return isSuccefuly; } + + private List> ParallelWriteTagAsync(CloseElevatorInput input) + { + var tasks = new List>(input.devNames.Count()); + foreach (var devName in input.devNames) + { + tasks.Add(WriteTagAsync(devName, ElevatorConsts.AGVControl, input.value)); + } + return tasks; + } + + public async Task CloseElevatorControl(CloseElevatorInput input) + { + if (input.devNames == null || !input.devNames.Any()) + { + throw new ArgumentNullException(nameof(input.devNames)); + } + var tasks = ParallelWriteTagAsync(input); + await Task.WhenAll(tasks); + var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; + if (timedTaskSvc != null) + { + if (input.flag.Equals("close", StringComparison.OrdinalIgnoreCase)) + { + _ = timedTaskSvc.CloseAgvHeartbeat(input.devNames); + } + else + { + _ = timedTaskSvc.OpenAgvHeartbeat(input.devNames); + } + } + } + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs index 1bc85611..5a78ace9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/Print/PPLBUtility.cs @@ -6,7 +6,8 @@ namespace Tnb.WarehouseMgr.Print { private const uint IMAGE_BITMAP = 0; private const uint LR_LOADFROMFILE = 16; - private static readonly string dllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPPLBDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\Winpplb.dll"); + private static readonly string winPortDllPath = Path.Combine(AppContext.BaseDirectory, @"Library\x64", "Library\\x64\\WinPort.dll"); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, @@ -490,7 +491,7 @@ namespace Tnb.WarehouseMgr.Print /// 注:经测试,type=1E 手机不能识别;type=1 手机可识别; /// 这个 B_Prn_Barcode 函数可以列印出一个指定类型的条码 功能。 /// - [DllImport("Library\\x64\\Winpplb.dll")] + [DllImport($"Library\\x64\\Winpplb.dll")] public static extern int B_Prn_Barcode(int x, int y, int ori, string type, int narrow, int width, int height, char human, string data); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index b1717e98..cc9cdacc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using Aop.Api.Domain; using JNPF; using JNPF.Common.Extension; using JNPF.Common.Security; @@ -26,24 +27,24 @@ namespace Tnb.WarehouseMgr private IEventPublisher _eventPublisher = default!; private readonly ElevatorControlConfiguration _elevatorControlConfiguration = App.Configuration.Build(); private readonly IServiceProvider _serviceProvider; + private readonly IHostApplicationLifetime _lifeTime; + private static List s_heartbeatDevNames = new(); //private static Dictionary> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase); - public TimedTaskBackgroundService(IServiceProvider serviceProvider) + public TimedTaskBackgroundService() { - _serviceProvider = serviceProvider; } protected override Task ExecuteAsync(CancellationToken stoppingToken) { IsStarted = true; - + s_heartbeatDevNames = _elevatorControlConfiguration.HeartbeatDevNames; Task timedTask = Task.Run(() => { _eventPublisher = App.GetRequiredService(); - //电梯Agv心跳检测 _ = TimedTask(async token => { - foreach (var devName in _elevatorControlConfiguration.HeartbeatDevNames) + foreach (var devName in s_heartbeatDevNames) { Dictionary parameter = new() { @@ -56,7 +57,7 @@ namespace Tnb.WarehouseMgr await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}"); } }, stoppingToken, 30); - + }); return timedTask; } @@ -144,6 +145,18 @@ namespace Tnb.WarehouseMgr return delayTask; } + public Task CloseAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.RemoveAll(x => devNames.Contains(x)); + return Task.CompletedTask; + } + + public Task OpenAgvHeartbeat(IEnumerable devNames) + { + s_heartbeatDevNames.AddRange(devNames); + return Task.CompletedTask; + } + } /// /// 自定义任务调度器,保证长任务在单独的线程中运行 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index e90b85b1..3742747a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -161,7 +161,7 @@ namespace Tnb.WarehouseMgr List items = new(); try { - WmsInstockPolicies policy = await _db.Queryable().Where(it => it.status == 1).FirstAsync(); + WmsInstockPolicies policy = await _db.CopyNew().Queryable().Where(it => it.status == 1).FirstAsync(); if (policy == null) { throw new AppFriendlyException("没有可用的策略", 500); @@ -173,7 +173,7 @@ namespace Tnb.WarehouseMgr .And(it => it.is_type == ((int)EnumLocationType.存储库位).ToString()) .And(it => it.is_use == ((int)EnumCarryStatus.空闲).ToString()) .ToExpression(); - items = await _db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -238,6 +238,7 @@ namespace Tnb.WarehouseMgr { //获取电梯数据 List elevatorList = await db.Queryable().InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => a.enabled == 1) .Select((a, b) => new WmsElevatorH { @@ -249,6 +250,7 @@ namespace Tnb.WarehouseMgr floor = b.floor }, true).ToListAsync(); + Logger.Information($"可用电梯信息:{elevatorList.Select(e => e.elevator_code)}"); //获取所有未下发的预任务申请 @@ -416,14 +418,14 @@ namespace Tnb.WarehouseMgr foreach (var at in agvDTTasks) { var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); - Logger.Information($"ele.elevator_id={ele?.elevator_id}"); + 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, string? start_floor)> endLocCodes = agvDTTasks + 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(); if (endLocCodes?.Count > 0) { @@ -475,13 +477,13 @@ namespace Tnb.WarehouseMgr /// /// /// - private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes) + private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes) { Logger.Information($" 开始呼梯操作............."); Logger.Information($"电梯信息:{JsonConvert.SerializeObject(s_elevatorMap)}"); try { - foreach ((_, string devId, string disTaskId, string floorNO) in endLocCodes) + foreach ((_, string devId, string disTaskId, int floorNO) in endLocCodes) { Logger.Information($"devId:{devId}"); if (!s_elevatorMap.TryGetValue(devId, out object? elevatorCode)) @@ -597,7 +599,7 @@ namespace Tnb.WarehouseMgr } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); - int floor = await GetRealFloor(disTask.end_floor.ParseToInt()); + int floor = await GetRealFloor(disTask.end_floor); Logger.Information($"目标楼层:{floor}"); @@ -608,7 +610,7 @@ namespace Tnb.WarehouseMgr do { - tuple = await _elevatorControlService.GetElevatorStatus(devName,tags, CancellationToken.None); + tuple = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); await Task.Delay(1000); } while (tuple.sysStatus != 3 && tuple.runStatus != 0); @@ -986,27 +988,38 @@ namespace Tnb.WarehouseMgr { List roads = await _db.Queryable().Where(it => it.status == 1).ToListAsync(); List points = await LocPathCalcAlgorithms(pStartId, pEndId, roads); + Logger.Information($"points:{string.Join(",", points.Select(p => p.point_code))}"); try { - if (points.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) + if (points?.FindAll(x => x.location_code != null && x.location_code.Contains("dt", StringComparison.OrdinalIgnoreCase))?.Count > 0) { + Logger.Information("包含电梯Agv任务"); //查询当前电梯点 - List curEleDs = await _db.Queryable().Where(it => points.Select(x => x.id).Contains(it.point_id)).ToListAsync(); + List curEleDs = await _db.Queryable().InnerJoin((a, b) => a.bill_id == b.id).Where((a, b) => points.Select(x => x.id).Contains(a.point_id)).ToListAsync(); + Logger.Information($"curEleDs==null :{curEleDs == null},curEleDs:{string.Join(",", curEleDs.Select(x => x.bill_id))}"); //如果有电梯点,则会进行电梯的均匀分配 if (curEleDs?.Count > 0) { //当前电梯 - WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id && it.enabled == 1); + WmsElevatorH curEle = await _db.Queryable().SingleAsync(it => it.id == curEleDs.First().bill_id); + Logger.Information($"curEle==null :{curEle == null}"); + //同电梯组电梯 List sGpEle = await _db.Queryable().Where(it => it.elevator_group == curEle.elevator_group && it.id != curEle.id && it.enabled == 1).ToListAsync(); - - if (curEle == null && sGpEle?.Count > 0) + if (curEle.enabled == 0 && (sGpEle == null || sGpEle.Count < 1)) { throw new AppFriendlyException("电梯被禁用或未配置", 500); } - + if ((sGpEle == null || sGpEle.Count < 1) && curEle.enabled == 1) + { + return points; + } + if (sGpEle?.Count > 0 && curEle.enabled == 0) + { + return points; + } //判断电梯组中各电梯任务数 - if (curEle == null || sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) + if (sGpEle.FindAll(x => Math.Abs(x.task_nums - curEle.task_nums) % 2 == 1)?.Count > 0) { List sGpDs = await _db.Queryable().Where(it => it.bill_id == sGpEle.First().id).ToListAsync(); if (sGpDs?.Count > 0) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs index 0127a490..a594fa26 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsDistaskService.cs @@ -31,6 +31,7 @@ namespace Tnb.WarehouseMgr preTask.status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID; _ = await _db.Updateable(preTask).UpdateColumns(it => it.status).ExecuteCommandAsync(); } + _ = await _db.Deleteable().Where(it => it.distask_id == id).ExecuteCommandAsync(); _ = await _db.Deleteable(disTask).ExecuteCommandAsync(); } diff --git a/apihost/Tnb.API.Entry/Startup.cs b/apihost/Tnb.API.Entry/Startup.cs index 049b470c..bc4afbe2 100644 --- a/apihost/Tnb.API.Entry/Startup.cs +++ b/apihost/Tnb.API.Entry/Startup.cs @@ -20,6 +20,7 @@ namespace JNPF.API.Entry; public class Startup : AppStartup { + //private TimedTaskBackgroundService timedTaskSvc = new(); public void ConfigureServices(IServiceCollection services) { // 注册和配置Mvc和api服务 @@ -48,7 +49,7 @@ public class Startup : AppStartup services.AddMemoryCache(); // 使用本地缓存必须添加 services.AddConfigurableOptions(); - services.AddSingleton( typeof(ISingleton), typeof(RedisData)); + services.AddSingleton(typeof(ISingleton), typeof(RedisData)); // 微信 services.AddSenparcGlobalServices(App.Configuration) // Senparc.CO2NET 全局注册 .AddSenparcWeixinServices(App.Configuration); // Senparc.Weixin 注册(如果使用Senparc.Weixin SDK则添加) @@ -56,15 +57,18 @@ public class Startup : AppStartup services.AddOverideVisualDev(); //定时任务 - services.AddHostedService(); - //services.AddHostedService(); + services.AddHostedService(); + services.AddSingleton(sp => new TimedTaskBackgroundService()); + //var bgSvc = App.GetRequiredService(); + //bgSvc.StartAsync(CancellationToken.None); + //services.AddHostedService(); } - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IOptions senparcSetting, IOptions senparcWeixinSetting, IHostApplicationLifetime lifeTime) { // 添加状态码拦截中间件 app.UseUnifyResultStatusCodes(); @@ -113,5 +117,10 @@ public class Startup : AppStartup bool isStartTimeJob = App.GetConfig("IsStartTimeJob"); if (isStartTimeJob) serviceProvider.GetRequiredService().StartTimerJob(); + + + + + } } \ No newline at end of file