From 37600a85b79387ab6afa7bf342eedbf938331e1d Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期日, 06 九月 2026 17:37:28 +0800
Subject: [PATCH] 实现对比报表快照编辑与历史版本

---
 battery-business/src/main/java/com/battery/business/report/CompareReportService.java |   48 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/report/CompareReportService.java b/battery-business/src/main/java/com/battery/business/report/CompareReportService.java
index e953489..f0bdf0b 100644
--- a/battery-business/src/main/java/com/battery/business/report/CompareReportService.java
+++ b/battery-business/src/main/java/com/battery/business/report/CompareReportService.java
@@ -22,7 +22,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-/** 对比来源与首版快照共用同一范围解析,测量始终来自后端当前有效数据。 */
+/** 首次保存和主动更新解析当前来源,普通编辑及历史查看只读取独立快照。 */
 @Service
 public class CompareReportService
 {
@@ -106,14 +106,58 @@
 
     /** 重开只读取保存版本,来源测试、字段或映射已删除也不重新解析。 */
     public Map<String, Object> get(long id)
+    { return get(id, null); }
+
+    /** 指定版本按其冻结内容还原,操作信息来自正式版本记录。 */
+    public Map<String, Object> get(long id, Integer versionNo)
     {
-        var version = reports.get(id);
+        var version = reports.get(id, versionNo);
         Map<String, Object> result = JSON.parseObject(version.snapshotJson());
         result.put("id", id); result.put("versionNo", version.versionNo());
         result.put("creator", version.report().creator()); result.put("createdAt", version.report().createdAt());
+        result.put("operatorName", version.operatorName()); result.put("versionCreatedAt", version.versionCreatedAt());
+        result.put("changeSummary", version.changeSummary());
         return result;
     }
 
+    /** 普通编辑追加展示版本,测量、来源身份和单位完全沿用基准快照。 */
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> edit(long id, CompareReportEditRequest request, long operatorId, String operatorName)
+    {
+        var snapshot = currentSnapshot(id, request.baseVersionNo());
+        validateSettings(request.settings());
+        snapshot.put("name", request.name().trim()); snapshot.put("description", request.description());
+        snapshot.put("experimentName", request.experimentName()); snapshot.put("settings", request.settings());
+        reports.append(id, request.baseVersionNo() + 1, request.name().trim(), JSON.toJSONString(snapshot, JSONWriter.Feature.WriteMapNullValue),
+                operatorId, operatorName, request.changeSummary().trim());
+        return get(id);
+    }
+
+    /** 仅主动更新重读来源;人工表格值仍保留在设置中,不覆盖本次测量快照。 */
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> refresh(long id, CompareReportEditRequest.Refresh request, long operatorId, String operatorName)
+    {
+        var snapshot = currentSnapshot(id, request.baseVersionNo());
+        var items = JSON.parseArray(JSON.toJSONString(snapshot.get("items")), Item.class);
+        var settings = JSON.parseObject(JSON.toJSONString(snapshot.get("settings")), CompareReportRequest.Settings.class);
+        var updated = preview(items.stream().map(item -> item.source().selection()).toList()).stream()
+                .map(item -> new Item(item.source(), item.zeroTime(), item.records(), item.logicalMapping(),
+                        item.businessFields().stream().filter(field -> settings.batteryTemplateFields().contains(field.getFieldName())).toList())).toList();
+        snapshot.put("items", updated);
+        reports.append(id, request.baseVersionNo() + 1, snapshot.getString("name"), JSON.toJSONString(snapshot, JSONWriter.Feature.WriteMapNullValue),
+                operatorId, operatorName, "按最新来源生成:" + request.changeSummary().trim());
+        return get(id);
+    }
+
+    private com.alibaba.fastjson2.JSONObject currentSnapshot(long id, int baseVersionNo)
+    {
+        // 同一报表内串行追加;陈旧页面需重新打开,不从历史版生成回滚版本。
+        reports.lock(id);
+        var current = reports.get(id);
+        if (current.versionNo() != baseVersionNo) throw new ServiceException("报表已有新版本,请重新打开后编辑");
+        return JSON.parseObject(current.snapshotJson());
+    }
+
     private void validateSettings(CompareReportRequest.Settings settings)
     {
         Set<String> metrics = Set.of("voltage", "current", "temperature", "positiveVoltage", "negativeVoltage");

--
Gitblit v1.7.1