24 changed files with 291 additions and 6 deletions
@ -0,0 +1,207 @@ |
|||||
|
-- ============================================================================ |
||||
|
-- 数据双向同步 —— 影子表建表脚本 |
||||
|
-- 运行库:2 期业务库(默认数据源 master,例如 zfjd_ef20_07_08) |
||||
|
-- 依赖:无。执行本脚本后再运行 002-初始化数据.sql 写入配置初始数据。 |
||||
|
-- 作者:zrb |
||||
|
-- 说明:本脚本严格遵循《数据双向同步详细计划.md》第四章"影子表设计"。 |
||||
|
-- 所有表均建在 2 期库;1 期业务表结构不做任何变更。 |
||||
|
-- ============================================================================ |
||||
|
|
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
-- 1. biz_sync_config —— 同步配置运行时表 |
||||
|
-- JSON 配置文件为默认值,DB 记录为运行时覆盖 / 开关控制 |
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
DROP TABLE IF EXISTS `biz_sync_config`; |
||||
|
CREATE TABLE `biz_sync_config` |
||||
|
( |
||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', |
||||
|
`config_key` varchar(128) NOT NULL COMMENT '配置Key,与 resources/businessdatasyn 下 JSON 文件名(不含扩展名)一致', |
||||
|
`description` varchar(500) DEFAULT NULL COMMENT '描述', |
||||
|
`enabled` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用:0=禁用,1=启用', |
||||
|
`scan_batch_size` int NOT NULL DEFAULT 1000 COMMENT '单次扫描批量大小', |
||||
|
`max_retry` int NOT NULL DEFAULT 5 COMMENT '单行失败最大重试次数,超过后置为DEAD', |
||||
|
`first_owner_fallback` varchar(4) NOT NULL DEFAULT 'V1' COMMENT '首次双侧共存时归属方回退值:V1/V2', |
||||
|
`strict_owner_mode` tinyint(1) NOT NULL DEFAULT 0 COMMENT '严格归属模式(非归属侧变更是否回滚):0=否,1=是', |
||||
|
`delete_mode` varchar(16) NOT NULL DEFAULT 'physical' COMMENT '删除模式:physical=物理删除,logical=逻辑删除', |
||||
|
`full_scan` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否全表扫描(无 update_time 字段时使用):0=否,1=是', |
||||
|
`create_by` varchar(64) DEFAULT '' COMMENT '创建者', |
||||
|
`create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', |
||||
|
`update_by` varchar(64) DEFAULT '' COMMENT '更新者', |
||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |
||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
||||
|
`remark` varchar(500) DEFAULT NULL COMMENT '备注', |
||||
|
PRIMARY KEY (`id`), |
||||
|
UNIQUE KEY `uk_config_key` (`config_key`) |
||||
|
) ENGINE = InnoDB |
||||
|
DEFAULT CHARSET = utf8mb4 |
||||
|
COLLATE = utf8mb4_general_ci |
||||
|
ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-配置运行时表'; |
||||
|
|
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
-- 2. biz_sync_record —— 行级影子表(每一行业务数据的同步状态与快照) |
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
DROP TABLE IF EXISTS `biz_sync_record`; |
||||
|
CREATE TABLE `biz_sync_record` |
||||
|
( |
||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', |
||||
|
`config_key` varchar(128) NOT NULL COMMENT '关联的同步配置Key', |
||||
|
`v1_table` varchar(128) NOT NULL COMMENT '1期表名(冗余,方便排查)', |
||||
|
`v2_table` varchar(128) NOT NULL COMMENT '2期表名(冗余,方便排查)', |
||||
|
`pk_value` varchar(128) NOT NULL COMMENT '业务行主键值,复合主键用 | 分隔', |
||||
|
`owner_side` varchar(4) NOT NULL COMMENT '归属方:V1=1期,V2=2期', |
||||
|
`content_hash_v1` char(64) DEFAULT NULL COMMENT '上次同步后1 期侧内容 SHA-256', |
||||
|
`content_hash_v2` char(64) DEFAULT NULL COMMENT '上次同步后 2 期侧内容 SHA-256', |
||||
|
`snapshot_v1_json` longtext DEFAULT NULL COMMENT '1期完整字段快照JSON(本次同步成功后写入,用于变更追溯)', |
||||
|
`snapshot_v2_json` longtext DEFAULT NULL COMMENT '2期完整字段快照JSON', |
||||
|
`last_sync_time` datetime DEFAULT NULL COMMENT '最近一次成功同步的时间', |
||||
|
`last_action` varchar(32) DEFAULT NULL COMMENT '最近一次动作:WRITE_V1/WRITE_V2/DELETE_V1/DELETE_V2/SKIP/CONFLICT_V1_WIN/CONFLICT_V2_WIN 等', |
||||
|
`retry_count` int NOT NULL DEFAULT 0 COMMENT '连续失败次数,成功归零', |
||||
|
`status` varchar(16) NOT NULL DEFAULT 'NORMAL' COMMENT '记录状态:NORMAL=正常,DEAD=死信(超过max_retry需人工介入)', |
||||
|
`create_by` varchar(64) DEFAULT '' COMMENT '创建者', |
||||
|
`create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', |
||||
|
`update_by` varchar(64) DEFAULT '' COMMENT '更新者', |
||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |
||||
|
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', |
||||
|
PRIMARY KEY (`id`), |
||||
|
UNIQUE KEY `uk_cfg_pk` (`config_key`, `pk_value`), |
||||
|
KEY `idx_status_retry` (`status`, `retry_count`), |
||||
|
KEY `idx_last_sync_time` (`last_sync_time`) |
||||
|
) ENGINE = InnoDB |
||||
|
DEFAULT CHARSET = utf8mb4 |
||||
|
COLLATE = utf8mb4_general_ci |
||||
|
ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-行级影子表'; |
||||
|
|
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
-- 3. biz_sync_task —— 每次 Job 执行记录(任务级) |
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
DROP TABLE IF EXISTS `biz_sync_task`; |
||||
|
CREATE TABLE `biz_sync_task` |
||||
|
( |
||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', |
||||
|
`task_id` varchar(64) NOT NULL COMMENT '任务ID(UUID)', |
||||
|
`config_key` varchar(128) NOT NULL COMMENT '关联同步配置Key', |
||||
|
`start_time` datetime NOT NULL COMMENT '开始时间', |
||||
|
`end_time` datetime DEFAULT NULL COMMENT '结束时间', |
||||
|
`last_scan_v1` datetime DEFAULT NULL COMMENT '本次扫描到的 1 期 update_time 上限,作为下次起点', |
||||
|
`last_scan_v2` datetime DEFAULT NULL COMMENT '本次扫描到的 2 期 update_time 上限,作为下次起点', |
||||
|
`total_candidates` int NOT NULL DEFAULT 0 COMMENT '参与本轮的候选行数', |
||||
|
`success_count` int NOT NULL DEFAULT 0 COMMENT '成功行数', |
||||
|
`conflict_count` int NOT NULL DEFAULT 0 COMMENT '冲突行数(仍会被处理,记录用于统计)', |
||||
|
`fail_count` int NOT NULL DEFAULT 0 COMMENT '失败行数', |
||||
|
`status` varchar(16) NOT NULL DEFAULT 'RUNNING' COMMENT '任务状态:RUNNING/SUCCESS/PARTIAL_FAIL/FAILED/ABORTED', |
||||
|
`error_msg` text DEFAULT NULL COMMENT '整体错误信息', |
||||
|
`trigger_type` varchar(16) NOT NULL DEFAULT 'QUARTZ' COMMENT '触发类型:QUARTZ=定时,MANUAL=手动触发,FORCE=强制全量', |
||||
|
`trigger_by` varchar(64) DEFAULT NULL COMMENT '手动触发的操作人', |
||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |
||||
|
PRIMARY KEY (`id`), |
||||
|
UNIQUE KEY `uk_task_id` (`task_id`), |
||||
|
KEY `idx_cfg_start` (`config_key`, `start_time`), |
||||
|
KEY `idx_status` (`status`) |
||||
|
) ENGINE = InnoDB |
||||
|
DEFAULT CHARSET = utf8mb4 |
||||
|
COLLATE = utf8mb4_general_ci |
||||
|
ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-任务执行表'; |
||||
|
|
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
-- 4. biz_sync_log —— 行级操作明细日志 |
||||
|
-- 每一行同步动作(含失败)都会写入一条,建议 30 天定期归档 |
||||
|
-- ---------------------------------------------------------------------------- |
||||
|
DROP TABLE IF EXISTS `biz_sync_log`; |
||||
|
CREATE TABLE `biz_sync_log` |
||||
|
( |
||||
|
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', |
||||
|
`task_id` varchar(64) NOT NULL COMMENT '关联 biz_sync_task.task_id', |
||||
|
`config_key` varchar(128) NOT NULL COMMENT '关联同步配置Key', |
||||
|
`pk_value` varchar(128) NOT NULL COMMENT '业务行主键值', |
||||
|
`action` varchar(32) NOT NULL COMMENT '动作:WRITE_V1/WRITE_V2/DELETE_V1/DELETE_V2/SKIP/CONFLICT_V1_WIN/CONFLICT_V2_WIN/CONFLICT_DELETE_LOSE_V1/CONFLICT_DELETE_LOSE_V2/CONFLICT_TYPE 等', |
||||
|
`owner_side` varchar(4) DEFAULT NULL COMMENT '归属方:V1/V2', |
||||
|
`before_v1_json` longtext DEFAULT NULL COMMENT '变更前 1 期数据JSON', |
||||
|
`before_v2_json` longtext DEFAULT NULL COMMENT '变更前 2 期数据JSON', |
||||
|
`after_v1_json` longtext DEFAULT NULL COMMENT '变更后 1 期数据JSON', |
||||
|
`after_v2_json` longtext DEFAULT NULL COMMENT '变更后 2 期数据JSON', |
||||
|
`success` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否成功:0=失败,1=成功', |
||||
|
`error_msg` text DEFAULT NULL COMMENT '失败信息(含堆栈简要)', |
||||
|
`cost_ms` int DEFAULT NULL COMMENT '本行耗时(毫秒)', |
||||
|
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', |
||||
|
PRIMARY KEY (`id`), |
||||
|
KEY `idx_task` (`task_id`), |
||||
|
KEY `idx_cfg_create` (`config_key`, `create_time`), |
||||
|
KEY `idx_pk_value` (`config_key`, `pk_value`), |
||||
|
KEY `idx_success` (`success`) |
||||
|
) ENGINE = InnoDB |
||||
|
DEFAULT CHARSET = utf8mb4 |
||||
|
COLLATE = utf8mb4_general_ci |
||||
|
ROW_FORMAT = DYNAMIC COMMENT ='业务数据双向同步-行级操作日志'; |
||||
|
|
||||
|
-- 设置定时任务 |
||||
|
INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, |
||||
|
create_time, remark) |
||||
|
VALUES ('业务数据增量同步', |
||||
|
'DEFAULT', |
||||
|
'businessDataSyncJob.execute()', |
||||
|
'0 0/30 * * * ?', |
||||
|
'3', |
||||
|
'1', |
||||
|
'0', |
||||
|
'admin', |
||||
|
NOW(), |
||||
|
'每30分钟执行一次业务数据增量同步,扫描v1和v2两侧update_time变更的数据进行双向同步'); |
||||
|
|
||||
|
-- ============================================================================ |
||||
|
-- 验证脚本(可选,创建完执行,应返回 4) |
||||
|
-- ============================================================================ |
||||
|
-- SELECT COUNT(*) AS shadow_table_count |
||||
|
-- FROM information_schema.tables |
||||
|
-- WHERE table_schema = DATABASE() |
||||
|
-- AND table_name IN ('biz_sync_config', 'biz_sync_record', 'biz_sync_task', 'biz_sync_log'); |
||||
|
|
||||
|
truncate table biz_sync_task; |
||||
|
truncate table biz_sync_record; |
||||
|
truncate table biz_sync_log; |
||||
|
|
||||
|
-- 删除业务表,重新同步 |
||||
|
truncate table enforcement_registration; |
||||
|
truncate table enterprise_information; |
||||
|
truncate table enforcement_inspection_program; |
||||
|
truncate table enterprise_complaint; |
||||
|
truncate table enterprise_evaluate; |
||||
|
truncate table enterprise_law_enforcement; |
||||
|
truncate table enterprise_merchant_authorization; |
||||
|
truncate table law_enforcement_warning_list; |
||||
|
truncate table zdxt_file; |
||||
|
truncate table qr_code_generate_history; |
||||
|
truncate table enterprise_pub_qrcode; |
||||
|
|
||||
|
-- 自动设置更新时间 |
||||
|
ALTER TABLE enterprise_law_enforcement |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_information |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enforcement_inspection_program |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_complaint |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_evaluate |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_law_enforcement |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_merchant_authorization |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE law_enforcement_warning_list |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE zdxt_file |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE qr_code_generate_history |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
|
|
||||
|
ALTER TABLE enterprise_pub_qrcode |
||||
|
MODIFY COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; |
||||
@ -0,0 +1,38 @@ |
|||||
|
create table enterprise_information |
||||
|
( |
||||
|
id varchar(50) not null comment '主键ID' |
||||
|
primary key, |
||||
|
enterprise_name varchar(100) null comment '企业名称', |
||||
|
enterprise_number varchar(100) null comment '企业纳税识别号', |
||||
|
enterprise_type varchar(10) null comment '企业类型', |
||||
|
enterprise_address varchar(200) null comment '企业地址', |
||||
|
legal_person varchar(100) null, |
||||
|
registered_capital varchar(40) null comment '注册资本', |
||||
|
establishment_time datetime null comment '成立日期', |
||||
|
operating_term varchar(100) null comment '营业期限', |
||||
|
business_scope varchar(2000) null comment '经营范围', |
||||
|
create_time datetime null comment '创建时间', |
||||
|
create_by varchar(50) null comment '创建人', |
||||
|
user_id bigint null, |
||||
|
dept_id varchar(55) collate utf8mb4_unicode_ci null comment '部门ID', |
||||
|
qr_code_id varchar(50) null comment '二维码id', |
||||
|
last_qr_code_time datetime null comment '上一次二维码生成时间', |
||||
|
is_unsubscribe int default 0 null comment '是否注销 0 否 1 是', |
||||
|
is_delete int default 0 null comment '是否删除 0 否 1 是', |
||||
|
salt varchar(100) null comment '盐加密字符串', |
||||
|
enterprise_tel varchar(20) null, |
||||
|
company_org_type varchar(55) null, |
||||
|
industry varchar(1) null, |
||||
|
operating_term_end varchar(100) null, |
||||
|
update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP, |
||||
|
constraint idx_enforcement_registration_number |
||||
|
unique (enterprise_number) |
||||
|
) |
||||
|
comment '企业端-企业信息表' row_format = DYNAMIC; |
||||
|
|
||||
|
create fulltext index idx_enforcement_registration_name |
||||
|
on enterprise_information (enterprise_name); |
||||
|
|
||||
|
create index idx_enterprise_time_number |
||||
|
on enterprise_information (establishment_time, enterprise_number); |
||||
|
|
||||
@ -0,0 +1,40 @@ |
|||||
|
create table enterprise_information |
||||
|
( |
||||
|
id varchar(50) not null comment '主键ID' |
||||
|
primary key, |
||||
|
enterprise_name varchar(100) null comment '企业名称', |
||||
|
enterprise_number varchar(100) null comment '企业纳税识别号', |
||||
|
enterprise_type varchar(10) null comment '企业类型', |
||||
|
enterprise_address varchar(200) null comment '企业地址', |
||||
|
legal_person varchar(100) null, |
||||
|
registered_capital varchar(40) null comment '注册资本', |
||||
|
establishment_time datetime null comment '成立日期', |
||||
|
operating_term varchar(100) null comment '营业期限', |
||||
|
business_scope varchar(2000) null comment '经营范围', |
||||
|
create_time datetime null comment '创建时间', |
||||
|
create_by varchar(50) null comment '创建人', |
||||
|
user_id bigint null, |
||||
|
dept_id varchar(55) collate utf8mb4_unicode_ci null comment '部门ID', |
||||
|
qr_code_id varchar(50) null comment '二维码id', |
||||
|
last_qr_code_time datetime null comment '上一次二维码生成时间', |
||||
|
is_unsubscribe int default 0 null comment '是否注销 0 否 1 是', |
||||
|
is_delete int default 0 null comment '是否删除 0 否 1 是', |
||||
|
salt varchar(100) null comment '盐加密字符串', |
||||
|
enterprise_tel varchar(20) null, |
||||
|
company_org_type varchar(55) null, |
||||
|
industry varchar(1) null, |
||||
|
operating_term_end varchar(100) null, |
||||
|
create_dept varchar(100) null comment '创建部门', |
||||
|
update_by varchar(50) null comment '更新者', |
||||
|
update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP, |
||||
|
constraint idx_enforcement_registration_number |
||||
|
unique (enterprise_number) |
||||
|
) |
||||
|
comment '企业端-企业信息表' row_format = DYNAMIC; |
||||
|
|
||||
|
create fulltext index idx_enforcement_registration_name |
||||
|
on enterprise_information (enterprise_name); |
||||
|
|
||||
|
create index idx_enterprise_time_number |
||||
|
on enterprise_information (establishment_time, enterprise_number); |
||||
|
|
||||
Loading…
Reference in new issue