refactor(mat): 优化采购服务中的入库详情查询逻辑

- 替换 IMatPurchaseInDetailService 为 MatPurchaseInDetailMapper 直接访问数据库
- 修改 MatMaterialServiceImpl 和 MatPurchaseServiceImpl 中的依赖注入
- 将查询逻辑从 BO 对象查询改为 LambdaQueryWrapper 条件查询
- 统一使用 MatPurchaseInDetail 实体类替代 MatPurchaseInDetailVo 进行数据处理
- 优化批量查询入库详情的性能,解决 N+1 查询问题
- 更新流式处理中的方法引用以匹配实体类字段映射
This commit is contained in:
2026-01-31 14:08:19 +08:00
parent 41ea6e79f9
commit 48e75676c5
2 changed files with 19 additions and 17 deletions

View File

@@ -9,9 +9,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gear.mat.domain.MatPurchase;
import com.gear.mat.domain.MatPurchaseInDetail;
import com.gear.mat.domain.bo.MatPurchaseBo;
import com.gear.mat.domain.bo.MatPurchaseInDetailBo;
import com.gear.mat.domain.vo.*;
import com.gear.mat.mapper.MatPurchaseInDetailMapper;
import com.gear.mat.mapper.MatPurchaseMapper;
import com.gear.mat.service.IMatPurchaseInDetailService;
import lombok.RequiredArgsConstructor;
@@ -40,7 +42,7 @@ public class MatMaterialServiceImpl implements IMatMaterialService {
private final MatMaterialMapper baseMapper;
private final MatPurchaseMapper matPurchaseMapper;
private final IMatPurchaseInDetailService matPurchaseInDetailService;
private final MatPurchaseInDetailMapper matPurchaseInDetailMapper;
/**
* 查询配料配件基础信息
@@ -214,15 +216,13 @@ public class MatMaterialServiceImpl implements IMatMaterialService {
.distinct()
.collect(Collectors.toList());
Map<Long, List<MatPurchaseInDetailVo>> detailsByPurchaseId = Collections.emptyMap();
Map<Long, List<MatPurchaseInDetail>> detailsByPurchaseId = Collections.emptyMap();
if (!purchaseIds.isEmpty()) {
MatPurchaseInDetailBo detailBo = new MatPurchaseInDetailBo();
Map<String, Object> params = new HashMap<>();
params.put("purchaseIds", purchaseIds);
detailBo.setParams(params);
List<MatPurchaseInDetailVo> allDetails = matPurchaseInDetailService.queryList(detailBo);
LambdaQueryWrapper<MatPurchaseInDetail> detailLqw = Wrappers.lambdaQuery();
detailLqw.in(MatPurchaseInDetail::getPurchaseId, purchaseIds);
List<MatPurchaseInDetail> allDetails = matPurchaseInDetailMapper.selectList(detailLqw);
detailsByPurchaseId = allDetails.stream()
.collect(Collectors.groupingBy(MatPurchaseInDetailVo::getPurchaseId));
.collect(Collectors.groupingBy(MatPurchaseInDetail::getPurchaseId));
}
// 计算每个物料的库存信息
@@ -251,9 +251,9 @@ public class MatMaterialServiceImpl implements IMatMaterialService {
planTotal = planTotal.add(planNum);
// 计算该采购单的已入库数量
List<MatPurchaseInDetailVo> details = detailsByPurchaseId.getOrDefault(purchase.getPurchaseId(), Collections.emptyList());
List<MatPurchaseInDetail> details = detailsByPurchaseId.getOrDefault(purchase.getPurchaseId(), Collections.emptyList());
BigDecimal receivedInPurchase = details.stream()
.map(MatPurchaseInDetailVo::getInNum)
.map(MatPurchaseInDetail::getInNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
receivedTotal = receivedTotal.add(receivedInPurchase);

View File

@@ -8,7 +8,9 @@ import com.gear.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gear.mat.domain.MatPurchaseInDetail;
import com.gear.mat.domain.vo.*;
import com.gear.mat.mapper.MatPurchaseInDetailMapper;
import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.BeanUtils;
@@ -42,7 +44,7 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService {
private final MatPurchaseMapper baseMapper;
private final MatMaterialMapper matMaterialMapper;
private final IMatPurchaseInDetailService matPurchaseInDetailService;
private final MatPurchaseInDetailMapper matPurchaseInDetailMapper;
/**
* 查询采购单主(管理在途库存)
@@ -185,18 +187,18 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService {
.collect(Collectors.toList());
// 批量查询所有入库详情一次性查询解决N+1
Map<Long, List<MatPurchaseInDetailVo>> detailMap = new HashMap<>();
Map<Long, List<MatPurchaseInDetail>> detailMap = new HashMap<>();
if (!purchaseIds.isEmpty()) {
// 使用LambdaQueryWrapper批量查询避免循环单查
LambdaQueryWrapper<com.gear.mat.domain.MatPurchaseInDetail> detailLqw = Wrappers.lambdaQuery();
detailLqw.in(com.gear.mat.domain.MatPurchaseInDetail::getPurchaseId, purchaseIds);
List<MatPurchaseInDetailVo> allDetails = matPurchaseInDetailService.queryList(new MatPurchaseInDetailBo());
detailLqw.in(MatPurchaseInDetail::getPurchaseId, purchaseIds);
List<MatPurchaseInDetail> allDetails = matPurchaseInDetailMapper.selectList(detailLqw);
// 按purchaseId分组
detailMap = allDetails.stream()
.filter(Objects::nonNull)
.filter(detail -> detail.getPurchaseId() != null)
.collect(Collectors.groupingBy(MatPurchaseInDetailVo::getPurchaseId));
.collect(Collectors.groupingBy(MatPurchaseInDetail::getPurchaseId));
log.debug("批量查询入库详情成功,采购单数量:{},明细总条数:{}", purchaseIds.size(), allDetails.size());
}
@@ -214,12 +216,12 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService {
}
// 获取入库详情
List<MatPurchaseInDetailVo> details = detailMap.get(purchase.getPurchaseId());
List<MatPurchaseInDetail> details = detailMap.get(purchase.getPurchaseId());
details = details != null ? details : Collections.emptyList();
// 计算已入库数量
BigDecimal receivedTotal = details.stream()
.map(MatPurchaseInDetailVo::getInNum)
.map(MatPurchaseInDetail::getInNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);