与任务执行,新增信号量锁,解决并发环境下数据的一致性问题

This commit is contained in:
yang.lee
2023-11-03 22:12:01 +08:00
parent 669c4228e8
commit 537e54b565
5 changed files with 61 additions and 28 deletions

View File

@@ -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}");