现在问题处理
This commit is contained in:
@@ -76,9 +76,11 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IWmsCarryBindService _wmsCarryBindService;
|
||||
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
|
||||
private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService;
|
||||
private static ISqlSugarClient db_agvElevatorTaskExceptionHandles;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private static readonly Dictionary<string, int> _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
private static Dictionary<string, object> locMap = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
|
||||
@@ -2564,15 +2566,11 @@ namespace Tnb.WarehouseMgr
|
||||
#region 电梯第三次改动
|
||||
|
||||
// 一托下的时候切换首选电梯
|
||||
//if (disTaskIds.Count == 1)
|
||||
//{
|
||||
// 选择另一个电梯座位首选电梯
|
||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
|
||||
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||
// 剩余可放托数
|
||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
|
||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||
//}
|
||||
if (disTaskIds.Count == 1)
|
||||
{
|
||||
await ChangeSelectedElevator(db);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -4473,6 +4471,323 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 电梯第三次改动 生成Agv到电梯任务
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
public async Task AgvelevatorTimerTaskExceptionHandle()
|
||||
{
|
||||
if (s_agvElevatortaskDic.CurrentCount == 0)
|
||||
return;
|
||||
|
||||
LoggerAgvElevatorTask.Information($"三楼出货检查暂存区");
|
||||
|
||||
await s_agvElevatortaskDic.WaitAsync();
|
||||
|
||||
if (db_agvElevatorTaskExceptionHandles == null)
|
||||
db_agvElevatorTaskExceptionHandles = _db.CopyNew();
|
||||
|
||||
try
|
||||
{
|
||||
var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
|
||||
if (floor3outstock != null && floor3outstock.value == "0")
|
||||
return;
|
||||
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
|
||||
// 获取暂存区需要生成任务的库位
|
||||
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||
.Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync();
|
||||
|
||||
if (agvElevatorStartLocs.Count > 0)
|
||||
{
|
||||
LoggerAgvElevatorTask.Information($"【AgvelevatorTimerTaskExceptionHandle】检查到需要下发到一楼任务的暂存区库位{agvElevatorStartLocs.Count}条 {string.Join(',', agvElevatorStartLocs.Select(x => x.location_code))}");
|
||||
|
||||
List<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
|
||||
|
||||
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
|
||||
{
|
||||
List<BasLocation> locs = group.ToList();
|
||||
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
|
||||
for (int i = 0; i < locs.Count; i++)
|
||||
{
|
||||
|
||||
// 交替选择缓存区库位
|
||||
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync();
|
||||
|
||||
if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右"))
|
||||
throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500);
|
||||
|
||||
BasLocation startloc = null;
|
||||
// 如果没切换就是当前发货区
|
||||
string 切换发货区 = YCLInnerTransfer.value;
|
||||
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
||||
{
|
||||
List<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||
.Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
|
||||
|
||||
startloc = locations.FirstOrDefault();
|
||||
#region 如果当前侧没有可用库位 切换另一侧继续发货,但是因为不能同时发两托同侧的货到同个电梯,所以必须保证当前优先级电梯是接第一托货
|
||||
// 交替出的时候可能会选不到库位,做特殊处理
|
||||
if (startloc == null)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发");
|
||||
var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||
|
||||
切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
|
||||
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
|
||||
|
||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == 切换发货区)
|
||||
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
||||
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||
.InnerJoin<WmsElevatorcacheArea>((a, b) => a.id == b.location_id)
|
||||
.Where((a, b) => b.name == 切换发货区 && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync();
|
||||
|
||||
startloc = locations.FirstOrDefault();
|
||||
// 如果还是选不到
|
||||
if (startloc == null)
|
||||
{
|
||||
throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常");
|
||||
}
|
||||
|
||||
var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
||||
// 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯
|
||||
if (_floor3FirstSelectElevatorTasknums.value == "2")
|
||||
{
|
||||
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯");
|
||||
}
|
||||
// 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯
|
||||
else
|
||||
{
|
||||
LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯");
|
||||
|
||||
string 切换电梯 = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
|
||||
LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货");
|
||||
|
||||
|
||||
WmsElevatorH _wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == 切换电梯).FirstAsync();
|
||||
// 仅切换电梯后 如果一托任务在等第二托时要做特殊处理
|
||||
if (_wmsElevatorH.task_nums == 1)
|
||||
{
|
||||
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles, "1");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 选择另一个电梯座位首选电梯
|
||||
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
|
||||
if (wmsCarryHs.Count > 1)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
|
||||
continue;
|
||||
}
|
||||
if (wmsCarryHs.Count == 0)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 选一楼出货库位
|
||||
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||
.Where(r => GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
|
||||
.OrderBy("location_code" + (切换发货区 == "3楼发货左" ? " desc" : "")).ToListAsync();
|
||||
|
||||
if (outLocations.Count == 0)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位");
|
||||
continue;
|
||||
}
|
||||
BasLocation outLocation = outLocations.FirstOrDefault();
|
||||
WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
|
||||
|
||||
WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault();
|
||||
|
||||
WmsElevatorH wmsElevatorH = null;
|
||||
|
||||
string elevatorSno = "";
|
||||
// 选电梯
|
||||
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
||||
{
|
||||
var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
||||
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||
|
||||
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
|
||||
elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
|
||||
|
||||
|
||||
// 检查有没有同时从同个暂存区分区发到同个电梯任务
|
||||
//if (wmsElevatorH.task_nums + wmsElevatorH.carry_count > 0)
|
||||
//{
|
||||
// List<string> currentAreaLocs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorcacheArea>().Where(r => r.name == 切换发货区).Select(r => r.location_code).ToListAsync();
|
||||
// // 同个暂存分区同个电梯的托盘
|
||||
// List<string> _carrys = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPretaskH>()
|
||||
// .InnerJoin<WmsPretaskH>((a, b) => currentAreaLocs.Contains(a.startlocation_code) && a.carry_code == b.carry_code
|
||||
// && a.endlocation_code == b.startlocation_code && a.endlocation_code == $"DT-3-{elevatorSno}")
|
||||
// .Where((a, b) => (a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)
|
||||
// || (b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)).Select((a, b) => a.carry_code).ToListAsync();
|
||||
|
||||
// if (_carrys.Count > 0)
|
||||
// {
|
||||
// LoggerAgvElevatorTask.LogInformation($"出现同时从同个暂存区分区发到同个电梯{wmsElevatorH.elevator_code}的托盘{string.Join(',', _carrys)},等待托盘任务完成");
|
||||
// continue;
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString();
|
||||
if (floor3FirstSelectElevatorTasknums.value == "0")
|
||||
{
|
||||
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 仅切换电梯后 如果一托任务在等第二托时要做特殊处理
|
||||
if (wmsElevatorH.task_nums == 1)
|
||||
{
|
||||
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 剩余可放托数
|
||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
|
||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
List<WmsPointH> wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().Where(it => it.status == 1).ToListAsync();
|
||||
List<WmsPointH> points = new List<WmsPointH>();
|
||||
|
||||
// 到电梯
|
||||
WmsPointH cacheOut_point = wmsPointHs.Where(r => r.location_code == startloc.location_code).First().Copy();
|
||||
WmsPointH DT_C_point = wmsPointHs.Where(r => r.point_code == $"DT-C-03-0{elevatorSno}").First().Copy();
|
||||
cacheOut_point.area_code = "FC";
|
||||
DT_C_point.area_code = "FC";
|
||||
|
||||
points.Add(cacheOut_point);
|
||||
points.Add(DT_C_point);
|
||||
// 到一楼
|
||||
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First());
|
||||
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First());
|
||||
points.Add(wmsPointHs.Where(r => r.point_code == $"DT-R-01-0{elevatorSno}").First());
|
||||
points.Add(outPoint);
|
||||
|
||||
//根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序)
|
||||
if (points?.Count > 0)
|
||||
{
|
||||
List<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
|
||||
{
|
||||
WmsPointH? sPoint = it.FirstOrDefault();
|
||||
WmsPointH? ePoint = it.LastOrDefault();
|
||||
|
||||
WmsPretaskH preTask = new()
|
||||
{
|
||||
org_id = WmsWareHouseConst.AdministratorOrgId,
|
||||
startlocation_id = sPoint?.location_id!,
|
||||
startlocation_code = sPoint?.location_code!,
|
||||
endlocation_id = ePoint?.location_id!,
|
||||
endlocation_code = ePoint?.location_code!,
|
||||
start_floor = sPoint?.floor.ToString(),
|
||||
end_floor = ePoint?.floor.ToString(),
|
||||
startpoint_id = sPoint?.id!,
|
||||
startpoint_code = sPoint?.point_code!,
|
||||
endpoint_id = ePoint?.id!,
|
||||
endpoint_code = ePoint?.point_code!,
|
||||
bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
|
||||
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
|
||||
biz_type = wmsCarryH.biz_type,
|
||||
task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID
|
||||
};
|
||||
preTask.carry_id = wmsCarryH.id;
|
||||
preTask.carry_code = wmsCarryH.carry_code;
|
||||
preTask.area_id = sPoint?.area_id!;
|
||||
preTask.area_code = it.Key;
|
||||
// 载具记录 require_id todo
|
||||
preTask.require_id = wmsCarryH.require_id;
|
||||
preTask.require_code = "";
|
||||
preTask.create_id = _userManager.UserId;
|
||||
preTask.create_time = DateTime.Now;
|
||||
return preTask;
|
||||
}).ToList();
|
||||
bool isOk = await GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles);
|
||||
if (isOk)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogInformation($"成功下发预任务 {string.Join(',', preTasks.Select(r => r.bill_code))}");
|
||||
LoggerAgvElevatorTask.LogInformation($"成功下发载具 {string.Join(',', preTasks.Select(r => r.carry_code).Distinct())}");
|
||||
//查询库位表
|
||||
BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>().SingleAsync(it => it.id == startloc.id);
|
||||
{
|
||||
//载具加锁,增加库位信息
|
||||
_ = await db_agvElevatorTaskExceptionHandles.Updateable<WmsCarryH>().SetColumns(it => new WmsCarryH
|
||||
{
|
||||
carry_status = ((int)EnumCarryStatus.占用).ToString(),
|
||||
is_lock = 1,
|
||||
location_id = startloc.id,
|
||||
location_code = location.location_code
|
||||
}).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (切换发货区 == "3楼发货左" ? "3楼发货右" : "3楼发货左"))
|
||||
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
||||
|
||||
//所有库位加锁
|
||||
string?[] ids = new[] { startloc.id, preTasks[0].endlocation_id, outLocation.id };
|
||||
_ = await db_agvElevatorTaskExceptionHandles.Updateable<BasLocation>().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("预任务生成失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync();
|
||||
}
|
||||
}
|
||||
catch (ObjectDisposedException ex)
|
||||
{
|
||||
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.Message}");
|
||||
LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}");
|
||||
if (ex.Source == "Npgsql")
|
||||
db_agvElevatorTaskExceptionHandles = _db.CopyNew();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("【AgvelevatorTimerTaskExceptionHandle】" + ex.Message);
|
||||
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.Message}");
|
||||
LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.StackTrace}");
|
||||
// 数据库连接断开时会报错
|
||||
try { await db_agvElevatorTaskExceptionHandles.Ado.RollbackTranAsync(); } catch { };
|
||||
}
|
||||
finally
|
||||
{
|
||||
s_agvElevatortaskDic.Release();
|
||||
}
|
||||
}
|
||||
|
||||
async Task ChangeSelectedElevator(ISqlSugarClient db, string maxposcount = "2")
|
||||
{
|
||||
BasFactoryConfig floor3FirstSelectElevator = await db.Queryable<BasFactoryConfig>().Where(r => r.key == "floor3FirstSelectElevator").FirstAsync();
|
||||
string elevator = floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
|
||||
LoggerAgvElevatorTask.LogInformation($"重置首选电梯为{elevator}");
|
||||
// 选择另一个电梯座位首选电梯
|
||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == elevator)
|
||||
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||
|
||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == maxposcount)
|
||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user