与任务执行,新增信号量锁,解决并发环境下数据的一致性问题
This commit is contained in:
@@ -54,7 +54,7 @@ namespace Tnb.WarehouseMgr
|
||||
|
||||
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService,
|
||||
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService)
|
||||
: base(repository.AsSugarClient())
|
||||
//: base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -62,6 +62,7 @@ namespace Tnb.WarehouseMgr
|
||||
_userManager = userManager;
|
||||
_cacheManager = cacheManager;
|
||||
_elevatorControlService = elevatorControlService;
|
||||
_ = InitializationTask;
|
||||
}
|
||||
|
||||
|
||||
@@ -215,19 +216,18 @@ namespace Tnb.WarehouseMgr
|
||||
/// 生成任务执行
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Timed(Name = nameof(IWareHouseService.GenTaskExecute))]
|
||||
[HttpPost]
|
||||
public async Task GenTaskExecute()
|
||||
{
|
||||
|
||||
await s_taskExecuteSemaphore.WaitAsync();
|
||||
|
||||
Stopwatch sw = Stopwatch.StartNew();
|
||||
CancellationTokenSource agvCts = new();
|
||||
|
||||
var db = _db.CopyNew();
|
||||
try
|
||||
{
|
||||
/*if (_elevatorMap.Count < 1)
|
||||
{
|
||||
_elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
}*/
|
||||
//获取电梯数据
|
||||
var elevatorList = await db.Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.Select((a, b) => new WmsElevatorH
|
||||
@@ -420,6 +420,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_taskExecuteSemaphore.Release();
|
||||
agvCts.Dispose();
|
||||
}
|
||||
}
|
||||
@@ -436,7 +437,7 @@ namespace Tnb.WarehouseMgr
|
||||
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||
{
|
||||
|
||||
if (!_elevatorMap.TryGetValue(devId, out var elevatorCode)) continue;
|
||||
if (!s_elevatorMap.TryGetValue(devId, out var elevatorCode)) continue;
|
||||
|
||||
var devName = elevatorCode.ToString();
|
||||
|
||||
@@ -510,14 +511,27 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||
try
|
||||
{
|
||||
if (!_elevatorMap.TryGetValue(disTask.device_id, out var elevatorCode))
|
||||
if (!s_elevatorMap.TryGetValue(disTask.device_id, out var elevatorCode))
|
||||
{
|
||||
return;
|
||||
}
|
||||
var devName = _elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName;
|
||||
var devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName;
|
||||
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out var agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
do
|
||||
{
|
||||
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
await Task.Delay(500);
|
||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
|
||||
}
|
||||
|
||||
var doorStatus = -1;
|
||||
var closeDoorRes = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令
|
||||
Logger.Information($"关门结果:{closeDoorRes}");
|
||||
|
||||
Reference in New Issue
Block a user