From 90b6d6768ebeebc44863850289a4696203a0cda9 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 09 九月 2026 12:25:33 +0800
Subject: [PATCH] 按三类数据分别保存工作簿导入修订

---
 battery-business/src/main/java/com/battery/business/service/impl/TestConsoleDataServiceImpl.java |   37 ++++++++++++++++++++++++++-----------
 1 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/service/impl/TestConsoleDataServiceImpl.java b/battery-business/src/main/java/com/battery/business/service/impl/TestConsoleDataServiceImpl.java
index 7bf81d0..547d62e 100644
--- a/battery-business/src/main/java/com/battery/business/service/impl/TestConsoleDataServiceImpl.java
+++ b/battery-business/src/main/java/com/battery/business/service/impl/TestConsoleDataServiceImpl.java
@@ -33,7 +33,7 @@
     @Override public List<TTestDataRevisionAction> selectActions(TTestDataRevisionAction query)
     {
         if (query == null) query = new TTestDataRevisionAction();
-        if (query.getDataType() != null && !Set.of("REALTIME", "STEP", "CYCLE", "ALL").contains(query.getDataType())) throw new ServiceException("数据类型无效");
+        if (query.getDataType() != null && !Set.of("REALTIME", "STEP", "CYCLE").contains(query.getDataType())) throw new ServiceException("数据类型无效");
         if (query.getOperationType() != null && !Set.of("EDIT", "IMPORT", "DELETE").contains(query.getOperationType())) throw new ServiceException("操作类型无效");
         return mapper.selectDataRevisionActions(query);
     }
@@ -44,7 +44,7 @@
 
     /**
      * 一次提交与接收、测试整体删除互斥;任一目标无效时整次动作回滚。导入仅允许检测完成的测试。
-     * @return 新增修订编号;导入全部重复时返回 null,不新增修订,跳过数量写入 action。
+     * @return 首条新增修订编号,全部编号写入 action;导入全部重复时返回 null,不新增修订。
      */
     @Override @Transactional(rollbackFor = Exception.class)
     public Long submitAction(TTestDataRevisionAction action, List<DataRevisionItem> items)
@@ -59,6 +59,7 @@
         if (test == null) throw new ServiceException("测试不存在");
         action.setCreatedAtUtc(new Date());
         action.setReason(action.getReason().trim());
+        action.setActionIds(List.of());
         List<Map<String, Object>> before = new ArrayList<>();
         List<Map<String, Object>> changes = new ArrayList<>();
         List<Runnable> mutations = new ArrayList<>();
@@ -68,23 +69,38 @@
             boolean workbook = "ALL".equals(action.getDataType());
             Map<String, List<Map<String, Object>>> sheets = importSheets(action, workbook);
             List<String> errors = new ArrayList<>();
-            List<String> addedIdentities = new ArrayList<>();
+            List<TTestDataRevisionAction> revisions = new ArrayList<>();
             Map<String, Map<String, Object>> bindings = new LinkedHashMap<>();
             Set<String> expectedBatteries = null;
             action.setImportedCount(0); action.setSkippedCount(0);
             for (var sheet : sheets.entrySet())
             {
+                List<String> addedIdentities = new ArrayList<>();
+                List<Map<String, Object>> sheetChanges = new ArrayList<>();
                 Set<String> batteries = prepareImport(action, sheet.getKey(), sheet.getValue(), workbook, bindings,
-                        errors, addedIdentities, changes, mutations);
+                        errors, addedIdentities, sheetChanges, mutations);
                 if (workbook && expectedBatteries != null && !expectedBatteries.equals(batteries))
                     errors.add(sheetLabel(sheet.getKey()) + "工作表,列「电池号」:三个 Sheet 的电池号集合不一致");
                 expectedBatteries = batteries;
+                var revision = new TTestDataRevisionAction();
+                revision.setTestId(action.getTestId()); revision.setDataType(sheet.getKey()); revision.setOperationType("IMPORT");
+                revision.setScopeSummary("导入" + sheetChanges.size() + "条" + sheetLabel(sheet.getKey()) + "数据");
+                revision.setIdentitySummary(JSON.toJSONString(addedIdentities));
+                revision.setChangesSummary(JSON.toJSONString(sheetChanges)); revision.setBeforeContentJson("[]");
+                revision.setOperatorId(action.getOperatorId()); revision.setOperatorName(action.getOperatorName());
+                revision.setReason(action.getReason()); revision.setCreatedAtUtc(action.getCreatedAtUtc());
+                revisions.add(revision);
+                action.setImportedCount(action.getImportedCount() + sheetChanges.size());
             }
-            // 三类全量校验后才执行写入,共享测试行锁、事务和唯一修订编号;失败不留下部分数据或修订。
+            // ALL 仅为请求调度标记;三类全量校验后按类型写修订,共享测试行锁和事务。
+            // 整批全重复不留修订;部分重复仍分别记录各类实际新增数量,失败全部回滚。
             if (!errors.isEmpty()) throw new ServiceException(String.join(";", errors));
-            action.setImportedCount(changes.size());
-            action.setIdentitySummary(JSON.toJSONString(addedIdentities));
-            if (changes.isEmpty()) return null;
+            if (action.getImportedCount() == 0) return null;
+            revisions.forEach(mapper::insertDataRevisionAction);
+            mutations.forEach(Runnable::run);
+            action.setActionIds(revisions.stream().map(TTestDataRevisionAction::getActionId).toList());
+            action.setActionId(action.getActionIds().get(0));
+            return action.getActionId();
         }
         else
         {
@@ -129,6 +145,7 @@
         action.setChangesSummary(JSON.toJSONString("DELETE".equals(action.getOperationType()) ? before : changes));
         mapper.insertDataRevisionAction(action);
         mutations.forEach(Runnable::run);
+        action.setActionIds(List.of(action.getActionId()));
         return action.getActionId();
     }
 
@@ -186,11 +203,9 @@
                     continue;
                 }
                 identities.put(identity, values);
-                String revisionIdentity = workbook ? type + ":" + identity : identity;
-                addedIdentities.add(revisionIdentity);
+                addedIdentities.add(identity);
                 mutations.add(() -> mapper.insertImportedDataRecord(type, values));
                 Map<String, Object> change = new LinkedHashMap<>(row);
-                if (workbook) { change.put("dataType", type); change.put("identity", revisionIdentity); }
                 changes.add(change);
             }
             catch (ServiceException ex) { errors.add((workbook ? sheetLabel(type) + "工作表," : "") + "第" + sourceRow + "行," + ex.getMessage()); }

--
Gitblit v1.7.1