feat(stock): 优化实际库区查询速率使用CTE递归查询
- 修改 WmsStockMapper 接口,增加 rootWarehouseId 参数用于限定查询范围 - 优化 WmsStockMapper.xml 中的 SQL 查询逻辑,引入 CTE 递归查询子仓库数据 - 调整查询语句结构,将分组统计与关联查询分离以提升性能 - 移除 Java 层递归获取子仓库 ID 的逻辑,改为数据库端处理 - 强制使用指定索引 idx_mc_fixed_group 提高查询效率 - 更新服务实现类传参逻辑,传递实际仓库 ID 用于构建查询条件
This commit is contained in:
@@ -35,5 +35,7 @@ public interface WmsStockMapper extends BaseMapperPlus<WmsStockMapper, WmsStock,
|
||||
*/
|
||||
List<WmsStockVo> selectStockDistribution(@Param("itemType") String itemType, @Param("itemId") Long itemId);
|
||||
|
||||
Page<WmsStockVo> selectVoPagePlusActual(Page<Object> build,@Param("ew") Wrapper<WmsStock> lqw);
|
||||
Page<WmsStockVo> selectVoPagePlusActual(Page<Object> build,
|
||||
@Param("ew") Wrapper<WmsStock> lqw,
|
||||
@Param("rootWarehouseId") Long rootWarehouseId);
|
||||
}
|
||||
|
||||
@@ -59,61 +59,25 @@ public class WmsStockServiceImpl implements IWmsStockService {
|
||||
@Override
|
||||
public TableDataInfo<WmsStockVo> queryPageListActual(WmsStockBo bo, PageQuery pageQuery) {
|
||||
QueryWrapper<WmsStock> lqw = buildQueryWrapperPlusActual(bo);
|
||||
Page<WmsStockVo> result = baseMapper.selectVoPagePlusActual(pageQuery.build(), lqw);
|
||||
Page<WmsStockVo> result = baseMapper.selectVoPagePlusActual(pageQuery.build(), lqw, bo.getActualWarehouseId());
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
private QueryWrapper<WmsStock> buildQueryWrapperPlusActual(WmsStockBo bo) { // 注意:这里改用 QueryWrapper 而非 LambdaQueryWrapper
|
||||
QueryWrapper<WmsStock> qw = Wrappers.query(); // 使用普通 QueryWrapper
|
||||
|
||||
QueryWrapper<WmsStock> qw = Wrappers.query();
|
||||
// 固定条件:未删除的现存数据
|
||||
qw.eq("mc.del_flag", 0);
|
||||
qw.eq("mc.data_type", 1);
|
||||
qw.eq("mc.status", 0);
|
||||
qw.in("mc.material_type", Arrays.asList("成品", "原料"));
|
||||
// 处理仓库ID查询,支持递归查询子节点
|
||||
if (bo.getActualWarehouseId() != null) {
|
||||
List<Long> warehouseIds = getActualWarehouseIdsWithChildren(bo.getActualWarehouseId());
|
||||
if (warehouseIds.size() == 1) {
|
||||
qw.eq("mc.actual_warehouse_id", warehouseIds.get(0));
|
||||
} else {
|
||||
qw.in("mc.actual_warehouse_id", warehouseIds);
|
||||
}
|
||||
}
|
||||
// 递归库区过滤下放到 SQL (CTE) 中处理,避免 Java 侧递归造成超大 IN 列表
|
||||
qw.eq(StringUtils.isNotBlank(bo.getItemType()), "mc.item_type", bo.getItemType());
|
||||
qw.eq(bo.getItemId() != null, "mc.item_id", bo.getItemId());
|
||||
// 优化模糊查询为前缀匹配,便于走索引(若有)
|
||||
// 优化模糊查询为前缀匹配,便于走索引
|
||||
qw.likeRight(StringUtils.isNotBlank(bo.getBatchNo()), "mc.enter_coil_no", bo.getBatchNo());
|
||||
|
||||
// 分组改由 SQL 中显式控制,避免在 Wrapper 中拼装大量分组字段
|
||||
|
||||
return qw;
|
||||
}
|
||||
|
||||
private List<Long> getActualWarehouseIdsWithChildren(Long actualWarehouseId) {
|
||||
|
||||
List<Long> actualWarehouseIds = new ArrayList<>();
|
||||
actualWarehouseIds.add(actualWarehouseId); // 添加当前仓库ID
|
||||
|
||||
// 递归获取所有子仓库ID
|
||||
getChildActualWarehouseIds(actualWarehouseId,actualWarehouseIds);
|
||||
|
||||
return actualWarehouseIds;
|
||||
}
|
||||
private void getChildActualWarehouseIds(Long parentId, List<Long> actualWarehouseIds) {
|
||||
// 查询直接子仓库
|
||||
List<WmsActualWarehouse> children = actualWarehouseMapper.selectList(
|
||||
Wrappers.<WmsActualWarehouse>lambdaQuery()
|
||||
.eq(WmsActualWarehouse::getParentId, parentId)
|
||||
.eq(WmsActualWarehouse::getDelFlag, 0)
|
||||
);
|
||||
|
||||
// 递归处理每个子仓库
|
||||
for (WmsActualWarehouse child : children) {
|
||||
actualWarehouseIds.add(child.getActualWarehouseId());
|
||||
getChildActualWarehouseIds(child.getActualWarehouseId(), actualWarehouseIds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询库存:原材料/产品与库区/库位的存放关系列表
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user