feat(wms): 添加钢卷物料订单关联信息查询功能

- 新增 queryPageListWithOrderRel 方法支持查询钢卷关联订单列表
- 实现批量查询避免 N+1 问题,提升查询性能
- 添加 listWithOrderRel 控制器接口供前端调用
- 集成 wms_coil_contract_rel 中间表与 crm_order 联查
- 优化查询逻辑,支持按需加载订单关联信息
- 完善异常处理和日志记录机制
This commit is contained in:
2026-04-18 13:01:28 +08:00
parent 67cf5aa7cb
commit ddb1beb629
3 changed files with 79 additions and 0 deletions

View File

@@ -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<WmsMaterialCoilVo> listWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery) {
return iWmsMaterialCoilService.queryPageListWithOrderRel(bo, pageQuery);
}
/**
* 统计筛选条件下的全量汇总数据
* 独立的统计接口,使用与分页列表相同的查询条件

View File

@@ -37,6 +37,12 @@ public interface IWmsMaterialCoilService {
*/
TableDataInfo<WmsMaterialCoilBindVo> queryPageListWithBindInfo(WmsMaterialCoilBo bo, PageQuery pageQuery);
/**
* 查询钢卷物料表列表(包含订单关联信息)
* 前端传 includeOrderRel=true 时返回每个钢卷关联的订单列表
*/
TableDataInfo<WmsMaterialCoilVo> queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery);
/**
* 查询钢卷物料表列表
*/

View File

@@ -352,6 +352,69 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
return TableDataInfo.build(bindResult);
}
/**
* 查询钢卷物料表列表(包含订单关联信息)
* 前端传 includeOrderRel=true 时调用此方法,返回每个钢卷关联的订单列表
* 使用批量查询避免N+1问题先收集所有coilId一次查询中间表+crm_order再回填
*/
@Override
public TableDataInfo<WmsMaterialCoilVo> queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery) {
Page<WmsMaterialCoilVo> result = queryMaterialCoilPage(bo, pageQuery);
List<WmsMaterialCoilVo> 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<WmsMaterialCoilVo> records) {
try {
// 1. 收集所有钢卷ID
Set<Long> coilIds = records.stream()
.map(WmsMaterialCoilVo::getCoilId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
if (coilIds.isEmpty()) {
return;
}
// 2. 批量查询所有关联关系JOIN crm_order返回WmsCoilContractRelVo含全量订单字段
List<com.klp.domain.vo.WmsCoilContractRelVo> allRels = coilContractRelMapper.selectOrdersByCoilIds(new ArrayList<>(coilIds));
if (allRels == null || allRels.isEmpty()) {
return;
}
// 3. 按coilId分组
Map<Long, List<com.klp.domain.vo.WmsCoilContractRelVo>> 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
* 独立的统计接口,不影响分页查询