From 2dbbb942ef7a1a4066f2ead52b569c1836a335ca Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 11 Jul 2026 16:49:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor(wms):=20=E4=BC=98=E5=8C=96=E5=8D=B7?= =?UTF-8?q?=E6=9D=90=E5=8F=98=E6=9B=B4=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构加工变换日志记录,支持合并、分卷等不同场景 - 修改快照对比逻辑,合并新旧键值以避免遗漏空值字段 - 调整仓库层级排序算法,移除四级库位的序号修正 - 注释掉卷材合同关系中的日志记录代码 - 在撤回导出时清空操作人员信息 --- .../crm/service/impl/CrmOrderServiceImpl.java | 9 +-- .../impl/WmsActualWarehouseServiceImpl.java | 50 ++++++------- .../impl/WmsCoilContractRelServiceImpl.java | 71 ++++++++++--------- .../klp/wms/aspect/CoilChangeLogAspect.java | 35 +++++++-- .../mapper/klp/WmsMaterialCoilMapper.xml | 1 + 5 files changed, 96 insertions(+), 70 deletions(-) diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java index c01a1b8f9..419907995 100644 --- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java +++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderServiceImpl.java @@ -276,7 +276,7 @@ public class CrmOrderServiceImpl implements ICrmOrderService { // 1. 置顶优先 (is_top=1 排在前面) // 2. 合同号倒序(KLPY+年月日+序号,降序最新在前) qw.orderByDesc("co.is_top") - .orderByDesc("co.contract_code"); + .orderByDesc("co.contract_code"); return qw; } @@ -365,10 +365,11 @@ public class CrmOrderServiceImpl implements ICrmOrderService { // 计算变更字段差异 Map> diff = new LinkedHashMap<>(); - for (Map.Entry fieldEntry : newSnapshot.entrySet()) { - String field = fieldEntry.getKey(); + Set allKeys = new LinkedHashSet<>(oldSnapshot.keySet()); + allKeys.addAll(newSnapshot.keySet()); + for (String field : allKeys) { Object oldVal = oldSnapshot.get(field); - Object newVal = fieldEntry.getValue(); + Object newVal = newSnapshot.get(field); if (!Objects.equals(oldVal, newVal)) { Map change = new LinkedHashMap<>(); change.put("old", oldVal); diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java index c9c701b5a..6958fd55a 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java @@ -107,10 +107,12 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); Map> diff = new LinkedHashMap<>(); - for (Map.Entry fieldEntry : newSnapshot.entrySet()) { - String field = fieldEntry.getKey(); + // 合并新旧 key,避免置空字段被 beanToMap 忽略而漏掉 + Set allKeys = new LinkedHashSet<>(oldSnapshot.keySet()); + allKeys.addAll(newSnapshot.keySet()); + for (String field : allKeys) { Object oldVal = oldSnapshot.get(field); - Object newVal = fieldEntry.getValue(); + Object newVal = newSnapshot.get(field); if (!Objects.equals(oldVal, newVal)) { Map change = new LinkedHashMap<>(); change.put("old", oldVal); @@ -872,9 +874,9 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService if (parent.getActualWarehouseType() != null && parent.getActualWarehouseType() == 1L) { List l2List = baseMapper.selectList( - new LambdaQueryWrapper() - .eq(WmsActualWarehouse::getParentId, parentId) - .eq(WmsActualWarehouse::getDelFlag, 0) + new LambdaQueryWrapper() + .eq(WmsActualWarehouse::getParentId, parentId) + .eq(WmsActualWarehouse::getDelFlag, 0) ); int totalCount = 0; @@ -895,16 +897,16 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService private int fixLevel(Long parentId, Long l1SortNo, Long l2SortNo, int[] counter) { List list = baseMapper.selectList( - new LambdaQueryWrapper() - .eq(WmsActualWarehouse::getParentId, parentId) - .eq(WmsActualWarehouse::getDelFlag, 0) + new LambdaQueryWrapper() + .eq(WmsActualWarehouse::getParentId, parentId) + .eq(WmsActualWarehouse::getDelFlag, 0) ); if (list.isEmpty()) return 0; // 需求调整:此处不再对四级(小库位)进行 sort_no 修正,只修正三级(大库位)即可 boolean isFourthLevel = list.get(0).getActualWarehouseType() != null - && list.get(0).getActualWarehouseType() == 4L; + && list.get(0).getActualWarehouseType() == 4L; if (isFourthLevel) { return 0; } @@ -919,25 +921,25 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService Matcher m3 = pattern3.matcher(code); if (m3.matches()) { sortKeyMap.put(w, new int[]{ - Integer.parseInt(m3.group(2)), - Integer.parseInt(m3.group(3)), - Integer.parseInt(m3.group(4)) + Integer.parseInt(m3.group(2)), + Integer.parseInt(m3.group(3)), + Integer.parseInt(m3.group(4)) }); } } List sorted = sortKeyMap.entrySet().stream() - .sorted((e1, e2) -> { - int[] k1 = e1.getValue(); - int[] k2 = e2.getValue(); - int c = Integer.compare(k1[0], k2[0]); - if (c != 0) return c; - c = Integer.compare(k1[1], k2[1]); - if (c != 0) return c; - return Integer.compare(k1[2], k2[2]); - }) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); + .sorted((e1, e2) -> { + int[] k1 = e1.getValue(); + int[] k2 = e2.getValue(); + int c = Integer.compare(k1[0], k2[0]); + if (c != 0) return c; + c = Integer.compare(k1[1], k2[1]); + if (c != 0) return c; + return Integer.compare(k1[2], k2[2]); + }) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); List updates = new ArrayList<>(); int totalCount = 0; diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java index 113494460..8de2e8854 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilContractRelServiceImpl.java @@ -118,44 +118,45 @@ public class WmsCoilContractRelServiceImpl implements IWmsCoilContractRelService if (needUpdate) { updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId); - // 更新前抓快照 - WmsMaterialCoil oldCoil = coilMapper.selectById(coilId); - Map oldSnapshot = oldCoil != null ? BeanUtil.beanToMap(oldCoil, false, true) : null; +// // 更新前抓快照 +// WmsMaterialCoil oldCoil = coilMapper.selectById(coilId); +// Map oldSnapshot = oldCoil != null ? BeanUtil.beanToMap(oldCoil, false, true) : null; coilMapper.update(null, updateWrapper); - // 更新后抓快照,计算差异 - try { - WmsMaterialCoil newCoil = coilMapper.selectById(coilId); - Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); - - Map> diff = new LinkedHashMap<>(); - if (oldSnapshot != null) { - for (Map.Entry entry : newSnapshot.entrySet()) { - String field = entry.getKey(); - Object oldVal = oldSnapshot.get(field); - Object newVal = entry.getValue(); - if (!Objects.equals(oldVal, newVal)) { - Map 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) { - // 日志记录失败不影响主流程 - } +// // 更新后抓快照,计算差异 +// try { +// WmsMaterialCoil newCoil = coilMapper.selectById(coilId); +// Map newSnapshot = newCoil != null ? BeanUtil.beanToMap(newCoil, false, true) : new LinkedHashMap<>(); +// +// Map> diff = new LinkedHashMap<>(); +// if (oldSnapshot != null) { +// Set allKeys = new LinkedHashSet<>(oldSnapshot.keySet()); +// allKeys.addAll(newSnapshot.keySet()); +// for (String field : allKeys) { +// Object oldVal = oldSnapshot.get(field); +// Object newVal = newSnapshot.get(field); +// if (!Objects.equals(oldVal, newVal)) { +// Map 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) { +// // 日志记录失败不影响主流程 +// } } } } diff --git a/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java b/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java index ebd7baf78..1c6083cd3 100644 --- a/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java +++ b/klp-wms/src/main/java/com/klp/wms/aspect/CoilChangeLogAspect.java @@ -81,13 +81,34 @@ public class CoilChangeLogAspect { insertLog(changeType, null, newId, null, newSnapshot, coilChangeLog.value()); } } else if (changeType.isProcessing()) { - // 加工变换:旧卷 → 新卷,一一对应(或 多旧 → 一新) - for (int i = 0; i < oldCoilIds.size(); i++) { - Long oldId = oldCoilIds.get(i); - Long newId = (i < newCoilIds.size()) ? newCoilIds.get(i) : null; + // 加工变换:旧卷 → 新卷 + Long commonNewId = newCoilIds.isEmpty() ? null : newCoilIds.get(0); + if (changeType == CoilChangeType.MERGE) { + // N旧→1新:每个旧卷都指向同一个新卷 + for (int i = 0; i < oldCoilIds.size(); i++) { + Long oldId = oldCoilIds.get(i); + Map oldSnapshot = oldSnapshots.get(oldId); + Map newSnapshot = commonNewId != null ? queryCoilSnapshot(commonNewId) : null; + insertLog(changeType, oldId, commonNewId, oldSnapshot, newSnapshot, coilChangeLog.value()); + } + } else if (oldCoilIds.size() == 1 && newCoilIds.size() > 1) { + // 1旧→N新(分卷):每个新卷一条日志,都指向同一个旧母卷 + Long oldId = oldCoilIds.get(0); Map oldSnapshot = oldSnapshots.get(oldId); - Map newSnapshot = (newId != null) ? queryCoilSnapshot(newId) : null; - insertLog(changeType, oldId, newId, oldSnapshot, newSnapshot, coilChangeLog.value()); + String label = coilChangeLog.value() + "-分卷"; + for (Long newId : newCoilIds) { + Map newSnapshot = queryCoilSnapshot(newId); + insertLog(changeType, oldId, newId, oldSnapshot, newSnapshot, label); + } + } else { + // 一一对应:单步加工/回滚/单子卷等 + for (int i = 0; i < oldCoilIds.size(); i++) { + Long oldId = oldCoilIds.get(i); + Long newId = (i < newCoilIds.size()) ? newCoilIds.get(i) : null; + Map oldSnapshot = oldSnapshots.get(oldId); + Map newSnapshot = (newId != null) ? queryCoilSnapshot(newId) : null; + insertLog(changeType, oldId, newId, oldSnapshot, newSnapshot, coilChangeLog.value()); + } } } else { // 原地修改:相同 ID @@ -254,7 +275,7 @@ public class CoilChangeLogAspect { * 对比新旧快照,返回变更字段差异 Map */ private Map> computeDiff(Map oldSnapshot, - Map newSnapshot) { + Map newSnapshot) { Map> diff = new LinkedHashMap<>(); // 检查旧值变更或新增 diff --git a/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml index 9dc2d5306..8a8fd58f0 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsMaterialCoilMapper.xml @@ -909,6 +909,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" UPDATE wms_material_coil SET export_time = NULL, + export_by = NULL, status = #{status} WHERE coil_id = #{coilId}