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) * 独立的统计接口,不影响分页查询