refactor(wms): 优化炉计划钢卷查询逻辑

- 移除 WmsFurnacePlanCoilVo 中的实际库位相关字段
- 添加 WmsMaterialCoilVo 类型的 coil 字段用于存储钢卷完整信息
- 将查询逻辑重构为分步骤处理:查询计划钢卷、批量获取钢卷信息、构建库区映射、填充数据
- 使用 WmsMaterialCoilVo 替代 WmsMaterialCoil 进行数据传输
- 新增 buildLogicWarehouseNameMap 和 fillCoilInfo 辅助方法提升代码可读性
- 通过批量查询减少数据库访问次数,提升查询性能
This commit is contained in:
2026-04-27 13:23:49 +08:00
parent 43ace2f91e
commit 9e03dbe9de
2 changed files with 70 additions and 54 deletions

View File

@@ -37,12 +37,10 @@ public class WmsFurnacePlanCoilVo {
@ExcelProperty(value = "入场钢卷号")
private String enterCoilNo;
@ExcelProperty(value = "实际库位ID")
private Long actualWarehouseId;
@ExcelProperty(value = "实际库位")
private String actualWarehouseName;
@ExcelProperty(value = "创建时间")
private Date createTime;
// 钢卷全部信息
private WmsMaterialCoilVo coil;
}

View File

@@ -15,6 +15,7 @@ import com.klp.domain.bo.WmsFurnacePlanCoilBo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsFurnacePlanCoilVo;
import com.klp.domain.vo.WmsFurnacePlanVo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.mapper.*;
import com.klp.service.IWmsFurnacePlanService;
import com.klp.service.IWmsMaterialCoilService;
@@ -23,10 +24,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -176,59 +174,79 @@ public class WmsFurnacePlanServiceImpl implements IWmsFurnacePlanService {
@Override
public List<WmsFurnacePlanCoilVo> queryPlanCoils(Long planId) {
List<WmsFurnacePlanCoilVo> list = planCoilMapper.selectVoList(Wrappers.<WmsFurnacePlanCoil>lambdaQuery()
.eq(WmsFurnacePlanCoil::getPlanId, planId));
if (list == null || list.isEmpty()) {
return list;
// 1. 查询计划钢卷关联记录
List<WmsFurnacePlanCoilVo> planCoils = planCoilMapper.selectVoList(
Wrappers.<WmsFurnacePlanCoil>lambdaQuery()
.eq(WmsFurnacePlanCoil::getPlanId, planId)
);
if (planCoils == null || planCoils.isEmpty()) {
return planCoils;
}
List<Long> coilIds = list.stream()
// 2. 收集钢卷ID并批量查询钢卷信息
List<Long> coilIds = planCoils.stream()
.map(WmsFurnacePlanCoilVo::getCoilId)
.filter(id -> id != null)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (coilIds.isEmpty()) {
return list;
return planCoils;
}
List<WmsMaterialCoil> materialCoils = materialCoilMapper.selectBatchIds(coilIds);
java.util.Map<Long, WmsMaterialCoil> coilMap = materialCoils.stream()
.collect(Collectors.toMap(WmsMaterialCoil::getCoilId, item -> item, (a, b) -> a));
List<Long> actualWarehouseIds = materialCoils.stream()
.map(WmsMaterialCoil::getActualWarehouseId)
.filter(id -> id != null)
.distinct()
.collect(Collectors.toList());
java.util.Map<Long, String> warehouseMap = actualWarehouseIds.isEmpty()
? java.util.Collections.emptyMap()
: actualWarehouseMapper.selectBatchIds(actualWarehouseIds).stream()
.collect(Collectors.toMap(WmsActualWarehouse::getActualWarehouseId,
WmsActualWarehouse::getActualWarehouseName, (a, b) -> a));
// 查询逻辑库区信息
List<Long> logicWarehouseIds = list.stream()
.map(WmsFurnacePlanCoilVo::getLogicWarehouseId)
.filter(id -> id != null)
.distinct()
.collect(Collectors.toList());
java.util.Map<Long, String> logicWarehouseMap = logicWarehouseIds.isEmpty()
? java.util.Collections.emptyMap()
: warehouseMapper.selectBatchIds(logicWarehouseIds).stream()
.collect(Collectors.toMap(WmsWarehouse::getWarehouseId,
WmsWarehouse::getWarehouseName, (a, b) -> a));
String coilIdsStr = coilIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(coilIdsStr);
List<WmsMaterialCoilVo> materialCoils = materialCoilService.queryList(coilBo);
Map<Long, WmsMaterialCoilVo> coilMap = materialCoils.stream()
.collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, item -> item, (a, b) -> a));
list.forEach(item -> {
WmsMaterialCoil coil = coilMap.get(item.getCoilId());
if (coil != null) {
item.setEnterCoilNo(coil.getEnterCoilNo());
item.setActualWarehouseId(coil.getActualWarehouseId());
item.setActualWarehouseName(warehouseMap.get(coil.getActualWarehouseId()));
}
// 设置逻辑库区名称
if (item.getLogicWarehouseId() != null) {
item.setLogicWarehouseId(item.getLogicWarehouseId());
item.setLogicWarehouseName(logicWarehouseMap.get(item.getLogicWarehouseId()));
}
});
return list;
// 3. 批量查询逻辑库区名称
Map<Long, String> logicWarehouseMap = buildLogicWarehouseNameMap(
planCoils.stream()
.map(WmsFurnacePlanCoilVo::getLogicWarehouseId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList())
);
// 4. 填充钢卷信息
planCoils.forEach(planCoil -> fillCoilInfo(planCoil, coilMap, logicWarehouseMap));
return planCoils;
}
/**
* 构建逻辑库区ID到名称的映射
*/
private Map<Long, String> buildLogicWarehouseNameMap(List<Long> warehouseIds) {
if (warehouseIds.isEmpty()) {
return Collections.emptyMap();
}
return warehouseMapper.selectBatchIds(warehouseIds).stream()
.collect(Collectors.toMap(WmsWarehouse::getWarehouseId,
WmsWarehouse::getWarehouseName, (a, b) -> a));
}
/**
* 填充钢卷信息
*/
private void fillCoilInfo(
WmsFurnacePlanCoilVo planCoil,
Map<Long, WmsMaterialCoilVo> coilMap,
Map<Long, String> logicWarehouseMap) {
// 填充钢卷基本信息(实际库区名称已在钢卷信息中)
WmsMaterialCoilVo coil = coilMap.get(planCoil.getCoilId());
if (coil != null) {
planCoil.setEnterCoilNo(coil.getEnterCoilNo());
planCoil.setCoil(coil);
}
// 填充逻辑库区名称
if (planCoil.getLogicWarehouseId() != null) {
planCoil.setLogicWarehouseName(logicWarehouseMap.get(planCoil.getLogicWarehouseId()));
}
}
@Override