feat(wms): 补充注解失效的钢卷变更日志记录功能

- 在CrmOrderServiceImpl中实现订单变更时钢卷快照对比和日志记录
- 在WmsActualWarehouseServiceImpl中实现库位释放时钢卷变更日志记录
- 在WmsCoilContractRelServiceImpl中实现合同关联更新时钢卷变更日志记录
- 重构CoilChangeLogAspect中的导入顺序
- 添加WmsCoilChangeLogMapper依赖注入到相关服务类
- 实现变更前后快照对比和差异字段JSON存储
- 添加异常处理确保日志记录失败不影响主业务流程
This commit is contained in:
2026-07-11 15:06:22 +08:00
parent ed08134191
commit 3bdc1c9879
5 changed files with 172 additions and 11 deletions

View File

@@ -2,11 +2,14 @@ package com.klp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.exception.ServiceException;
import com.klp.common.utils.StringUtils;
import com.klp.domain.WmsCoilChangeLog;
import com.klp.mapper.WmsCoilChangeLogMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -22,6 +25,7 @@ import com.klp.mapper.WmsActualWarehouseMapper;
import com.klp.service.IWmsActualWarehouseService;
import com.klp.domain.WmsMaterialCoil;
import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.wms.enums.CoilChangeType;
import java.util.*;
import java.util.regex.Matcher;
@@ -40,6 +44,7 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService
private final WmsActualWarehouseMapper baseMapper;
private final WmsMaterialCoilMapper wmsMaterialCoilMapper;
private final WmsCoilChangeLogMapper changeLogMapper;
/**
* 查询实际库区/库位自关联
@@ -72,6 +77,19 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService
}
// 2) 清空钢卷绑定(仅现存且未删除)- 使用UpdateWrapper进行更新
// 更新前查询受影响的钢卷(全字段,用于快照)
LambdaQueryWrapper<WmsMaterialCoil> affectedQw = Wrappers.lambdaQuery();
affectedQw.eq(WmsMaterialCoil::getActualWarehouseId, actualWarehouseId)
.eq(WmsMaterialCoil::getDataType, 1)
.eq(WmsMaterialCoil::getDelFlag, 0);
List<WmsMaterialCoil> affectedCoils = wmsMaterialCoilMapper.selectList(affectedQw);
// 保存旧快照
Map<Long, Map<String, Object>> oldSnapshots = new LinkedHashMap<>();
for (WmsMaterialCoil coil : affectedCoils) {
oldSnapshots.put(coil.getCoilId(), BeanUtil.beanToMap(coil, false, true));
}
UpdateWrapper<WmsMaterialCoil> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("actual_warehouse_id", actualWarehouseId)
.eq("data_type", 1)
@@ -79,6 +97,41 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService
.set("actual_warehouse_id", null);
wmsMaterialCoilMapper.update(null, updateWrapper);
// 更新后抓快照,计算差异并记录日志
try {
for (Map.Entry<Long, Map<String, Object>> entry : oldSnapshots.entrySet()) {
Long coilId = entry.getKey();
Map<String, Object> oldSnapshot = entry.getValue();
WmsMaterialCoil newCoil = wmsMaterialCoilMapper.selectById(coilId);
Map<String, Object> newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>();
Map<String, Map<String, Object>> diff = new LinkedHashMap<>();
for (Map.Entry<String, Object> fieldEntry : newSnapshot.entrySet()) {
String field = fieldEntry.getKey();
Object oldVal = oldSnapshot.get(field);
Object newVal = fieldEntry.getValue();
if (!Objects.equals(oldVal, newVal)) {
Map<String, Object> change = new LinkedHashMap<>();
change.put("old", oldVal);
change.put("new", newVal);
diff.put(field, change);
}
}
WmsCoilChangeLog log = new WmsCoilChangeLog();
log.setChangeType(CoilChangeType.UPDATE.name());
log.setOldCoilId(coilId);
log.setNewCoilId(coilId);
log.setOldCoilNo(oldSnapshot.get("currentCoilNo") != null ? String.valueOf(oldSnapshot.get("currentCoilNo")) : null);
log.setNewCoilNo(newSnapshot.get("currentCoilNo") != null ? String.valueOf(newSnapshot.get("currentCoilNo")) : null);
log.setChangedFields(diff.isEmpty() ? null : JSONUtil.toJsonStr(diff));
log.setOperationDesc("释放实际库位");
changeLogMapper.insert(log);
}
} catch (Exception e) {
// 日志记录失败不影响主流程
}
}
@Override

View File

@@ -1,6 +1,7 @@
package com.klp.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,6 +9,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import com.klp.domain.WmsCoilChangeLog;
import com.klp.mapper.WmsCoilChangeLogMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsCoilContractRelBo;
@@ -18,13 +21,11 @@ import com.klp.domain.WmsCoilContractRel;
import com.klp.domain.WmsMaterialCoil;
import com.klp.mapper.WmsCoilContractRelMapper;
import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.wms.enums.CoilChangeType;
import com.klp.service.IWmsCoilContractRelService;
import com.klp.common.exception.ServiceException;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Collections;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -40,6 +41,7 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService
private final WmsCoilContractRelMapper baseMapper;
private final WmsMaterialCoilMapper coilMapper;
private final WmsCoilChangeLogMapper changeLogMapper;
/**
* 查询钢卷与合同关联关系
@@ -115,7 +117,45 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService
}
if (needUpdate) {
updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId);
// 更新前抓快照
WmsMaterialCoil oldCoil = coilMapper.selectById(coilId);
Map<String, Object> oldSnapshot = oldCoil != null ? BeanUtil.beanToMap(oldCoil, false, true) : null;
coilMapper.update(null, updateWrapper);
// 更新后抓快照,计算差异
try {
WmsMaterialCoil newCoil = coilMapper.selectById(coilId);
Map<String, Object> newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>();
Map<String, Map<String, Object>> diff = new LinkedHashMap<>();
if (oldSnapshot != null) {
for (Map.Entry<String, Object> entry : newSnapshot.entrySet()) {
String field = entry.getKey();
Object oldVal = oldSnapshot.get(field);
Object newVal = entry.getValue();
if (!Objects.equals(oldVal, newVal)) {
Map<String, Object> change = new LinkedHashMap<>();
change.put("old", oldVal);
change.put("new", newVal);
diff.put(field, change);
}
}
}
WmsCoilChangeLog log = new WmsCoilChangeLog();
log.setChangeType(CoilChangeType.UPDATE.name());
log.setOldCoilId(coilId);
log.setNewCoilId(coilId);
log.setOldCoilNo(oldSnapshot != null ? String.valueOf(oldSnapshot.get("currentCoilNo")) : null);
log.setNewCoilNo(newSnapshot.get("currentCoilNo") != null ? String.valueOf(newSnapshot.get("currentCoilNo")) : null);
log.setChangedFields(diff.isEmpty() ? null : JSONUtil.toJsonStr(diff));
log.setOperationDesc("同步销售员/合同号");
changeLogMapper.insert(log);
} catch (Exception e) {
// 日志记录失败不影响主流程
}
}
}
}

View File

@@ -88,6 +88,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
private final WmsCoilContractRelMapper coilContractRelMapper;
private final WmsCoilQualityRejudgeMapper wmsCoilQualityRejudgeMapper;
private final WmsCoilAbnormalMapper coilAbnormalMapper;
// private final WmsCoilChangeLogMapper changeLogMapper;
/**
* 查询钢卷物料表
@@ -5811,6 +5812,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
.set(WmsMaterialCoil::getParentCoilNos, String.join(",", childCoilNos)); // 记录子卷号
baseMapper.update(null, parentUpdateWrapper);
// // 记录母卷变更日志
// try {
// WmsCoilChangeLog log = new WmsCoilChangeLog();
// log.setChangeType(CoilChangeType.SPLIT.name());
// log.setOldCoilId(parentCoilId);
// log.setNewCoilId(parentCoilId);
// log.setOldCoilNo(parentCoil.getCurrentCoilNo());
// log.setOperationDesc("完成分卷-母卷变历史");
// changeLogMapper.insert(log);
// } catch (Exception e) {
// // 日志记录失败不影响主流程
// }
// 4.1 将母卷的二维码标记为失效
if (parentCoil.getQrcodeRecordId() != null) {
WmsGenerateRecordBo parentQrBo = new WmsGenerateRecordBo();

View File

@@ -2,8 +2,8 @@ package com.klp.wms.aspect;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.klp.domain.WmsMaterialCoil;
import com.klp.domain.WmsCoilChangeLog;
import com.klp.domain.WmsMaterialCoil;
import com.klp.mapper.WmsCoilChangeLogMapper;
import com.klp.mapper.WmsMaterialCoilMapper;
import com.klp.wms.annotation.CoilChangeLog;