-- ---------------------------- -- BOTP 业务规则内核:10 张表的完整建表语句(建库用) -- -- 用途: -- 1) 全新环境建库:直接执行本脚本即得到 BOTP 的完整表结构; -- 2) 存量环境结构比对:本脚本是「应然结构」,与线上 SHOW CREATE TABLE 比对可发现缺列。 -- -- ⚠ 存量环境不要直接执行本脚本: -- - 本脚本不带 IF NOT EXISTS,表已存在会报错(不会覆盖数据,但会中断后续语句); -- - 存量环境请按顺序执行增量脚本: -- ① botp-reverse-writing-tables-script.sql (反写三表,表不存在则建) -- ② botp-rule-version-script.sql (rule_version + 两张快照表) -- ③ convert-relation-entry-writeback-script.sql(convert_relation_entry 两列) -- ④ botp-rule-columns-script.sql (其余 11 列 + 2 个索引) -- ⑤ botp-migration-data-script.sql (存量数据兜底 + 插件回填,会改数据,先备份) -- ⑥ closed_flag 补列(见升级说明 §1.6,仓库内无脚本,需逐表 ALTER) -- -- 涉及 10 张表: -- convert_rule / convert_fieldmapping_entry / convert_plugin_entry -- convert_relation / convert_relation_entry -- reverse_writing_rules / reverse_writing_formula / reverse_writing_business -- convert_rule_ver / reverse_writing_rules_ver -- -- 执行位置:tenant-admin 服务指向的默认数据库。多租户部署时每个租户库都要执行。 -- 建表顺序:无外键依赖,可任意顺序;表间关系靠 parent_id / rules_id / rule_id 逻辑关联。 -- -- 关于列类型(与实体逐项核对过,详见升级说明 §1.3): -- - 枚举编码一律 varchar 存数字字符串('1'/'2'/'3'),不是 int; -- - convert_rule.enabled 是 String、convert_plugin_entry.serial_number 是 String(按字符串排序); -- - convert_fieldmapping_entry.serial_number 是 Integer(int,默认 10); -- - reverse_writing_*.enable 是 int,与历史口径一致,勿改成 varchar; -- - reverse_writing_rules.rollback_on_revoke 是 Integer(tinyint),不是 Boolean; -- - convert_relation.source_id / target_id 是 varchar,不是 bigint; -- - convert_relation_entry 的列名是 targe_entry_*(少一个 t,是实体既有拼写,勿改); -- - 审计四列来自 BaseModel;反写三表与 convert_relation 的 create_user_id / create_time 为 NOT NULL。 -- -- 回滚段:文件末尾。 -- ---------------------------- SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ============================================================================ -- 一、规则配置表 -- ============================================================================ -- ---------------------------- -- 1. 转换规则主表 -- source_entity_id / target_entity_id 存 OnlFormHead.id(单元数据主键),不是表名 -- auto_save:'1' 或 'true' 视为开(下推即落库),空值与其它值视为关(前端手动保存) -- split_merge_strategy:1 一对一 / 2 多对一 / 3 按规则分组合并 -- group_by_field 存源单字段 OnlFormField.id;group_by_field_name 仅展示,执行侧不读 -- enable_condition_json / select_filter_json 留空(NULL)表示不限制;空串会被当成「配了但解析失败」 -- ---------------------------- CREATE TABLE `convert_rule` ( `id` bigint(20) NOT NULL COMMENT '主键', `deleted_flag` int(11) DEFAULT '1' COMMENT '逻辑删除标记(1:正常 -1:已删除)', `number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '规则编码', `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '规则名称', `source_entity_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单(OnlFormHead.id)', `source_table` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单表名', `target_entity_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单(OnlFormHead.id)', `enabled` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '启动状态(1:启用)', `is_default` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否默认', `auto_save` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '下推自动保存(1/true:是 其它或空:否)', `visible` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '运行时可见', `up_interface_type` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '上游界面类型', `down_interface_type` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '下游界面类型', `up_route_interface` bigint(20) DEFAULT NULL COMMENT '上游路由界面(xy_sys_menu.id)', `down_route_interface` bigint(20) DEFAULT NULL COMMENT '下游路由界面(xy_sys_menu.id)', `up_list_interface` bigint(20) DEFAULT NULL COMMENT '上游在线列表界面(OnlineForm.id)', `up_edit_interface` bigint(20) DEFAULT NULL COMMENT '上游在线编辑界面(OnlineForm.id)', `down_list_interface` bigint(20) DEFAULT NULL COMMENT '下游在线列表界面(OnlineForm.id)', `down_edit_interface` bigint(20) DEFAULT NULL COMMENT '下游在线编辑界面(OnlineForm.id)', `split_merge_strategy` varchar(10) COLLATE utf8mb4_bin NOT NULL DEFAULT '1' COMMENT '分单策略(1:一对一 2:多对一 3:按规则分组合并)', `group_by_field` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分单字段(源单OnlFormField.id;策略为3时必填)', `group_by_field_name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '分单字段名称(仅展示)', `enable_condition_json` text COLLATE utf8mb4_bin COMMENT '规则启用条件JSON;留空表示始终启用', `select_filter_json` text COLLATE utf8mb4_bin COMMENT '选单过滤JSON;留空表示全部通过;下推与拉式共用', `rule_version` int(11) NOT NULL DEFAULT '1' COMMENT '规则版本号(@Version乐观锁)', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uk_convert_rule_number` (`number`) USING BTREE, KEY `idx_convert_rule_target` (`target_entity_id`) USING BTREE, KEY `idx_convert_rule_source` (`source_entity_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换规则存值主表'; -- ---------------------------- -- 2. 字段映射分录 -- parent_id 指向 convert_rule.id -- value_method:1 源单字段 / 2 常量 / 3 计算公式 / 4 按条件取值 -- calculation_json:以 { 开头是计算公式对象(valueMethod=3),以 [ 开头是条件分支数组(valueMethod=4) -- merge_method:1 直接取 / 2 求和 / 3 拼接(仅策略 2/3 且有合并场景时生效) -- entry_target 存目标单据 OnlFormHead.id(与 target_entity_id 同口径),单分录时可留空 -- serial_number 参与「是否同一映射」判定,使同一目标字段的多条映射不再互相覆盖 -- ---------------------------- CREATE TABLE `convert_fieldmapping_entry` ( `id` bigint(20) NOT NULL COMMENT '主键', `deleted_flag` int(11) DEFAULT '1' COMMENT '逻辑删除标记(1:正常 -1:已删除)', `oldfield_number` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单字段(OnlFormField.id)', `oldfield_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单字段名称', `newfield_number` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单字段(OnlFormField.id)', `newfield_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单字段名称', `calculation` text COLLATE utf8mb4_bin COMMENT '计算公式(原文)', `calculation_json` text COLLATE utf8mb4_bin COMMENT '取值方式3:计算公式对象{...} 取值方式4:条件分支数组[...]', `value_method` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '取值方式(1:源单字段 2:常量 3:计算公式 4:按条件取值)', `clt_value` varchar(500) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '常量值/未命中分支时的兜底取值', `parent_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '所属转换规则(convert_rule.id)', `merge_method` varchar(10) COLLATE utf8mb4_bin NOT NULL DEFAULT '1' COMMENT '合并方式(1:直接取 2:求和 3:拼接)', `entry_target` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标分录(目标单据OnlFormHead.id)', `serial_number` int(11) DEFAULT '10' COMMENT '执行顺序;数字越小越先执行', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_fieldmapping_parent` (`parent_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换规则-字段映射分录'; -- ---------------------------- -- 3. 插件分录(转换插件与反写插件共用本表,靠 type 区分) -- parent_id:type=convert 时指向 convert_rule.id;type=writeback 时指向 reverse_writing_rules.id -- commen:插件参数「键=列名,键=列名」。原先写死在 Java 里的表名/字段名改从这里取, -- 升级后必须由 botp-migration-data-script.sql 回填,否则插件取不到字段而静默失效 -- serial_number:注意是 varchar 不是 int,按字符串排序(实体 ConvertPluginEntry 即 String) -- ---------------------------- CREATE TABLE `convert_plugin_entry` ( `id` bigint(20) NOT NULL COMMENT '主键', `deleted_flag` int(11) DEFAULT '1' COMMENT '逻辑删除标记(1:正常 -1:已删除)', `enable` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否启用(true/1:是)', `type` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '插件类型(convert:转换 writeback:反写)', `class_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '插件类全限定名', `plugin_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '插件名称', `commen` varchar(500) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '插件参数(键=列名,键=列名);原先硬编码的字段名从这里取', `serial_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '执行顺序(注意:实体是String不是Integer)', `parent_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '所属规则(转换规则id或反写规则id,由type区分)', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_plugin_parent` (`parent_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='规则插件分录(转换/反写共用)'; -- ---------------------------- -- 4. 反写规则主表 -- source_documents / target_doc 存 OnlFormHead.id(单元数据主键),不是表名 -- trigger_timing:1 保存即反写 / 2 审核即反写 -- enable:1 启用 / 0 停用(int,与历史口径一致,勿改成 varchar) -- rollback_on_revoke:1 开 / 0 关(Integer),空值按「开启」处理 -- source_close_json 成立时写源单主表 closed_flag=1,不成立写 0(整单关闭语义) -- ---------------------------- CREATE TABLE `reverse_writing_rules` ( `id` bigint(20) NOT NULL COMMENT '主键Id', `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '规则名称', `source_documents` bigint(20) DEFAULT NULL COMMENT '来源单据(OnlFormHead.id)', `target_doc` bigint(20) DEFAULT NULL COMMENT '目标单据(OnlFormHead.id)', `trigger_timing` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '触发时机(1:保存即反写 2:审核即反写)', `enable` int(11) NOT NULL DEFAULT '1' COMMENT '是否启用(1:是 0:否)', `excess_check_json` text COLLATE utf8mb4_bin COMMENT '超额检查JSON;留空表示不检查', `excess_action` varchar(10) COLLATE utf8mb4_bin NOT NULL DEFAULT '1' COMMENT '超额动作(1:拦截报错 2:仅告警)', `source_close_json` text COLLATE utf8mb4_bin COMMENT '源单关闭条件JSON;留空表示不关闭', `rollback_on_revoke` tinyint(1) NOT NULL DEFAULT '1' COMMENT '撤销回滚(1:是 0:否)', `rule_version` int(11) NOT NULL DEFAULT '1' COMMENT '规则版本号(@Version乐观锁)', `create_user_id` bigint(20) NOT NULL COMMENT '创建者Id', `create_time` datetime NOT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_target_doc` (`target_doc`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='反写规则配置主表'; -- ---------------------------- -- 5. 反写公式分录 -- rules_id 指向 reverse_writing_rules.id -- condition / formula 等列名是 MySQL 保留字,必须加反引号(实体已用 @TableField("`condition`")) -- formula / formula_english = 回写位置(源单);source_single_field = 取值位置(目标单) -- ⚠ 方向与直觉相反,配反了表现为「反写执行了但源单没变」 -- mode:1 累加 / 2 扣减 / 3 覆盖(覆盖方式会把原值记到 convert_relation_entry.before_value) -- exec_order:Integer,数字越小越先执行 -- *_text / *_english / *_field 是展示镜像列,前端需与 *_json 同步写入,不要只写 JSON -- ---------------------------- CREATE TABLE `reverse_writing_formula` ( `id` bigint(20) NOT NULL COMMENT '主键Id', `rules_id` bigint(20) NOT NULL COMMENT '反写规则Id(reverse_writing_rules.id)', `condition` text COLLATE utf8mb4_bin COMMENT '条件(原始)', `condition_text` text COLLATE utf8mb4_bin COMMENT '条件(展示文本)', `condition_english` text COLLATE utf8mb4_bin COMMENT '条件(英文表达式)', `condition_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '条件字段', `condition_json` text COLLATE utf8mb4_bin COMMENT '条件JSON(运行时只读这一列)', `formula` text COLLATE utf8mb4_bin COMMENT '反写公式(回写位置;指向源单)', `formula_text` text COLLATE utf8mb4_bin COMMENT '反写公式(展示文本)', `formula_english` text COLLATE utf8mb4_bin COMMENT '反写公式(英文表达式;指向源单字段)', `formula_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '反写公式字段', `formula_json` text COLLATE utf8mb4_bin COMMENT '反写公式JSON(运行时只读这一列)', `mode` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '反写方式(1:累加 2:扣减 3:覆盖)', `source_single_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单字段(取值位置;实际指向目标单字段)', `source_single_field_name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单字段名称', `enable` int(11) NOT NULL DEFAULT '1' COMMENT '是否启用(1:是 0:否)', `exec_order` int(11) DEFAULT '10' COMMENT '执行顺序;数字越小越先执行', `create_user_id` bigint(20) NOT NULL COMMENT '创建者Id', `create_time` datetime NOT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_rules_id` (`rules_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='反写规则-反写公式分录'; -- ---------------------------- -- 6. 业务规则分录 -- preconditions / established / not_established 三组:前置条件、条件成立、条件不成立 -- 前置条件为空时按「成立」分支处理;两个分支都真实写入并持久化 -- 本表没有 exec_order:业务规则按返回顺序执行,本次不新增 -- ---------------------------- CREATE TABLE `reverse_writing_business` ( `id` bigint(20) NOT NULL COMMENT '主键Id', `rules_id` bigint(20) NOT NULL COMMENT '反写规则Id(reverse_writing_rules.id)', `preconditions` text COLLATE utf8mb4_bin COMMENT '前置条件(原始)', `preconditions_text` text COLLATE utf8mb4_bin COMMENT '前置条件(展示文本)', `preconditions_english` text COLLATE utf8mb4_bin COMMENT '前置条件(英文表达式)', `preconditions_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '前置条件字段', `preconditions_json` text COLLATE utf8mb4_bin COMMENT '前置条件JSON(运行时只读这一列)', `established` text COLLATE utf8mb4_bin COMMENT '条件成立(原始)', `established_text` text COLLATE utf8mb4_bin COMMENT '条件成立(展示文本)', `established_english` text COLLATE utf8mb4_bin COMMENT '条件成立(英文表达式)', `established_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '条件成立字段', `established_json` text COLLATE utf8mb4_bin COMMENT '条件成立JSON(运行时只读这一列)', `not_established` text COLLATE utf8mb4_bin COMMENT '条件不成立(原始)', `not_established_text` text COLLATE utf8mb4_bin COMMENT '条件不成立(展示文本)', `not_established_english` text COLLATE utf8mb4_bin COMMENT '条件不成立(英文表达式)', `not_established_field` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '条件不成立字段', `not_established_json` text COLLATE utf8mb4_bin COMMENT '条件不成立JSON(运行时只读这一列)', `enable` int(11) NOT NULL DEFAULT '1' COMMENT '是否启用(1:是 0:否)', `create_user_id` bigint(20) NOT NULL COMMENT '创建者Id', `create_time` datetime NOT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_rules_id` (`rules_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='反写规则-业务规则分录'; -- ============================================================================ -- 二、转换关系表(反写定位源单的权威依据) -- ============================================================================ -- ---------------------------- -- 7. 转换关系(单据级) -- target_number 实际存的是目标单的 OnlFormHead.id(不是表名),与 target_id 组成组合索引 -- rule_version:本次转换实际使用的规则版本,供事后回溯 -- ---------------------------- CREATE TABLE `convert_relation` ( `id` bigint(20) NOT NULL COMMENT '主键', `convert_rule_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '转换规则id', `source_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单表名', `source_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单id', `target_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单表名/OnlFormHead.id', `target_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单id', `rule_version` int(11) DEFAULT NULL COMMENT '本次转换实际使用的规则版本', `create_user_id` bigint(20) NOT NULL COMMENT '创建者Id', `create_time` datetime NOT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_relation_target` (`target_number`, `target_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换关系(单据级)'; -- ---------------------------- -- 8. 转换关系(分录行级) -- ⚠ 列名是 targe_entry_number / targe_entry_id(少一个 t,不是 target_entry_*), -- 这是实体 ConvertRelationEntry 的既有拼写,建表必须照抄,改了代码就找不到列 -- before_value:反写前的源单字段原值,只有「覆盖」方式需要(累加/扣减天然可逆) -- writeback_rule_version:本次反写实际使用的规则版本,撤销时按同一版本取快照执行 -- ---------------------------- CREATE TABLE `convert_relation_entry` ( `id` bigint(20) NOT NULL COMMENT '主键', `convert_rule_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '转换规则id', `source_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单表名', `source_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源单id', `source_entry_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源分录表名', `source_entry_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '源分录行id', `target_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单表名', `target_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标单id', `targe_entry_number` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标分录表名(列名少一个t,是实体既有拼写)', `targe_entry_id` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '目标分录行id(列名少一个t,是实体既有拼写)', `before_value` decimal(24,8) DEFAULT NULL COMMENT '反写前的源单字段原值(仅覆盖方式),供撤销回滚恢复', `writeback_rule_version` int(11) DEFAULT NULL COMMENT '本次反写使用的反写规则版本,撤销时按同一版本执行', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `update_time` datetime DEFAULT NULL COMMENT '最后更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `idx_relation_entry_target` (`target_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='转换关系(分录行级)'; -- ============================================================================ -- 三、规则版本快照表 -- 每次保存规则时版本号 +1 并追加一条全量快照,快照以 JSON 内联存储规则主表 + 全部子表分录 -- 唯一索引 (rule_id, rule_version) 保证版本号单调且不重复 -- remark 只有两个值:新增保存 / 修改保存 -- ============================================================================ -- ---------------------------- -- 9. 转换规则版本快照 -- snapshot_json 分区:rule / fieldMappings / pluginEntries -- ---------------------------- CREATE TABLE `convert_rule_ver` ( `id` bigint(20) NOT NULL COMMENT '主键', `rule_id` bigint(20) NOT NULL COMMENT '所属转换规则Id(convert_rule.id)', `rule_version` int(11) NOT NULL COMMENT '规则版本号', `snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:rule/fieldMappings/pluginEntries', `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `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='转换规则版本快照'; -- ---------------------------- -- 10. 反写规则版本快照 -- snapshot_json 分区:rule / formulas / businesses -- 撤销/弃审回滚时按 convert_relation_entry.writeback_rule_version 到本表取当时的快照执行 -- ---------------------------- CREATE TABLE `reverse_writing_rules_ver` ( `id` bigint(20) NOT NULL COMMENT '主键', `rule_id` bigint(20) NOT NULL COMMENT '所属反写规则Id(reverse_writing_rules.id)', `rule_version` int(11) NOT NULL COMMENT '规则版本号', `snapshot_json` longtext COLLATE utf8mb4_bin COMMENT '全量快照JSON:rule/formulas/businesses', `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注(新增保存/修改保存)', `create_user_id` bigint(20) DEFAULT NULL COMMENT '创建者Id', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_user_id` bigint(20) DEFAULT NULL COMMENT '更新者Id', `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; -- ============================================================================ -- 建后自检:应返回 10 行,每行一张表 -- ============================================================================ SELECT e.table_name, IF(c.table_name IS NULL, '缺失', '已建') AS status FROM ( SELECT 'convert_rule' AS table_name UNION ALL SELECT 'convert_fieldmapping_entry' UNION ALL SELECT 'convert_plugin_entry' UNION ALL SELECT 'reverse_writing_rules' UNION ALL SELECT 'reverse_writing_formula' UNION ALL SELECT 'reverse_writing_business' UNION ALL SELECT 'convert_relation' UNION ALL SELECT 'convert_relation_entry' UNION ALL SELECT 'convert_rule_ver' UNION ALL SELECT 'reverse_writing_rules_ver' ) e LEFT JOIN information_schema.tables c ON c.table_schema = DATABASE() AND c.table_name = e.table_name; -- ---------------------------- -- 回滚段(仅在确认 10 张表都是本次新建、且无业务数据时使用)。 -- 有存量数据时禁止直接 DROP:规则配置与转换关系会一起丢失,应先导出。 -- 注意:convert_plugin_entry 的反写插件分录(type=writeback)也一并丢失。 -- ---------------------------- -- SET FOREIGN_KEY_CHECKS = 0; -- DROP TABLE IF EXISTS `reverse_writing_rules_ver`; -- DROP TABLE IF EXISTS `convert_rule_ver`; -- DROP TABLE IF EXISTS `convert_relation_entry`; -- DROP TABLE IF EXISTS `convert_relation`; -- DROP TABLE IF EXISTS `reverse_writing_business`; -- DROP TABLE IF EXISTS `reverse_writing_formula`; -- DROP TABLE IF EXISTS `reverse_writing_rules`; -- DROP TABLE IF EXISTS `convert_plugin_entry`; -- DROP TABLE IF EXISTS `convert_fieldmapping_entry`; -- DROP TABLE IF EXISTS `convert_rule`; -- SET FOREIGN_KEY_CHECKS = 1;