From ddb1beb629896ef1610999fbf781b7210a75c6a8 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 18 Apr 2026 13:01:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E9=92=A2?= =?UTF-8?q?=E5=8D=B7=E7=89=A9=E6=96=99=E8=AE=A2=E5=8D=95=E5=85=B3=E8=81=94?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 queryPageListWithOrderRel 方法支持查询钢卷关联订单列表 - 实现批量查询避免 N+1 问题,提升查询性能 - 添加 listWithOrderRel 控制器接口供前端调用 - 集成 wms_coil_contract_rel 中间表与 crm_order 联查 - 优化查询逻辑,支持按需加载订单关联信息 - 完善异常处理和日志记录机制 --- .../controller/WmsMaterialCoilController.java | 10 +++ .../klp/service/IWmsMaterialCoilService.java | 6 ++ .../impl/WmsMaterialCoilServiceImpl.java | 63 +++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java index ece8c2f9..690be433 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java @@ -68,6 +68,16 @@ public class WmsMaterialCoilController extends BaseController { return iWmsMaterialCoilService.queryPageListWithBindInfo(bo, pageQuery); } + /** + * 查询钢卷物料表列表(包含订单关联信息) + * 前端调用此接口时,每个钢卷会携带其关联的订单列表(通过wms_coil_contract_rel中间表JOIN crm_order) + * 注意:此接口比普通list多一次联表查询,仅在需要查看订单关联时使用 + */ + @GetMapping("/listWithOrderRel") + public TableDataInfo listWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery) { + return iWmsMaterialCoilService.queryPageListWithOrderRel(bo, pageQuery); + } + /** * 统计筛选条件下的全量汇总数据 * 独立的统计接口,使用与分页列表相同的查询条件 diff --git a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java index 057649eb..6ba04439 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java @@ -37,6 +37,12 @@ public interface IWmsMaterialCoilService { */ TableDataInfo queryPageListWithBindInfo(WmsMaterialCoilBo bo, PageQuery pageQuery); + /** + * 查询钢卷物料表列表(包含订单关联信息) + * 前端传 includeOrderRel=true 时返回每个钢卷关联的订单列表 + */ + TableDataInfo queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery); + /** * 查询钢卷物料表列表 */ 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 23fff4b1..fa40c2de 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 @@ -352,6 +352,69 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { return TableDataInfo.build(bindResult); } + /** + * 查询钢卷物料表列表(包含订单关联信息) + * 前端传 includeOrderRel=true 时调用此方法,返回每个钢卷关联的订单列表 + * 使用批量查询避免N+1问题:先收集所有coilId,一次查询中间表+crm_order,再回填 + */ + @Override + public TableDataInfo queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery) { + Page result = queryMaterialCoilPage(bo, pageQuery); + List records = result.getRecords(); + if (records == null || records.isEmpty()) { + return TableDataInfo.build(result); + } + + // 填充通用字段(昵称等) + fillPageCommonFields(records); + + // 批量填充订单关联信息 + fillOrderRelForPage(records); + + return TableDataInfo.build(result); + } + + /** + * 批量填充钢卷列表的订单关联信息(一次查询中间表+订单,避免N+1) + */ + private void fillOrderRelForPage(List records) { + try { + // 1. 收集所有钢卷ID + Set coilIds = records.stream() + .map(WmsMaterialCoilVo::getCoilId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + if (coilIds.isEmpty()) { + return; + } + + // 2. 批量查询所有关联关系(JOIN crm_order,返回WmsCoilContractRelVo含全量订单字段) + List allRels = coilContractRelMapper.selectOrdersByCoilIds(new ArrayList<>(coilIds)); + + if (allRels == null || allRels.isEmpty()) { + return; + } + + // 3. 按coilId分组 + Map> relMap = allRels.stream() + .filter(rel -> rel.getCoilId() != null) + .collect(Collectors.groupingBy( + com.klp.domain.vo.WmsCoilContractRelVo::getCoilId, + Collectors.toList() + )); + + // 4. 回填到每个钢卷VO + for (WmsMaterialCoilVo vo : records) { + if (vo.getCoilId() != null && relMap.containsKey(vo.getCoilId())) { + vo.setOrderList(relMap.get(vo.getCoilId())); + } + } + } catch (Exception e) { + log.warn("批量查询钢卷关联订单信息失败", e); + } + } + /** * 统计筛选条件下的全量汇总数据(高性能:只查sum/count) * 独立的统计接口,不影响分页查询