diff --git a/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java b/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java index 63c5c7d7..565e5df2 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsPurchasePlanController.java @@ -6,7 +6,6 @@ import java.util.Arrays; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; -import cn.dev33.satoken.annotation.SaCheckPermission; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import com.klp.common.annotation.RepeatSubmit; @@ -37,6 +36,15 @@ public class WmsPurchasePlanController extends BaseController { private final IWmsPurchasePlanService iWmsPurchasePlanService; + /** + * 根据订单ID生成推荐采购计划(只返回,不落库) + */ + @GetMapping("/recommend/{orderId}") + public R recommendPurchasePlan(@PathVariable Long orderId) { + WmsPurchasePlanVo planVo = iWmsPurchasePlanService.recommendPurchasePlanByOrder(orderId); + return R.ok(planVo); + } + /** * 查询采购计划主列表 */ diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanVo.java index 8d8fb798..b3d4db2a 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanVo.java @@ -6,6 +6,8 @@ import com.klp.common.annotation.ExcelDictFormat; import com.klp.common.convert.ExcelDictConvert; import lombok.Data; +import java.util.List; + /** * 采购计划主视图对象 wms_purchase_plan @@ -56,5 +58,9 @@ public class WmsPurchasePlanVo { @ExcelProperty(value = "备注") private String remark; + /** + * 采购计划明细列表 + */ + private List detailList; } diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsProductBomMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsProductBomMapper.java index 0e1d9d3b..aeedcd3c 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsProductBomMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsProductBomMapper.java @@ -4,6 +4,8 @@ import com.klp.domain.WmsProductBom; import com.klp.domain.vo.WmsProductBomVo; import com.klp.common.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 产品BOM(产品-原材料清单)Mapper接口 * @@ -12,4 +14,5 @@ import com.klp.common.core.mapper.BaseMapperPlus; */ public interface WmsProductBomMapper extends BaseMapperPlus { + List listByProductId(Long productId); } diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsStockMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsStockMapper.java index 21a82dc8..c1e0fb66 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsStockMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsStockMapper.java @@ -4,6 +4,8 @@ import com.klp.domain.WmsStock; import com.klp.domain.vo.WmsStockVo; import com.klp.common.core.mapper.BaseMapperPlus; +import java.math.BigDecimal; + /** * 库存:原材料/产品与库区/库位的存放关系Mapper接口 * @@ -12,4 +14,5 @@ import com.klp.common.core.mapper.BaseMapperPlus; */ public interface WmsStockMapper extends BaseMapperPlus { + BigDecimal getStockByItemId(Long rawMaterialId); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsProductBomService.java b/klp-wms/src/main/java/com/klp/service/IWmsProductBomService.java index 297fb924..0b0f06d1 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsProductBomService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsProductBomService.java @@ -46,4 +46,9 @@ public interface IWmsProductBomService { * 校验并批量删除产品BOM(产品-原材料清单)信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据产品ID查询产品BOM(产品-原材料清单)列表 + */ + List listByProductId(Long productId); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java b/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java index 5e1a5e6e..886f0f8b 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsPurchasePlanService.java @@ -17,6 +17,11 @@ import java.util.List; */ public interface IWmsPurchasePlanService { + /** + * 根据订单ID生成推荐采购计划(只返回,不落库) + */ + WmsPurchasePlanVo recommendPurchasePlanByOrder(Long orderId); + /** * 查询采购计划主 */ diff --git a/klp-wms/src/main/java/com/klp/service/IWmsStockService.java b/klp-wms/src/main/java/com/klp/service/IWmsStockService.java index 4fb5b33a..2c3d8958 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsStockService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsStockService.java @@ -6,6 +6,7 @@ import com.klp.domain.bo.WmsStockBo; import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.domain.PageQuery; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; @@ -46,4 +47,9 @@ public interface IWmsStockService { * 校验并批量删除库存:原材料/产品与库区/库位的存放关系信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据原材料ID获取库存数量 (用于生成推荐采购计划) + */ + BigDecimal getStockByItemId(Long rawMaterialId); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsProductBomServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsProductBomServiceImpl.java index df2ebb6e..818c573e 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsProductBomServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsProductBomServiceImpl.java @@ -109,4 +109,9 @@ public class WmsProductBomServiceImpl implements IWmsProductBomService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public List listByProductId(Long productId) { + return baseMapper.listByProductId(productId); + } } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java index cfb18069..ac973913 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanServiceImpl.java @@ -7,6 +7,13 @@ 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.klp.common.utils.StringUtils; +import com.klp.domain.WmsOrderDetail; +import com.klp.domain.WmsProductBom; +import com.klp.domain.vo.WmsOrderDetailVo; +import com.klp.domain.vo.WmsPurchasePlanDetailVo; +import com.klp.service.IWmsOrderDetailService; +import com.klp.service.IWmsProductBomService; +import com.klp.service.IWmsStockService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsPurchasePlanBo; @@ -15,9 +22,8 @@ import com.klp.domain.WmsPurchasePlan; import com.klp.mapper.WmsPurchasePlanMapper; import com.klp.service.IWmsPurchasePlanService; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.math.BigDecimal; +import java.util.*; /** * 采购计划主Service业务层处理 @@ -31,6 +37,49 @@ public class WmsPurchasePlanServiceImpl implements IWmsPurchasePlanService { private final WmsPurchasePlanMapper baseMapper; + private final IWmsOrderDetailService wmsOrderDetailService; + + private final IWmsProductBomService wmsProductBomService; + + private final IWmsStockService wmsStockService; + + @Override + public WmsPurchasePlanVo recommendPurchasePlanByOrder(Long orderId) { + // 1. 查询订单明细 + List orderDetails = wmsOrderDetailService.queryListByOrderId(orderId); + // 2. 汇总原材料需求 + Map materialMap = new HashMap<>(); + for (WmsOrderDetailVo detail : orderDetails) { + List bomList = wmsProductBomService.listByProductId(detail.getProductId()); + for (WmsProductBom bom : bomList) { + BigDecimal needQty = bom.getQuantity().multiply(detail.getQuantity()); + WmsPurchasePlanDetailVo vo = materialMap.getOrDefault(bom.getRawMaterialId(), new WmsPurchasePlanDetailVo()); + vo.setRawMaterialId(bom.getRawMaterialId()); + vo.setQuantity(vo.getQuantity() == null ? needQty : vo.getQuantity().add(needQty)); + vo.setUnit(bom.getUnit()); + materialMap.put(bom.getRawMaterialId(), vo); + } + } + // 3. 查询库存并计算推荐采购量 + for (WmsPurchasePlanDetailVo vo : materialMap.values()) { + BigDecimal stockQty = wmsStockService.getStockByItemId(vo.getRawMaterialId()); + // 要是物料不是产品 + BigDecimal recommendQty = BigDecimal.ZERO; + if (stockQty != null) { + recommendQty = vo.getQuantity().subtract(stockQty); + } + vo.setQuantity(recommendQty.compareTo(BigDecimal.ZERO) > 0 ? recommendQty : BigDecimal.ZERO); + } + // 4. 组装主VO + WmsPurchasePlanVo planVo = new WmsPurchasePlanVo(); + planVo.setPlanCode("推荐计划-" + orderId); + planVo.setOrderId(orderId); + planVo.setOwner("系统推荐"); + planVo.setRemark("仅供参考,实际采购请确认"); + planVo.setDetailList(new ArrayList<>(materialMap.values())); + return planVo; + } + /** * 查询采购计划主 */ diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsStockServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsStockServiceImpl.java index bfc65042..0a3894c0 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsStockServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsStockServiceImpl.java @@ -15,6 +15,7 @@ import com.klp.domain.WmsStock; import com.klp.mapper.WmsStockMapper; import com.klp.service.IWmsStockService; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Collection; @@ -111,4 +112,9 @@ public class WmsStockServiceImpl implements IWmsStockService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public BigDecimal getStockByItemId(Long rawMaterialId) { + return baseMapper.getStockByItemId(rawMaterialId); + } } diff --git a/klp-wms/src/main/resources/mapper/klp/WmsProductBomMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsProductBomMapper.xml index b03879b7..7d8acf59 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsProductBomMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsProductBomMapper.xml @@ -13,5 +13,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + diff --git a/klp-wms/src/main/resources/mapper/klp/WmsStockMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsStockMapper.xml index 8b527016..a1f0443d 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsStockMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsStockMapper.xml @@ -20,5 +20,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + +