diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 702af71d..b62cf902 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -2120,9 +2120,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable().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; if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) @@ -2138,7 +2136,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}"); continue; } - if (wmsCarryHs.Count == 1) + if (wmsCarryHs.Count == 0) { LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘"); continue; @@ -2149,18 +2147,23 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 选电梯 if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) { - List wmsElevatorHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_group == "2" && r.enabled == 1).ToListAsync(); + var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); - foreach (WmsElevatorH _wmsElevatorH in wmsElevatorHs) + wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync(); + + floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString(); + if (floor3FirstSelectElevatorTasknums.value == "0") { - // 加上暂存区到电梯的任务数 - List wmsPretaskHs = await db_agvElevatorTaskExceptionHandles.Queryable() - .Where(r => r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID || r.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && r.startlocation_id == startloc.id).ToListAsync(); - - _wmsElevatorH.carry_count += wmsPretaskHs.Count; + // 选择另一个电梯座位首选电梯 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + // 重置为可放两托 + floor3FirstSelectElevatorTasknums.value = "2"; } - - wmsElevatorH = wmsElevatorHs.OrderBy(r => r.carry_count).FirstOrDefault(); + // 剩余可放托数 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value) + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); } string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", ""); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index dd68cccf..cef76731 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1460,19 +1460,56 @@ namespace Tnb.WarehouseMgr !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) .ToList(); + + var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList(); + + //Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks)); + //Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks)); + //Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks)); + + /* IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); + agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; + */ + + //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 + var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); + if (equalEndLocPreTasks.Any()) + { + Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 "); + agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList(); + } + #region 三楼三四号梯如果与判断一托下有冲突 #region 电梯第三次改动 // 到暂存区的未完成任务 List wmsdistasks_agvElevator = await _db.Queryable() .InnerJoin((a, b) => a.endlocation_id == b.id) - .Where((a, b) => a.status != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID && a.status != WmsWareHouseConst.BILLSTATUS_CANCEL_ID + .Where((a, b) => a.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.TASK_BILL_STATUS_CANCEL_ID && b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID) .ToListAsync(); - // 过滤同目标库位的正在执行的预任务 - agvElevatorTasks = agvElevatorTasks.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); + // 到暂存区的未完成预任务 + List wmspretasks_agvElevator = await _db.Queryable() + .InnerJoin((a, b) => a.endlocation_id == b.id) + .InnerJoin((a, b, c) => a.area_id == c.id) + .Where((a, b) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID + && b.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID) + .Select((a, b, c) => new WmsPretaskH + { + move_num = c.move_num, + third_eqp_type = c.third_eqp_type, + }, true) + .ToListAsync(); + // 过滤normalPreTasks中的到三楼暂存区任务 + normalPreTasks = normalPreTasks.Where(r => !wmspretasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); + + // 过滤到三楼暂存区同目标库位的正在执行的任务 + var cacheLocTasks = wmspretasks_agvElevator.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); // 过滤重复目标库位的预任务 - agvElevatorTasks = agvElevatorTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList(); + cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList(); + + normalPreTasks = normalPreTasks.Concat(cacheLocTasks).ToList(); #endregion @@ -1512,27 +1549,9 @@ namespace Tnb.WarehouseMgr #endregion - - var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList(); - - //Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks)); - //Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks)); - //Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks)); - - /* IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); - agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; - */ - - //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 - var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); - if (equalEndLocPreTasks.Any()) - { - Logger.Information("【GenTaskExecute】 执行:如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 "); - agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList(); - } preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList(); + //一楼中储仓CTU List ids = preTasks.Select(x => x.id).Distinct().ToList(); @@ -2354,8 +2373,23 @@ namespace Tnb.WarehouseMgr { Logger.Information($"通知WCS电梯{devName}下行接口调用成功"); } + + #region 电梯第三次改动 + + // 一托下的时候切换首选电梯 + if (disTaskIds.Count == 1) + { + // 选择另一个电梯座位首选电梯 + await db.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + // 剩余可放托数 + await db.Updateable().SetColumns(r => r.value == "2") + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } + + #endregion } - + } } catch { throw; } @@ -2802,7 +2836,7 @@ namespace Tnb.WarehouseMgr { id = multiList[i].endlocation_id, is_lock = 0, - carry_count = locCarrycountMap[endLocId] == null ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1, + carry_count = locCarrycountMap[endLocId] == null || string.IsNullOrEmpty(locCarrycountMap[endLocId].ToString()) ? 1: int.Parse(locCarrycountMap[endLocId].ToString()) + 1, is_use = string.IsNullOrEmpty(multiList[i].carry_status) ? ((int)EnumCarryStatus.占用).ToString() : multiList[i].carry_status }; if (!string.IsNullOrEmpty(multiList[i].carry_status)) @@ -2810,8 +2844,6 @@ namespace Tnb.WarehouseMgr loc.is_use = ((int)EnumCarryStatus.占用).ToString(); } - - // 如果是出入库位 完成后解除占用 string? is_type = locTypeMap.ContainsKey(endLocId) ? locTypeMap[endLocId].ToString() : ""; if (is_type == ((int)EnumLocationType.出入库位).ToString()) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs index 864d3c6d..d338b3d1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs @@ -232,7 +232,7 @@ namespace Tnb.WarehouseMgr } List locations = await _db.Queryable() .InnerJoin((a, b) => a.id == b.location_id) - .Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.is_lock,a.is_use,carry_count,a.location_code").ToListAsync(); + .Where((a, b) => b.name == YCLInnerTransfer.value).OrderBy("a.is_lock,a.is_use,a.carry_count+a.task_nums,a.location_code").ToListAsync(); endLocation = locations.FirstOrDefault(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs index fb35bc1a..beef9143 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs @@ -62,7 +62,6 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } - BasLocation endLocation = await _db.Queryable().Where(r => r.id == input.wmsDistaskH.endlocation_id).FirstAsync(); // 生产入库(灭菌完成) 仓库传 1001A1100000001MA8KP if (endLocation.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID)