取消定时服务发布订阅模式改为存时间轮询方式

This commit is contained in:
alex
2023-10-10 13:23:38 +08:00
parent 1cfc9e25e5
commit ab9608aec2
6 changed files with 54 additions and 44 deletions

View File

@@ -275,19 +275,19 @@ namespace Tnb.WarehouseMgr
var pars = new Dictionary<string, string>(); var pars = new Dictionary<string, string>();
pars["DevName"] = devName; pars["DevName"] = devName;
pars["Pos"] = "1"; pars["Pos"] = "1";
pars["Count"] = "4"; pars["Count"] = "11";
pars["token"] = _elevatorCtlCfg.token; pars["token"] = _elevatorCtlCfg.token;
var url = _elevatorCtlCfg.GetTagListUrl; var url = _elevatorCtlCfg.GetTagListUrl;
var systemInfo = await HttpClientHelper.GetAsync(url, pars: pars); var systemInfo = await HttpClientHelper.GetAsync(url, pars: pars);
var jo = JObject.Parse(systemInfo); var jo = JObject.Parse(systemInfo);
var objs = jo["Items"].Values<JObject>().ToList(); var objs = jo["Items"].Values<JObject>().ToList();
if (objs?.Count == 4) //if (objs?.Count == 4)
{ {
if (objs[0].Value<string>("Name").Equals("SysStatus") if (objs[0].Value<string>("Name").Equals("SysStatus")
&& objs[1].Value<string>("Name").Equals("RunStatus") && objs[1].Value<string>("Name").Equals("RunStatus")
&& objs[3].Value<string>("Name").Equals("FloorNo")) && objs[3].Value<string>("Name").Equals("FloorNo"))
{ {
multi = (objs[0].Value<int>("V"), objs[1].Value<int>("V"), objs[3].Value<int>("V"), objs[2].Value<int>("V"), objs[10].Value<int>("V")); multi = (objs[0].Value<int>("V"), objs[1].Value<int>("V"), objs[3].Value<int>("V"), objs[2].Value<int>("V"), objs[9].Value<int>("V"));
} }
} }
return multi; return multi;
@@ -334,7 +334,7 @@ namespace Tnb.WarehouseMgr
await SendOpenCloseCmd(devName, (int)EnumAgvControl.); await SendOpenCloseCmd(devName, (int)EnumAgvControl.);
} }
var result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到4楼 var result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到4楼
if (!result.IsNullOrEmpty()) if (!string.IsNullOrEmpty(result))
{ {
JObject jo = JObject.Parse(result); JObject jo = JObject.Parse(result);
isSuccefuly = jo?.Value<string>("Result").Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false; isSuccefuly = jo?.Value<string>("Result").Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false;

View File

@@ -46,13 +46,13 @@ namespace Tnb.WarehouseMgr
private static Dictionary<string, Func<CancellationToken?, Task>> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase); private static Dictionary<string, Func<CancellationToken?, Task>> _timedFuncMap = new(StringComparer.OrdinalIgnoreCase);
static TimedTaskBackgroundService() static TimedTaskBackgroundService()
{ {
Task.Run(() => //Task.Run(() =>
{ //{
_timedFuncMap = App.EffectiveTypes.AsParallel().Where(t => !t.Namespace.IsNullOrWhiteSpace() && t.Namespace.Equals("Tnb.WarehouseMgr", StringComparison.OrdinalIgnoreCase)).SelectMany(t => t.GetMethods()) // _timedFuncMap = App.EffectiveTypes.AsParallel().Where(t => !t.Namespace.IsNullOrWhiteSpace() && t.Namespace.Equals("Tnb.WarehouseMgr", StringComparison.OrdinalIgnoreCase)).SelectMany(t => t.GetMethods())
.Where(m => m.GetCustomAttribute<TimedAttribute>() != null) // .Where(m => m.GetCustomAttribute<TimedAttribute>() != null)
.ToDictionary(x => x.Name, x => // .ToDictionary(x => x.Name, x =>
(Func<CancellationToken?, Task>)Delegate.CreateDelegate(typeof(Func<CancellationToken?, Task>), App.GetService(x.DeclaringType), x)); // (Func<CancellationToken?, Task>)Delegate.CreateDelegate(typeof(Func<CancellationToken?, Task>), App.GetService(x.DeclaringType), x));
}); //});
} }
public TimedTaskBackgroundService(IServiceProvider serviceProvider) public TimedTaskBackgroundService(IServiceProvider serviceProvider)
{ {
@@ -62,42 +62,44 @@ namespace Tnb.WarehouseMgr
protected override Task ExecuteAsync(CancellationToken stoppingToken) protected override Task ExecuteAsync(CancellationToken stoppingToken)
{ {
IsStarted = true; IsStarted = true;
var queueTask = Task.Run(async () => //var queueTask = Task.Run(async () =>
{ // {
var channelReader = _serviceProvider.GetRequiredService<ITaskMessageNotify>().Reader; // var channelReader = _serviceProvider.GetRequiredService<ITaskMessageNotify>().Reader;
CancellationTokenSource? cts = new(); // CancellationTokenSource? cts = new();
while (channelReader != null && await channelReader.WaitToReadAsync()) // while (channelReader != null && await channelReader.WaitToReadAsync())
{ // {
while (channelReader.TryRead(out var message)) // while (channelReader.TryRead(out var message))
{ // {
if (_timedFuncMap.ContainsKey(message.TaskName)) // if (_timedFuncMap.ContainsKey(message.TaskName))
{ // {
await _timedFuncMap[message.TaskName].Invoke(stoppingToken); // await _timedFuncMap[message.TaskName].Invoke(stoppingToken);
} // }
} // }
} // }
}, stoppingToken); // }, stoppingToken);
var timedTask = Task.Run(() => var timedTask = Task.Run(() =>
{ {
_eventPublisher = App.GetRequiredService<IEventPublisher>(); _eventPublisher = App.GetRequiredService<IEventPublisher>();
var whSvc = App.GetRequiredService<IWareHouseService>();
TimedTask(token => whSvc.GenTaskExecute(token), stoppingToken, 3);
//齐套出库 //齐套出库
var kittingOutService = App.GetRequiredService<IWmskittingOutService>(); var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1); TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 3);
TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1); TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 3);
//齐套分拣 //齐套分拣
var setSortingService = App.GetRequiredService<IWmsSetSortingService>(); var setSortingService = App.GetRequiredService<IWmsSetSortingService>();
TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 1); TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 3);
//最低库存检查 //最低库存检查
var transferSignService = App.GetRequiredService<IWmsPDATransferSignService>(); var transferSignService = App.GetRequiredService<IWmsPDATransferSignService>();
TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes); TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes);
}, stoppingToken); }, stoppingToken);
return Task.WhenAll(queueTask, timedTask); return timedTask;
} }

View File

@@ -17,6 +17,7 @@ using JNPF.Systems.Interfaces.System;
using Mapster; using Mapster;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json; using Newtonsoft.Json;
//using NPOI.SS.Formula.Functions; //using NPOI.SS.Formula.Functions;
using SqlSugar; using SqlSugar;
@@ -47,6 +48,7 @@ namespace Tnb.WarehouseMgr
private readonly ICacheManager _cacheManager; private readonly ICacheManager _cacheManager;
private readonly IElevatorControlService _elevatorControlService; private readonly IElevatorControlService _elevatorControlService;
private static Dictionary<string, object> _elevatorMap = new Dictionary<string, object>(); private static Dictionary<string, object> _elevatorMap = new Dictionary<string, object>();
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
public Func<string, Task> AddUnExecuteTask { get; set; } public Func<string, Task> AddUnExecuteTask { get; set; }
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService, public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService,
@@ -224,10 +226,10 @@ namespace Tnb.WarehouseMgr
var db = _db.CopyNew(); var db = _db.CopyNew();
try try
{ {
if (_elevatorMap.Count < 1) //if (_elevatorMap.Count < 1)
{ //{
_elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code); // _elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
} //}
//获取所有未下发的预任务申请 //获取所有未下发的预任务申请
var preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) var preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id) .InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
@@ -385,9 +387,9 @@ namespace Tnb.WarehouseMgr
try try
{ {
var item = endLocCodes.FirstOrDefault(); var item = endLocCodes.FirstOrDefault();
if (_elevatorMap.ContainsKey(item.device_id)) //if (_elevatorMap.ContainsKey(item.device_id))
var devName = _eleCtlCfg.DevName;
{ {
var devName = _elevatorMap[item.device_id].ToString();
var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl); var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl);
//判断当前设备是否为运行状态不是则进入Agv电梯控制状态 //判断当前设备是否为运行状态不是则进入Agv电梯控制状态
if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态) if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
@@ -403,16 +405,15 @@ namespace Tnb.WarehouseMgr
{ {
distask_id = disTaskId, distask_id = disTaskId,
elevator_id = devId, elevator_id = devId,
elevator_code = _elevatorMap[devId].ToString(), elevator_code = devName,
floor = floorN, //5代表4楼 floor = floorN, //5代表4楼
task_status = "待执行", task_status = "待执行",
create_id = _userManager.UserId, create_id = _userManager.UserId,
create_time = DateTime.Now create_time = DateTime.Now
}; };
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync(); var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync();
if (_elevatorMap.ContainsKey(devId) && (elevatorQueue.IsNull() || elevatorQueue.Count < 1)) if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1))
{ {
var devName = _elevatorMap[devId].ToString();
elevatorQueueItem.task_status = "执行中"; elevatorQueueItem.task_status = "执行中";
await _elevatorControlService.CallLift(devName, 5, CancellationToken.None); await _elevatorControlService.CallLift(devName, 5, CancellationToken.None);
@@ -485,6 +486,8 @@ namespace Tnb.WarehouseMgr
tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, CancellationToken.None); tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, CancellationToken.None);
} while (tuple.sysStatus != 3 && tuple.runStatus != 0 && tuple.floorNo != disTask.end_floor.ParseToInt()); } while (tuple.sysStatus != 3 && tuple.runStatus != 0 && tuple.floorNo != disTask.end_floor.ParseToInt());
Log.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo}");
if (tuple.sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && tuple.runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus. if (tuple.sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && tuple.runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.
&& tuple.floorNo == disTask.end_floor.ParseToInt()) && tuple.floorNo == disTask.end_floor.ParseToInt())
{ {

View File

@@ -12,6 +12,7 @@ using JNPF.Common.Security;
using JNPF.DependencyInjection; using JNPF.DependencyInjection;
using JNPF.DynamicApiController; using JNPF.DynamicApiController;
using JNPF.FriendlyException; using JNPF.FriendlyException;
using JNPF.Logging;
using JNPF.Systems.Interfaces.System; using JNPF.Systems.Interfaces.System;
using JNPF.VisualDev; using JNPF.VisualDev;
using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Entitys;
@@ -135,10 +136,14 @@ namespace Tnb.WarehouseMgr
var sPoint = it.FirstOrDefault(); var sPoint = it.FirstOrDefault();
var ePoint = it.LastOrDefault(); var ePoint = it.LastOrDefault();
Log.Information("ePoint?.point_code="+ ePoint?.point_code);
WmsPretaskH preTask = new(); WmsPretaskH preTask = new();
preTask.org_id = _userManager.User.OrganizeId; preTask.org_id = _userManager.User.OrganizeId;
preTask.startlocation_id = sPoint?.location_id!; preTask.startlocation_id = sPoint?.location_id!;
preTask.startlocation_code = sPoint?.location_code!; preTask.startlocation_code = sPoint?.location_code!;
preTask.startpoint_code = sPoint?.point_code;
preTask.endpoint_code = ePoint?.point_code;
preTask.endlocation_id = ePoint?.location_id!; preTask.endlocation_id = ePoint?.location_id!;
preTask.endlocation_code = ePoint?.location_code!; preTask.endlocation_code = ePoint?.location_code!;
preTask.start_floor = sPoint?.floor.ToString(); preTask.start_floor = sPoint?.floor.ToString();

View File

@@ -68,7 +68,7 @@ public class Startup : AppStartup
//定时任务 //定时任务
services.AddHostedService<TimedTaskBackgroundService>(); services.AddHostedService<TimedTaskBackgroundService>();
//Agv心跳监听服务 //Agv心跳监听服务
services.AddAgvHeartbeatMonitor(); services.AddHostedService<AgvHeartbeatMonitorService>();
//services.AddHostedService<TimedTaskBackgroundService>(); //services.AddHostedService<TimedTaskBackgroundService>();
} }

View File

@@ -294,7 +294,7 @@ public class OAuthService : IDynamicApiController, ITransient
var userId = _userManager.UserId; var userId = _userManager.UserId;
//modify by ly on 20230918 登录成功后启动定时服务 //modify by ly on 20230918 登录成功后启动定时服务
if (!userId.IsNullOrWhiteSpace()) /*if (!userId.IsNullOrWhiteSpace())
{ {
if (!_fetchPropValue.TryGetValue("IsStarted", out var action)) if (!_fetchPropValue.TryGetValue("IsStarted", out var action))
@@ -317,7 +317,7 @@ public class OAuthService : IDynamicApiController, ITransient
{ {
} }
} }
} }*/
var loginOutput = new CurrentUserOutput(); var loginOutput = new CurrentUserOutput();
loginOutput.userInfo = await _userManager.GetUserInfo(); loginOutput.userInfo = await _userManager.GetUserInfo();
@@ -419,10 +419,10 @@ public class OAuthService : IDynamicApiController, ITransient
public async Task Logout([FromQuery] string ticket) public async Task Logout([FromQuery] string ticket)
{ {
//modify by ly on 20230918 //modify by ly on 20230918
stopTimedTaskSvcCTS ??= new(); /* stopTimedTaskSvcCTS ??= new();
await _backgroundService.StopAsync(stopTimedTaskSvcCTS.Token); await _backgroundService.StopAsync(stopTimedTaskSvcCTS.Token);
stopTimedTaskSvcCTS.Cancel(); stopTimedTaskSvcCTS.Cancel();
//stopTimedTaskSvcCTS.Dispose(); */ //stopTimedTaskSvcCTS.Dispose();
UserManager.AsscessToken = string.Empty; UserManager.AsscessToken = string.Empty;