From f0547a4c8dc8495af58ba6bf13169e38de18a07e Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 20 Dec 2025 14:50:21 +0800 Subject: [PATCH] =?UTF-8?q?refactor(wms):=20=E4=BC=98=E5=8C=96=E5=BA=93?= =?UTF-8?q?=E4=BD=8D=E6=8B=86=E5=88=86=E4=B8=8E=E5=90=88=E5=B9=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除子库位启用状态的重复设置 - 改进子库位排序算法,提升性能和准确性 - 优化编码生成逻辑,支持更灵活的层级分配 - 批量处理父库位状态更新,提高执行效率 - 增强合并前的占用检查机制 - 实现子库位隐藏和父库位重置的批量操作 - 添加空值检查和异常处理,提升代码健壮性 --- .../impl/WmsActualWarehouseServiceImpl.java | 211 +++++++++++++----- 1 file changed, 155 insertions(+), 56 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java index 29412a65..9de5a724 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java @@ -479,7 +479,6 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService // 复用原有子库位:恢复启用状态,更新拆分类型 for (WmsActualWarehouse child : existingChildren) { child.setDelFlag(0); // 恢复未删除 - child.setIsEnabled(1); child.setSplitStatus(1); child.setSplitType(splitType); toUpdate.add(child); @@ -549,40 +548,88 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService allSubLocations.addAll(toInsert); allSubLocations.addAll(toUpdate); - // 按父库位排序(保持物理顺序) - allSubLocations.sort((a, b) -> { - Long parentA = a.getParentId(); - Long parentB = b.getParentId(); - int idxA = columnLocations.stream().map(WmsActualWarehouse::getActualWarehouseId).collect(Collectors.toList()).indexOf(parentA); - int idxB = columnLocations.stream().map(WmsActualWarehouse::getActualWarehouseId).collect(Collectors.toList()).indexOf(parentB); - return Integer.compare(idxA, idxB); - }); + if (!allSubLocations.isEmpty()) { + // 按父库位在columnLocations中的顺序排序 + Map parentOrderMap = new HashMap<>(); + for (int i = 0; i < columnLocations.size(); i++) { + parentOrderMap.put(columnLocations.get(i).getActualWarehouseId(), i); + } - // 生成规范编码 - String prefix = columnFlag; - List codeToUpdate = new ArrayList<>(); - for (int i = 0; i < allSubLocations.size(); i++) { - WmsActualWarehouse sub = allSubLocations.get(i); - int sequenceNum = (i / 2) + 1; - int layer = (i % 2) + 1; - String newCode = String.format("%s-X%02d-%d", prefix, sequenceNum, layer); + allSubLocations.sort((a, b) -> { + int orderA = parentOrderMap.getOrDefault(a.getParentId(), Integer.MAX_VALUE); + int orderB = parentOrderMap.getOrDefault(b.getParentId(), Integer.MAX_VALUE); + if (orderA != orderB) { + return Integer.compare(orderA, orderB); + } + // 同一父库位下,按层级排序(假设层级1在前,层级2在后) + return Long.compare(a.getActualWarehouseId(), b.getActualWarehouseId()); + }); - sub.setActualWarehouseCode(newCode); - sub.setActualWarehouseName(newCode); - codeToUpdate.add(sub); + // 生成规范编码 + String prefix = columnFlag; + List codeToUpdate = new ArrayList<>(); + + int sequenceNum = 1; + for (int i = 0; i < allSubLocations.size(); i++) { + WmsActualWarehouse sub = allSubLocations.get(i); + + // 判断是第一层还是第二层 + // 如果是拆分库位的子库位,按顺序分配层级 + // 如果是剩余库位的子库位,保持原层级 + Long parentId = sub.getParentId(); + boolean isFromSplitLocation = splitLocations.stream() + .anyMatch(loc -> loc.getActualWarehouseId().equals(parentId)); + + int layer; + if (isFromSplitLocation) { + // 拆分库位:第一个子库位是层级1,第二个是层级2 + final int currentIndex = i; // 创建一个有效的final变量 + long sameParentCount = allSubLocations.stream() + .filter(s -> s.getParentId().equals(parentId)) + .filter(s -> allSubLocations.indexOf(s) <= currentIndex) + .count(); + layer = (int) ((sameParentCount - 1) % 2) + 1; + } else { + // 剩余库位:保持原层级 + WmsActualWarehouse parent = columnLocations.stream() + .filter(loc -> loc.getActualWarehouseId().equals(parentId)) + .findFirst().orElse(null); + if (parent != null) { + String[] parts = parent.getActualWarehouseCode().split("-"); + layer = parts.length >= 3 ? Integer.parseInt(parts[2]) : 1; + } else { + layer = 1; + } + } + + String newCode = String.format("%s-X%02d-%d", prefix, sequenceNum, layer); + sub.setActualWarehouseCode(newCode); + sub.setActualWarehouseName(newCode); + codeToUpdate.add(sub); + + // 如果是拆分库位的第二个子库位,或者是剩余库位的子库位,序号递增 + if (!isFromSplitLocation || layer == 2) { + sequenceNum++; + } + } + + // 批量更新编码 + for (WmsActualWarehouse sub : codeToUpdate) { + baseMapper.updateById(sub); + } } - // 批量更新编码 - for (WmsActualWarehouse sub : codeToUpdate) { - baseMapper.updateById(sub); - } - - // 7. 更新父库位拆分状态 + // 7. 批量更新父库位拆分状态 + List parentUpdates = new ArrayList<>(); for (WmsActualWarehouse location : columnLocations) { WmsActualWarehouse upd = new WmsActualWarehouse(); upd.setActualWarehouseId(location.getActualWarehouseId()); upd.setSplitStatus(1); upd.setSplitType(splitType); + parentUpdates.add(upd); + } + + for (WmsActualWarehouse upd : parentUpdates) { baseMapper.updateById(upd); } } @@ -609,49 +656,101 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService throw new ServiceException("参数不能为空"); } + // 批量查询父库位 List parents = baseMapper.selectList(Wrappers.lambdaQuery() .in(WmsActualWarehouse::getActualWarehouseId, bo.getLocationIds()) .eq(WmsActualWarehouse::getDelFlag, 0)); - for (WmsActualWarehouse parent : parents) { - Integer splitStatus = Optional.ofNullable(parent.getSplitStatus()).orElse(0); - if (splitStatus != 1) { - // 未拆分状态,无需处理 - continue; - } + if (CollUtil.isEmpty(parents)) { + return; + } - // 查询父库位下的所有四级子库位(包含已逻辑删除的) - List children = baseMapper.selectList(Wrappers.lambdaQuery() - .eq(WmsActualWarehouse::getParentId, parent.getActualWarehouseId()) - .eq(WmsActualWarehouse::getActualWarehouseType, 4) - .eq(WmsActualWarehouse::getDelFlag, 0)); + // 过滤出已拆分的父库位 + List splitParents = parents.stream() + .filter(p -> Optional.ofNullable(p.getSplitStatus()).orElse(0) == 1) + .collect(Collectors.toList()); + + if (CollUtil.isEmpty(splitParents)) { + return; + } + + // 批量查询所有子库位 + List splitParentIds = splitParents.stream() + .map(WmsActualWarehouse::getActualWarehouseId) + .collect(Collectors.toList()); + + List allChildren = baseMapper.selectList(Wrappers.lambdaQuery() + .in(WmsActualWarehouse::getParentId, splitParentIds) + .eq(WmsActualWarehouse::getActualWarehouseType, 4) + .eq(WmsActualWarehouse::getDelFlag, 0)); + + // 按父ID分组子库位 + Map> childrenByParent = allChildren.stream() + .collect(Collectors.groupingBy(WmsActualWarehouse::getParentId)); + + // 检查是否有被占用的子库位 + List occupiedChildren = allChildren.stream() + .filter(c -> !Objects.equals(c.getIsEnabled(), 1)) + .collect(Collectors.toList()); + + if (!occupiedChildren.isEmpty()) { + // 找到被占用子库位的父库位名称 + Set occupiedParentIds = occupiedChildren.stream() + .map(WmsActualWarehouse::getParentId) + .collect(Collectors.toSet()); + + List occupiedParentCodes = splitParents.stream() + .filter(p -> occupiedParentIds.contains(p.getActualWarehouseId())) + .map(WmsActualWarehouse::getActualWarehouseCode) + .collect(Collectors.toList()); + + throw new ServiceException("以下库位的小库位被占用,不能合并:" + String.join(", ", occupiedParentCodes)); + } + + // 准备批量更新操作 + List childrenToHide = new ArrayList<>(); + List parentsToReset = new ArrayList<>(); + + for (WmsActualWarehouse parent : splitParents) { + List children = childrenByParent.get(parent.getActualWarehouseId()); if (CollUtil.isEmpty(children)) { - // 无子库位,直接还原父库位状态 - resetParentLocationStatus(parent); + // 无子库位,直接重置父库位状态 + WmsActualWarehouse parentUpdate = new WmsActualWarehouse(); + parentUpdate.setActualWarehouseId(parent.getActualWarehouseId()); + parentUpdate.setSplitStatus(0); + parentUpdate.setSplitType(0); + parentsToReset.add(parentUpdate); continue; } - // 检查子库位是否被占用(仅检查未删除的子库位) - boolean anyOccupied = children.stream() - .filter(c -> c.getDelFlag() == 0) // 只检查启用中的子库位 - .anyMatch(c -> !Objects.equals(c.getIsEnabled(), 1)); - - if (anyOccupied) { - throw new ServiceException("小库位被占用,不能合并:" + parent.getActualWarehouseCode()); - } - - // 逻辑删除子库位(保留数据,用于后续拆分复用) + // 准备隐藏子库位 for (WmsActualWarehouse child : children) { - WmsActualWarehouse updChild = new WmsActualWarehouse(); - updChild.setActualWarehouseId(child.getActualWarehouseId()); - updChild.setDelFlag(1); // 逻辑删除 - updChild.setIsEnabled(0); // 禁用 - baseMapper.updateById(updChild); + WmsActualWarehouse childUpdate = new WmsActualWarehouse(); + childUpdate.setActualWarehouseId(child.getActualWarehouseId()); + childUpdate.setDelFlag(1); // 逻辑删除(隐藏) + childrenToHide.add(childUpdate); } - // 还原父库位状态 - resetParentLocationStatus(parent); + // 准备重置父库位状态 + WmsActualWarehouse parentUpdate = new WmsActualWarehouse(); + parentUpdate.setActualWarehouseId(parent.getActualWarehouseId()); + parentUpdate.setSplitStatus(0); + parentUpdate.setSplitType(0); + parentsToReset.add(parentUpdate); + } + + // 批量执行更新操作 + if (!childrenToHide.isEmpty()) { + for (WmsActualWarehouse child : childrenToHide) { + baseMapper.updateById(child); + } + } + + if (!parentsToReset.isEmpty()) { + for (WmsActualWarehouse parent : parentsToReset) { + baseMapper.updateById(parent); + } } }