diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java index 815a1ec..7fabe1e 100644 --- a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java +++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java @@ -126,4 +126,21 @@ public class MatPurchaseVo { private BigDecimal currentStock; + /** + * 已入库数量 + */ + private BigDecimal receivedNum; + + /** + * 在途数量(未入库数量) + */ + private BigDecimal inTransitNum; + + + + + + + + } diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java index c378ca8..0582492 100644 --- a/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java +++ b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java @@ -1,6 +1,5 @@ package com.gear.mat.service; -import com.gear.mat.domain.MatPurchase; import com.gear.mat.domain.vo.MatPurchaseVo; import com.gear.mat.domain.vo.MaterialInventoryVo; import com.gear.mat.domain.bo.MatPurchaseBo; diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java index 031443d..2188a1e 100644 --- a/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java +++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.gear.mat.domain.vo.*; import lombok.RequiredArgsConstructor; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.springframework.stereotype.Service; import com.gear.mat.domain.bo.MatPurchaseBo; 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.domain.bo.MatPurchaseInDetailBo; -import java.util.List; -import java.util.Map; -import java.util.Collection; -import java.util.ArrayList; +import java.util.*; import java.math.BigDecimal; import java.util.stream.Collectors; @@ -55,7 +53,13 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService { public TableDataInfo queryPageList(MatPurchaseBo bo, PageQuery pageQuery) { QueryWrapper qw = buildQueryWrapperPlus(bo); Page result = baseMapper.selectVoPagePlus(pageQuery.build(), qw); - return TableDataInfo.build(result); + // 添加库存信息 + List inventoryList = convertToPurchaseWithInventoryVo(result.getRecords()); + + Page inventoryResult = new Page<>(result.getCurrent(), result.getSize(), result.getTotal()); + inventoryResult.setRecords(inventoryList); + + return TableDataInfo.build(inventoryResult); } private QueryWrapper buildQueryWrapperPlus(MatPurchaseBo bo) { @@ -225,6 +229,65 @@ public class MatPurchaseServiceImpl implements IMatPurchaseService { return result; } + public List convertToPurchaseWithInventoryVo(List purchaseList) { + List 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 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 public List queryPurchasePlanMaterialInventory(Long purchaseId) { List result = new ArrayList<>();