feat(mat-purchase): 添加采购单库存信息显示功能

- 移除未使用的 MatPurchase 导入
- 添加 IPage 依赖导入并简化集合导入
- 扩展查询方法以集成库存信息
- 新增 convertToPurchaseWithInventoryVo 方法处理采购单与库存数据转换
- 在 MatPurchaseVo 中添加已入库数量和在途数量字段
- 实现物料信息获取和入库统计逻辑
- 添加在途数量计算逻辑基于采购单状态判断
This commit is contained in:
2026-01-31 10:38:45 +08:00
parent 5a2b5ff2ff
commit 8f104dddf6
3 changed files with 85 additions and 6 deletions

View File

@@ -126,4 +126,21 @@ public class MatPurchaseVo {
private BigDecimal currentStock; private BigDecimal currentStock;
/**
* 已入库数量
*/
private BigDecimal receivedNum;
/**
* 在途数量(未入库数量)
*/
private BigDecimal inTransitNum;
} }

View File

@@ -1,6 +1,5 @@
package com.gear.mat.service; package com.gear.mat.service;
import com.gear.mat.domain.MatPurchase;
import com.gear.mat.domain.vo.MatPurchaseVo; import com.gear.mat.domain.vo.MatPurchaseVo;
import com.gear.mat.domain.vo.MaterialInventoryVo; import com.gear.mat.domain.vo.MaterialInventoryVo;
import com.gear.mat.domain.bo.MatPurchaseBo; import com.gear.mat.domain.bo.MatPurchaseBo;

View File

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.gear.mat.domain.vo.*; import com.gear.mat.domain.vo.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.gear.mat.domain.bo.MatPurchaseBo; import com.gear.mat.domain.bo.MatPurchaseBo;
import com.gear.mat.domain.MatPurchase; import com.gear.mat.domain.MatPurchase;
@@ -19,10 +20,7 @@ import com.gear.mat.service.IMatMaterialService;
import com.gear.mat.service.IMatPurchaseInDetailService; import com.gear.mat.service.IMatPurchaseInDetailService;
import com.gear.mat.domain.bo.MatPurchaseInDetailBo; import com.gear.mat.domain.bo.MatPurchaseInDetailBo;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.Collection;
import java.util.ArrayList;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -55,7 +53,13 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService {
public TableDataInfo<MatPurchaseVo> queryPageList(MatPurchaseBo bo, PageQuery pageQuery) { public TableDataInfo<MatPurchaseVo> queryPageList(MatPurchaseBo bo, PageQuery pageQuery) {
QueryWrapper<MatPurchase> qw = buildQueryWrapperPlus(bo); QueryWrapper<MatPurchase> qw = buildQueryWrapperPlus(bo);
Page<MatPurchaseVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw); Page<MatPurchaseVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw);
return TableDataInfo.build(result); // 添加库存信息
List<MatPurchaseVo> inventoryList = convertToPurchaseWithInventoryVo(result.getRecords());
Page<MatPurchaseVo> inventoryResult = new Page<>(result.getCurrent(), result.getSize(), result.getTotal());
inventoryResult.setRecords(inventoryList);
return TableDataInfo.build(inventoryResult);
} }
private QueryWrapper<MatPurchase> buildQueryWrapperPlus(MatPurchaseBo bo) { private QueryWrapper<MatPurchase> buildQueryWrapperPlus(MatPurchaseBo bo) {
@@ -225,6 +229,65 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService {
return result; return result;
} }
public List<MatPurchaseVo> convertToPurchaseWithInventoryVo(List<MatPurchaseVo> purchaseList) {
List<MatPurchaseVo> result = new ArrayList<>();
for (MatPurchaseVo purchase : purchaseList) {
MatPurchaseVo vo = new MatPurchaseVo();
// 复制基本采购信息
vo.setPurchaseId(purchase.getPurchaseId());
vo.setPurchaseNo(purchase.getPurchaseNo());
vo.setFactory(purchase.getFactory());
vo.setMaterialId(purchase.getMaterialId());
vo.setPlanNum(purchase.getPlanNum());
vo.setPurchasePrice(purchase.getPurchasePrice());
vo.setStatus(purchase.getStatus());
vo.setRemark(purchase.getRemark());
// 获取物料信息
MatMaterialVo material = matMaterialService.queryById(purchase.getMaterialId());
if (material != null) {
vo.setMaterialName(material.getMaterialName());
vo.setSpec(material.getSpec());
vo.setModel(material.getModel());
vo.setUnit(material.getUnit());
vo.setCurrentStock(material.getCurrentStock());
}
// 计算已入库数量
MatPurchaseInDetailBo detailBo = new MatPurchaseInDetailBo();
detailBo.setPurchaseId(purchase.getPurchaseId());
List<MatPurchaseInDetailVo> details = matPurchaseInDetailService.queryList(detailBo);
BigDecimal receivedTotal = details.stream()
.map(MatPurchaseInDetailVo::getInNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
vo.setReceivedNum(receivedTotal);
// 根据采购单状态判断在途数量
// 1-待入(在途) 2-已完成(全部入库) 3-已取消(归零) 4-部分入库
if (purchase.getStatus() != null && (purchase.getStatus() == 1 || purchase.getStatus() == 4)) {
// 在途或部分入库,计算未入库数量
BigDecimal pending = purchase.getPlanNum().subtract(receivedTotal);
if (pending.compareTo(BigDecimal.ZERO) > 0) {
vo.setInTransitNum(pending);
} else {
vo.setInTransitNum(BigDecimal.ZERO);
}
} else {
// 已完成或已取消,没有在途数量
vo.setInTransitNum(BigDecimal.ZERO);
}
result.add(vo);
}
return result;
}
@Override @Override
public List<PurchasePlanMaterialInventoryVo> queryPurchasePlanMaterialInventory(Long purchaseId) { public List<PurchasePlanMaterialInventoryVo> queryPurchasePlanMaterialInventory(Long purchaseId) {
List<PurchasePlanMaterialInventoryVo> result = new ArrayList<>(); List<PurchasePlanMaterialInventoryVo> result = new ArrayList<>();