Files
klp-oa/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPackingDetailServiceImpl.java
Joshi ed08134191 feat(wms): 添加钢卷变更日志功能
- 新增钢卷变更日志的Service接口及实现类
- 创建钢卷变更日志的业务对象BO和视图对象VO
- 实现钢卷变更日志的控制器提供CRUD操作接口
- 添加钢卷变更日志的数据库映射和表结构定义
- 开发钢卷变更日志注解和AOP切面自动记录变更
- 定义钢卷变更类型的枚举类支持多种变更场景
- 在钢卷相关业务方法中集成变更日志记录功能
- 创建钢卷变更日志的数据表SQL脚本文件
2026-07-11 13:36:04 +08:00

255 lines
9.4 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.wms.annotation.CoilChangeLog;
import com.klp.wms.enums.CoilChangeType;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsCoilPackingDetailBo;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsCoilPackingDetailVo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.WmsCoilPackingDetail;
import com.klp.domain.WmsCoilPackingRecord;
import com.klp.domain.WmsMaterialCoil;
import com.klp.mapper.WmsCoilPackingDetailMapper;
import com.klp.mapper.WmsCoilPackingRecordMapper;
import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.service.IWmsCoilPackingDetailService;
import com.klp.service.IWmsMaterialCoilService;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* 钢卷打包明细(存储每个钢卷的库区/重量信息Service业务层处理
*
* @author klp
* @date 2026-03-23
*/
@RequiredArgsConstructor
@Service
public class WmsCoilPackingDetailServiceImpl implements IWmsCoilPackingDetailService {
private final WmsCoilPackingDetailMapper baseMapper;
private final IWmsMaterialCoilService iWmsMaterialCoilService;
private final WmsCoilPackingRecordMapper recordMapper;
private final WmsMaterialCoilMapper coilMapper;
/**
* 查询钢卷打包明细(存储每个钢卷的库区/重量信息)
*/
@Override
public WmsCoilPackingDetailVo queryById(Long detailId){
return baseMapper.selectVoById(detailId);
}
/**
* 查询钢卷打包明细(存储每个钢卷的库区/重量信息)列表
*/
@Override
public TableDataInfo<WmsCoilPackingDetailVo> queryPageList(WmsCoilPackingDetailBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsCoilPackingDetail> lqw = buildQueryWrapper(bo);
Page<WmsCoilPackingDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (result.getRecords() != null && !result.getRecords().isEmpty()) {
enrichCoilInfo(result.getRecords());
}
return TableDataInfo.build(result);
}
/**
* 查询钢卷打包明细(存储每个钢卷的库区/重量信息)列表
*/
@Override
public List<WmsCoilPackingDetailVo> queryList(WmsCoilPackingDetailBo bo) {
LambdaQueryWrapper<WmsCoilPackingDetail> lqw = buildQueryWrapper(bo);
List<WmsCoilPackingDetailVo> list = baseMapper.selectVoList(lqw);
if (list != null && !list.isEmpty()) {
enrichCoilInfo(list);
}
return list;
}
private void enrichCoilInfo(List<WmsCoilPackingDetailVo> detailVos) {
List<Long> coilIds = detailVos.stream()
.map(WmsCoilPackingDetailVo::getCoilId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (coilIds.isEmpty()) {
return;
}
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
coilBo.setCoilIds(StringUtils.join(coilIds, ","));
List<WmsMaterialCoilVo> coilVoList = iWmsMaterialCoilService.queryList(coilBo);
Map<Long, WmsMaterialCoilVo> coilMap = coilVoList.stream()
.collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, v -> v, (a, b) -> a));
for (WmsCoilPackingDetailVo detailVo : detailVos) {
detailVo.setCoil(coilMap.get(detailVo.getCoilId()));
}
}
private LambdaQueryWrapper<WmsCoilPackingDetail> buildQueryWrapper(WmsCoilPackingDetailBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsCoilPackingDetail> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getPackingId() != null, WmsCoilPackingDetail::getPackingId, bo.getPackingId());
lqw.eq(bo.getCoilId() != null, WmsCoilPackingDetail::getCoilId, bo.getCoilId());
lqw.eq(bo.getFromWarehouseId() != null, WmsCoilPackingDetail::getFromWarehouseId, bo.getFromWarehouseId());
lqw.eq(bo.getToWarehouseId() != null, WmsCoilPackingDetail::getToWarehouseId, bo.getToWarehouseId());
lqw.eq(bo.getCoilGrossWeight() != null, WmsCoilPackingDetail::getCoilGrossWeight, bo.getCoilGrossWeight());
lqw.eq(bo.getCoilNetWeight() != null, WmsCoilPackingDetail::getCoilNetWeight, bo.getCoilNetWeight());
return lqw;
}
/**
* 新增钢卷打包明细(存储每个钢卷的库区/重量信息)
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "打包入库", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean insertByBo(WmsCoilPackingDetailBo bo) {
Long packingId = bo.getPackingId();
if (packingId == null) {
throw new RuntimeException("打包主表ID不能为空");
}
Long coilId = bo.getCoilId();
WmsMaterialCoil coil = coilMapper.selectById(coilId);
if (coil == null) {
throw new RuntimeException("钢卷不存在coilId: " + coilId);
}
bo.setFromWarehouseId(coil.getWarehouseId());
bo.setCoilGrossWeight(coil.getGrossWeight());
bo.setCoilNetWeight(coil.getNetWeight());
WmsCoilPackingDetail add = BeanUtil.toBean(bo, WmsCoilPackingDetail.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setDetailId(add.getDetailId());
updateRecordWeight(packingId);
WmsMaterialCoil updateCoil = new WmsMaterialCoil();
updateCoil.setCoilId(coilId);
updateCoil.setWarehouseId(bo.getToWarehouseId());
if (StringUtils.isNotBlank(bo.getSaleName())) {
updateCoil.setSaleName(bo.getSaleName());
}
coilMapper.updateById(updateCoil);
}
return flag;
}
/**
* 修改钢卷打包明细(存储每个钢卷的库区/重量信息)
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "打包更新", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean updateByBo(WmsCoilPackingDetailBo bo) {
Long packingId = bo.getPackingId();
if (packingId == null) {
throw new RuntimeException("打包主表ID不能为空");
}
// coilId不能为null
if (bo.getCoilId() == null){
throw new RuntimeException("钢卷ID不能为空");
}
WmsCoilPackingDetail update = BeanUtil.toBean(bo, WmsCoilPackingDetail.class);
validEntityBeforeSave(update);
boolean flag = baseMapper.updateById(update) > 0;
if (flag) {
updateRecordWeight(packingId);
WmsMaterialCoil updateCoil = new WmsMaterialCoil();
updateCoil.setCoilId(bo.getCoilId());
updateCoil.setWarehouseId(bo.getToWarehouseId());
if (StringUtils.isNotBlank(bo.getSaleName())) {
updateCoil.setSaleName(bo.getSaleName());
}
coilMapper.updateById(updateCoil);
}
return flag;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsCoilPackingDetail entity){
}
/**
* 批量删除钢卷打包明细(存储每个钢卷的库区/重量信息)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
}
List<WmsCoilPackingDetail> details = baseMapper.selectBatchIds(ids);
if (details.isEmpty()) {
return false;
}
Set<Long> packingIds = new HashSet<>();
for (WmsCoilPackingDetail detail : details) {
packingIds.add(detail.getPackingId());
}
boolean flag = baseMapper.deleteBatchIds(ids) > 0;
if (flag) {
for (Long packingId : packingIds) {
updateRecordWeight(packingId);
}
}
return flag;
}
private void updateRecordWeight(Long packingId) {
LambdaQueryWrapper<WmsCoilPackingDetail> lqw = Wrappers.lambdaQuery();
lqw.eq(WmsCoilPackingDetail::getPackingId, packingId);
List<WmsCoilPackingDetail> details = baseMapper.selectList(lqw);
BigDecimal totalGrossWeight = BigDecimal.ZERO;
BigDecimal totalNetWeight = BigDecimal.ZERO;
for (WmsCoilPackingDetail detail : details) {
totalGrossWeight = totalGrossWeight.add(detail.getCoilGrossWeight() != null ? detail.getCoilGrossWeight() : BigDecimal.ZERO);
totalNetWeight = totalNetWeight.add(detail.getCoilNetWeight() != null ? detail.getCoilNetWeight() : BigDecimal.ZERO);
}
WmsCoilPackingRecord record = recordMapper.selectById(packingId);
if (record != null) {
record.setCoilCount((long) details.size());
record.setTotalGrossWeight(totalGrossWeight);
record.setTotalNetWeight(totalNetWeight);
recordMapper.updateById(record);
}
}
}