feat(wms): 添加钢卷物料订单关联信息查询功能
- 新增 queryPageListWithOrderRel 方法支持查询钢卷关联订单列表 - 实现批量查询避免 N+1 问题,提升查询性能 - 添加 listWithOrderRel 控制器接口供前端调用 - 集成 wms_coil_contract_rel 中间表与 crm_order 联查 - 优化查询逻辑,支持按需加载订单关联信息 - 完善异常处理和日志记录机制
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计筛选条件下的全量汇总数据
|
||||
* 独立的统计接口,使用与分页列表相同的查询条件
|
||||
|
||||
@@ -37,6 +37,12 @@ public interface IWmsMaterialCoilService {
|
||||
*/
|
||||
TableDataInfo<WmsMaterialCoilBindVo> queryPageListWithBindInfo(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询钢卷物料表列表(包含订单关联信息)
|
||||
* 前端传 includeOrderRel=true 时返回每个钢卷关联的订单列表
|
||||
*/
|
||||
TableDataInfo<WmsMaterialCoilVo> queryPageListWithOrderRel(WmsMaterialCoilBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询钢卷物料表列表
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
* 独立的统计接口,不影响分页查询
|
||||
|
||||
Reference in New Issue
Block a user