feat(wms): 补充注解失效的钢卷变更日志记录功能
- 在CrmOrderServiceImpl中实现订单变更时钢卷快照对比和日志记录 - 在WmsActualWarehouseServiceImpl中实现库位释放时钢卷变更日志记录 - 在WmsCoilContractRelServiceImpl中实现合同关联更新时钢卷变更日志记录 - 重构CoilChangeLogAspect中的导入顺序 - 添加WmsCoilChangeLogMapper依赖注入到相关服务类 - 实现变更前后快照对比和差异字段JSON存储 - 添加异常处理确保日志记录失败不影响主业务流程
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package com.klp.crm.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
@@ -9,7 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
|
||||
import com.klp.mapper.WmsCoilContractRelMapper;
|
||||
import com.klp.domain.*;
|
||||
import com.klp.mapper.*;
|
||||
import com.klp.wms.enums.CoilChangeType;
|
||||
import com.klp.system.service.ISysUserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -18,15 +21,10 @@ import com.klp.crm.domain.vo.CrmOrderVo;
|
||||
import com.klp.crm.domain.CrmOrder;
|
||||
import com.klp.crm.mapper.CrmOrderMapper;
|
||||
import com.klp.crm.service.ICrmOrderService;
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.service.IWmsCoilContractRelService;
|
||||
import com.klp.service.IWmsMaterialCoilService;
|
||||
import com.klp.domain.WmsDeliveryWaybill;
|
||||
import com.klp.domain.WmsDeliveryWaybillDetail;
|
||||
import com.klp.mapper.WmsDeliveryWaybillDetailMapper;
|
||||
import com.klp.mapper.WmsDeliveryWaybillMapper;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -47,6 +45,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
|
||||
private final WmsCoilContractRelMapper coilContractRelMapper;
|
||||
|
||||
private final WmsMaterialCoilMapper coilMapper;
|
||||
|
||||
private final WmsCoilChangeLogMapper changeLogMapper;
|
||||
|
||||
private final IWmsMaterialCoilService materialCoilService;
|
||||
|
||||
private final WmsDeliveryWaybillDetailMapper wmsDeliveryWaybillDetailMapper;
|
||||
@@ -332,10 +334,62 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
boolean salesmanChanged = !Objects.equals(oldSalesman, newSalesman);
|
||||
boolean contractCodeChanged = !Objects.equals(oldContractCode, newContractCode);
|
||||
if (salesmanChanged || contractCodeChanged) {
|
||||
// 查询受影响的钢卷,抓取变更前快照
|
||||
Map<Long, Map<String, Object>> oldSnapshots = new LinkedHashMap<>();
|
||||
try {
|
||||
LambdaQueryWrapper<WmsCoilContractRel> relQw = Wrappers.lambdaQuery();
|
||||
relQw.eq(WmsCoilContractRel::getContractId, bo.getOrderId());
|
||||
List<WmsCoilContractRel> rels = coilContractRelMapper.selectList(relQw);
|
||||
for (WmsCoilContractRel rel : rels) {
|
||||
WmsMaterialCoil oldCoil = coilMapper.selectById(rel.getCoilId());
|
||||
if (oldCoil != null) {
|
||||
oldSnapshots.put(rel.getCoilId(), BeanUtil.beanToMap(oldCoil, false, true));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 快照失败不影响主流程
|
||||
}
|
||||
|
||||
coilContractRelMapper.updateCoilSaleNameByOrderId(
|
||||
bo.getOrderId(),
|
||||
StringUtils.isNotBlank(newSalesman) ? newSalesman : oldSalesman,
|
||||
StringUtils.isNotBlank(newContractCode) ? newContractCode : oldContractCode);
|
||||
|
||||
// 抓取变更后快照,计算差异并记录日志
|
||||
try {
|
||||
for (Map.Entry<Long, Map<String, Object>> entry : oldSnapshots.entrySet()) {
|
||||
Long coilId = entry.getKey();
|
||||
Map<String, Object> oldSnapshot = entry.getValue();
|
||||
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<>();
|
||||
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) {
|
||||
// 日志记录失败不影响主流程
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
// 日志记录失败不影响主流程
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user