无尘阁日记

无尘阁日记

跟AI沟通完成一个跟三方OA的对接工作之二
2026-03-10

我问:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;


CREATE DATABASE IF NOT EXISTS `oa_bridge_v4`

DEFAULT CHARACTER SET utf8mb4

DEFAULT COLLATE utf8mb4_0900_ai_ci;


USE `oa_bridge_v4`;


-- ----------------------------

-- 对接方配置表

-- ----------------------------

DROP TABLE IF EXISTS `bridge_partner`;

CREATE TABLE `bridge_partner` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '匹配主系统企业ID',

`partner_code` varchar(100) NOT NULL COMMENT '对接方编码,如nuoming',

`partner_name` varchar(255) NOT NULL COMMENT '对接方名称',

`enterprise_name` varchar(255) DEFAULT NULL COMMENT '企业名称',

`credit_code` varchar(100) DEFAULT NULL COMMENT '统一社会信用代码',

`api_host_test` varchar(500) DEFAULT NULL COMMENT '测试环境域名/IP',

`api_host_production` varchar(500) DEFAULT NULL COMMENT '正式环境域名/IP',

`app_key` varchar(200) NOT NULL COMMENT '系统分配的app_key',

`app_secret` varchar(500) NOT NULL COMMENT '系统分配的app_secret',

`ip_allow_list` varchar(1000) DEFAULT NULL COMMENT 'IP白名单,逗号分隔',

`max_retry_count` int DEFAULT 3 COMMENT '最大重试次数',

`retry_interval_seconds` int DEFAULT 60 COMMENT '重试间隔秒',

`status` tinyint NOT NULL DEFAULT 1 COMMENT '0-停用,1-启用',

`remark` varchar(500) DEFAULT NULL COMMENT '备注',

`created_by` bigint DEFAULT NULL COMMENT '创建人',

`updated_by` bigint DEFAULT NULL COMMENT '更新人',

`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',

`deleted_time` datetime DEFAULT NULL COMMENT '删除时间',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uk_tenant_partner_code` (`tenant_id`, `partner_code`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_status` (`status`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='对接方配置表';


-- ----------------------------

-- JWT签发记录表

-- ----------------------------

DROP TABLE IF EXISTS `bridge_token_log`;

CREATE TABLE `bridge_token_log` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '请求流水号',

`jti` varchar(100) NOT NULL COMMENT 'JWT唯一ID',

`token` varchar(1024) NOT NULL COMMENT '签发的JWT明文token',

`expire_time` datetime NOT NULL COMMENT '过期时间',

`status` tinyint NOT NULL DEFAULT 1 COMMENT '0-失效,1-有效',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '获取token时的请求体',

`response_body` json DEFAULT NULL COMMENT '获取token时的响应体',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uk_jti` (`jti`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_expire_time` (`expire_time`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='JWT签发记录表';


-- ----------------------------

-- 用户实时校验日志表

-- ----------------------------

DROP TABLE IF EXISTS `bridge_user_verify_log`;

CREATE TABLE `bridge_user_verify_log` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '请求流水号',

`oa_user_code` varchar(100) DEFAULT NULL COMMENT 'OA人员编码',

`oa_user_name` varchar(100) DEFAULT NULL COMMENT 'OA人员姓名',

`mobile` varchar(50) DEFAULT NULL COMMENT '手机号',

`zpy_user_id` bigint DEFAULT NULL COMMENT '智评云用户ID',

`verify_status` tinyint NOT NULL DEFAULT 0 COMMENT '0-无效,1-有效',

`verify_message` varchar(500) DEFAULT NULL COMMENT '校验结果说明',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '请求报文',

`response_body` json DEFAULT NULL COMMENT '响应报文',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_zpy_user_id` (`zpy_user_id`) USING BTREE,

KEY `idx_mobile` (`mobile`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户实时校验日志表';


-- ----------------------------

-- OA立项当前快照表

-- 文档要求立项变更先保留日志,因此这里保留当前值即可

-- ----------------------------

DROP TABLE IF EXISTS `bridge_oa_project`;

CREATE TABLE `bridge_oa_project` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '最近一次请求流水号',

`project_code` varchar(200) NOT NULL COMMENT 'OA项目编号',

`project_name` varchar(2000) NOT NULL COMMENT '项目名称',

`do_organ` varchar(500) DEFAULT NULL COMMENT '组织',

`project_main_person` varchar(100) DEFAULT NULL COMMENT '项目负责人',

`project_main_person_mobile` varchar(100) DEFAULT NULL COMMENT '项目负责人手机号',

`zpy_user_id` bigint DEFAULT NULL COMMENT '智评云用户ID',

`last_receive_time` datetime DEFAULT NULL COMMENT '最近接收时间',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '最近一次请求报文',

`response_body` json DEFAULT NULL COMMENT '最近一次响应报文',

`created_by` bigint DEFAULT NULL COMMENT '创建人',

`updated_by` bigint DEFAULT NULL COMMENT '更新人',

`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',

`deleted_time` datetime DEFAULT NULL COMMENT '删除时间',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uk_partner_project_code` (`partner_id`, `project_code`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_zpy_user_id` (`zpy_user_id`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='OA立项当前快照表';


-- ----------------------------

-- OA立项接收/变更日志表

-- 文档要求变更先按日志记录保存

-- ----------------------------

DROP TABLE IF EXISTS `bridge_oa_project_log`;

CREATE TABLE `bridge_oa_project_log` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`oa_project_id` bigint DEFAULT NULL COMMENT '关联bridge_oa_project.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '请求流水号',

`log_type` varchar(50) NOT NULL COMMENT 'CREATE/UPDATE/DELETE',

`project_code` varchar(200) DEFAULT NULL COMMENT 'OA项目编号',

`project_name` varchar(2000) DEFAULT NULL COMMENT '项目名称',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`before_data` json DEFAULT NULL COMMENT '变更前数据',

`after_data` json DEFAULT NULL COMMENT '变更后数据',

`request_body` json DEFAULT NULL COMMENT '原始请求报文',

`response_body` json DEFAULT NULL COMMENT '响应报文',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_oa_project_id` (`oa_project_id`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_log_type` (`log_type`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='OA立项接收/变更日志表';


-- ----------------------------

-- 立项与项目组绑定表

-- 文档说明一个立项可以关联多个项目组,并且项目组有各自独立状态

-- ----------------------------

DROP TABLE IF EXISTS `bridge_project_group_bind`;

CREATE TABLE `bridge_project_group_bind` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`oa_project_id` bigint NOT NULL COMMENT '关联bridge_oa_project.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '最近一次请求流水号',

`project_code` varchar(200) NOT NULL COMMENT 'OA项目编号',

`project_group_uuid` bigint NOT NULL COMMENT '项目组UUID',

`project_group_name` varchar(500) DEFAULT NULL COMMENT '项目组名称',

`relation_type` tinyint NOT NULL DEFAULT 1 COMMENT '1-新建项目组,2-关联已有项目组',

`report_no` varchar(200) DEFAULT NULL COMMENT '当前最新报告号',

`review_status` varchar(50) NOT NULL DEFAULT 'INIT' COMMENT 'INIT/SUBMITTING/REVIEWING/APPROVED/REJECTED/VOIDED/DELETED/REOPENED',

`latest_submit_record_id` bigint DEFAULT NULL COMMENT '最近一次提审记录ID',

`last_report_no_receive_time` datetime DEFAULT NULL COMMENT '最近一次接收报告号时间',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '最近一次请求报文',

`response_body` json DEFAULT NULL COMMENT '最近一次响应报文',

`created_by` bigint DEFAULT NULL COMMENT '创建人',

`updated_by` bigint DEFAULT NULL COMMENT '更新人',

`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',

`deleted_time` datetime DEFAULT NULL COMMENT '删除时间',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uk_oa_project_group` (`oa_project_id`, `project_group_uuid`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_project_group_uuid` (`project_group_uuid`) USING BTREE,

KEY `idx_review_status` (`review_status`) USING BTREE,

KEY `idx_report_no` (`report_no`) USING BTREE,

KEY `idx_latest_submit_record_id` (`latest_submit_record_id`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='立项与项目组绑定表';


-- ----------------------------

-- 每次提审记录表

-- 文档说明首次送审、收到报告号后再次送审、报告号变更后再次送审都要区分

-- ----------------------------

DROP TABLE IF EXISTS `bridge_submit_record`;

CREATE TABLE `bridge_submit_record` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`oa_project_id` bigint NOT NULL COMMENT '关联bridge_oa_project.id',

`project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '本次请求流水号',

`submit_no` varchar(100) NOT NULL COMMENT '提审记录单号',

`project_code` varchar(200) NOT NULL COMMENT 'OA项目编号',

`project_group_uuid` bigint NOT NULL COMMENT '项目组UUID',

`project_group_name` varchar(500) DEFAULT NULL COMMENT '项目组名称',

`submit_scene` varchar(80) NOT NULL COMMENT 'FIRST_SUBMIT_FOR_REPORT_NO/AUTO_RESUBMIT_AFTER_INITIAL_REPORT_NO/AUTO_RESUBMIT_AFTER_REPORT_NO_CHANGE',

`submit_origin` varchar(30) NOT NULL COMMENT 'USER_ACTION/SYSTEM_AUTO',

`report_no_at_submit` varchar(200) DEFAULT NULL COMMENT '本次提审时使用的报告号',

`push_status` varchar(30) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING/SUCCESS/FAIL/TIMEOUT',

`need_file_callback` tinyint NOT NULL DEFAULT 1 COMMENT '0-不需要,1-需要',

`file_callback_status` varchar(30) NOT NULL DEFAULT 'WAITING' COMMENT 'NOT_REQUIRED/WAITING/SUCCESS/FAIL/TIMEOUT',

`retry_count` int NOT NULL DEFAULT 0 COMMENT '当前已重试次数',

`push_time` datetime DEFAULT NULL COMMENT '推送时间',

`push_response_time` datetime DEFAULT NULL COMMENT '推送响应时间',

`file_callback_time` datetime DEFAULT NULL COMMENT '文件回调时间',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '请求报文',

`response_body` json DEFAULT NULL COMMENT '响应报文',

`remark` varchar(1000) DEFAULT NULL COMMENT '备注',

`created_by` bigint DEFAULT NULL COMMENT '创建人',

`updated_by` bigint DEFAULT NULL COMMENT '更新人',

`is_deleted` tinyint NOT NULL DEFAULT 0 COMMENT '是否删除',

`deleted_time` datetime DEFAULT NULL COMMENT '删除时间',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`) USING BTREE,

UNIQUE KEY `uk_submit_no` (`submit_no`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_oa_project_id` (`oa_project_id`) USING BTREE,

KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,

KEY `idx_project_group_uuid` (`project_group_uuid`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_submit_scene` (`submit_scene`) USING BTREE,

KEY `idx_submit_origin` (`submit_origin`) USING BTREE,

KEY `idx_push_status` (`push_status`) USING BTREE,

KEY `idx_file_callback_status` (`file_callback_status`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='每次提审记录表';


-- ----------------------------

-- 提审动作日志表

-- 重试要记录,不然只能看到重试次数,看不到每次历史

-- ----------------------------

DROP TABLE IF EXISTS `bridge_submit_record_log`;

CREATE TABLE `bridge_submit_record_log` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`submit_record_id` bigint NOT NULL COMMENT '关联bridge_submit_record.id',

`project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '请求流水号',

`event_type` varchar(80) NOT NULL COMMENT 'SUBMIT_CREATED/SUBMIT_PUSH_STARTED/SUBMIT_PUSH_RESULT_SUCCESS/SUBMIT_PUSH_RESULT_FAIL/SUBMIT_PUSH_RESULT_TIMEOUT/SUBMIT_RETRY_STARTED/SUBMIT_RETRY_RESULT_SUCCESS/SUBMIT_RETRY_RESULT_FAIL/SUBMIT_RETRY_RESULT_TIMEOUT/REPORT_NO_CALLBACK_RECEIVED/AUTO_RESUBMIT_SKIPPED_REPORT_NO_UNCHANGED/FILE_CALLBACK_NOT_REQUIRED/FILE_CALLBACK_STARTED/FILE_CALLBACK_RESULT_SUCCESS/FILE_CALLBACK_RESULT_FAIL/FILE_CALLBACK_RESULT_TIMEOUT/REVIEW_STATUS_UPDATED',

`from_value` varchar(500) DEFAULT NULL COMMENT '变更前值',

`to_value` varchar(500) DEFAULT NULL COMMENT '变更后值',

`message` varchar(1000) DEFAULT NULL COMMENT '日志说明',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '请求报文',

`response_body` json DEFAULT NULL COMMENT '响应报文',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_submit_record_id` (`submit_record_id`) USING BTREE,

KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_event_type` (`event_type`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='提审动作日志表';


-- ----------------------------

-- 提审重试任务表

-- 当前待重试任务状态放这里,历史动作放日志表

-- ----------------------------

DROP TABLE IF EXISTS `bridge_submission_retry_task`;

CREATE TABLE `bridge_submission_retry_task` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`submit_record_id` bigint NOT NULL COMMENT '关联bridge_submit_record.id',

`project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',

`request_id` varchar(100) DEFAULT NULL COMMENT '首次请求流水号',

`retry_status` varchar(30) NOT NULL DEFAULT 'WAITING' COMMENT 'WAITING/RUNNING/SUCCESS/FAIL/CANCEL/TIMEOUT',

`retry_count` int NOT NULL DEFAULT 0 COMMENT '当前重试次数',

`max_retry_count` int NOT NULL DEFAULT 3 COMMENT '最大重试次数',

`next_retry_time` datetime DEFAULT NULL COMMENT '下次重试时间',

`last_retry_time` datetime DEFAULT NULL COMMENT '最后一次重试时间',

`last_error_message` varchar(1000) DEFAULT NULL COMMENT '最后一次错误信息',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '首次请求报文',

`response_body` json DEFAULT NULL COMMENT '最近一次响应报文',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_submit_record_id` (`submit_record_id`) USING BTREE,

KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_retry_status_next_retry_time` (`retry_status`, `next_retry_time`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='提审重试任务表';


-- ----------------------------

-- 报告号变更日志表

-- 只保留第一次回调和后续变更两类

-- 报告号未变则记到submit_log的AUTO_RESUBMIT_SKIPPED_REPORT_NO_UNCHANGED

-- ----------------------------

DROP TABLE IF EXISTS `bridge_report_no_log`;

CREATE TABLE `bridge_report_no_log` (

`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

`tenant_id` bigint NOT NULL COMMENT '企业租户ID',

`enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',

`partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

`oa_project_id` bigint NOT NULL COMMENT '关联bridge_oa_project.id',

`project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',

`submit_record_id` bigint DEFAULT NULL COMMENT '若因此触发自动提审,则关联提审记录',

`request_id` varchar(100) DEFAULT NULL COMMENT '请求流水号',

`old_report_no` varchar(200) DEFAULT NULL COMMENT '旧报告号',

`new_report_no` varchar(200) NOT NULL COMMENT '新报告号',

`change_type` varchar(30) NOT NULL COMMENT 'INITIAL_CALLBACK/CHANGE_CALLBACK',

`change_status` tinyint NOT NULL DEFAULT 1 COMMENT '0-失败,1-成功',

`trigger_auto_submit` tinyint NOT NULL DEFAULT 0 COMMENT '0-否,1-是',

`source_ip` varchar(50) DEFAULT NULL COMMENT '请求来源IP',

`request_body` json DEFAULT NULL COMMENT '请求报文',

`response_body` json DEFAULT NULL COMMENT '响应报文',

`remark` varchar(500) DEFAULT NULL COMMENT '备注',

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

PRIMARY KEY (`id`) USING BTREE,

KEY `idx_oa_project_id` (`oa_project_id`) USING BTREE,

KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,

KEY `idx_submit_record_id` (`submit_record_id`) USING BTREE,

KEY `idx_partner_id` (`partner_id`) USING BTREE,

KEY `idx_enterprise_id` (`enterprise_id`) USING BTREE,

KEY `idx_request_id` (`request_id`) USING BTREE,

KEY `idx_new_report_no` (`new_report_no`) USING BTREE,

KEY `idx_change_type` (`change_type`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='报告号变更日志表';


SET FOREIGN_KEY_CHECKS = 1;


这个设计已经接近完美了。不过提审的时候还必须关联一组报告版本ID,说明版本ID,项目底稿id(包括收益法、市场法、资产基础法、单项资产),你这个里面并没有,请你考虑我此时给你的sql,补充进去。这个你可以新加一张表来存。

AI答:

你的这套表设计,其实已经非常完整了。
整体结构是一个非常标准的 “主状态表 + 历史日志表 + 重试任务表 + 外部回调表” 的架构,这在 金融系统 / 审批系统 / 审计系统 里是非常成熟的模式。

但你现在提到的这个新需求,本质上属于 “提审数据快照” 的问题。

因为:

提审的时候需要绑定:

1 提审记录(submit_record)
2 报告版本ID
3 报告版本说明
4 项目底稿ID(多个)
 收益法
 市场法
 资产基础法
 单项资产

而这里有两个非常关键的系统设计原则:

第一:提审时的数据必须是历史可追溯的

也就是说:

即使后来报告版本变了
底稿重新生成了
项目组数据变化了

历史提审记录 也必须能还原当时的状态

所以这些数据 绝对不能只存在业务系统表里引用

必须 在提审系统里留一份快照

第二:底稿可能是多条

例如:

一个项目组可能同时有

收益法底稿
市场法底稿
资产基础法底稿
单项资产若干

因此这里一定要 拆表设计

整体设计建议如下:

新增两张表

bridge_submit_report_version
bridge_submit_draft_bind

结构如下。

第一张:提审报告版本快照表

-- ----------------------------
-- 提审报告版本快照表
-- 每一次提审对应一个报告版本
-- ----------------------------
DROP TABLE IF EXISTS `bridge_submit_report_version`;
CREATE TABLE `bridge_submit_report_version` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `tenant_id` bigint NOT NULL COMMENT '企业租户ID',
  `enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',
  `partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

  `submit_record_id` bigint NOT NULL COMMENT '关联bridge_submit_record.id',

  `project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',
  `oa_project_id` bigint NOT NULL COMMENT '关联bridge_oa_project.id',

  `report_version_id` bigint NOT NULL COMMENT '报告版本ID',
  `report_version_code` varchar(200) DEFAULT NULL COMMENT '报告版本编号',
  `report_version_name` varchar(500) DEFAULT NULL COMMENT '报告版本名称',
  `version_description` varchar(1000) DEFAULT NULL COMMENT '版本说明',

  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_submit_record_id` (`submit_record_id`) USING BTREE,

  KEY `idx_report_version_id` (`report_version_id`) USING BTREE,
  KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,
  KEY `idx_oa_project_id` (`oa_project_id`) USING BTREE,
  KEY `idx_partner_id` (`partner_id`) USING BTREE
) ENGINE=InnoDB 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_0900_ai_ci 
COMMENT='提审报告版本快照表';

这一张表的核心意义是:

记录提审时用的是哪个报告版本。

注意:

这里用 submit_record_id 唯一约束

因为:

一次提审只对应一个报告版本。

第二张:提审底稿绑定表

因为底稿一定是 多条,所以必须单独表。

-- ----------------------------
-- 提审底稿绑定表
-- 一次提审可能关联多个底稿
-- ----------------------------
DROP TABLE IF EXISTS `bridge_submit_draft_bind`;
CREATE TABLE `bridge_submit_draft_bind` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增主键',

  `tenant_id` bigint NOT NULL COMMENT '企业租户ID',
  `enterprise_id` bigint NOT NULL COMMENT '主系统企业ID',
  `partner_id` bigint NOT NULL COMMENT '关联bridge_partner.id',

  `submit_record_id` bigint NOT NULL COMMENT '关联bridge_submit_record.id',
  `project_group_bind_id` bigint NOT NULL COMMENT '关联bridge_project_group_bind.id',

  `draft_id` bigint NOT NULL COMMENT '底稿ID',

  `draft_type` varchar(50) NOT NULL COMMENT 'INCOME/MARKET/ASSET/ITEM',

  `draft_name` varchar(500) DEFAULT NULL COMMENT '底稿名称',

  `draft_snapshot` json DEFAULT NULL COMMENT '底稿快照(可选)',

  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  PRIMARY KEY (`id`) USING BTREE,

  KEY `idx_submit_record_id` (`submit_record_id`) USING BTREE,
  KEY `idx_project_group_bind_id` (`project_group_bind_id`) USING BTREE,
  KEY `idx_draft_id` (`draft_id`) USING BTREE,
  KEY `idx_draft_type` (`draft_type`) USING BTREE
) ENGINE=InnoDB 
DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_0900_ai_ci 
COMMENT='提审底稿绑定表';

这里有几个设计点值得你注意。


draft_type

我建议枚举值:

INCOME      收益法
MARKET      市场法
ASSET       资产基础法
ITEM        单项资产


draft_snapshot

这个字段我强烈建议你留着。

因为未来非常可能遇到一个情况:

底稿被重新生成
底稿被删除
底稿结构变化

但你需要 复盘当时提审的数据

所以 snapshot 是非常保险的设计。


为什么不放到 submit_record 里

因为:

submit_record 是 动作记录

版本
底稿

业务数据结构

分开是最清晰的。

最终结构关系会变成:

bridge_submit_record
        │
        │1
        │
        ├──── bridge_submit_report_version
        │
        │
        └──── bridge_submit_draft_bind (多条)

这样整个系统结构就非常清晰:

立项
   │
   └── 项目组
           │
           └── 提审记录
                    │
                    ├── 报告版本
                    │
                    ├── 底稿绑定
                    │
                    ├── 提审日志
                    │
                    └── 重试任务

这是 典型的金融级审计架构

如果系统再往上升级一步,其实还可以加一个表:

bridge_submit_payload_snapshot

专门存 完整提审报文快照

用于:

审计
追溯
问题排查
监管检查

不过你现在这个版本已经非常接近 生产级系统设计了

如果你愿意,我可以再帮你把这一整套 OA → 立项 → 项目组 → 提审 → 报告号 → 文件回调 的:

完整 系统时序图 + 表关系图 + 状态机 一次性画出来。
那会让整个架构直接变成 企业级标准方案