2025-07-18 10:12:48 +08:00
|
|
|
package com.klp.service.impl;
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
|
import com.klp.common.core.page.TableDataInfo;
|
|
|
|
|
import com.klp.common.core.domain.PageQuery;
|
|
|
|
|
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;
|
2025-07-18 17:23:51 +08:00
|
|
|
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;
|
2025-07-18 10:12:48 +08:00
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import com.klp.domain.bo.WmsPurchasePlanBo;
|
|
|
|
|
import com.klp.domain.vo.WmsPurchasePlanVo;
|
|
|
|
|
import com.klp.domain.WmsPurchasePlan;
|
|
|
|
|
import com.klp.mapper.WmsPurchasePlanMapper;
|
|
|
|
|
import com.klp.service.IWmsPurchasePlanService;
|
|
|
|
|
|
2025-07-18 17:23:51 +08:00
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.*;
|
2025-07-18 10:12:48 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 采购计划主Service业务层处理
|
|
|
|
|
*
|
|
|
|
|
* @author Joshi
|
|
|
|
|
* @date 2025-07-18
|
|
|
|
|
*/
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Service
|
|
|
|
|
public class WmsPurchasePlanServiceImpl implements IWmsPurchasePlanService {
|
|
|
|
|
|
|
|
|
|
private final WmsPurchasePlanMapper baseMapper;
|
|
|
|
|
|
2025-07-18 17:23:51 +08:00
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-18 10:12:48 +08:00
|
|
|
/**
|
|
|
|
|
* 查询采购计划主
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public WmsPurchasePlanVo queryById(Long planId){
|
|
|
|
|
return baseMapper.selectVoById(planId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询采购计划主列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public TableDataInfo<WmsPurchasePlanVo> queryPageList(WmsPurchasePlanBo bo, PageQuery pageQuery) {
|
|
|
|
|
LambdaQueryWrapper<WmsPurchasePlan> lqw = buildQueryWrapper(bo);
|
|
|
|
|
Page<WmsPurchasePlanVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
|
|
return TableDataInfo.build(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询采购计划主列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<WmsPurchasePlanVo> queryList(WmsPurchasePlanBo bo) {
|
|
|
|
|
LambdaQueryWrapper<WmsPurchasePlan> lqw = buildQueryWrapper(bo);
|
|
|
|
|
return baseMapper.selectVoList(lqw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private LambdaQueryWrapper<WmsPurchasePlan> buildQueryWrapper(WmsPurchasePlanBo bo) {
|
|
|
|
|
Map<String, Object> params = bo.getParams();
|
|
|
|
|
LambdaQueryWrapper<WmsPurchasePlan> lqw = Wrappers.lambdaQuery();
|
|
|
|
|
lqw.eq(StringUtils.isNotBlank(bo.getPlanCode()), WmsPurchasePlan::getPlanCode, bo.getPlanCode());
|
|
|
|
|
lqw.eq(StringUtils.isNotBlank(bo.getOwner()), WmsPurchasePlan::getOwner, bo.getOwner());
|
|
|
|
|
lqw.eq(bo.getOrderId() != null, WmsPurchasePlan::getOrderId, bo.getOrderId());
|
|
|
|
|
lqw.eq(bo.getStatus() != null, WmsPurchasePlan::getStatus, bo.getStatus());
|
|
|
|
|
return lqw;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 新增采购计划主
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean insertByBo(WmsPurchasePlanBo bo) {
|
|
|
|
|
WmsPurchasePlan add = BeanUtil.toBean(bo, WmsPurchasePlan.class);
|
|
|
|
|
validEntityBeforeSave(add);
|
|
|
|
|
boolean flag = baseMapper.insert(add) > 0;
|
|
|
|
|
if (flag) {
|
|
|
|
|
bo.setPlanId(add.getPlanId());
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改采购计划主
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean updateByBo(WmsPurchasePlanBo bo) {
|
|
|
|
|
WmsPurchasePlan update = BeanUtil.toBean(bo, WmsPurchasePlan.class);
|
|
|
|
|
validEntityBeforeSave(update);
|
|
|
|
|
return baseMapper.updateById(update) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 保存前的数据校验
|
|
|
|
|
*/
|
|
|
|
|
private void validEntityBeforeSave(WmsPurchasePlan entity){
|
|
|
|
|
//TODO 做一些数据校验,如唯一约束
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量删除采购计划主
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
|
|
if(isValid){
|
|
|
|
|
//TODO 做一些业务上的校验,判断是否需要校验
|
|
|
|
|
}
|
|
|
|
|
return baseMapper.deleteBatchIds(ids) > 0;
|
|
|
|
|
}
|
|
|
|
|
}
|