做双端审批流

This commit is contained in:
hero920103 committed 2026-10-07 13:46:32 +08:00
1 parent 5b4dbb2b46
commit ffaadc26ae
69 files changed
+6662 -1071

No files matched your search

+198
View File
@@ -0,0 +1,198 @@
-- =============================================================
-- 自定义审批流(租户侧 + 平台侧)
--
-- 对应模型: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;
-- =============================================================
+38
View File
@@ -0,0 +1,38 @@
-- ============================================================
-- 审批流配置 —— 平台端菜单(yz_system_menu)
-- 挂在「域名管理」目录(path = /system/domains)下,紧邻「域名审核」。
-- 幂等脚本:按 path 判重,重复执行不会产生重复菜单。
-- 执行:mysql -h <host> -P <port> -u <user> -p <db> < platform_approval_menu.sql
-- ============================================================
-- 字段说明:
-- type 1=目录 2=页面;views [1]=平台端;is_visible/status=1 显示并启用
-- path 与 platform 前端静态路由 /system/approval 一致(component 同源,双保险)
SET @domain_dir := (
SELECT id FROM yz_system_menu
WHERE path = '/system/domains' AND delete_time IS NULL
LIMIT 1
);
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark)
SELECT @domain_dir, '审批流配置', '/system/approval', 'system/approval/index.vue',
'SetUp', 5, 1, 1, '[1]', 2, 'system', '平台侧审批流节点编排(域名申请等管控场景)'
FROM DUAL
WHERE @domain_dir IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/system/approval' AND delete_time IS NULL) x);
-- 若未找到「域名管理」目录,则退化为平台端顶级菜单(pid=0)
INSERT INTO yz_system_menu
(pid, title, path, component_path, icon, sort, status, is_visible, views, type, creater, remark)
SELECT 0, '审批流配置', '/system/approval', 'system/approval/index.vue',
'SetUp', 90, 1, 1, '[1]', 2, 'system', '平台侧审批流节点编排(域名申请等管控场景)'
FROM DUAL
WHERE @domain_dir IS NULL
AND NOT EXISTS (SELECT 1 FROM (SELECT id FROM yz_system_menu WHERE path = '/system/approval' AND delete_time IS NULL) x);
-- 结果校验
SELECT id, pid, title, path, component_path, views, type, is_visible, status
FROM yz_system_menu
WHERE delete_time IS NULL AND path = '/system/approval';