From bfba3ce49a0019d4b24b882bc46a87cb3a16941c Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Thu, 12 Mar 2026 17:05:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(warehouse):=20=E6=B7=BB=E5=8A=A0=E5=BA=93?= =?UTF-8?q?=E4=BD=8D=E6=8E=92=E5=BA=8F=E5=8F=B7=E4=BF=AE=E6=AD=A3=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=B9=B6=E4=BC=98=E5=8C=96=E9=92=A2=E5=8D=B7=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 IWmsActualWarehouseService 中新增 fixSortNoByParentId 方法用于修正库位排序号 - 在 WmsActualWarehouseController 中新增 /fixSortNo/{parentId} 接口 - 实现 WmsActualWarehouseServiceImpl 中的 fixSortNoByParentId 业务逻辑 - 添加正则表达式处理库位编码的排序键解析 - 新增 WmsMaterialCoilMapper 的 selectVoPagePlusOrderBy 查询方法 - 重构 WmsMaterialCoilMapper.xml 中的排序辅助字段查询逻辑 - 修改 WmsMaterialCoilServiceImpl 中的分页查询逻辑以支持排序功能 --- .../WmsActualWarehouseController.java | 13 ++ .../com/klp/mapper/WmsMaterialCoilMapper.java | 5 + .../service/IWmsActualWarehouseService.java | 8 ++ .../impl/WmsActualWarehouseServiceImpl.java | 114 ++++++++++++++++++ .../impl/WmsMaterialCoilServiceImpl.java | 7 +- .../mapper/klp/WmsMaterialCoilMapper.xml | 109 +++++++++++++++-- 6 files changed, 245 insertions(+), 11 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java b/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java index a067caec..d6b8b203 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java @@ -224,4 +224,17 @@ public class WmsActualWarehouseController extends BaseController { return AjaxResult.error("库区释放失败: " + e.getMessage()); } } + + /** + * 修正已生成库位的排序号(交错排序) + * + * @param parentId 父库位ID + */ + @Log(title = "修正库位排序号", businessType = BusinessType.UPDATE) + @PutMapping("/fixSortNo/{parentId}") + public R fixSortNo(@PathVariable Long parentId) { + int count = iWmsActualWarehouseService.fixSortNoByParentId(parentId); + return R.ok(count); + } + } diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsMaterialCoilMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsMaterialCoilMapper.java index 2f838906..96fc3270 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsMaterialCoilMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsMaterialCoilMapper.java @@ -37,6 +37,11 @@ public interface WmsMaterialCoilMapper extends BaseMapperPlus selectVoPagePlus(Page build,@Param("ew") QueryWrapper lqw); + /** + * orderBy=true 时使用:包含库位排序辅助字段(aw_sort_key/aw_layer_key/aw_id_key)以及父库位 join + */ + Page selectVoPagePlusOrderBy(Page build, @Param("ew") QueryWrapper lqw); + List selectVoListWithDynamicJoin(@Param("ew")QueryWrapper lqw); List> getDistributionByActualWarehouse(@Param("itemType") String itemType, @Param("itemId") Long itemId); diff --git a/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java b/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java index ade9447f..d6835293 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java @@ -84,4 +84,12 @@ public interface IWmsActualWarehouseService { * - 清空钢卷表中绑定此库区且为现存(data_type=1)、未删除(del_flag=0)的记录的 actual_warehouse_id */ void releaseActualWarehouse(Long actualWarehouseId); + + /** + * 修正已生成库位的排序号(交错排序) + * @param parentId 父库位ID + * @return 修正的记录数 + */ + int fixSortNoByParentId(Long parentId); + } 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 10b83234..c9e37224 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 @@ -24,6 +24,8 @@ import com.klp.domain.WmsMaterialCoil; import com.klp.mapper.WmsMaterialCoilMapper; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -799,5 +801,117 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService } } + @Override + @Transactional(rollbackFor = Exception.class) + public int fixSortNoByParentId(Long parentId) { + if (parentId == null) { + throw new ServiceException("父库位ID不能为空"); + } + + WmsActualWarehouse parent = baseMapper.selectById(parentId); + if (parent == null) { + throw new ServiceException("父库位不存在"); + } + + Long l1SortNo = parent.getSortNo() != null ? parent.getSortNo() : 0L; + int[] counter = {1}; // Global counter for sortNo + + if (parent.getActualWarehouseType() != null && parent.getActualWarehouseType() == 1L) { + List l2List = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(WmsActualWarehouse::getParentId, parentId) + .eq(WmsActualWarehouse::getDelFlag, 0) + ); + + int totalCount = 0; + for (WmsActualWarehouse l2 : l2List) { + Long l2SortNo = l2.getSortNo() != null ? l2.getSortNo() : 0L; + totalCount += fixLevel(l2.getActualWarehouseId(), l1SortNo, l2SortNo, counter); + } + return totalCount; + } else { + Long l2SortNo = 0L; + if (parent.getParentId() != null) { + WmsActualWarehouse l2 = baseMapper.selectById(parent.getParentId()); + l2SortNo = l2 != null && l2.getSortNo() != null ? l2.getSortNo() : 0L; + } + return fixLevel(parentId, l1SortNo, l2SortNo, counter); + } + } + + private int fixLevel(Long parentId, Long l1SortNo, Long l2SortNo, int[] counter) { + List list = baseMapper.selectList( + new LambdaQueryWrapper() + .eq(WmsActualWarehouse::getParentId, parentId) + .eq(WmsActualWarehouse::getDelFlag, 0) + ); + + if (list.isEmpty()) return 0; + + // 需求调整:此处不再对四级(小库位)进行 sort_no 修正,只修正三级(大库位)即可 + boolean isFourthLevel = list.get(0).getActualWarehouseType() != null + && list.get(0).getActualWarehouseType() == 4L; + if (isFourthLevel) { + return 0; + } + + Map sortKeyMap = new HashMap<>(); + Pattern pattern3 = Pattern.compile("(.*?)(\\d+)-(\\d+)-(\\d+)"); + + for (WmsActualWarehouse w : list) { + String code = w.getActualWarehouseCode(); + if (StringUtils.isBlank(code)) continue; + + Matcher m3 = pattern3.matcher(code); + if (m3.matches()) { + sortKeyMap.put(w, new int[]{ + Integer.parseInt(m3.group(2)), + Integer.parseInt(m3.group(3)), + Integer.parseInt(m3.group(4)) + }); + } + } + + List sorted = sortKeyMap.entrySet().stream() + .sorted((e1, e2) -> { + int[] k1 = e1.getValue(); + int[] k2 = e2.getValue(); + int c = Integer.compare(k1[0], k2[0]); + if (c != 0) return c; + c = Integer.compare(k1[1], k2[1]); + if (c != 0) return c; + return Integer.compare(k1[2], k2[2]); + }) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + List updates = new ArrayList<>(); + int totalCount = 0; + + for (WmsActualWarehouse w : sorted) { + long currentSortNo = l1SortNo * 100000L + l2SortNo * 10000L + counter[0]; + // 仅修正三级排序号;四级交错排序已由钢卷查询排序逻辑处理 + totalCount += fixLevel(w.getActualWarehouseId(), l1SortNo, l2SortNo, counter); + + WmsActualWarehouse update = new WmsActualWarehouse(); + update.setActualWarehouseId(w.getActualWarehouseId()); + update.setSortNo(currentSortNo); + updates.add(update); + + counter[0]++; + totalCount++; + + if (updates.size() >= 500) { + baseMapper.updateBatchById(updates); + updates.clear(); + } + } + + if (!updates.isEmpty()) { + baseMapper.updateBatchById(updates); + } + + return totalCount; + } } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 73c38432..18b2ad20 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -305,7 +305,12 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { @Override public TableDataInfo queryPageList(WmsMaterialCoilBo bo, PageQuery pageQuery) { QueryWrapper qw = buildQueryWrapperPlus(bo); - Page result = baseMapper.selectVoPagePlus(pageQuery.build(), qw); + Page result; + if (Boolean.TRUE.equals(bo.getOrderBy())) { + result = baseMapper.selectVoPagePlusOrderBy(pageQuery.build(), qw); + } else { + result = baseMapper.selectVoPagePlus(pageQuery.build(), qw); + } List records = result.getRecords(); if (records == null || records.isEmpty()) { diff --git a/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml index f8c6b8ab..0caad581 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml @@ -139,17 +139,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHEN mc.item_type = 'product' THEN p.product_code ELSE NULL END as itemCode, - -- 库位排序辅助字段(用于全局交错排序,避免在 ORDER BY 中写复杂表达式触发 MP 注入拦截) - COALESCE(CASE WHEN aw.actual_warehouse_type = 4 THEN awp.sort_no ELSE aw.sort_no END, 0) AS aw_sort_key, - CASE WHEN aw.actual_warehouse_type = 4 THEN CAST(SUBSTRING_INDEX(aw.actual_warehouse_code, '-', -1) AS UNSIGNED) ELSE 0 END AS aw_layer_key, - COALESCE(aw.actual_warehouse_id, 0) AS aw_id_key, -- 异常数量统计 COALESCE(ca.abnormal_count, 0) AS abnormalCount FROM wms_material_coil mc LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id LEFT JOIN wms_warehouse nw ON mc.next_warehouse_id = nw.warehouse_id LEFT JOIN wms_actual_warehouse aw ON mc.actual_warehouse_id = aw.actual_warehouse_id - LEFT JOIN wms_actual_warehouse awp ON aw.parent_id = awp.actual_warehouse_id LEFT JOIN sys_user su ON mc.sale_id = su.user_id LEFT JOIN wms_raw_material rm ON mc.item_type = 'raw_material' AND mc.item_id = rm.raw_material_id LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id @@ -161,6 +156,105 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) ca ON mc.coil_id = ca.coil_id ${ew.customSqlSegment} + + + + + +