diff --git a/klp-wms/src/main/java/com/klp/controller/WmsRawMaterialController.java b/klp-wms/src/main/java/com/klp/controller/WmsRawMaterialController.java index d37f81f9..5b99a87b 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsRawMaterialController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsRawMaterialController.java @@ -97,4 +97,12 @@ public class WmsRawMaterialController extends BaseController { @PathVariable Long[] rawMaterialIds) { return toAjax(iWmsRawMaterialService.deleteWithValidByIds(Arrays.asList(rawMaterialIds), true)); } + + /** + * 查询原材料列表(含需求、库存、在途信息) + */ + @GetMapping("/listWithDemand") + public TableDataInfo listWithDemand(WmsRawMaterialBo bo, PageQuery pageQuery) { + return iWmsRawMaterialService.queryPageListWithDemand(bo, pageQuery); + } } diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsRawMaterialVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsRawMaterialVo.java index 6ecb4c27..26bc5a08 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsRawMaterialVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsRawMaterialVo.java @@ -193,5 +193,23 @@ public class WmsRawMaterialVo { @ExcelProperty(value = "BOM 表头ID") private Long bomId; + /** + * 需求量 + */ + @ExcelProperty(value = "需求量") + private BigDecimal demand; + + /** + * 库存量 + */ + @ExcelProperty(value = "库存量") + private BigDecimal inventory; + + /** + * 在途量 + */ + @ExcelProperty(value = "在途量") + private BigDecimal onTheWay; + } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsRawMaterialService.java b/klp-wms/src/main/java/com/klp/service/IWmsRawMaterialService.java index d6be0224..2e241abd 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsRawMaterialService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsRawMaterialService.java @@ -46,4 +46,9 @@ public interface IWmsRawMaterialService { * 校验并批量删除原材料信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询原材料列表(含需求、库存、在途信息) + */ + TableDataInfo queryPageListWithDemand(WmsRawMaterialBo bo, PageQuery pageQuery); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java index e4617edd..9082d71e 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java @@ -14,6 +14,19 @@ import com.klp.domain.vo.WmsRawMaterialVo; import com.klp.domain.WmsRawMaterial; import com.klp.mapper.WmsRawMaterialMapper; import com.klp.service.IWmsRawMaterialService; +import com.klp.service.IWmsStockService; +import com.klp.service.IWmsPurchasePlanDetailService; +import com.klp.service.IWmsOrderDetailService; +import com.klp.service.IWmsProductBomService; +import com.klp.service.IWmsOrderService; +import com.klp.domain.bo.WmsPurchasePlanDetailBo; +import com.klp.domain.bo.WmsOrderDetailBo; +import com.klp.domain.bo.WmsProductBomBo; +import com.klp.domain.vo.WmsPurchasePlanDetailVo; +import com.klp.domain.vo.WmsProductBomVo; +import com.klp.domain.vo.WmsOrderDetailVo; +import com.klp.domain.vo.WmsOrderVo; +import java.math.BigDecimal; import java.util.List; import java.util.Map; @@ -30,6 +43,11 @@ import java.util.Collection; public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService { private final WmsRawMaterialMapper baseMapper; + private final IWmsStockService stockService; + private final IWmsPurchasePlanDetailService purchasePlanDetailService; + private final IWmsOrderDetailService orderDetailService; + private final IWmsProductBomService productBomService; + private final IWmsOrderService orderService; /** * 查询原材料 @@ -58,6 +76,92 @@ public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService { return baseMapper.selectVoList(lqw); } + /** + * 查询原材料列表(含需求、库存、在途信息) + */ + @Override + public TableDataInfo queryPageListWithDemand(WmsRawMaterialBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 填充需求、库存、在途信息 + fillDemandInfo(result.getRecords()); + return TableDataInfo.build(result); + } + + /** + * 填充原材料需求、库存、在途信息 + */ + private void fillDemandInfo(List rawMaterialList) { + if (rawMaterialList == null || rawMaterialList.isEmpty()) { + return; + } + // 为每个原材料填充信息 + for (WmsRawMaterialVo vo : rawMaterialList) { + Long rawMaterialId = vo.getRawMaterialId(); + // 查询库存量 + BigDecimal inventory = stockService.getStockByItemId(rawMaterialId); + vo.setInventory(inventory != null ? inventory : BigDecimal.ZERO); + // 查询在途量(采购计划明细) + BigDecimal onTheWay = getOnTheWayQuantity(rawMaterialId); + vo.setOnTheWay(onTheWay); + // 查询需求量(订单+BOM) + BigDecimal demand = getDemandQuantity(rawMaterialId); + vo.setDemand(demand); + } + } + + /** + * 获取在途量 + */ + private BigDecimal getOnTheWayQuantity(Long rawMaterialId) { + WmsPurchasePlanDetailBo bo = new WmsPurchasePlanDetailBo(); + bo.setRawMaterialId(rawMaterialId); + List list = purchasePlanDetailService.queryList(bo); + return list.stream() + .filter(item -> item.getStatus() != null && item.getStatus() == 1) // 在途状态 + .map(WmsPurchasePlanDetailVo::getQuantity) + .filter(qty -> qty != null) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + /** + * 获取需求量 + */ + private BigDecimal getDemandQuantity(Long rawMaterialId) { + // 先查询包含该原材料的BOM + WmsProductBomBo bomBo = new WmsProductBomBo(); + bomBo.setRawMaterialId(rawMaterialId); + List bomList = productBomService.queryList(bomBo); + if (bomList.isEmpty()) { + return BigDecimal.ZERO; + } + // 查询这些产品的订单明细 + BigDecimal totalDemand = BigDecimal.ZERO; + for (WmsProductBomVo bom : bomList) { + WmsOrderDetailBo orderDetailBo = new WmsOrderDetailBo(); + orderDetailBo.setProductId(bom.getProductId()); + List orderDetails = orderDetailService.queryList(orderDetailBo); + // 逐个查询订单状态,过滤出有效订单的明细 + BigDecimal productDemand = BigDecimal.ZERO; + for (WmsOrderDetailVo detail : orderDetails) { + // 查询订单主表状态 + WmsOrderVo order = orderService.queryById(detail.getOrderId()); + if (order != null && order.getOrderStatus() != null && order.getOrderStatus() < 2) { + // 新建、生产中状态,累加数量 + if (detail.getQuantity() != null) { + productDemand = productDemand.add(detail.getQuantity()); + } + } + } + // 需求量 = 产品需求量 × BOM用量 + if (bom.getQuantity() != null) { + totalDemand = totalDemand.add(productDemand.multiply(bom.getQuantity())); + } + } + + return totalDemand; + } + private LambdaQueryWrapper buildQueryWrapper(WmsRawMaterialBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); diff --git a/klp-wms/src/main/resources/mapper/klp/WmsRawMaterialMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsRawMaterialMapper.xml index 3052fb40..e9733b85 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsRawMaterialMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsRawMaterialMapper.xml @@ -38,5 +38,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" -