feat(wms): 添加钢卷变更日志功能
- 新增钢卷变更日志的Service接口及实现类 - 创建钢卷变更日志的业务对象BO和视图对象VO - 实现钢卷变更日志的控制器提供CRUD操作接口 - 添加钢卷变更日志的数据库映射和表结构定义 - 开发钢卷变更日志注解和AOP切面自动记录变更 - 定义钢卷变更类型的枚举类支持多种变更场景 - 在钢卷相关业务方法中集成变更日志记录功能 - 创建钢卷变更日志的数据表SQL脚本文件
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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不能为空");
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user