refactor(wms): 优化钢卷不匹配数据查询逻辑

- 在WmsMaterialCoilMapper中新增selectMismatchedItemCoils方法用于查询itemId和itemType不匹配的钢卷
- 在WmsMaterialCoilMapper.xml中添加对应的SQL查询语句,使用子查询直接筛选不匹配的数据
- 重构WmsMaterialCoilServiceImpl中的queryMismatchedItemCoils方法,改用SQL子查询替代原来的多次数据库查询
- 移除原有的批量验证逻辑,直接通过数据库层面进行数据校验
- 优化性能,减少不必要的数据库访问次数
- 使用批量填充方式处理关联对象信息
This commit is contained in:
2026-04-08 14:18:59 +08:00
parent 9adbc1ea0c
commit cd5bca19f6
3 changed files with 33 additions and 67 deletions

View File

@@ -91,5 +91,11 @@ List<WmsMaterialCoilDeliveryExportVo> selectDeliveryExportListByCoilIds(@Param("
List<CoilTrimRawVo> selectCoilTrimStatistics(); List<CoilTrimRawVo> selectCoilTrimStatistics();
List<CategoryWidthRawVo> selectCategoryWidthStatistics(); List<CategoryWidthRawVo> selectCategoryWidthStatistics();
/**
* 查询itemId和itemType不匹配的钢卷
* @return 不匹配的钢卷列表
*/
List<WmsMaterialCoil> selectMismatchedItemCoils();
} }

View File

@@ -4922,75 +4922,20 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/ */
@Override @Override
public List<WmsMaterialCoilVo> queryMismatchedItemCoils() { public List<WmsMaterialCoilVo> queryMismatchedItemCoils() {
// 查询所有钢卷 // 用SQL子查询直接找出itemId和itemType不匹配的钢卷
LambdaQueryWrapper<WmsMaterialCoil> queryWrapper = new LambdaQueryWrapper<>(); List<WmsMaterialCoil> mismatchedCoils = baseMapper.selectMismatchedItemCoils();
queryWrapper.eq(WmsMaterialCoil::getDelFlag, 0);
queryWrapper.isNotNull(WmsMaterialCoil::getItemId); if (mismatchedCoils == null || mismatchedCoils.isEmpty()) {
queryWrapper.isNotNull(WmsMaterialCoil::getItemType);
List<WmsMaterialCoil> allCoils = baseMapper.selectList(queryWrapper);
if (allCoils == null || allCoils.isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
} }
// 收集所有需要校验的itemId按itemType分组 // 批量填充关联信息
Set<Long> rawMaterialIds = new HashSet<>(); List<WmsMaterialCoilVo> voList = mismatchedCoils.stream()
Set<Long> productIds = new HashSet<>(); .map(coil -> BeanUtil.toBean(coil, WmsMaterialCoilVo.class))
.collect(Collectors.toList());
for (WmsMaterialCoil coil : allCoils) { fillRelatedObjectsBatch(voList);
if ("raw_material".equals(coil.getItemType())) {
rawMaterialIds.add(coil.getItemId()); return voList;
} else if ("product".equals(coil.getItemType())) {
productIds.add(coil.getItemId());
}
}
// 批量查询原材料和产品找出存在的ID
Set<Long> existingRawMaterialIds = new HashSet<>();
if (!rawMaterialIds.isEmpty()) {
List<WmsRawMaterial> rawMaterials = rawMaterialMapper.selectBatchIds(rawMaterialIds);
existingRawMaterialIds = rawMaterials.stream()
.map(WmsRawMaterial::getRawMaterialId)
.collect(Collectors.toSet());
}
Set<Long> existingProductIds = new HashSet<>();
if (!productIds.isEmpty()) {
List<WmsProduct> products = productMapper.selectBatchIds(productIds);
existingProductIds = products.stream()
.map(WmsProduct::getProductId)
.collect(Collectors.toSet());
}
// 筛选出不匹配的钢卷
List<WmsMaterialCoilVo> mismatchedCoils = new ArrayList<>();
for (WmsMaterialCoil coil : allCoils) {
boolean isMismatched = false;
if ("raw_material".equals(coil.getItemType())) {
// 检查原材料ID是否存在
if (!existingRawMaterialIds.contains(coil.getItemId())) {
isMismatched = true;
}
} else if ("product".equals(coil.getItemType())) {
// 检查产品ID是否存在
if (!existingProductIds.contains(coil.getItemId())) {
isMismatched = true;
}
} else {
// itemType不是预期值也视为不匹配
isMismatched = true;
}
if (isMismatched) {
// 转换为Vo并填充关联信息
WmsMaterialCoilVo vo = BeanUtil.toBean(coil, WmsMaterialCoilVo.class);
fillRelatedObjects(vo);
mismatchedCoils.add(vo);
}
}
return mismatchedCoils;
} }

View File

@@ -881,5 +881,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ORDER BY category, isTrimmed, width ORDER BY category, isTrimmed, width
</select> </select>
<!-- 查询itemId和itemType不匹配的钢卷 -->
<select id="selectMismatchedItemCoils" resultMap="WmsMaterialCoilResult">
SELECT mc.*
FROM wms_material_coil mc
WHERE mc.del_flag = 0
AND mc.item_id IS NOT NULL
AND mc.item_type IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM wms_raw_material rm WHERE rm.raw_material_id = mc.item_id AND rm.del_flag = 0
)
AND NOT EXISTS (
SELECT 1 FROM wms_product wp WHERE wp.product_id = mc.item_id AND wp.del_flag = 0
)
</select>
</mapper> </mapper>