1、删除无用类
2、调整定时逻辑,将定时改为框架的事件总线 3、电梯业务逻辑代码调整
This commit is contained in:
@@ -33,6 +33,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs;
|
||||
using Tnb.WarehouseMgr.Entities.Entity;
|
||||
using Tnb.WarehouseMgr.Entities.Enums;
|
||||
using Tnb.WarehouseMgr.Interfaces;
|
||||
using JNPF.Common.Extension;
|
||||
|
||||
namespace Tnb.WarehouseMgr
|
||||
{
|
||||
@@ -47,12 +48,13 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly IElevatorControlService _elevatorControlService;
|
||||
private static Dictionary<string, object> _elevatorMap = new Dictionary<string, object>();
|
||||
private static Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
public Func<string, int, Task> AddUnExecuteTask { get; set; }
|
||||
|
||||
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService,
|
||||
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService)
|
||||
: base(repository.AsSugarClient())
|
||||
{
|
||||
_db = repository.AsSugarClient();
|
||||
_dictionaryDataService = dictionaryDataService;
|
||||
@@ -60,10 +62,6 @@ namespace Tnb.WarehouseMgr
|
||||
_userManager = userManager;
|
||||
_cacheManager = cacheManager;
|
||||
_elevatorControlService = elevatorControlService;
|
||||
AddUnExecuteTask = async (code, floor) =>
|
||||
{
|
||||
await _elevatorControlService.CallLift(code, floor, CancellationToken.None);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -226,10 +224,23 @@ namespace Tnb.WarehouseMgr
|
||||
var db = _db.CopyNew();
|
||||
try
|
||||
{
|
||||
//if (_elevatorMap.Count < 1)
|
||||
//{
|
||||
// _elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
|
||||
//}
|
||||
/*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
|
||||
{
|
||||
bill_id = b.bill_id,
|
||||
location_id = b.location_id,
|
||||
location_code = b.location_code,
|
||||
point_id = b.point_id,
|
||||
point_code = b.point_code,
|
||||
floor = b.floor
|
||||
}, true).ToListAsync();
|
||||
|
||||
|
||||
//获取所有未下发的预任务申请
|
||||
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)
|
||||
@@ -240,6 +251,14 @@ namespace Tnb.WarehouseMgr
|
||||
move_num = c.move_num
|
||||
}, true)
|
||||
.ToListAsync();
|
||||
var agvElevatorTasks = preTasks
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||
.ToList();
|
||||
var firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
|
||||
agvElevatorTasks = agvElevatorTasks.FindAll(x => firstEleGrp.Select(y => y.endlocation_code).Contains(x.endlocation_code));
|
||||
preTasks = preTasks.Where(it => !it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).Concat(agvElevatorTasks).ToList();
|
||||
|
||||
var ids = preTasks.Select(x => x.id).Distinct().ToList();
|
||||
var preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||
if (preTasks.Count > 0)
|
||||
@@ -323,7 +342,25 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
await db.Ado.BeginTranAsync();
|
||||
|
||||
var endPointIds = disTasks.Where(t => t.area_code.StartsWith("ELE", StringComparison.OrdinalIgnoreCase)).Select(t => t.endpoint_id).ToList();
|
||||
if (endPointIds?.Count > 0)
|
||||
{
|
||||
elevatorList = elevatorList.FindAll(x => endPointIds.Contains(x.point_id));
|
||||
if (elevatorList?.Count > 0)
|
||||
{
|
||||
foreach (var e in elevatorList)
|
||||
{
|
||||
var disTask = disTasks.Find(x => x.endpoint_id == e.point_id);
|
||||
if (disTask != null)
|
||||
{
|
||||
disTask.device_id = e.elevator_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//disTasks.ForEach(x => x.id = SnowflakeIdHelper.NextId());
|
||||
|
||||
|
||||
var row = await db.Insertable(disTasks).ExecuteCommandAsync();
|
||||
if (preTaskCodes?.Count > 0)
|
||||
{
|
||||
@@ -335,24 +372,22 @@ namespace Tnb.WarehouseMgr
|
||||
row = await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
Log.Information($"程序运行耗时{sw.ElapsedMilliseconds}ms");
|
||||
await db.Ado.CommitTranAsync();
|
||||
|
||||
//呼梯操作
|
||||
//获取目标库位为电梯库位的任务
|
||||
|
||||
var endLocCodes = disTasks
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)
|
||||
).Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
||||
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
if (endLocCodes?.Count > 0)
|
||||
{
|
||||
|
||||
await CallingLanding(endLocCodes);
|
||||
}
|
||||
//执行电梯任务
|
||||
var elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
|
||||
|
||||
if (elevatorTasks?.Count > 0)
|
||||
{
|
||||
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
@@ -371,7 +406,6 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
await AgvDispatch(agvTasks, agvCts.Token);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (ex is HttpRequestException hReqEx)
|
||||
@@ -396,59 +430,67 @@ namespace Tnb.WarehouseMgr
|
||||
/// <returns></returns>
|
||||
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, string floorNO)> endLocCodes)
|
||||
{
|
||||
Logger.Information($"开始呼梯操作.............");
|
||||
Logger.Information($" 开始呼梯操作.............");
|
||||
try
|
||||
{
|
||||
var item = endLocCodes.FirstOrDefault();
|
||||
//if (_elevatorMap.ContainsKey(item.device_id))
|
||||
var devName = _eleCtlCfg.DevName;
|
||||
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||
{
|
||||
var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl);
|
||||
Logger.Information($"当前Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||
|
||||
//判断当前设备是否为运行状态,不是则进入Agv电梯控制状态
|
||||
if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
|
||||
if (!_elevatorMap.TryGetValue(devId, out var elevatorCode)) continue;
|
||||
|
||||
var devName = elevatorCode.ToString();
|
||||
|
||||
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(devId, out var agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
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[devId] = eleStatusMulti.agvStatus;
|
||||
}
|
||||
}
|
||||
{
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
|
||||
foreach (var (_, devId, disTaskId, floorNO) in endLocCodes)
|
||||
Logger.Information($"任务开始目标楼层为:{floorNO}");
|
||||
|
||||
var floorN = await GetRealFloor(floorNO.ParseToInt());
|
||||
//如果电梯在当前楼层则不呼梯
|
||||
if (floorN == eleStatusMulti.curFloorNo)
|
||||
{
|
||||
Logger.Information($"任务开始目标楼层为:{floorNO}");
|
||||
|
||||
var floorN = await GetRealFloor(floorNO.ParseToInt());
|
||||
|
||||
Logger.Information($"实际目标楼层为:{floorN}");
|
||||
|
||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||
{
|
||||
distask_id = disTaskId,
|
||||
elevator_id = devId,
|
||||
elevator_code = devName,
|
||||
floor = floorN, //5代表4楼
|
||||
task_status = "待执行",
|
||||
create_id = _userManager.UserId,
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.distask_id == disTaskId && it.task_status == "执行中").ToListAsync();
|
||||
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorNO.ParseToInt() != curFloorNo)
|
||||
{
|
||||
|
||||
elevatorQueueItem.task_status = "执行中";
|
||||
var callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
|
||||
string successful = "成功", fail = "失败";
|
||||
var callLiftResult = callLiftRes ? successful : fail;
|
||||
Logger.Information($"呼梯结果:{callLiftResult}");
|
||||
}
|
||||
|
||||
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
|
||||
await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
Logger.Information($"{devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
Logger.Information($"实际目标楼层为:{floorN}");
|
||||
|
||||
WmsElevatorUnexecute elevatorQueueItem = new()
|
||||
{
|
||||
distask_id = disTaskId,
|
||||
elevator_id = devId,
|
||||
elevator_code = devName,
|
||||
floor = floorN, //5代表4楼
|
||||
task_status = "待执行",
|
||||
create_id = _userManager.UserId,
|
||||
create_time = DateTime.Now
|
||||
};
|
||||
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.distask_id == disTaskId && it.task_status == "执行中").ToListAsync();
|
||||
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorN != eleStatusMulti.curFloorNo)
|
||||
{
|
||||
|
||||
elevatorQueueItem.task_status = "执行中";
|
||||
var callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
|
||||
string successful = "成功", fail = "失败";
|
||||
var callLiftResult = callLiftRes ? successful : fail;
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 呼梯结果:{callLiftResult}");
|
||||
}
|
||||
|
||||
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
|
||||
await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -468,54 +510,58 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||
try
|
||||
{
|
||||
/* var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => it.task_status == "执行中");
|
||||
Log.Information($"是否存在电梯任务项:{elevatorQueueItem != null}");
|
||||
*/ //if (elevatorQueueItem != null)
|
||||
if (!_elevatorMap.TryGetValue(disTask.device_id, out var elevatorCode))
|
||||
{
|
||||
//var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
|
||||
//if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
|
||||
{
|
||||
var doorStatus = -1;
|
||||
var closeDoorRes = await _elevatorControlService.SendOpenCloseCmd(_eleCtlCfg.DevName, 4); //向电梯发送前门关门指令
|
||||
Logger.Information($"关门结果:{closeDoorRes}");
|
||||
do
|
||||
{
|
||||
doorStatus = await _elevatorControlService.GetTagAsync(_eleCtlCfg.DevName, ElevatorConsts.DoorStatus);
|
||||
await Task.Delay(2000);
|
||||
} while (doorStatus != 4);
|
||||
Logger.Information($"当前门状态:{doorStatus}");
|
||||
|
||||
var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
|
||||
|
||||
Logger.Information($"目标楼层:{floor}");
|
||||
|
||||
//发送到目标楼的指令
|
||||
var reuslt = await _elevatorControlService.WriteTagAsync(_eleCtlCfg.DevName, ElevatorConsts.FloorExecute, floor);
|
||||
//电梯任务手动执行任务状态上报
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
|
||||
|
||||
do
|
||||
{
|
||||
tuple = await _elevatorControlService.GetElevatorStatus(_eleCtlCfg.DevName, CancellationToken.None);
|
||||
await Task.Delay(2000);
|
||||
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
||||
|
||||
Logger.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.停梯)
|
||||
{
|
||||
Log.Information($"disTask.require_id={disTask.require_id}");
|
||||
|
||||
List<string> disTaskIds = new() { disTask.id };
|
||||
Log.Information($"disTaskIds={string.Join(",", disTaskIds)}");
|
||||
TaskExecuteAfterUpInput teaUpInput = new() { disTaskIds = disTaskIds };
|
||||
await TaskExecuteAfter(teaUpInput);
|
||||
|
||||
TaskCompleUpInput tcUpInput = new() { disTaskIds = disTaskIds };
|
||||
await TaskComplate(tcUpInput);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
var devName = _elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName;
|
||||
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
|
||||
var doorStatus = -1;
|
||||
var closeDoorRes = await _elevatorControlService.SendOpenCloseCmd(devName, 4); //向电梯发送前门关门指令
|
||||
Logger.Information($"关门结果:{closeDoorRes}");
|
||||
do
|
||||
{
|
||||
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||
await Task.Delay(2000);
|
||||
} while (doorStatus != 4);
|
||||
Logger.Information($"当前门状态:{doorStatus}");
|
||||
|
||||
var floor = await GetRealFloor(disTask.end_floor.ParseToInt());
|
||||
|
||||
Logger.Information($"目标楼层:{floor}");
|
||||
|
||||
//发送到目标楼的指令
|
||||
var reuslt = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor);
|
||||
//电梯任务手动执行任务状态上报
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) tuple = (-1, -1, -1, -1, -1);
|
||||
|
||||
do
|
||||
{
|
||||
tuple = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
||||
await Task.Delay(2000);
|
||||
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
||||
|
||||
Logger.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.停梯)
|
||||
{
|
||||
Log.Information($"disTask.require_id={disTask.require_id}");
|
||||
var disTaskIds = new List<string> { disTask.id };
|
||||
var upInput = new { disTaskIds = disTask.id };
|
||||
TaskExecuteAfterUpInput teaUpInput = new()
|
||||
{
|
||||
disTaskIds = disTaskIds,
|
||||
};
|
||||
await TaskExecuteAfter(teaUpInput);
|
||||
TaskCompleUpInput tcUpInput = new()
|
||||
{
|
||||
disTaskIds = disTaskIds,
|
||||
};
|
||||
await TaskComplate(tcUpInput);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -746,7 +792,7 @@ namespace Tnb.WarehouseMgr
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error($"任务结束失败", ex);
|
||||
Log .Error($"任务结束失败堆栈异常", ex.StackTrace);
|
||||
Log.Error($"任务结束失败堆栈异常", ex.StackTrace);
|
||||
await _db.Ado.RollbackTranAsync();
|
||||
throw;
|
||||
}
|
||||
@@ -916,8 +962,9 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.Error("路径算法异常", ex);
|
||||
throw;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user