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);
|
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);
|
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);
|
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)
|
* 统计筛选条件下的全量汇总数据(高性能:只查sum/count)
|
||||||
* 独立的统计接口,不影响分页查询
|
* 独立的统计接口,不影响分页查询
|
||||||
|
|||||||
Reference in New Issue
Block a user