Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java

327 lines
13 KiB
Java
Raw Normal View History

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;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsRawMaterialBo;
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 com.klp.service.IWmsBomService;
import com.klp.service.IWmsBomItemService;
import com.klp.domain.bo.WmsBomBo;
import com.klp.domain.bo.WmsBomItemBo;
import com.klp.domain.vo.WmsBomItemVo;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
2025-07-18 10:12:48 +08:00
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Arrays;
2025-07-18 10:12:48 +08:00
/**
* 原材料Service业务层处理
*
* @author Joshi
* @date 2025-07-18
*/
@RequiredArgsConstructor
@Service
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;
private final IWmsBomService wmsBomService;
private final IWmsBomItemService wmsBomItemService;
2025-07-18 10:12:48 +08:00
/**
* 查询原材料
*/
@Override
public WmsRawMaterialVo queryById(Long rawMaterialId){
return baseMapper.selectVoById(rawMaterialId);
}
/**
* 查询原材料列表
*/
@Override
public TableDataInfo<WmsRawMaterialVo> queryPageList(WmsRawMaterialBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsRawMaterial> lqw = buildQueryWrapper(bo);
Page<WmsRawMaterialVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询原材料列表带BOM信息
*/
@Override
public TableDataInfo<WmsRawMaterialVo> queryPageListWithBom(WmsRawMaterialBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsRawMaterial> lqw = buildQueryWrapper(bo);
Page<WmsRawMaterialVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// 填充BOM信息
fillBomInfo(result.getRecords());
return TableDataInfo.build(result);
}
2025-07-18 10:12:48 +08:00
/**
* 查询原材料列表
*/
@Override
public List<WmsRawMaterialVo> queryList(WmsRawMaterialBo bo) {
LambdaQueryWrapper<WmsRawMaterial> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
/**
* 查询原材料列表含需求库存在途信息
*/
@Override
public TableDataInfo<WmsRawMaterialVo> queryPageListWithDemand(WmsRawMaterialBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsRawMaterial> lqw = buildQueryWrapper(bo);
Page<WmsRawMaterialVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
// // 填充需求、库存、在途信息
// fillDemandInfo(result.getRecords());
return TableDataInfo.build(result);
}
// /**
// * 填充原材料需求、库存、在途信息
// */
// private void fillDemandInfo(List<WmsRawMaterialVo> 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<WmsPurchasePlanDetailVo> 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<WmsProductBomVo> 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<WmsOrderDetailVo> 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;
}
2025-07-18 10:12:48 +08:00
private LambdaQueryWrapper<WmsRawMaterial> buildQueryWrapper(WmsRawMaterialBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsRawMaterial> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getRawMaterialCode()), WmsRawMaterial::getRawMaterialCode, bo.getRawMaterialCode());
lqw.like(StringUtils.isNotBlank(bo.getRawMaterialName()), WmsRawMaterial::getRawMaterialName, bo.getRawMaterialName());
lqw.eq(StringUtils.isNotBlank(bo.getSteelGrade()), WmsRawMaterial::getSteelGrade, bo.getSteelGrade());
lqw.eq(StringUtils.isNotBlank(bo.getTargetColdGrade()), WmsRawMaterial::getTargetColdGrade, bo.getTargetColdGrade());
lqw.eq(bo.getBaseMaterialId() != null, WmsRawMaterial::getBaseMaterialId, bo.getBaseMaterialId());
lqw.eq(bo.getSurfaceTreatmentId() != null, WmsRawMaterial::getSurfaceTreatmentId, bo.getSurfaceTreatmentId());
lqw.eq(bo.getThickness() != null, WmsRawMaterial::getThickness, bo.getThickness());
lqw.eq(bo.getThicknessDeviation() != null, WmsRawMaterial::getThicknessDeviation, bo.getThicknessDeviation());
lqw.eq(bo.getWidth() != null, WmsRawMaterial::getWidth, bo.getWidth());
lqw.eq(bo.getTargetColdWidth() != null, WmsRawMaterial::getTargetColdWidth, bo.getTargetColdWidth());
lqw.eq(bo.getTargetColdThickness() != null, WmsRawMaterial::getTargetColdThickness, bo.getTargetColdThickness());
lqw.eq(bo.getCrown() != null, WmsRawMaterial::getCrown, bo.getCrown());
lqw.eq(bo.getCoilWeight() != null, WmsRawMaterial::getCoilWeight, bo.getCoilWeight());
lqw.eq(StringUtils.isNotBlank(bo.getSurfaceQuality()), WmsRawMaterial::getSurfaceQuality, bo.getSurfaceQuality());
lqw.eq(bo.getHardnessHv5() != null, WmsRawMaterial::getHardnessHv5, bo.getHardnessHv5());
lqw.eq(bo.getHardnessDiff() != null, WmsRawMaterial::getHardnessDiff, bo.getHardnessDiff());
lqw.eq(bo.getCompositionMn() != null, WmsRawMaterial::getCompositionMn, bo.getCompositionMn());
lqw.eq(bo.getCompositionP() != null, WmsRawMaterial::getCompositionP, bo.getCompositionP());
lqw.eq(StringUtils.isNotBlank(bo.getGrainSize()), WmsRawMaterial::getGrainSize, bo.getGrainSize());
lqw.eq(bo.getHeadTailCutFlag() != null, WmsRawMaterial::getHeadTailCutFlag, bo.getHeadTailCutFlag());
lqw.eq(StringUtils.isNotBlank(bo.getInspectionResult()), WmsRawMaterial::getInspectionResult, bo.getInspectionResult());
lqw.eq(bo.getIsEnabled() != null, WmsRawMaterial::getIsEnabled, bo.getIsEnabled());
lqw.eq(bo.getBomId() != null, WmsRawMaterial::getBomId, bo.getBomId());
2025-07-18 10:12:48 +08:00
return lqw;
}
/**
* 新增原材料
*/
@Override
@Transactional(rollbackFor = Exception.class)
2025-08-02 17:12:07 +08:00
public WmsRawMaterialBo insertByBo(WmsRawMaterialBo bo) {
// 1. 先创建BOM头
WmsBomBo bomBo = new WmsBomBo();
bomBo.setBomCode("原材料BOM" + System.currentTimeMillis());
bomBo.setBomName("原材料BOM" + System.currentTimeMillis());
bomBo.setIsEnabled(1);
bomBo.setRemark("原材料创建时自动生成的BOM");
WmsBomBo savedBom = wmsBomService.insertByBo(bomBo);
Long bomId = savedBom.getBomId();
// 2. 创建原材料并关联BOM
2025-07-18 10:12:48 +08:00
WmsRawMaterial add = BeanUtil.toBean(bo, WmsRawMaterial.class);
add.setBomId(bomId);
2025-07-18 10:12:48 +08:00
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setRawMaterialId(add.getRawMaterialId());
// 3. 创建默认的BOM明细项根据截图的默认属性
createDefaultBomItems(bomId, "原料");
2025-07-18 10:12:48 +08:00
}
2025-08-02 17:12:07 +08:00
return bo;
2025-07-18 10:12:48 +08:00
}
/**
* 创建默认的BOM明细项
*/
private void createDefaultBomItems(Long bomId, String type) {
List<String[]> defaultAttrs;
if ("产品".equals(type)) {
// 产品默认属性(根据截图)
defaultAttrs = Arrays.asList(
new String[]{"规格", "1250 * 0.6"},
new String[]{"材质", "SPCC"},
new String[]{"表面处理", "涂油"}
);
} else {
// 原料默认属性(根据截图)
defaultAttrs = Arrays.asList(
new String[]{"规格", "1265 * 4"},
new String[]{"材质", "Q195L"},
new String[]{"厂家", "天铁"}
);
}
for (String[] attr : defaultAttrs) {
WmsBomItemBo itemBo = new WmsBomItemBo();
itemBo.setBomId(bomId);
itemBo.setAttrKey(attr[0]);
itemBo.setAttrValue(attr[1]);
itemBo.setIsEnabled(1);
itemBo.setRemark("创建时自动生成的默认属性");
wmsBomItemService.insertByBo(itemBo);
}
}
2025-07-18 10:12:48 +08:00
/**
* 修改原材料
*/
@Override
public Boolean updateByBo(WmsRawMaterialBo bo) {
WmsRawMaterial update = BeanUtil.toBean(bo, WmsRawMaterial.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 填充BOM信息
*/
private void fillBomInfo(List<WmsRawMaterialVo> rawMaterialList) {
if (rawMaterialList == null || rawMaterialList.isEmpty()) {
return;
}
for (WmsRawMaterialVo vo : rawMaterialList) {
if (vo.getBomId() != null) {
// 查询BOM明细
WmsBomItemBo bomItemBo = new WmsBomItemBo();
bomItemBo.setBomId(vo.getBomId());
List<WmsBomItemVo> bomItems = wmsBomItemService.queryList(bomItemBo);
vo.setBomItems(bomItems);
}
}
}
2025-07-18 10:12:48 +08:00
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsRawMaterial entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除原材料
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}