新增接口,根据订单推荐采购计划
This commit is contained in:
@@ -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<WmsPurchasePlanVo> recommendPurchasePlan(@PathVariable Long orderId) {
|
||||
WmsPurchasePlanVo planVo = iWmsPurchasePlanService.recommendPurchasePlanByOrder(orderId);
|
||||
return R.ok(planVo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询采购计划主列表
|
||||
*/
|
||||
|
||||
@@ -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<WmsPurchasePlanDetailVo> detailList;
|
||||
|
||||
}
|
||||
|
||||
@@ -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<WmsProductBomMapper, WmsProductBom, WmsProductBomVo> {
|
||||
|
||||
List<WmsProductBom> listByProductId(Long productId);
|
||||
}
|
||||
|
||||
@@ -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<WmsStockMapper, WmsStock, WmsStockVo> {
|
||||
|
||||
BigDecimal getStockByItemId(Long rawMaterialId);
|
||||
}
|
||||
|
||||
@@ -46,4 +46,9 @@ public interface IWmsProductBomService {
|
||||
* 校验并批量删除产品BOM(产品-原材料清单)信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 根据产品ID查询产品BOM(产品-原材料清单)列表
|
||||
*/
|
||||
List<WmsProductBom> listByProductId(Long productId);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,11 @@ import java.util.List;
|
||||
*/
|
||||
public interface IWmsPurchasePlanService {
|
||||
|
||||
/**
|
||||
* 根据订单ID生成推荐采购计划(只返回,不落库)
|
||||
*/
|
||||
WmsPurchasePlanVo recommendPurchasePlanByOrder(Long orderId);
|
||||
|
||||
/**
|
||||
* 查询采购计划主
|
||||
*/
|
||||
|
||||
@@ -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<Long> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 根据原材料ID获取库存数量 (用于生成推荐采购计划)
|
||||
*/
|
||||
BigDecimal getStockByItemId(Long rawMaterialId);
|
||||
}
|
||||
|
||||
@@ -109,4 +109,9 @@ public class WmsProductBomServiceImpl implements IWmsProductBomService {
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WmsProductBom> listByProductId(Long productId) {
|
||||
return baseMapper.listByProductId(productId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<WmsOrderDetailVo> orderDetails = wmsOrderDetailService.queryListByOrderId(orderId);
|
||||
// 2. 汇总原材料需求
|
||||
Map<Long, WmsPurchasePlanDetailVo> materialMap = new HashMap<>();
|
||||
for (WmsOrderDetailVo detail : orderDetails) {
|
||||
List<WmsProductBom> 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询采购计划主
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,5 +13,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="listByProductId" resultType="com.klp.domain.WmsProductBom">
|
||||
SELECT bom_id, product_id, raw_material_id, quantity, unit, remark
|
||||
FROM wms_product_bom
|
||||
WHERE product_id = #{productId}
|
||||
and del_flag = 0
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -20,5 +20,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="updateBy" column="update_by"/>
|
||||
</resultMap>
|
||||
|
||||
<select id="getStockByItemId" resultType="java.math.BigDecimal">
|
||||
select sum(quantity) as quantity from wms_stock
|
||||
where item_id = #{rawMaterialId} and item_type = 'raw_material' and del_flag = 0
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user