| | |
| | | package com.battery.business.report; |
| | | |
| | | import java.sql.Timestamp; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import javax.sql.DataSource; |
| | | import org.springframework.jdbc.core.JdbcTemplate; |
| | | import org.springframework.jdbc.support.GeneratedKeyHolder; |
| | | import org.springframework.stereotype.Repository; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | |
| | | /** 报表身份和版本存储;重读只访问报表表,不联查来源测试。 */ |
| | | /** 对比报表身份与版本只使用对比表,复用独立版本持久化规则。 */ |
| | | @Repository |
| | | public class CompareReportRepository |
| | | public class CompareReportRepository extends ReportVersionRepository |
| | | { |
| | | private final JdbcTemplate jdbc; |
| | | |
| | | public CompareReportRepository(DataSource dataSource) { jdbc = new JdbcTemplate(dataSource); } |
| | | |
| | | public record Summary(long id, String name, String creator, long createdAt) { } |
| | | public record Version(Summary report, int versionNo, String snapshotJson, String operatorName, long versionCreatedAt, String changeSummary) { } |
| | | public record History(int versionNo, String operatorName, long createdAt, String changeSummary) { } |
| | | |
| | | /** 查询所有已保存报表摘要,允许授权用户跨创建人查看。 */ |
| | | public List<Summary> list() |
| | | { |
| | | return jdbc.query("select report_id, report_name, creator_name, created_at_utc from t_compare_report order by created_at_utc desc, report_id desc", |
| | | (rs, index) -> new Summary(rs.getLong(1), rs.getString(2), rs.getString(3), rs.getTimestamp(4).getTime())); |
| | | } |
| | | |
| | | /** 重读最新完整版本;来源不存在不影响结果。 */ |
| | | public Version get(long id) |
| | | { return get(id, null); } |
| | | |
| | | /** 读取指定历史版,版本号为空时读取最新版本。 */ |
| | | public Version get(long id, Integer versionNo) |
| | | { |
| | | var rows = jdbc.query("select r.report_id, r.report_name, r.creator_name, r.created_at_utc, v.version_no, v.snapshot_json, v.operator_name, v.created_at_utc, v.change_summary " |
| | | + "from t_compare_report r join t_compare_report_version v on v.report_id=r.report_id where r.report_id=? " |
| | | + (versionNo == null ? "and v.version_no=(select max(v2.version_no) from t_compare_report_version v2 where v2.report_id=r.report_id)" : "and v.version_no=?"), |
| | | (rs, index) -> new Version(new Summary(rs.getLong(1), rs.getString(2), rs.getString(3), rs.getTimestamp(4).getTime()), |
| | | rs.getInt(5), rs.getString(6), rs.getString(7), rs.getTimestamp(8).getTime(), rs.getString(9)), |
| | | versionNo == null ? new Object[] { id } : new Object[] { id, versionNo }); |
| | | if (rows.isEmpty()) throw new ServiceException("对比报表或版本不存在"); |
| | | return rows.get(0); |
| | | } |
| | | |
| | | /** 历史摘要只来自正式版本,不返回测量快照。 */ |
| | | public List<History> history(long id) |
| | | { |
| | | return jdbc.query("select version_no,operator_name,created_at_utc,change_summary from t_compare_report_version where report_id=? order by version_no desc", |
| | | (rs, index) -> new History(rs.getInt(1), rs.getString(2), rs.getTimestamp(3).getTime(), rs.getString(4)), id); |
| | | } |
| | | |
| | | /** 业务事务内锁定报表,版本号分配与旧基准拒绝共用此锁。 */ |
| | | public void lock(long id) |
| | | { |
| | | if (jdbc.queryForList("select report_id from t_compare_report where report_id=? for update", Long.class, id).isEmpty()) |
| | | throw new ServiceException("对比报表不存在"); |
| | | } |
| | | |
| | | /** 仅在业务事务和报表锁内调用;物理清理全部版本,同步保留最小操作日志。 */ |
| | | public void delete(long id, long operatorId, String operatorName) |
| | | { |
| | | String name = jdbc.queryForObject("select report_name from t_compare_report where report_id=?", String.class, id); |
| | | jdbc.update("delete from t_compare_report_version where report_id=?", id); |
| | | jdbc.update("delete from t_compare_report where report_id=?", id); |
| | | // 不走异步 @Log,日志失败必须回滚删除;只保留身份,不读取或记录测量快照。 |
| | | jdbc.update("insert into sys_oper_log(title,business_type,method,request_method,operator_type,oper_name,oper_url,oper_param,status,oper_time) values(?,3,?,'DELETE',1,?,?,?,0,?)", |
| | | "对比报表删除", "compare-report.delete", operatorName, "/system/compare-report/" + id, |
| | | JSON.toJSONString(Map.of("reportId", id, "reportName", name, "operatorId", operatorId)), new Timestamp(System.currentTimeMillis())); |
| | | } |
| | | |
| | | /** 只追加版本并更新列表名称;业务事务保证两步同时成功。 */ |
| | | public void append(long id, int versionNo, String name, String snapshot, long operatorId, String operatorName, String summary) |
| | | { |
| | | jdbc.update("insert into t_compare_report_version(report_id,version_no,snapshot_json,operator_id,operator_name,created_at_utc,change_summary) values(?,?,?,?,?,?,?)", |
| | | id, versionNo, snapshot, operatorId, operatorName, new Timestamp(System.currentTimeMillis()), summary); |
| | | jdbc.update("update t_compare_report set report_name=? where report_id=?", name, id); |
| | | } |
| | | |
| | | /** 由业务事务调用,身份与首个版本任一写入失败必须一起回滚。 */ |
| | | public long insert(String name, String snapshot, long operatorId, String operatorName, long createdAt) |
| | | { |
| | | var keys = new GeneratedKeyHolder(); |
| | | jdbc.update(connection -> { |
| | | var statement = connection.prepareStatement("insert into t_compare_report(report_name,creator_id,creator_name,created_at_utc) values(?,?,?,?)", java.sql.Statement.RETURN_GENERATED_KEYS); |
| | | statement.setString(1, name); statement.setLong(2, operatorId); statement.setString(3, operatorName); |
| | | statement.setTimestamp(4, new Timestamp(createdAt)); |
| | | return statement; |
| | | }, keys); |
| | | long id = keys.getKey().longValue(); |
| | | jdbc.update("insert into t_compare_report_version(report_id,version_no,snapshot_json,operator_id,operator_name,created_at_utc,change_summary) values(?,1,?,?,?,?,?)", |
| | | id, snapshot, operatorId, operatorName, new Timestamp(createdAt), "首次保存对比报表"); |
| | | return id; |
| | | } |
| | | public CompareReportRepository(DataSource dataSource) { super(dataSource, "compare", "对比"); } |
| | | } |