实现对比报表字段模板复用
新增按对比类型持久化字段结构的模板表和接口,复用对比报表新增与查看权限。前端移除临时模板依赖,支持模板加载、保存、应用,并保持报表快照独立。
| New file |
| | |
| | | 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("模板名称已存在"); } |
| | | } |
| | | } |
| | |
| | | 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; |
| | |
| | | { |
| | | 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')") |
| New file |
| | |
| | | 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='对比报表字段模板'; |