电梯Agv心跳代码调整
This commit is contained in:
@@ -10,6 +10,10 @@
|
|||||||
/// 4#梯设备名称
|
/// 4#梯设备名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string DevName4 { get; set; }
|
public string DevName4 { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 心跳检测设备名称集合
|
||||||
|
/// </summary>
|
||||||
|
public List<string> HeartbeatDevNames { get; set; }
|
||||||
public string token { get; set; }
|
public string token { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取设备标签列表url
|
/// 获取设备标签列表url
|
||||||
|
|||||||
@@ -33,6 +33,8 @@
|
|||||||
/// <returns>获取到的状态值</returns>
|
/// <returns>获取到的状态值</returns>
|
||||||
Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable<string> tags, CancellationToken token);
|
Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable<string> tags, CancellationToken token);
|
||||||
|
|
||||||
|
|
||||||
|
Task<Dictionary<string,int>> GetELevatorStatusMap(string devName,IEnumerable<string> tags, CancellationToken token);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查Agv状态
|
/// 检查Agv状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Logger.Information($"任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
Logger.Information($"任务链上报->任务链编号:{input.taskChainCode},状态:{input.status},设备ID:{input.deviceID}");
|
||||||
/*switch (input.status)
|
/*switch (input.status)
|
||||||
{
|
{
|
||||||
case "CREATED": break;
|
case "CREATED": break;
|
||||||
@@ -318,6 +318,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||||
};
|
};
|
||||||
|
Logger.Information($"设备取返回输入参数:{JsonConvert.SerializeObject(taskExecuteAfterUpInput)}");
|
||||||
await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput);
|
await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput);
|
||||||
Logger.Information($"Agv取货完成,任务Id:{string.Join(",", disTasks.Select(x => x.id))}");
|
Logger.Information($"Agv取货完成,任务Id:{string.Join(",", disTasks.Select(x => x.id))}");
|
||||||
WmsElevatorUnexecute elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
|
WmsElevatorUnexecute elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Dynamic;
|
using System.Dynamic;
|
||||||
|
using DingTalk.Api.Request;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
using JNPF.Common.Extension;
|
using JNPF.Common.Extension;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
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<Dictionary<string, int>> GetELevatorStatusMap(string devName, IEnumerable<string> tags, CancellationToken token)
|
||||||
|
{
|
||||||
|
Task<string> GetTag(string tag)
|
||||||
|
{
|
||||||
|
var dicCommand = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
["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<string>("Name"), x => x.Value<int>("V")) ?? default;
|
||||||
|
return statusMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using NPOI.OpenXmlFormats.Dml.Diagram;
|
|||||||
using Tnb.Common.Extension;
|
using Tnb.Common.Extension;
|
||||||
using Tnb.Common.Utils;
|
using Tnb.Common.Utils;
|
||||||
using Tnb.WarehouseMgr.Entities.Configs;
|
using Tnb.WarehouseMgr.Entities.Configs;
|
||||||
|
using Tnb.WarehouseMgr.Entities.Consts;
|
||||||
using Tnb.WarehouseMgr.Entities.Enums;
|
using Tnb.WarehouseMgr.Entities.Enums;
|
||||||
using Tnb.WarehouseMgr.Entities.Exceptions;
|
using Tnb.WarehouseMgr.Entities.Exceptions;
|
||||||
|
|
||||||
@@ -42,43 +43,21 @@ namespace Tnb.WarehouseMgr
|
|||||||
//电梯Agv心跳检测
|
//电梯Agv心跳检测
|
||||||
_ = TimedTask(async token =>
|
_ = TimedTask(async token =>
|
||||||
{
|
{
|
||||||
Dictionary<string, string> parameter = new()
|
foreach (var devName in _elevatorControlConfiguration.HeartbeatDevNames)
|
||||||
{
|
{
|
||||||
["DevName"] = _elevatorControlConfiguration.DevName3,
|
Dictionary<string, string> parameter = new()
|
||||||
["TagName"] = "AGVKeepalive",
|
{
|
||||||
["Value"] = "123",
|
["DevName"] = devName,
|
||||||
["token"] = _elevatorControlConfiguration.token
|
["TagName"] = ElevatorConsts.AGVKeepalive,
|
||||||
};
|
["Value"] = "123",
|
||||||
string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
["token"] = _elevatorControlConfiguration.token
|
||||||
await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName3.Match(@"\d+")}#梯, 心跳检测结果:{result}");
|
};
|
||||||
}, stoppingToken, 30, TimeSpanUnit.Seconds);
|
string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
||||||
_ = TimedTask(async token =>
|
await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}");
|
||||||
{
|
}
|
||||||
Dictionary<string, string> parameter = new()
|
}, stoppingToken, 30);
|
||||||
{
|
|
||||||
["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<IWmskittingOutService>();
|
|
||||||
TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1);
|
|
||||||
TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1);
|
|
||||||
//齐套分拣
|
|
||||||
var setSortingService = App.GetRequiredService<IWmsSetSortingService>();
|
|
||||||
TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 2);
|
|
||||||
|
|
||||||
|
|
||||||
//最低库存检查
|
|
||||||
var transferSignService = App.GetRequiredService<IWmsPDATransferSignService>();
|
|
||||||
TimedTask(token => transferSignService.IsMinStorage(token), stoppingToken, 30, TimeSpanUnit.Minutes);*/
|
|
||||||
|
|
||||||
}, stoppingToken);
|
|
||||||
|
|
||||||
|
});
|
||||||
return timedTask;
|
return timedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,14 +65,42 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
private Task TimedTask(Func<CancellationToken, Task> action, CancellationToken ct, int interval, TimeSpanUnit timeType = TimeSpanUnit.Seconds)
|
private Task TimedTask(Func<CancellationToken, Task> action, CancellationToken ct, int interval, TimeSpanUnit timeType = TimeSpanUnit.Seconds)
|
||||||
{
|
{
|
||||||
CancellationToken token = ct;
|
// CancellationToken token = ct;
|
||||||
return Task.Factory.StartNew(async () =>
|
// 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 =>
|
await action(ct).Catch(async ex =>
|
||||||
{
|
{
|
||||||
|
|
||||||
if (ex is TimedTaskException timedTaskEx and not null)
|
if (ex is TimedTaskException timedTaskEx and not null)
|
||||||
{
|
{
|
||||||
await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity
|
await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateExLog", timedTaskEx.options!, new SysLogEntity
|
||||||
@@ -113,37 +120,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
});
|
});
|
||||||
await TaskDelay(timeType, interval);
|
await TaskDelay(timeType, interval);
|
||||||
}
|
}
|
||||||
}, ct, TaskCreationOptions.None, new CustomerTaskScheduler());
|
}, ct);
|
||||||
|
|
||||||
#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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override Task StopAsync(CancellationToken cancellationToken)
|
public override Task StopAsync(CancellationToken cancellationToken)
|
||||||
|
|||||||
@@ -838,9 +838,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
upInput.loginType = "web";
|
upInput.loginType = "web";
|
||||||
}*/
|
}*/
|
||||||
Logger.Information("loginType赋值前");
|
|
||||||
upInput.loginType = "web";//(!string.IsNullOrEmpty(_userManager?.LoginType) ? "app" : "web") ?? "web";
|
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")
|
if (dt.is_sign == 1 && dt.chain_type == "3")
|
||||||
{
|
{
|
||||||
Logger.Information("执行业务回更操作.....");
|
Logger.Information("执行业务回更操作.....");
|
||||||
|
|||||||
@@ -111,7 +111,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
if (s_materialMap.Count == 0)
|
if (s_materialMap.Count == 0)
|
||||||
{
|
{
|
||||||
s_materialMap = await _db.Queryable<BasMaterial>().ToDictionaryAsync(x => x.id, x => x.name);
|
//物料+规格型号+批次+箱号
|
||||||
|
//s_materialMap = await _db.Queryable<BasMaterial>().ToDictionaryAsync(x => $"{}{}{}{}", x => x.name);
|
||||||
}
|
}
|
||||||
var list = await _db.Queryable<TSubEntity>().Where(it => it.bill_id == pkId)
|
var list = await _db.Queryable<TSubEntity>().Where(it => it.bill_id == pkId)
|
||||||
.Mapper(it => it.material_name = s_materialMap.ContainsKey(it.material_id) ? s_materialMap[it.material_id]?.ToString() ?? "" : "")
|
.Mapper(it => it.material_name = s_materialMap.ContainsKey(it.material_id) ? s_materialMap[it.material_id]?.ToString() ?? "" : "")
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"DevName3": "Elevator3",
|
"DevName3": "Elevator3",
|
||||||
"DevName4": "Elevator4",
|
"DevName4": "Elevator4",
|
||||||
|
"HeartbeatDevNames": [ "Elevator3", "Elevator4" ],
|
||||||
"token": "780BE4144636CF47DDF3920B0F1D069B",
|
"token": "780BE4144636CF47DDF3920B0F1D069B",
|
||||||
"GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList",
|
"GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList",
|
||||||
"GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",
|
"GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ public class Startup : AppStartup
|
|||||||
//定时任务
|
//定时任务
|
||||||
services.AddHostedService<TimedTaskBackgroundService>();
|
services.AddHostedService<TimedTaskBackgroundService>();
|
||||||
//services.AddHostedService<RedisBackGround>();
|
//services.AddHostedService<RedisBackGround>();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user