diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java index 4ffb3fa3..bae8934b 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java @@ -1788,25 +1788,40 @@ public class StructuralPackageOrderController extends BaseController { // 9. 处理每个托盘的物料 List allQrCodeDTOs = new ArrayList<>(); + // 提前获取订单下所有托盘项(此时trayId可能为空),用于后续匹配 + List allOrderTrayItems = structuralPackageOrderTrayItemService.getList(orderId); + + // 记录已经使用过的托盘项ID,避免重复匹配 + Set usedTrayItemIds = new HashSet<>(); + for (TraySubmitQO trayQO : request.getTrays()) { WmsStructuralPackageOrderTray tray = trays.stream() .filter(t -> StrUtil.equals(t.getNo(), trayQO.getTrayNo())) .findFirst() .orElse(null); - // 获取托盘项 - List trayItems = structuralPackageOrderTrayItemService.getListByTrayId(tray.getId()); + // 收集当前托盘需要绑定的托盘项 + List currentTrayItems = new ArrayList<>(); // 处理托盘中的每个物料 for (TrayMaterialQO materialQO : trayQO.getItems()) { - WmsStructuralPackageOrderTrayItem trayItem = trayItems.stream() + // 从订单级别的所有托盘项中查找匹配的物料(排除已使用的,且trayId为null或-1表示未绑定) + WmsStructuralPackageOrderTrayItem trayItem = allOrderTrayItems.stream() + .filter(item -> !usedTrayItemIds.contains(item.getId())) .filter(item -> StrUtil.equals(item.getMaterialNo(), materialQO.getMaterialNo())) + .filter(item -> Objects.isNull(item.getTrayId()) || item.getTrayId() == -1 || item.getTrayId() == 0) .findFirst() .orElse(null); VUtil.trueThrowBusinessError(Objects.isNull(trayItem)) .throwMessage("托盘" + trayQO.getTrayNo() + "中物料" + materialQO.getMaterialNo() + "不存在"); + // 标记该托盘项已被使用 + usedTrayItemIds.add(trayItem.getId()); + + // 将托盘项加入当前托盘列表 + currentTrayItems.add(trayItem); + // 更新托盘项的trayId trayItem.setTrayId(tray.getId()); @@ -1837,8 +1852,10 @@ public class StructuralPackageOrderController extends BaseController { } } - // 批量更新托盘项的trayId - structuralPackageOrderTrayItemService.updateBatchById(trayItems); + // 批量更新当前托盘项的trayId + if (CollectionUtil.isNotEmpty(currentTrayItems)) { + structuralPackageOrderTrayItemService.updateBatchById(currentTrayItems); + } // 更新托盘状态为已打包 VUtil.trueThrowBusinessError(!structuralPackageOrderTrayService.lambdaUpdate() @@ -1898,25 +1915,40 @@ public class StructuralPackageOrderController extends BaseController { // 5. 处理每个托盘的物料 List allQrCodeDTOs = new ArrayList<>(); + // 提前获取订单下所有托盘项(此时trayId可能为空),用于后续匹配 + List allOrderTrayItems = structuralPackageOrderTrayItemService.getList(orderId); + + // 记录已经使用过的托盘项ID,避免重复匹配 + Set usedTrayItemIds = new HashSet<>(); + for (TraySubmitQO trayQO : request.getTrays()) { WmsStructuralPackageOrderTray tray = trays.stream() .filter(t -> StrUtil.equals(t.getNo(), trayQO.getTrayNo())) .findFirst() .orElse(null); - // 获取托盘项 - List trayItems = structuralPackageOrderTrayItemService.getListByTrayId(tray.getId()); + // 收集当前托盘需要绑定的托盘项 + List currentTrayItems = new ArrayList<>(); // 处理托盘中的每个物料 for (TrayMaterialQO materialQO : trayQO.getItems()) { - WmsStructuralPackageOrderTrayItem trayItem = trayItems.stream() + // 从订单级别的所有托盘项中查找匹配的物料(排除已使用的,且trayId为null或-1表示未绑定) + WmsStructuralPackageOrderTrayItem trayItem = allOrderTrayItems.stream() + .filter(item -> !usedTrayItemIds.contains(item.getId())) .filter(item -> StrUtil.equals(item.getMaterialNo(), materialQO.getMaterialNo())) + .filter(item -> Objects.isNull(item.getTrayId()) || item.getTrayId() == -1 || item.getTrayId() == 0) .findFirst() .orElse(null); VUtil.trueThrowBusinessError(Objects.isNull(trayItem)) .throwMessage("托盘" + trayQO.getTrayNo() + "中物料" + materialQO.getMaterialNo() + "不存在"); + // 标记该托盘项已被使用 + usedTrayItemIds.add(trayItem.getId()); + + // 将托盘项加入当前托盘列表 + currentTrayItems.add(trayItem); + // 判断该物料是否在差异列表中 boolean hasDiff = request.getDiffList().stream() .anyMatch(diff -> StrUtil.equals(diff.getMaterialNo(), materialQO.getMaterialNo())); @@ -1954,8 +1986,10 @@ public class StructuralPackageOrderController extends BaseController { } } - // 批量更新托盘项的trayId - structuralPackageOrderTrayItemService.updateBatchById(trayItems); + // 批量更新当前托盘项的trayId + if (CollectionUtil.isNotEmpty(currentTrayItems)) { + structuralPackageOrderTrayItemService.updateBatchById(currentTrayItems); + } // 更新托盘状态为已打包 VUtil.trueThrowBusinessError(!structuralPackageOrderTrayService.lambdaUpdate() diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayMapper.xml index ba6f122e..930afaea 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsStructuralPackageOrderTrayMapper.xml @@ -5,7 +5,7 @@