电梯并行优化,取消与重置任务逻辑优化
This commit is contained in:
@@ -117,7 +117,7 @@ namespace Tnb.ProductionMgr
|
||||
public SemaphoreSlim s_taskF2KTPsupplement = new(1);
|
||||
public SemaphoreSlim s_taskYCLInternalTransfer = new(1);
|
||||
|
||||
public SemaphoreSlim s_elevatortask = new(1);
|
||||
public Dictionary<string, SemaphoreSlim> s_elevatortaskDic = new();
|
||||
|
||||
private StackExRedisHelper _redisData;
|
||||
private readonly IPrdInstockService _prdInstockService;
|
||||
@@ -138,7 +138,7 @@ namespace Tnb.ProductionMgr
|
||||
private ISqlSugarClient db_Floor4DMJ2MJX;
|
||||
private ISqlSugarClient db_Floor4MJX2MJC;
|
||||
private ISqlSugarClient db_Floor4DMC2CPK;
|
||||
private ISqlSugarClient db_ElevatorTaskExceptionHandle;
|
||||
private List<ISqlSugarClient> db_ElevatorTaskExceptionHandles = new ();
|
||||
private ISqlSugarClient db_F2KTPsupplement;
|
||||
private ISqlSugarClient db_YCLInternalTransfer;
|
||||
|
||||
@@ -196,9 +196,18 @@ namespace Tnb.ProductionMgr
|
||||
db_Floor4DMJ2MJX = repository.CopyNew();
|
||||
db_Floor4MJX2MJC = repository.CopyNew();
|
||||
db_Floor4DMC2CPK = repository.CopyNew();
|
||||
db_ElevatorTaskExceptionHandle = repository.CopyNew();
|
||||
db_F2KTPsupplement = repository.CopyNew();
|
||||
db_YCLInternalTransfer = repository.CopyNew();
|
||||
|
||||
List<string> elevatorAreas = repository.CopyNew().Queryable<WmsElevatorH>().Select(r => r.area_code).Distinct().ToList();
|
||||
foreach (var s_elevatorArea in elevatorAreas)
|
||||
{
|
||||
ISqlSugarClient db_ElevatorTaskExceptionHandle = repository.CopyNew();
|
||||
db_ElevatorTaskExceptionHandles.Add(db_ElevatorTaskExceptionHandle);
|
||||
SemaphoreSlim s_elevatortask = new(1);
|
||||
s_elevatortaskDic.Add(s_elevatorArea, s_elevatortask);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -1918,98 +1927,123 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
||||
|
||||
async void ElevatorTaskExceptionHandle(object args)
|
||||
{
|
||||
if (s_elevatortask.CurrentCount == 0)
|
||||
return;
|
||||
|
||||
try
|
||||
Task[] taskActions = new Task[s_elevatortaskDic.Count];
|
||||
int index = 0;
|
||||
foreach (string area in s_elevatortaskDic.Keys)
|
||||
{
|
||||
SemaphoreSlim s_elevatortask = s_elevatortaskDic[area];
|
||||
|
||||
if (s_elevatortask.CurrentCount == 0)
|
||||
return;
|
||||
|
||||
await s_elevatortask.WaitAsync();
|
||||
List<WmsDistaskH> elevatorTasks = db_ElevatorTaskExceptionHandle.Queryable<WmsDistaskH>()
|
||||
.Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null
|
||||
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
|
||||
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复/执行的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}");
|
||||
|
||||
|
||||
if (elevatorTasks?.Count > 0)
|
||||
var db_ElevatorTaskExceptionHandle = db_ElevatorTaskExceptionHandles[index];
|
||||
taskActions[index] = Task.Run(async () =>
|
||||
{
|
||||
List<IGrouping<string, WmsDistaskH>> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList();
|
||||
foreach (IGrouping<string, WmsDistaskH> group in elevatorTaskGroup)
|
||||
try
|
||||
{
|
||||
List<WmsDistaskH> wmsDistaskHs = group.ToList();
|
||||
ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code };
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
|
||||
var e = await _wareHouseService.FindElevatorFromPars(q);
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
|
||||
List<WmsDistaskH> elevatorTasks = db_ElevatorTaskExceptionHandle.Queryable<WmsDistaskH>()
|
||||
.Where(r => r.area_code == area && r.act_start_date == null && r.act_end_date == null
|
||||
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).ToList();
|
||||
|
||||
// 三、四号梯发货带两托货
|
||||
string[] doubleCarryRunElevators =
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复/执行的电梯任务{elevatorTasks.Count}条 {string.Join(',', elevatorTasks.Select(x => x.bill_code))}");
|
||||
|
||||
|
||||
if (elevatorTasks?.Count > 0)
|
||||
{
|
||||
List<IGrouping<string, WmsDistaskH>> elevatorTaskGroup = elevatorTasks.GroupBy(r => $"{r.endlocation_code} {r.end_floor}").ToList();
|
||||
foreach (IGrouping<string, WmsDistaskH> group in elevatorTaskGroup)
|
||||
{
|
||||
List<WmsDistaskH> wmsDistaskHs = group.ToList();
|
||||
ElevagorInfoQuery q = new() { endlocation_id = wmsDistaskHs[0].endlocation_id, taskCode = wmsDistaskHs[0].bill_code };
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
|
||||
var e = await _wareHouseService.FindElevatorFromPars(q);
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
|
||||
|
||||
// 三、四号梯发货带两托货
|
||||
string[] doubleCarryRunElevators =
|
||||
{
|
||||
"Elevator3","Elevator4"
|
||||
};
|
||||
if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
|
||||
{
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】判断为三四号梯任务");
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】现在有{group.Count()}托货");
|
||||
// 电梯内放置两托货呼叫电梯下
|
||||
if (group.Count() == 2)
|
||||
{
|
||||
if (e != null)
|
||||
if (doubleCarryRunElevators.Contains(e.elevator_code) && wmsDistaskHs[0].end_floor == 1)
|
||||
{
|
||||
wmsDistaskHs[0].device_id = e.device_id;
|
||||
wmsDistaskHs[1].device_id = e.device_id;
|
||||
}
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}");
|
||||
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}执行完成");
|
||||
}
|
||||
// 一托货
|
||||
else if (group.Count() == 1)
|
||||
{
|
||||
// 如果当前电梯没有执行中的任务 则呼叫电梯下
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】判断为三四号梯任务");
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】现在有{group.Count()}托货");
|
||||
// 电梯内放置两托货呼叫电梯下
|
||||
if (group.Count() == 2)
|
||||
{
|
||||
if (e != null)
|
||||
{
|
||||
wmsDistaskHs[0].device_id = e.device_id;
|
||||
wmsDistaskHs[1].device_id = e.device_id;
|
||||
}
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}");
|
||||
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}执行完成");
|
||||
}
|
||||
// 一托货
|
||||
else if (group.Count() == 1)
|
||||
{
|
||||
// 如果当前电梯没有执行中的任务 则呼叫电梯下
|
||||
|
||||
if (db_ElevatorTaskExceptionHandle.Queryable<WmsDistaskH>().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
|
||||
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
|
||||
if (db_ElevatorTaskExceptionHandle.Queryable<WmsDistaskH>().Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID
|
||||
&& r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.endlocation_id == wmsDistaskHs[0].startlocation_id).Count() == 0)
|
||||
{
|
||||
if (e != null)
|
||||
{
|
||||
wmsDistaskHs[0].device_id = e.device_id;
|
||||
}
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}");
|
||||
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}执行完成");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】判断为非三四号梯任务");
|
||||
if (e != null)
|
||||
{
|
||||
wmsDistaskHs[0].device_id = e.device_id;
|
||||
}
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}");
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}");
|
||||
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}执行完成");
|
||||
LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】呼叫电梯 {e.elevator_code}执行完成");
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】电梯 {e.elevator_code} 待执行的电梯任务数异常 目前是{group.Count()} 超过了两托");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】判断为非三四号梯任务");
|
||||
if (e != null)
|
||||
{
|
||||
wmsDistaskHs[0].device_id = e.device_id;
|
||||
}
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}");
|
||||
await _wareHouseService.ExecuteTargetFloorTask(wmsDistaskHs);
|
||||
LoggerElevatorTask.Information($"【GenTaskExecute】呼叫电梯 {e.elevator_code}执行完成");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LoggerFloor2RackDelivery.LogError($"【ElevatorTaskExceptionHandle】{ex.Message}");
|
||||
LoggerFloor2RackDelivery.LogError($"【ElevatorTaskExceptionHandle】{ex.StackTrace}");
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_elevatortask.Release();
|
||||
catch (ObjectDisposedException ex)
|
||||
{
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】 数据库连接异常:{ex.Message}");
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}");
|
||||
if (ex.Source == "Npgsql")
|
||||
db_ElevatorTaskExceptionHandle = _repository.AsSugarClient().CopyNew();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("【ElevatorTaskExceptionHandle】" + ex.Message);
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】 {ex.Message}");
|
||||
LoggerElevatorTask.LogError($"【ElevatorTaskExceptionHandle】 {ex.StackTrace}");
|
||||
// 数据库连接断开时会报错
|
||||
try { await db_ElevatorTaskExceptionHandle.Ado.RollbackTranAsync(); } catch { };
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_elevatortask.Release();
|
||||
}
|
||||
});
|
||||
index++;
|
||||
}
|
||||
|
||||
Task.WaitAll(taskActions);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user