refactor(mat): 优化采购服务中的入库详情查询逻辑
- 替换 IMatPurchaseInDetailService 为 MatPurchaseInDetailMapper 直接访问数据库 - 修改 MatMaterialServiceImpl 和 MatPurchaseServiceImpl 中的依赖注入 - 将查询逻辑从 BO 对象查询改为 LambdaQueryWrapper 条件查询 - 统一使用 MatPurchaseInDetail 实体类替代 MatPurchaseInDetailVo 进行数据处理 - 优化批量查询入库详情的性能,解决 N+1 查询问题 - 更新流式处理中的方法引用以匹配实体类字段映射
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user