From 693b4e4b083919745806cef47ce82039d2f3f149 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 07 九月 2026 00:00:19 +0800
Subject: [PATCH] 实现对比报表字段模板复用

---
 battery-business/src/main/java/com/battery/business/report/CompareFieldTemplateRepository.java |   34 +++++++++++++++++
 ruoyi-admin/src/main/resources/db/migration-final/V14__compare_report_field_templates.sql      |   11 +++++
 ruoyi-admin/src/main/java/com/battery/business/web/CompareReportController.java                |   21 +++++++++-
 3 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/battery-business/src/main/java/com/battery/business/report/CompareFieldTemplateRepository.java b/battery-business/src/main/java/com/battery/business/report/CompareFieldTemplateRepository.java
new file mode 100644
index 0000000..a229bef
--- /dev/null
+++ b/battery-business/src/main/java/com/battery/business/report/CompareFieldTemplateRepository.java
@@ -0,0 +1,34 @@
+package com.battery.business.report;
+
+import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.exception.ServiceException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+import javax.sql.DataSource;
+import java.sql.Timestamp;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class CompareFieldTemplateRepository {
+    private final JdbcTemplate jdbc;
+    public CompareFieldTemplateRepository(DataSource dataSource) { jdbc = new JdbcTemplate(dataSource); }
+    public record Template(long id, String name, String type, List<Map<String, Object>> fields, String creator, long updatedAt) {}
+    @SuppressWarnings("unchecked") private List<Map<String,Object>> fields(String json) { return (List<Map<String,Object>>)(List<?>) JSON.parseArray(json, Map.class); }
+    public List<Template> list() {
+        return jdbc.query("select template_id,template_name,template_type,fields_json,creator_name,updated_at_utc from t_compare_report_field_template where template_type='compare' order by template_name,template_id",
+            (rs, i) -> new Template(rs.getLong(1), rs.getString(2), rs.getString(3), fields(rs.getString(4)), rs.getString(5), rs.getTimestamp(6).getTime()));
+    }
+    public Template get(long id) {
+        List<Template> rows = jdbc.query("select template_id,template_name,template_type,fields_json,creator_name,updated_at_utc from t_compare_report_field_template where template_id=?", (rs,i) -> new Template(rs.getLong(1),rs.getString(2),rs.getString(3),fields(rs.getString(4)),rs.getString(5),rs.getTimestamp(6).getTime()), id);
+        if (rows.isEmpty()) throw new ServiceException("字段模板不存在");
+        return rows.get(0);
+    }
+    public long insert(String name, List<Map<String,Object>> fields, long userId, String userName) {
+        try {
+            var key = new org.springframework.jdbc.support.GeneratedKeyHolder();
+            jdbc.update(c -> { var s=c.prepareStatement("insert into t_compare_report_field_template(template_name,template_type,fields_json,creator_id,creator_name,created_at_utc,updated_at_utc) values(?,'compare',?,?,?,?,?)", java.sql.Statement.RETURN_GENERATED_KEYS); s.setString(1,name); s.setString(2,JSON.toJSONString(fields)); s.setLong(3,userId); s.setString(4,userName); var now=new Timestamp(System.currentTimeMillis()); s.setTimestamp(5,now); s.setTimestamp(6,now); return s; }, key);
+            return key.getKey().longValue();
+        } catch (org.springframework.dao.DuplicateKeyException e) { throw new ServiceException("模板名称已存在"); }
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/battery/business/web/CompareReportController.java b/ruoyi-admin/src/main/java/com/battery/business/web/CompareReportController.java
index ad9ecb6..11d5462 100644
--- a/ruoyi-admin/src/main/java/com/battery/business/web/CompareReportController.java
+++ b/ruoyi-admin/src/main/java/com/battery/business/web/CompareReportController.java
@@ -4,8 +4,10 @@
 import com.battery.business.report.CompareReportService;
 import com.battery.business.report.CompareReportRequest;
 import com.battery.business.report.CompareReportEditRequest;
+import com.battery.business.report.CompareFieldTemplateRepository;
 import jakarta.validation.Valid;
 import java.util.List;
+import java.util.Map;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -24,8 +26,23 @@
 {
     private final CompareReportRepository reports;
     private final CompareReportService service;
-    public CompareReportController(CompareReportRepository reports, CompareReportService service)
-    { this.reports = reports; this.service = service; }
+    private final CompareFieldTemplateRepository templates;
+    public CompareReportController(CompareReportRepository reports, CompareReportService service, CompareFieldTemplateRepository templates)
+    { this.reports = reports; this.service = service; this.templates = templates; }
+
+    @PreAuthorize("@ss.hasPermi('system:compare-report:query')")
+    @GetMapping("/templates")
+    public AjaxResult templates() { return success(templates.list()); }
+
+    @PreAuthorize("@ss.hasPermi('system:compare-report:add')")
+    @PostMapping("/templates")
+    public AjaxResult createTemplate(@RequestBody Map<String, Object> body)
+    {
+        String name = String.valueOf(body.getOrDefault("name", "")).trim();
+        Object fields = body.get("fields");
+        if (name.isBlank() || !(fields instanceof List<?> list) || list.isEmpty() || list.size() > 100) throw new com.ruoyi.common.exception.ServiceException("模板名称和字段不能为空");
+        return success().put("id", templates.insert(name, (List<Map<String,Object>>) (List<?>) list, getUserId(), getUsername()));
+    }
 
     /** 查询报表摘要;筛选与分页沿用现有列表交互。 */
     @PreAuthorize("@ss.hasPermi('system:compare-report:query')")
diff --git a/ruoyi-admin/src/main/resources/db/migration-final/V14__compare_report_field_templates.sql b/ruoyi-admin/src/main/resources/db/migration-final/V14__compare_report_field_templates.sql
new file mode 100644
index 0000000..f11f7a2
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/db/migration-final/V14__compare_report_field_templates.sql
@@ -0,0 +1,11 @@
+CREATE TABLE t_compare_report_field_template (
+    template_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
+    template_name VARCHAR(100) NOT NULL,
+    template_type VARCHAR(30) NOT NULL DEFAULT 'compare',
+    fields_json JSON NOT NULL,
+    creator_id BIGINT NOT NULL,
+    creator_name VARCHAR(64) NOT NULL,
+    created_at_utc DATETIME(3) NOT NULL,
+    updated_at_utc DATETIME(3) NOT NULL,
+    UNIQUE KEY uk_compare_field_template_name (template_type, template_name)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='对比报表字段模板';

--
Gitblit v1.7.1