You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
4.2 KiB

feat(botp): 转换/反写规则版本号递增与全量快照,新增版本历史与对比接口 - 保存即版本 +1 并落全量快照:新增 convert_rule_ver / reverse_writing_rules_ver, 快照以 JSON 内联存储规则主表 + 全部子表分录(字段映射、插件分录 / 反写公式分录、业务规则分录) - 版本号唯一且单调:两张快照表建唯一索引 (rule_id, rule_version);实体 ruleVersion 加 @Version 并注册 OptimisticLockerInnerInterceptor,用「页面打开时的版本号」做 CAS, 影响行数为 0 即提示「已被他人修改,请刷新后重试」,避免并发保存互相覆盖或写坏版本号 - 新增版本历史接口:getVersionList(版本号/创建时间/创建人,不返回 JSON 正文)、 getVersionSnapshot(只读查看指定版本全量快照)、compareVersion(与当前版本或指定版本对比) - 版本对比只产出新增/删除/修改三类结论,不做逐字 diff;规则主表按字段比对并忽略审计字段, 子表分录按业务主键配对(分录为「先删后插」,主键每版都变,按主键配会把所有行显示成删改) - 快照 JSON 分区名对齐任务分派文档附录 A.2:fieldMappings / pluginEntries / formulas / businesses - 反写规则保存逻辑从 ReverseWritingRulesController 下沉到 Service.saveAll, 使版本号递增与快照写入同主表、子表处于同一事务 - 新增幂等 DDL 脚本 botp-rule-version-script.sql:缺列时补 rule_version(information_schema 守卫)、 历史空版本号兜底为 1、建两张快照表,可重复执行
1 week ago
-- ----------------------------
-- BOTP 规则版本快照表 + 版本号字段。
-- 转换规则(convert_rule)、反写规则(reverse_writing_rules)每保存一次,版本号 +1,
-- 并追加一条全量快照记录:快照以 JSON 内联存储规则主表及其全部子表分录。
-- 请在 tenant-admin 服务指向的默认数据库执行该脚本;脚本可重复执行。
-- ----------------------------
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- 1. 补齐版本号字段(老环境的业务表可能没有 rule_version,MySQL 不支持 ADD COLUMN IF NOT EXISTS,
-- 这里用 information_schema 判断后动态执行,保证脚本可重复执行)
-- ----------------------------
SET @ddl = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE `convert_rule` ADD COLUMN `rule_version` int NOT NULL DEFAULT 1 COMMENT ''规则版本号''',
'DO 0')
FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'convert_rule' AND column_name = 'rule_version');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl = (SELECT IF(COUNT(*) = 0,
'ALTER TABLE `reverse_writing_rules` ADD COLUMN `rule_version` int DEFAULT 1 COMMENT ''规则版本号''',
'DO 0')
FROM information_schema.columns
WHERE table_schema = DATABASE() AND table_name = 'reverse_writing_rules' AND column_name = 'rule_version');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ----------------------------
-- 2. 历史数据版本号兜底:乐观锁需要有非空版本号做比较基准,空值/非法值统一按首版处理。
-- 只影响版本号为空或小于 1 的行。
-- ----------------------------
UPDATE `convert_rule` SET `rule_version` = 1 WHERE `rule_version` IS NULL OR `rule_version` < 1;
UPDATE `reverse_writing_rules` SET `rule_version` = 1 WHERE `rule_version` IS NULL OR `rule_version` < 1;
-- ----------------------------
-- 3. 转换规则版本快照表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `convert_rule_ver` (
`id` bigint NOT NULL COMMENT '主键',
`rule_id` bigint NOT NULL COMMENT '所属转换规则Id(convert_rule.id)',
`rule_version` int NOT NULL COMMENT '规则版本号',
`snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:规则主表 + 字段映射分录 + 插件分录',
`remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)',
`create_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人登录名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人登录名称',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_convert_rule_ver_rule_version` (`rule_id`, `rule_version`) USING BTREE,
KEY `idx_convert_rule_ver_rule_id` (`rule_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换规则版本快照';
-- ----------------------------
-- 4. 反写规则版本快照表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `reverse_writing_rules_ver` (
`id` bigint NOT NULL COMMENT '主键',
`rule_id` bigint NOT NULL COMMENT '所属反写规则Id(reverse_writing_rules.id)',
`rule_version` int NOT NULL COMMENT '规则版本号',
`snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:规则主表 + 反写公式分录 + 业务规则分录',
`remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)',
`create_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人登录名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_user_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人登录名称',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_reverse_writing_rules_ver_rule_version` (`rule_id`, `rule_version`) USING BTREE,
KEY `idx_reverse_writing_rules_ver_rule_id` (`rule_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='反写规则版本快照';
SET FOREIGN_KEY_CHECKS = 1;