1、解决SnowflakeIdHeler.NextId()空引用问题

2、将Agv心跳检测服务移至自定义定时服务,统一维护管理
This commit is contained in:
yang.lee
2023-10-16 13:53:33 +08:00
parent 9597c9b3e5
commit 66242f929d
10 changed files with 163 additions and 204 deletions

View File

@@ -1,72 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Tnb.Common.Extension;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities.Configs;
namespace Tnb.WarehouseMgr
{
/// <summary>
/// Agv心跳检测服务
/// </summary>
public class AgvHeartbeatMonitorService : BackgroundService
{
private readonly ElevatorControlConfiguration _elevatorControlConfiguration;
public bool IsStarted { get; set; }
public AgvHeartbeatMonitorService()
{
_elevatorControlConfiguration = App.Configuration.Build<ElevatorControlConfiguration>();
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
IsStarted = true;
var parameter = new Dictionary<string, string>();
parameter["DevName"] = _elevatorControlConfiguration.DevName;
parameter["TagName"] = "AGVKeepalive";
parameter["Value"] = "123";
parameter["token"] = _elevatorControlConfiguration.token;
Task.Run(async () =>
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
var result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
await Console.Out.WriteLineAsync($"心跳检测结果:{result}");
await Task.Delay(TimeSpan.FromSeconds(5));
}
catch (Exception ex)
{
throw;
}
}
});
}
public override Task StopAsync(CancellationToken cancellationToken)
{
IsStarted = false;
return Task.CompletedTask;
}
}
public static class AgvHeartbeatMonitorServiceExtenstions
{
public static IServiceCollection AddAgvHeartbeatMonitor(this IServiceCollection services)
{
return services.AddSingleton<BackgroundService, AgvHeartbeatMonitorService>();
}
}
}

View File

@@ -128,7 +128,29 @@ namespace Tnb.WarehouseMgr
return Task.FromResult(isMatch); return Task.FromResult(isMatch);
} }
/// <summary>
/// 根据当前目标楼层获取,电梯接口真正的楼层
/// </summary>
/// <param name="floor"></param>
/// <returns></returns>
[NonAction]
protected 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>
/// 发布消息 /// 发布消息

View File

@@ -90,22 +90,24 @@ namespace Tnb.WarehouseMgr
var elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id) var elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id) .LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
.LeftJoin<WmsPointH>((a, b, c, d) => c.startlocation_id == d.location_id) .LeftJoin<WmsPointH>((a, b, c, d) => c.startlocation_id == d.location_id)
.Where((a, b, c, d) => d.point_code == input.sourceName && c.bill_code == input.taskCode) .Where((a, b, c, d) => d.point_code == input.sourceName && input.taskCode.Contains(c.bill_code))
.FirstAsync(); .FirstAsync();
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code, CancellationToken.None); //Log.Information($"elevator!=null?{elevator!=null}");
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus("Elevator1", CancellationToken.None);
Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}"); Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}");
if (floorNo == 3)
{ {
//var endFloor = elevator.end_floor;
var floor = 5;
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.) if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{ {
await _elevatorControlService.SendOpenCloseCmd(elevator.elevator_code, 3); //发送电梯前门开门指令 await _elevatorControlService.SendOpenCloseCmd("Elevator1", 3); //发送电梯前门开门指令
} }
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus. if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.)
&& doorStatus.ToEnum<EnumDoorStatus>() == EnumDoorStatus. && floorNo == 3)
{ {
elevator.current_floor = floorNo; //elevator.current_floor = floor;
await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync(); //await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();
return await ToApiResult(HttpStatusCode.OK, "成功"); return await ToApiResult(HttpStatusCode.OK, "成功");
} }
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
@@ -154,7 +156,6 @@ namespace Tnb.WarehouseMgr
{ {
await _elevatorControlService.SendOpenCloseCmd("Elevator1", 3); //发送电梯前门开门指令 await _elevatorControlService.SendOpenCloseCmd("Elevator1", 3); //发送电梯前门开门指令
} }
Log.Information("fadsfadsfadsfadsfdsa");
if (sysStatus == (int)EnumSysStatus. && runStatus == (int)EnumRunStatus. if (sysStatus == (int)EnumSysStatus. && runStatus == (int)EnumRunStatus.
&& doorStatus == (int)EnumDoorStatus.) && doorStatus == (int)EnumDoorStatus.)
{ {
@@ -167,7 +168,7 @@ namespace Tnb.WarehouseMgr
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.Error("更新延迟队列异常",ex); Log.Error("更新延迟队列异常", ex);
throw; throw;
} }
@@ -262,13 +263,16 @@ namespace Tnb.WarehouseMgr
disTaskIds = disTasks.Select(x => x.id).ToList() disTaskIds = disTasks.Select(x => x.id).ToList()
}; };
await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput); await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput);
Log.Information("Agv取货完成");
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中"); var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
if (elevatorQueueItem != null) if (elevatorQueueItem != null)
{ {
Log.Information("开始进入关门流程");
var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id); var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID) //if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
{ {
var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus); var doorStatus = await _elevatorControlService.GetTagAsync("Elevator1", ElevatorConsts.DoorStatus);
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.) if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{ {
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令 await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令

View File

@@ -169,17 +169,16 @@ namespace Tnb.WarehouseMgr
dicCommand["token"] = _elevatorCtlCfg.token; dicCommand["token"] = _elevatorCtlCfg.token;
dicCommand["TagName"] = "DoorExecute"; dicCommand["TagName"] = "DoorExecute";
dicCommand["Value"] = value.ToString(); dicCommand["Value"] = value.ToString();
var result = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand); try
if (result.IsNotEmptyOrNull())
{ {
JObject jo = JObject.Parse(result); await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
if (jo != null) }
catch (Exception)
{ {
return jo.Value<string>("Result").Equals("Ok", StringComparison.OrdinalIgnoreCase);
}
}
return false; return false;
} }
return true;
}
/// <summary> /// <summary>
/// 设置Agv控制请求状态 /// 设置Agv控制请求状态
/// </summary> /// </summary>

View File

@@ -217,6 +217,8 @@ namespace Tnb.WarehouseMgr
catch (Exception ex) catch (Exception ex)
{ {
await curDb.Ado.RollbackTranAsync(); await curDb.Ado.RollbackTranAsync();
if(_userManager?.ToKen.IsNullOrEmpty() ?? false)
{
TimedTaskErrorInfo ei = new() TimedTaskErrorInfo ei = new()
{ {
RequestURL = App.HttpContext?.Request?.Path, RequestURL = App.HttpContext?.Request?.Path,
@@ -224,9 +226,9 @@ namespace Tnb.WarehouseMgr
userIdentity = await GetUserIdentity(_userManager.ToKen), userIdentity = await GetUserIdentity(_userManager.ToKen),
}; };
var timedTaskEx = ex.ToTimedTaskException(ei); var timedTaskEx = ex.ToTimedTaskException(ei);
//cts?.Cancel();
throw timedTaskEx; throw timedTaskEx;
} }
} }
} }
}
} }

View File

@@ -45,6 +45,7 @@ namespace Tnb.WarehouseMgr
{ {
public bool IsStarted { get; set; } public bool IsStarted { get; set; }
private IEventPublisher _eventPublisher = default!; private IEventPublisher _eventPublisher = default!;
private ElevatorControlConfiguration _elevatorControlConfiguration = App.Configuration.Build<ElevatorControlConfiguration>();
private readonly IServiceProvider _serviceProvider; private readonly IServiceProvider _serviceProvider;
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()
@@ -89,15 +90,15 @@ namespace Tnb.WarehouseMgr
_eventPublisher = App.GetRequiredService<IEventPublisher>(); _eventPublisher = App.GetRequiredService<IEventPublisher>();
var whSvc = App.GetRequiredService<IWareHouseService>(); var whSvc = App.GetRequiredService<IWareHouseService>();
TimedTask(token => whSvc.GenTaskExecute(token), stoppingToken, 1); TimedTask(token => whSvc.GenTaskExecute(token), stoppingToken, 1);
//齐套出库 ////齐套出库
//var kittingOutService = App.GetRequiredService<IWmskittingOutService>(); var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
//TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1); TimedTask(token => kittingOutService.KittingOutByAdd(token), stoppingToken, 1);
//TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1); TimedTask(token => kittingOutService.KittingOutByIsToBeShipped(token), stoppingToken, 1);
//齐套分拣 //齐套分拣
//var setSortingService = App.GetRequiredService<IWmsSetSortingService>(); var setSortingService = App.GetRequiredService<IWmsSetSortingService>();
//TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 1); TimedTask(token => setSortingService.PackSortingByAdd(token), stoppingToken, 2);
var _elevatorControlConfiguration = App.Configuration.Build<ElevatorControlConfiguration>();
TimedTask(async token => TimedTask(async token =>
{ {
var parameter = new Dictionary<string, string>(); var parameter = new Dictionary<string, string>();
@@ -107,7 +108,7 @@ namespace Tnb.WarehouseMgr
parameter["token"] = _elevatorControlConfiguration.token; parameter["token"] = _elevatorControlConfiguration.token;
var result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); var result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
await Console.Out.WriteLineAsync($"心跳检测结果:{result}"); await Console.Out.WriteLineAsync($"心跳检测结果:{result}");
},stoppingToken,30,TimeSpanUnit.Seconds); }, stoppingToken, 30, TimeSpanUnit.Seconds);
//最低库存检查 //最低库存检查
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);
@@ -130,19 +131,19 @@ namespace Tnb.WarehouseMgr
{ {
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
//{ {
// Id = SnowflakeIdHelper.NextId(), Id = SnowflakeIdHelper.NextId(),
// Category = 4, Category = 4,
// UserId = timedTaskEx.UserId, UserId = timedTaskEx.UserId,
// UserName = timedTaskEx.UserName, UserName = timedTaskEx.UserName,
// IPAddress = NetHelper.Ip, IPAddress = NetHelper.Ip,
// RequestURL = timedTaskEx.RequestURL, RequestURL = timedTaskEx.RequestURL,
// RequestMethod = timedTaskEx.RequestMethod, RequestMethod = timedTaskEx.RequestMethod,
// Json = timedTaskEx + "\n" + timedTaskEx.InnerException?.StackTrace + "\n" + timedTaskEx?.TargetSite?.GetParameters().ToString(), Json = timedTaskEx + "\n" + timedTaskEx.InnerException?.StackTrace + "\n" + timedTaskEx?.TargetSite?.GetParameters().ToString(),
// //PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue), //PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue),
// CreatorTime = DateTime.Now CreatorTime = DateTime.Now
//})); }));
} }
}); });
await TaskDelay(timeType, interval); await TaskDelay(timeType, interval);

View File

@@ -454,28 +454,7 @@ namespace Tnb.WarehouseMgr
throw; throw;
} }
} }
/// <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>
/// 执行到目标楼层电梯任务 /// 执行到目标楼层电梯任务
/// </summary> /// </summary>
@@ -488,6 +467,7 @@ namespace Tnb.WarehouseMgr
try try
{ {
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => it.task_status == "执行中"); var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => it.task_status == "执行中");
Log.Information($"是否存在电梯任务项:{elevatorQueueItem != null}");
if (elevatorQueueItem != null) if (elevatorQueueItem != null)
{ {
//var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id); //var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
@@ -499,10 +479,12 @@ namespace Tnb.WarehouseMgr
do do
{ {
doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus); doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
await Task.Delay(2000);
} while (doorStatus != 4); } while (doorStatus != 4);
Log.Information($"当前门状态:{doorStatus}");
var floor = await GetRealFloor(disTask.end_floor.ParseToInt()); var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
Log.Information($"目标楼层:{floor}"); Log.Information($"目标楼层:{floor}");
Log.Information($"当前门状态:{doorStatus}");
//发送到目标楼的指令 //发送到目标楼的指令
var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor); var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, floor);
//电梯任务手动执行任务状态上报 //电梯任务手动执行任务状态上报
@@ -511,17 +493,20 @@ namespace Tnb.WarehouseMgr
do do
{ {
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()); await Task.Delay(2000);
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
Log.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo}"); Log.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
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())
{ {
dynamic input = new ExpandoObject(); Log.Information($"disTask.require_id={disTask.require_id}");
input.disTaskIds = new List<string> { disTask.id };
await TaskExecuteAfter(input); List<string> disTaskIds = new() { disTask.id };
await TaskComplate(input); TaskExecuteAfterUpInput teaUpInput = new() { disTaskIds = disTaskIds };
await TaskExecuteAfter(teaUpInput);
TaskCompleUpInput tcUpInput = new() { disTaskIds = disTaskIds };
await TaskComplate(tcUpInput);
} }
} }
} }
@@ -712,28 +697,35 @@ namespace Tnb.WarehouseMgr
locIts.Add(loc); locIts.Add(loc);
} }
Log.Information("更新载具及库位开始.....");
await _db.Updateable(carryIts).UpdateColumns(it => new { it.is_lock, it.location_id, it.location_code }).ExecuteCommandAsync(); await _db.Updateable(carryIts).UpdateColumns(it => new { it.is_lock, it.location_id, it.location_code }).ExecuteCommandAsync();
//更新条码的库位和仓库信息 //更新条码的库位和仓库信息
await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync(); await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
//更新库位信息,使用状态为 使用,锁定状态为未锁定 //更新库位信息,使用状态为 使用,锁定状态为未锁定
await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync(); await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
Log.Information("更新载具及库位结束.....");
Log.Information($"_userManager.LoginType={_userManager.LoginType}");
//更新业务主表的单据状态 //更新业务主表的单据状态
foreach (var dt in disTasks) foreach (var dt in disTasks)
{ {
var disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync(); var disTaskCodes = await _db.Queryable<WmsDistaskCode>().Where(it => it.bill_id == dt.id).ToListAsync();
var upInput = new WareHouseUpInput { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() }; var upInput = new WareHouseUpInput { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() };
upInput.loginType = !_userManager.LoginType.IsNullOrEmpty() ? "app" : "web"; upInput.loginType = !_userManager.LoginType.IsNullOrEmpty() ? "app" : "web";
Log.Information($"upInput.loginType={upInput.loginType}");
if (dt.is_sign == 1 && dt.chain_type == "3") if (dt.is_sign == 1 && dt.chain_type == "3")
{ {
Log.Information("执行业务回更操作.....");
await DoUpdate(upInput); await DoUpdate(upInput);
} }
} }
} }
await _db.Ado.CommitTranAsync(); await _db.Ado.CommitTranAsync();
} }
catch (Exception) catch (Exception ex)
{ {
Log.Error($"任务结束失败", ex);
Log.Error($"任务结束失败堆栈异常", ex.StackTrace);
await _db.Ado.RollbackTranAsync(); await _db.Ado.RollbackTranAsync();
throw; throw;
} }

View File

@@ -103,8 +103,13 @@ namespace Tnb.WarehouseMgr
//Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId}\t Thread pool: {Thread.CurrentThread.IsThreadPoolThread}"); //Console.WriteLine($"ThreadID:{Thread.CurrentThread.ManagedThreadId}\t Thread pool: {Thread.CurrentThread.IsThreadPoolThread}");
var curDb = _db.CopyNew(); var curDb = _db.CopyNew();
try
{
await curDb.Ado.BeginTranAsync();
string firstLocationId = "27010980724501", secondLocationId = "27010987857941"; string firstLocationId = "27010980724501", secondLocationId = "27010987857941";
var endLocation = await curDb.Queryable<BasLocation>().SingleAsync(it => it.id == secondLocationId); var endLocation = await curDb.Queryable<BasLocation>().FirstAsync(it => it.id == secondLocationId);
var setSortings = await curDb.Queryable<WmsSetsortingH>() var setSortings = await curDb.Queryable<WmsSetsortingH>()
.Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID) .Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID)
@@ -113,9 +118,6 @@ namespace Tnb.WarehouseMgr
.ToListAsync(); .ToListAsync();
var items = await curDb.Queryable<WmsSetsortingH>().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync(); var items = await curDb.Queryable<WmsSetsortingH>().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync();
var onFlag = items?.Count > 0; var onFlag = items?.Count > 0;
try
{
await curDb.Ado.BeginTranAsync();
if (setSortings?.Count > 0 && !onFlag) if (setSortings?.Count > 0 && !onFlag)
{ {
@@ -263,6 +265,9 @@ namespace Tnb.WarehouseMgr
{ {
JNPF.Logging.Log.Error("齐套分拣执行时出现错误", ex); JNPF.Logging.Log.Error("齐套分拣执行时出现错误", ex);
await curDb.Ado.RollbackTranAsync(); await curDb.Ado.RollbackTranAsync();
if (_userManager?.ToKen.IsNullOrEmpty() ?? false)
{
TimedTaskErrorInfo ei = new() TimedTaskErrorInfo ei = new()
{ {
RequestURL = App.HttpContext?.Request?.Path, RequestURL = App.HttpContext?.Request?.Path,
@@ -273,9 +278,11 @@ namespace Tnb.WarehouseMgr
//cts?.Cancel(); //cts?.Cancel();
throw timedTaskEx; throw timedTaskEx;
} }
}
finally finally
{ {
await Publish(nameof(IWareHouseService.GenTaskExecute)); //await Publish(nameof(IWareHouseService.GenTaskExecute));
} }
} }

View File

@@ -80,12 +80,10 @@ namespace Tnb.WarehouseMgr
[HttpPost, Timed(Name = nameof(KittingOutByAdd))] [HttpPost, Timed(Name = nameof(KittingOutByAdd))]
public async Task KittingOutByAdd(CancellationToken? ct = default) public async Task KittingOutByAdd(CancellationToken? ct = default)
{ {
//if (UserManager.AsscessToken.IsNullOrWhiteSpace()) return; //if (ct?.IsCancellationRequested ?? false)
//var curUser = await GetUserIdentity(); //{
if (ct?.IsCancellationRequested ?? false) // ct?.ThrowIfCancellationRequested();
{ //}
ct?.ThrowIfCancellationRequested();
}
var curDb = _db.CopyNew(); var curDb = _db.CopyNew();
try try
{ {
@@ -171,6 +169,8 @@ namespace Tnb.WarehouseMgr
{ {
Log.Error("齐套出库,新增时出现错误", ex); Log.Error("齐套出库,新增时出现错误", ex);
await curDb.Ado.RollbackTranAsync(); await curDb.Ado.RollbackTranAsync();
if(_userManager?.ToKen.IsNullOrEmpty() ?? false)
{
TimedTaskErrorInfo ei = new() TimedTaskErrorInfo ei = new()
{ {
RequestURL = App.HttpContext?.Request?.Path, RequestURL = App.HttpContext?.Request?.Path,
@@ -182,6 +182,7 @@ namespace Tnb.WarehouseMgr
throw timedTaskEx; throw timedTaskEx;
} }
} }
}
/// <summary> /// <summary>
/// 齐套出库,(待配送状态) /// 齐套出库,(待配送状态)
/// </summary> /// </summary>
@@ -278,6 +279,8 @@ namespace Tnb.WarehouseMgr
{ {
Log.Error("齐套出库,待配送时出现错误", ex); Log.Error("齐套出库,待配送时出现错误", ex);
await curDb.Ado.RollbackTranAsync(); await curDb.Ado.RollbackTranAsync();
if(_userManager?.ToKen.IsNullOrEmpty() ?? false)
{
TimedTaskErrorInfo ei = new() TimedTaskErrorInfo ei = new()
{ {
RequestURL = App.HttpContext?.Request?.Path, RequestURL = App.HttpContext?.Request?.Path,
@@ -287,10 +290,12 @@ namespace Tnb.WarehouseMgr
var timedTaskEx = ex.ToTimedTaskException(ei); var timedTaskEx = ex.ToTimedTaskException(ei);
//cts?.Cancel(); //cts?.Cancel();
throw timedTaskEx; throw timedTaskEx;
}
} }
finally finally
{ {
await Publish(nameof(IWareHouseService.GenTaskExecute)); //await Publish(nameof(IWareHouseService.GenTaskExecute));
} }
} }

View File

@@ -65,10 +65,9 @@ public class Startup : AppStartup
//注册任务消息通知 added by ly on 20230814 //注册任务消息通知 added by ly on 20230814
services.AddTaskMessageNotify(); services.AddTaskMessageNotify();
SnowflakeIdHelper.InitYitIdWorker();
//定时任务 //定时任务
services.AddHostedService<TimedTaskBackgroundService>(); services.AddHostedService<TimedTaskBackgroundService>();
//Agv心跳监听服务
//services.AddHostedService<AgvHeartbeatMonitorService>();
} }
@@ -116,7 +115,7 @@ public class Startup : AppStartup
endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
}); });
SnowflakeIdHelper.InitYitIdWorker(); //SnowflakeIdHelper.InitYitIdWorker();
bool isStartTimeJob = App.GetConfig<bool>("IsStartTimeJob"); bool isStartTimeJob = App.GetConfig<bool>("IsStartTimeJob");
if (isStartTimeJob) if (isStartTimeJob)