Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -54,7 +54,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
private static Dictionary<string, IWHStorageService> _storeMap = new(StringComparer.OrdinalIgnoreCase);
|
private static Dictionary<string, IWHStorageService> _storeMap = new(StringComparer.OrdinalIgnoreCase);
|
||||||
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||||
private readonly ChannelWriter<NotifyMessage> _channelWriter;
|
private readonly ChannelWriter<NotifyMessage> _channelWriter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public BaseWareHouseService(ChannelWriter<NotifyMessage>? channelWriter = default)
|
public BaseWareHouseService(ChannelWriter<NotifyMessage>? channelWriter = default)
|
||||||
@@ -64,17 +64,23 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
static BaseWareHouseService()
|
static BaseWareHouseService()
|
||||||
{
|
{
|
||||||
var serviceTypes = App.EffectiveTypes.Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(IWHStorageService).IsAssignableFrom(u)).ToList();
|
_stroageMapLazy = new Lazy<Dictionary<string, IWHStorageService>>(() =>
|
||||||
foreach (var serviceType in serviceTypes)
|
|
||||||
{
|
{
|
||||||
var callerName = serviceType.GetCustomAttribute<CallerAttribute>()?.Name ?? string.Empty;
|
Dictionary<string, IWHStorageService> map = new();
|
||||||
if (!callerName.IsNullOrEmpty())
|
var serviceTypes = App.EffectiveTypes.Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(IWHStorageService).IsAssignableFrom(u)).ToList();
|
||||||
|
foreach (var serviceType in serviceTypes)
|
||||||
{
|
{
|
||||||
var obj = Activator.CreateInstance(serviceType) as IWHStorageService;
|
var callerName = serviceType.GetCustomAttribute<CallerAttribute>()?.Name ?? string.Empty;
|
||||||
if (obj == null) continue;
|
if (!callerName.IsNullOrEmpty())
|
||||||
_storeMap[callerName] = obj;
|
{
|
||||||
|
var obj = Activator.CreateInstance(serviceType) as IWHStorageService;
|
||||||
|
if (obj == null) continue;
|
||||||
|
map[callerName] = obj;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
return map;
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Task<ClaimsPrincipal> GetUserIdentity(string? asscessToken = null)
|
protected Task<ClaimsPrincipal> GetUserIdentity(string? asscessToken = null)
|
||||||
@@ -140,9 +146,9 @@ namespace Tnb.WarehouseMgr
|
|||||||
[NonAction]
|
[NonAction]
|
||||||
protected async Task DoUpdate(WareHouseUpInput input)
|
protected async Task DoUpdate(WareHouseUpInput input)
|
||||||
{
|
{
|
||||||
if (_storeMap.ContainsKey(input.loginType))
|
if (_stroageMapLazy.Value.ContainsKey(input.loginType))
|
||||||
{
|
{
|
||||||
await _storeMap[input.loginType].Do(input);
|
await _stroageMapLazy.Value[input.loginType].Do(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[NonAction]
|
[NonAction]
|
||||||
@@ -229,7 +235,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (0 != ret)
|
if (0 != ret)
|
||||||
return ;
|
return;
|
||||||
|
|
||||||
// sample setting.
|
// sample setting.
|
||||||
PPLBUtility.B_Set_Originpoint(0, 0);
|
PPLBUtility.B_Set_Originpoint(0, 0);
|
||||||
@@ -251,7 +257,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
PPLBUtility.B_Prn_Text(200, 50, 0, 2, 2, 2, 'N', code);
|
PPLBUtility.B_Prn_Text(200, 50, 0, 2, 2, 2, 'N', code);
|
||||||
//barcode.
|
//barcode.
|
||||||
PPLBUtility.B_Prn_Barcode(50, 100, 0, "1", 3, 5, 70, 'B', code);//have a counter
|
PPLBUtility.B_Prn_Barcode(50, 100, 0, "1", 3, 5, 70, 'B', code);//have a counter
|
||||||
// output.
|
// output.
|
||||||
PPLBUtility.B_Print_Out(1);// copy 2.
|
PPLBUtility.B_Print_Out(1);// copy 2.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Aliyun.OSS;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
using JNPF.Common.Core.Manager;
|
using JNPF.Common.Core.Manager;
|
||||||
using JNPF.Common.Enums;
|
using JNPF.Common.Enums;
|
||||||
@@ -271,22 +272,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||||
};
|
};
|
||||||
await _wareHouseService.TaskComplate(taskCompleUpInput);
|
await _wareHouseService.TaskComplate(taskCompleUpInput);
|
||||||
//收到放货确认通知,向电梯发送到3楼的指令
|
|
||||||
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
|
|
||||||
if (elevatorQueueItem != null)
|
|
||||||
{
|
|
||||||
var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
|
|
||||||
if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
|
|
||||||
{
|
|
||||||
var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
|
|
||||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持)
|
|
||||||
{
|
|
||||||
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
|
|
||||||
}
|
|
||||||
//发送到3楼的指令
|
|
||||||
var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -340,11 +342,21 @@ namespace Tnb.WarehouseMgr
|
|||||||
//呼梯操作
|
//呼梯操作
|
||||||
//获取目标库位为电梯库位的任务
|
//获取目标库位为电梯库位的任务
|
||||||
|
|
||||||
var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList();
|
var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
if (endLocCodes?.Count > 0)
|
if (endLocCodes?.Count > 0)
|
||||||
{
|
{
|
||||||
await CallingLanding(endLocCodes);
|
await CallingLanding(endLocCodes);
|
||||||
}
|
}
|
||||||
|
//执行电梯任务
|
||||||
|
var elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
if (elevatorTasks?.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var elevatorTask in elevatorTasks)
|
||||||
|
{
|
||||||
|
await ExecuteTargetFloorTask(elevatorTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
////调用AGV创建任务链接口
|
////调用AGV创建任务链接口
|
||||||
await AgvDispatch(disTasks, agvCts.Token);
|
await AgvDispatch(disTasks, agvCts.Token);
|
||||||
|
|
||||||
@@ -370,14 +382,14 @@ namespace Tnb.WarehouseMgr
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="endLocCodes"></param>
|
/// <param name="endLocCodes"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id)> endLocCodes)
|
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes)
|
||||||
{
|
{
|
||||||
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运行状态)
|
||||||
@@ -386,22 +398,22 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
foreach (var (_, devId, disTaskId) in endLocCodes)
|
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||||
{
|
{
|
||||||
|
var floorN = await GetRealFloor(floorNO.ParseToInt());
|
||||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||||
{
|
{
|
||||||
distask_id = disTaskId,
|
distask_id = disTaskId,
|
||||||
elevator_id = devId,
|
elevator_id = devId,
|
||||||
elevator_code = _elevatorMap[devId].ToString(),
|
elevator_code = devName,
|
||||||
floor = 5, //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);
|
||||||
|
|
||||||
@@ -420,6 +432,80 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
/// 根据当前目标楼层获取,电梯接口真正的楼层
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="floor"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private Task<int> GetRealFloor(int floor)
|
||||||
|
{
|
||||||
|
var realFloor = 0;
|
||||||
|
if (floor == 4)
|
||||||
|
{
|
||||||
|
realFloor = 5;
|
||||||
|
}
|
||||||
|
else if (floor == 3)
|
||||||
|
{
|
||||||
|
realFloor = 4;
|
||||||
|
}
|
||||||
|
else if (floor == 2)
|
||||||
|
{
|
||||||
|
realFloor = 3;
|
||||||
|
}
|
||||||
|
return Task.FromResult(realFloor);
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 执行到目标楼层电梯任务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disTask"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
|
||||||
|
{
|
||||||
|
//收到放货确认通知,向电梯发送到3楼的指令
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTask.id == it.distask_id && it.task_status == "执行中");
|
||||||
|
if (elevatorQueueItem != null)
|
||||||
|
{
|
||||||
|
//var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
|
||||||
|
//if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
|
||||||
|
{
|
||||||
|
var doorStatus = -1;
|
||||||
|
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
|
||||||
|
do
|
||||||
|
{
|
||||||
|
doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
|
||||||
|
} while (doorStatus != 4);
|
||||||
|
var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
|
||||||
|
//发送到目标楼的指令
|
||||||
|
var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor);
|
||||||
|
//电梯任务手动执行任务状态上报
|
||||||
|
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
tuple = await _elevatorControlService.GetElevatorStatus(elevatorQueueItem.elevator_code, CancellationToken.None);
|
||||||
|
} 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.停梯
|
||||||
|
&& tuple.floorNo == disTask.end_floor.ParseToInt())
|
||||||
|
{
|
||||||
|
dynamic input = new ExpandoObject();
|
||||||
|
input.disTaskIds = new List<string> { disTask.id };
|
||||||
|
await TaskExecuteAfter(input);
|
||||||
|
await TaskComplate(input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Log.Error("执行到目标楼层电梯任务失败", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
/// Agv调度
|
/// Agv调度
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="disTasks"></param>
|
/// <param name="disTasks"></param>
|
||||||
@@ -497,8 +583,9 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
await _db.Ado.CommitTranAsync();
|
await _db.Ado.CommitTranAsync();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Log.Error("任务执行失败", ex);
|
||||||
await _db.Ado.RollbackTranAsync();
|
await _db.Ado.RollbackTranAsync();
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -532,8 +619,9 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
await _db.Ado.CommitTranAsync();
|
await _db.Ado.CommitTranAsync();
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Log.Error("设备取返回操作失败", ex);
|
||||||
await _db.Ado.RollbackTranAsync();
|
await _db.Ado.RollbackTranAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user