feat(wms): 添加钢卷变更日志功能

- 新增钢卷变更日志的Service接口及实现类
- 创建钢卷变更日志的业务对象BO和视图对象VO
- 实现钢卷变更日志的控制器提供CRUD操作接口
- 添加钢卷变更日志的数据库映射和表结构定义
- 开发钢卷变更日志注解和AOP切面自动记录变更
- 定义钢卷变更类型的枚举类支持多种变更场景
- 在钢卷相关业务方法中集成变更日志记录功能
- 创建钢卷变更日志的数据表SQL脚本文件
This commit is contained in:
2026-07-11 13:36:04 +08:00
parent 59dfa4f2b8
commit ed08134191
15 changed files with 962 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package com.klp.service;
import com.klp.domain.WmsCoilChangeLog;
import com.klp.domain.vo.WmsCoilChangeLogVo;
import com.klp.domain.bo.WmsCoilChangeLogBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 钢卷变更日志Service接口
*
* @author klp
* @date 2026-07-11
*/
public interface IWmsCoilChangeLogService {
/**
* 查询钢卷变更日志
*/
WmsCoilChangeLogVo queryById(Long logId);
/**
* 查询钢卷变更日志列表
*/
TableDataInfo<WmsCoilChangeLogVo> queryPageList(WmsCoilChangeLogBo bo, PageQuery pageQuery);
/**
* 查询钢卷变更日志列表
*/
List<WmsCoilChangeLogVo> queryList(WmsCoilChangeLogBo bo);
/**
* 新增钢卷变更日志
*/
Boolean insertByBo(WmsCoilChangeLogBo bo);
/**
* 修改钢卷变更日志
*/
Boolean updateByBo(WmsCoilChangeLogBo bo);
/**
* 校验并批量删除钢卷变更日志信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,115 @@
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.WmsCoilChangeLogBo;
import com.klp.domain.vo.WmsCoilChangeLogVo;
import com.klp.domain.WmsCoilChangeLog;
import com.klp.mapper.WmsCoilChangeLogMapper;
import com.klp.service.IWmsCoilChangeLogService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 钢卷变更日志Service业务层处理
*
* @author klp
* @date 2026-07-11
*/
@RequiredArgsConstructor
@Service
public class WmsCoilChangeLogServiceImpl implements IWmsCoilChangeLogService {
private final WmsCoilChangeLogMapper baseMapper;
/**
* 查询钢卷变更日志
*/
@Override
public WmsCoilChangeLogVo queryById(Long logId){
return baseMapper.selectVoById(logId);
}
/**
* 查询钢卷变更日志列表
*/
@Override
public TableDataInfo<WmsCoilChangeLogVo> queryPageList(WmsCoilChangeLogBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WmsCoilChangeLog> lqw = buildQueryWrapper(bo);
Page<WmsCoilChangeLogVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询钢卷变更日志列表
*/
@Override
public List<WmsCoilChangeLogVo> queryList(WmsCoilChangeLogBo bo) {
LambdaQueryWrapper<WmsCoilChangeLog> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<WmsCoilChangeLog> buildQueryWrapper(WmsCoilChangeLogBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsCoilChangeLog> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), WmsCoilChangeLog::getChangeType, bo.getChangeType());
lqw.eq(bo.getOldCoilId() != null, WmsCoilChangeLog::getOldCoilId, bo.getOldCoilId());
lqw.eq(bo.getNewCoilId() != null, WmsCoilChangeLog::getNewCoilId, bo.getNewCoilId());
lqw.eq(StringUtils.isNotBlank(bo.getOldCoilNo()), WmsCoilChangeLog::getOldCoilNo, bo.getOldCoilNo());
lqw.eq(StringUtils.isNotBlank(bo.getNewCoilNo()), WmsCoilChangeLog::getNewCoilNo, bo.getNewCoilNo());
lqw.eq(StringUtils.isNotBlank(bo.getChangedFields()), WmsCoilChangeLog::getChangedFields, bo.getChangedFields());
lqw.eq(StringUtils.isNotBlank(bo.getOperationDesc()), WmsCoilChangeLog::getOperationDesc, bo.getOperationDesc());
return lqw;
}
/**
* 新增钢卷变更日志
*/
@Override
public Boolean insertByBo(WmsCoilChangeLogBo bo) {
WmsCoilChangeLog add = BeanUtil.toBean(bo, WmsCoilChangeLog.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setLogId(add.getLogId());
}
return flag;
}
/**
* 修改钢卷变更日志
*/
@Override
public Boolean updateByBo(WmsCoilChangeLogBo bo) {
WmsCoilChangeLog update = BeanUtil.toBean(bo, WmsCoilChangeLog.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WmsCoilChangeLog entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除钢卷变更日志
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -7,6 +7,8 @@ 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;
@@ -120,6 +122,7 @@ public class WmsCoilPackingDetailServiceImpl implements IWmsCoilPackingDetailSer
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "打包入库", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean insertByBo(WmsCoilPackingDetailBo bo) {
Long packingId = bo.getPackingId();
if (packingId == null) {
@@ -161,6 +164,7 @@ public class WmsCoilPackingDetailServiceImpl implements IWmsCoilPackingDetailSer
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "打包更新", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean updateByBo(WmsCoilPackingDetailBo bo) {
Long packingId = bo.getPackingId();
if (packingId == null) {

View File

@@ -16,6 +16,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.helper.LoginHelper;
import com.klp.common.utils.DateUtils;
import com.klp.common.utils.StringUtils;
import com.klp.wms.annotation.CoilChangeLog;
import com.klp.wms.enums.CoilChangeType;
import com.klp.domain.*;
import com.klp.domain.bo.*;
import com.klp.domain.vo.*;
@@ -1850,6 +1852,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "质量改判", changeType = CoilChangeType.QUALITY_CHANGE)
public void updateQualityStatus(Long coilId, String newQuality, String reason) {
if (coilId == null || StringUtils.isBlank(newQuality)) {
log.warn("updateQualityStatus 参数不足: coilId={}, newQuality={}", coilId, newQuality);
@@ -1903,6 +1906,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "入场收货", changeType = CoilChangeType.INSERT, coilIdBoField = "coilId")
public WmsMaterialCoilVo insertByBo(WmsMaterialCoilBo bo) {
// 检查当前钢卷号是否重复(新增)
Map<String, Object> duplicateCheck = checkCoilNoDuplicate(null, null, bo.getCurrentCoilNo(), null);
@@ -2056,6 +2060,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "钢卷加工", changeType = CoilChangeType.PROCESS, coilIdBoField = "coilId")
public String updateByBo(WmsMaterialCoilBo bo, String qrcodeStepType) {
String result;
// 判断是否批量更新
@@ -2084,6 +2089,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "简单更新", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean updateSimple(WmsMaterialCoilBo bo) {
if (bo.getCoilId() == null) {
throw new RuntimeException("钢卷ID不能为空");
@@ -3279,6 +3285,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
* 批量删除钢卷物料表
*/
@Override
@CoilChangeLog(value = "删除", changeType = CoilChangeType.DELETE, coilIdParam = "ids", isBatch = true)
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
@@ -4010,6 +4017,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
* @return
*/
@Override
@CoilChangeLog(value = "发货", changeType = CoilChangeType.EXPORT)
public int exportCoil(Long coilId) {
// 检查独占状态
validateCoilOperationPermission(coilId, "发货");
@@ -4090,6 +4098,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "合卷", changeType = CoilChangeType.MERGE, coilIdBoField = "coilId")
public Long mergeCoils(WmsMaterialCoilBo bo) {
if (bo.getNewCoils() == null || bo.getNewCoils().isEmpty()) {
throw new RuntimeException("合卷操作需要提供参与合卷的钢卷列表");
@@ -4176,6 +4185,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional
@CoilChangeLog(value = "发货撤回", changeType = CoilChangeType.UPDATE)
public int withdrawExportCoil(Long coilId) {
// 参数校验
if (coilId == null) {
@@ -4205,6 +4215,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
* @return 是否更新成功
*/
@Override
@CoilChangeLog(value = "批量更新发货状态", changeType = CoilChangeType.UPDATE, coilIdParam = "coilIds", isBatch = true)
public Boolean batchUpdateDeliveryStatus(List<Long> coilIds, Integer status) {
if (coilIds == null || coilIds.isEmpty()) {
return false;
@@ -4616,6 +4627,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "回滚", changeType = CoilChangeType.ROLLBACK, coilIdParam = "currentCoilId")
public Map<String, Object> rollbackCoil(Long currentCoilId) {
Map<String, Object> result = new HashMap<>();
result.put("success", false);
@@ -5596,6 +5608,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "创建子卷", changeType = CoilChangeType.SPLIT, coilIdParam = "parentCoilId")
public WmsMaterialCoilVo createChildCoilInSpecialSplit(Long parentCoilId, WmsMaterialCoilBo childCoilBo, Long pendingActionId) {
// 1. 查询母卷信息
WmsMaterialCoil parentCoil = baseMapper.selectById(parentCoilId);
@@ -5921,6 +5934,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "退货", changeType = CoilChangeType.PROCESS)
public WmsMaterialCoilVo returnCoil(Long coilId) {
if (coilId == null) {
throw new RuntimeException("钢卷ID不能为空");
@@ -6200,6 +6214,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
@Override
@CoilChangeLog(value = "修复材质异常", changeType = CoilChangeType.UPDATE)
public Boolean fixMaterialMismatchCoils(Long coilId) {
WmsMaterialCoil coil = baseMapper.selectById(coilId);
if (coil == null) {
@@ -6616,6 +6631,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
@Override
@CoilChangeLog(value = "解锁钢卷", changeType = CoilChangeType.UPDATE)
public Boolean unlockCoil(Long coilId) {
if (coilId == null) {
throw new RuntimeException("钢卷ID不能为空");

View File

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.klp.common.utils.StringUtils;
import com.klp.wms.annotation.CoilChangeLog;
import com.klp.wms.enums.CoilChangeType;
import com.klp.domain.*;
import com.klp.domain.bo.WmsMaterialCoilBo;
import com.klp.domain.vo.WmsMaterialCoilVo;
@@ -529,6 +531,7 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
*/
@Override
@Transactional(rollbackFor = Exception.class)
@CoilChangeLog(value = "确认调拨", changeType = CoilChangeType.UPDATE, coilIdBoField = "coilId")
public Boolean confirmTransfer(WmsTransferOrderItemBo bo) {
Long transferId = bo.getTransferId();
Long orderItemId = bo.getOrderItemId();