Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsRawMaterialServiceImpl.java
Joshi 9db27db96a refactor(wms): 移除产品和原材料服务中的缓存注解
- 注释掉了 WmsProductServiceImpl 中的 @Cacheable 和 @CacheEvict 注解
- 注释掉了 WmsRawMaterialServiceImpl 中的 @Cacheable 和 @CacheEvict 注解
- 清理了查询方法中的多余空行格式
- 暂时禁用 Redis 缓存功能以便后续重构优化
2026-01-10 08:12:07 +08:00

346 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 com.klp.domain.WmsProduct;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
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.IWmsOrderDetailService;
import com.klp.service.IWmsOrderService;
import com.klp.domain.bo.WmsOrderDetailBo;
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;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Arrays;
/**
* 原材料Service业务层处理
*
* @author Joshi
* @date 2025-07-18
*/
@RequiredArgsConstructor
@Service
public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService {
private final WmsRawMaterialMapper baseMapper;
private final IWmsOrderDetailService orderDetailService;
private final IWmsOrderService orderService;
private final IWmsBomService wmsBomService;
private final IWmsBomItemService wmsBomItemService;
/**
* 查询原材料
*/
@Override
public WmsRawMaterialVo queryById(Long rawMaterialId){
return baseMapper.selectVoById(rawMaterialId);
}
/**
* 查询原材料列表带Redis缓存30分钟过期
*/
@Override
// @Cacheable(cacheNames = "wms:rawMaterial:list", key = "'bo_' + #bo + '_page_' + #pageQuery.pageNum + '_' + #pageQuery.pageSize")
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);
}
/**
* 查询原材料列表
*/
@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;
// }
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());
// 如果同时传入了名称和规格,且值相同(搜索关键词),使用 OR 条件
boolean hasName = StringUtils.isNotBlank(bo.getRawMaterialName());
boolean hasSpec = StringUtils.isNotBlank(bo.getSpecification());
if (hasName && hasSpec && bo.getRawMaterialName().equals(bo.getSpecification())) {
// 搜索关键词:匹配名称或规格
String searchKey = bo.getRawMaterialName();
lqw.and(wrapper -> wrapper
.like(WmsRawMaterial::getRawMaterialName, searchKey)
.or()
.like(WmsRawMaterial::getSpecification, searchKey)
);
} else {
// 分别处理名称和规格
lqw.like(hasName, WmsRawMaterial::getRawMaterialName, bo.getRawMaterialName());
lqw.like(hasSpec, WmsRawMaterial::getSpecification, bo.getSpecification());
}
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());
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), WmsRawMaterial::getMaterial, bo.getMaterial());
lqw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatmentDesc()), WmsRawMaterial::getSurfaceTreatmentDesc, bo.getSurfaceTreatmentDesc());
lqw.eq(StringUtils.isNotBlank(bo.getManufacturer()), WmsRawMaterial::getManufacturer, bo.getManufacturer());
lqw.eq(StringUtils.isNotBlank(bo.getZincLayer()), WmsRawMaterial::getZincLayer, bo.getZincLayer());
return lqw;
}
/**
* 新增原材料
*/
@Override
@Transactional(rollbackFor = Exception.class)
// @CacheEvict(cacheNames = "wms:rawMaterial:list", allEntries = true)
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
WmsRawMaterial add = BeanUtil.toBean(bo, WmsRawMaterial.class);
add.setBomId(bomId);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setRawMaterialId(add.getRawMaterialId());
// 3. 创建默认的BOM明细项根据截图的默认属性
createDefaultBomItems(bomId, "原料");
}
return bo;
}
/**
* 创建默认的BOM明细项
*/
private void createDefaultBomItems(Long bomId, String type) {
List<String[]> defaultAttrs;
if ("产品".equals(type)) {
// 产品默认属性(根据截图)
defaultAttrs = Arrays.asList(
new String[]{"规格", null},
new String[]{"材质", null},
new String[]{"表面处理", null}
);
} else {
// 原料默认属性(根据截图)
defaultAttrs = Arrays.asList(
new String[]{"规格", null},
new String[]{"材质", null},
new String[]{"厂家", null}
);
}
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);
}
}
/**
* 修改原材料
*/
@Override
@CacheEvict(cacheNames = "wms:rawMaterial:list", allEntries = true)
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);
}
}
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsRawMaterial entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除原材料
*/
@Override
// @CacheEvict(cacheNames = "wms:rawMaterial:list", allEntries = true)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}