From c81c639a19a16d2f5b6addd873f5787c05504c4e Mon Sep 17 00:00:00 2001 From: btobab Date: Sun, 21 Sep 2025 13:11:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=93=E4=BD=8D=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=85=88=E4=BD=BF?= =?UTF-8?q?=E7=94=A82=E6=B7=B1=E5=BA=A6=E5=BA=93=E4=BD=8D=EF=BC=8C?= =?UTF-8?q?=E5=BD=932=E6=B7=B1=E5=BA=A6=E5=BA=93=E4=BD=8D=E8=80=97?= =?UTF-8?q?=E5=B0=BD=E5=90=8E=E5=90=AF=E7=94=A81=E6=B7=B1=E5=BA=A6?= =?UTF-8?q?=E5=BA=93=E4=BD=8D=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=89=8D=E6=9C=9F?= =?UTF-8?q?=E8=BF=98=E6=9C=AA=E5=85=A5=E5=BA=93=E5=BE=88=E5=A4=9A=E7=89=A9?= =?UTF-8?q?=E6=96=99=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E5=87=BA?= =?UTF-8?q?=E5=BA=93=E6=97=B6=E5=B0=B1=E9=9C=80=E8=A6=81=E7=A7=BB=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceImpl/StackerTaskServiceImpl.java | 65 +++++++++++++++---- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/202504-Wms-MengYang-tp/wms_serve_mengyang/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java b/202504-Wms-MengYang-tp/wms_serve_mengyang/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java index cf894a8..a4300e3 100644 --- a/202504-Wms-MengYang-tp/wms_serve_mengyang/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java +++ b/202504-Wms-MengYang-tp/wms_serve_mengyang/src/main/java/com/wms_main/service/business/serviceImpl/StackerTaskServiceImpl.java @@ -104,7 +104,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService { * @return 申请到的库位,null表示无库位可用 */ @Override - public TAppLocation requestOneLocation(TAppLocation locationFilter, String requestVehicleId) { + public TAppLocation requestOneLocation(TAppLocation locationFilter, String requestVehicleId) { // 目标库位 TAppLocation targetLocation = null; // 设备号优先级序列 @@ -130,6 +130,13 @@ public class StackerTaskServiceImpl implements IStackerTaskService { .eq(TAppLocation::getEquipmentId, equipmentId); // 查询库位 List locationList = appLocationService.list(queryWrapper); + if (locationList == null || locationList.isEmpty()) { + continue; + } + // 计算当前设备的最大深度(默认2) + int maxDepth = locationList.stream().mapToInt(TAppLocation::getLDepth).max().orElse(2); + + // 候选库位:先按过滤条件筛选,并按 LRow -> LCol -> LLayer 排序 List candidateLocationList = locationList.stream().filter(item -> { boolean filterResult = item.getIsWorking() == 0 && item.getIsLock() == 0 && item.getIsOccupy() == 0; if (locationFilter != null) { @@ -144,39 +151,73 @@ public class StackerTaskServiceImpl implements IStackerTaskService { } } return filterResult; - }).sorted(Comparator.comparingInt(TAppLocation::getLDepth).reversed()) - .sorted(Comparator.comparingInt(location -> location.getLCol() + location.getLLayer())) + }).sorted(Comparator.comparingInt(TAppLocation::getLRow) + .thenComparingInt(TAppLocation::getLCol) + .thenComparingInt(TAppLocation::getLLayer)) .toList(); - // 判断是否输入了subArea + + // 若指定了 subArea,则基于上述排序优先同 subArea 的库位 if (locationFilter != null && StringUtils.isNotEmpty(locationFilter.getSubArea())) { - // 对candidateLocationList进行排序 List firstList = candidateLocationList.stream() .filter(item -> item.getSubArea().equals(locationFilter.getSubArea())).toList(); List lastList = candidateLocationList.stream() .filter(item -> !item.getSubArea().equals(locationFilter.getSubArea())).toList(); - candidateLocationList = new ArrayList<>(firstList);// 先添加符合subArea的库位 - candidateLocationList.addAll(lastList);// 再添加不符合subArea的库位 + candidateLocationList = new ArrayList<>(firstList); + candidateLocationList.addAll(lastList); } - // 找一个空闲的库位 + + // 第一轮:只尝试最大深度(例如 2 深度)库位 for (TAppLocation candidateLocation : candidateLocationList) { + if (!Objects.equals(candidateLocation.getLDepth(), maxDepth)) { + continue; // 只处理最大深度 + } if (candidateLocation.getIsWorking() == 1 || candidateLocation.getIsLock() == 1 || candidateLocation.getIsOccupy() == 1) { continue; } if (isMaxDepthAvailable(locationList, candidateLocation)) { try { - // 尝试锁定库位,锁定成功就返回 + // 申请当前库位,如果成功则返回 if (appLocationService.update(new LambdaUpdateWrapper() .set(TAppLocation::getIsOccupy, 1) .set(TAppLocation::getVehicleId, requestVehicleId) .eq(TAppLocation::getLocationId, candidateLocation.getLocationId()) .eq(TAppLocation::getIsOccupy, 0))) { - // 当前库位可用 targetLocation = candidateLocation; break; } } catch (Exception e) { - log.error("锁定库位{}失败。", candidateLocation.getLocationId()); + log.error("请求库位{}失败.", candidateLocation.getLocationId()); + } + } + } + if (targetLocation != null) { + // 找到了目标库位 + break; + } + + // 第二轮:若最大深度库位都不可用,再尝试其它深度(如 1 深度)库位 + for (TAppLocation candidateLocation : candidateLocationList) { + if (Objects.equals(candidateLocation.getLDepth(), maxDepth)) { + continue; // 第一轮已经尝试 + } + if (candidateLocation.getIsWorking() == 1 || candidateLocation.getIsLock() == 1 + || candidateLocation.getIsOccupy() == 1) { + continue; + } + if (isMaxDepthAvailable(locationList, candidateLocation)) { + try { + // 申请当前库位,如果成功则返回 + if (appLocationService.update(new LambdaUpdateWrapper() + .set(TAppLocation::getIsOccupy, 1) + .set(TAppLocation::getVehicleId, requestVehicleId) + .eq(TAppLocation::getLocationId, candidateLocation.getLocationId()) + .eq(TAppLocation::getIsOccupy, 0))) { + targetLocation = candidateLocation; + break; + } + } catch (Exception e) { + log.error("请求库位{}失败.", candidateLocation.getLocationId()); } } } @@ -189,7 +230,7 @@ public class StackerTaskServiceImpl implements IStackerTaskService { appCommon.updateWorkingLocations(targetLocation.getLocationId(), 1); } - // 返回库位,如果返回null则表示没有可用库位 + // 返回库位,若为 null 表示无可用库位 return targetLocation; }