Files
yunzerwebsiteallinone/go/docs/sql/create_approval_flow.sql
T
2026-10-07 13:46:32 +08:00

198 lines
13 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================
-- 自定义审批流(租户侧 + 平台侧)
--
-- 对应模型:go/models/approval.go
--
-- 设计要点:
-- 1. 配置侧与实例侧分离:flow/node 是配置(租户可编辑),
-- instance/task 是运行时(提交后生成,不可编辑)。
-- 2. 节点表用 prev_keys / next_keys 存连线,当期顺序链只填 sort,
-- 后续上拖拽图与条件分支无需改表。
-- 3. scope 区分租户侧(tenant)与平台侧(platform):平台账号不归属租户,
-- 其流程不带 tid,实例用 biz_tid 标记申请来源租户。
--
-- 注意:不显式指定 COLLATE,沿用数据库默认排序规则,避免与既有表
-- (utf8mb4_0900_ai_ci)在 JOIN 比较字符串时报 Illegal mix of collations。
-- =============================================================
SET NAMES utf8mb4;
-- ---------------- 1. 租户侧审批流程 ----------------
CREATE TABLE IF NOT EXISTS `yz_backend_approval_flow` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`module_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '所属功能模块 code(yz_system_modules.code):oa/erp/crm/cms',
`biz_type` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '适用单据类型:reimburse/bid/domain/...',
`flow_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '审批流编号(自动生成、全局唯一,供各程序按编号发起):FL000007',
`flow_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '流程名称',
`description` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '流程说明',
`is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '是否该单据类型的默认流程:1是 0否',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_tid` (`tid`),
KEY `idx_tid_module` (`tid`,`module_code`),
KEY `idx_tid_biz` (`tid`,`biz_type`),
KEY `idx_tid_code` (`tid`,`flow_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-自定义审批流程(租户侧)';
-- ---------------- 2. 租户侧审批节点 ----------------
CREATE TABLE IF NOT EXISTS `yz_backend_approval_node` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`flow_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属流程ID',
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID(冗余,便于按租户清理)',
`node_key` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '节点唯一标识(流程内唯一)',
`node_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '节点名称',
`node_type` TINYINT NOT NULL DEFAULT 2 COMMENT '1开始 2审批 3结束 4条件分支',
`approver_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1指定用户 2指定角色 3部门主管 4指定职位 5发起人本人 6发起人主管',
`approver_ids` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '审批人ID列表,逗号分隔(user=SystemTenantUser.uid / role=AdminRole.id / position=BackendPosition.id)',
`multi_mode` TINYINT NOT NULL DEFAULT 1 COMMENT '多人审批方式:1或签(任一通过) 2会签(全部通过)',
`allow_return` TINYINT NOT NULL DEFAULT 0 COMMENT '是否允许退回上一节点:1是 0否',
`timeout_hours` INT NOT NULL DEFAULT 48 COMMENT '超时小时数,超时后自动通过',
`prev_keys` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '前置节点 node_key 列表,逗号分隔(为条件分支预留)',
`next_keys` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '后继节点 node_key 列表,逗号分隔(为条件分支预留)',
`condition_expr` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '进入条件表达式,如 amount>5000(条件分支网关的出边条件)',
`sort` INT NOT NULL DEFAULT 0 COMMENT '顺序号,顺序链按此升序流转',
`pos_x` INT NOT NULL DEFAULT 0 COMMENT '画布X坐标(图编辑器回显)',
`pos_y` INT NOT NULL DEFAULT 0 COMMENT '画布Y坐标(图编辑器回显)',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_flow` (`flow_id`),
KEY `idx_tid` (`tid`),
KEY `idx_flow_sort` (`flow_id`,`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='OA-自定义审批节点(租户侧)';
-- ---------------- 3. 平台侧审批流程 ----------------
CREATE TABLE IF NOT EXISTS `yz_platform_approval_flow` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`module_code` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '所属平台模块 code',
`biz_type` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '适用单据类型:domain/tenant/...',
`flow_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '审批流编号(自动生成、全局唯一):FL000007',
`flow_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '流程名称',
`description` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '流程说明',
`is_default` TINYINT NOT NULL DEFAULT 0 COMMENT '是否默认流程:1是 0否',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_module` (`module_code`),
KEY `idx_biz` (`biz_type`),
KEY `idx_code` (`flow_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台-自定义审批流程';
-- ---------------- 4. 平台侧审批节点 ----------------
CREATE TABLE IF NOT EXISTS `yz_platform_approval_node` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`flow_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属流程ID',
`node_key` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '节点唯一标识(流程内唯一)',
`node_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '节点名称',
`node_type` TINYINT NOT NULL DEFAULT 2 COMMENT '1开始 2审批 3结束 4条件分支',
`approver_type` TINYINT NOT NULL DEFAULT 1 COMMENT '1指定平台用户 2指定平台角色 5发起人本人',
`approver_ids` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '审批人ID列表,逗号分隔(user=AdminUser.id / role=AdminRole.id)',
`multi_mode` TINYINT NOT NULL DEFAULT 1 COMMENT '1或签 2会签',
`allow_return` TINYINT NOT NULL DEFAULT 0 COMMENT '是否允许退回:1是 0否',
`timeout_hours` INT NOT NULL DEFAULT 48 COMMENT '超时小时数',
`prev_keys` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '前置节点(为条件分支预留)',
`next_keys` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '后继节点(为条件分支预留)',
`condition_expr` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '进入条件(条件分支网关出边条件)',
`sort` INT NOT NULL DEFAULT 0 COMMENT '顺序号',
`pos_x` INT NOT NULL DEFAULT 0 COMMENT '画布X坐标(图编辑器回显)',
`pos_y` INT NOT NULL DEFAULT 0 COMMENT '画布Y坐标(图编辑器回显)',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_flow` (`flow_id`),
KEY `idx_flow_sort` (`flow_id`,`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='平台-自定义审批节点';
-- ---------------- 5. 审批实例(运行时,租户侧与平台侧共用) ----------------
CREATE TABLE IF NOT EXISTS `yz_approval_instance` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`scope` TINYINT NOT NULL DEFAULT 1 COMMENT '1租户侧 2平台侧',
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID(租户侧=本租户;平台侧=发起申请的平台账号所属租户,平台账号通常为0)',
`biz_tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '业务来源租户ID(平台侧审批必填:申请由哪个租户提交)',
`flow_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '流程ID(配置可能被改,实例内节点快照为准)',
`biz_type` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '单据类型:reimburse/bid/domain',
`biz_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '单据ID',
`biz_title` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '单据标题快照',
`submit_user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '发起人ID',
`submit_user_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '发起人姓名快照',
`submit_dept_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '发起人部门ID快照(部门主管审批依赖)',
`form_data` TEXT NULL COMMENT '发起表单数据快照(JSON),条件分支求值依据',
`current_node` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '当前节点 node_key',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '0草稿 1审批中 2已通过 3已驳回 4已撤回 5已取消',
`submit_time` DATETIME DEFAULT NULL COMMENT '提交时间',
`finish_time` DATETIME DEFAULT NULL COMMENT '完成时间',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_scope_tid` (`scope`,`tid`),
KEY `idx_biz` (`biz_type`,`biz_id`),
KEY `idx_biz_tid` (`scope`,`biz_tid`,`biz_type`),
KEY `idx_status` (`status`),
KEY `idx_flow` (`flow_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批实例(运行时)';
-- ---------------- 6. 审批任务(运行时,节点级待办) ----------------
CREATE TABLE IF NOT EXISTS `yz_approval_task` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`instance_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '实例ID',
`scope` TINYINT NOT NULL DEFAULT 1 COMMENT '1租户侧 2平台侧',
`tid` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租户ID',
`biz_type` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '单据类型(冗余,便于列表筛选)',
`biz_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '单据ID(冗余)',
`node_key` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '节点 node_key',
`node_name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '节点名称快照',
`sort` INT NOT NULL DEFAULT 0 COMMENT '节点顺序号快照',
`approver_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '审批人ID',
`approver_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '审批人姓名快照',
`multi_mode` TINYINT NOT NULL DEFAULT 1 COMMENT '1或签 2会签',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '0待审批 1已通过 2已驳回 3已退回 4已跳过 5已超时',
`action` TINYINT NOT NULL DEFAULT 0 COMMENT '1提交 2通过 3驳回 4退回 5撤回 6超时自动通过',
`comment` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '审批意见',
`deadline` DATETIME DEFAULT NULL COMMENT '超时时间点',
`finish_time` DATETIME DEFAULT NULL COMMENT '处理时间',
`is_deleted` TINYINT NOT NULL DEFAULT 0,
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`delete_time` DATETIME DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_instance` (`instance_id`),
KEY `idx_approver` (`scope`,`approver_id`,`status`),
KEY `idx_biz` (`biz_type`,`biz_id`),
KEY `idx_tid` (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审批任务(运行时·待办)';
-- =============================================================
-- 旧表迁移说明:
-- yz_backend_approval_flows(扁平步骤行结构)仅被 OA 报销 Submit 读取。
-- 第一期接管报销后改走新引擎,旧表保留只读兼容,不再写入。
-- 如需保留历史配置,可按如下语句转换(按需执行):
--
-- INSERT INTO yz_backend_approval_flow
-- (tid, module_code, biz_type, flow_name, is_default, status)
-- SELECT DISTINCT tid, 'oa', 'reimburse', flow_name, 1, 1
-- FROM yz_backend_approval_flows
-- WHERE is_active = 1 AND is_deleted = 0
-- GROUP BY tid, flow_name;
--
-- INSERT INTO yz_backend_approval_node
-- (flow_id, tid, node_key, node_name, node_type, approver_type, approver_ids, timeout_hours, sort)
-- SELECT f.id, f.tid, CONCAT('step_', s.step_order), s.flow_name, 2, 2, '', s.timeout_hours, s.step_order
-- FROM yz_backend_approval_flows s
-- JOIN yz_backend_approval_flow f
-- ON f.tid = s.tid AND f.biz_type = 'reimburse'
-- WHERE s.is_active = 1 AND s.is_deleted = 0;
-- =============================================================