feat(permission): replace OA roles with post-bound roles and assignee posts

Unify effective roles via post-role bindings, remove dedicated OA role UI, and update OA assignee resolution plus related SQL/docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-08-04 17:41:04 +08:00
1 parent a3c73d76bb
commit 06db3bc966
66 files changed
+55337 -38647

No files matched your search

+56 -405
View File
@@ -1,423 +1,74 @@
-- OA 审批(钉钉交互)增量脚本 — 2026-07-14
-- 执行前请备份;可重复执行时注意 IGNORE 语义(部分语句非幂等)
-- docs/sql/oa_receive_account.sql
CREATE TABLE IF NOT EXISTS `oa_receive_account` (
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
`account_type` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'alipay/personal/corporate',
`account_name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '户名',
`account_no` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '账号',
`bank_name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '银行',
`bank_province` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '省',
`bank_city` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '市',
`bank_branch` varchar(256) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支行',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_ora_tenant` (`tenant_no`,`del_flag`) USING BTREE,
KEY `idx_ora_type` (`tenant_no`,`account_type`,`del_flag`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA收款账户';
-- ---------------------------------------------------------------------------
-- 1. 组织字段:直属主管 / 部门负责人用户 ID
-- ---------------------------------------------------------------------------
ALTER TABLE sys_user
ADD COLUMN supervisor_user_id VARCHAR(64) NULL COMMENT '直属主管用户ID' AFTER dept_id;
ALTER TABLE sys_dept
ADD COLUMN leader_user_id VARCHAR(64) NULL COMMENT '部门负责人用户ID' AFTER status;
-- ---------------------------------------------------------------------------
-- 2. OA 审批核心表
-- ---------------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS oa_app_group (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
group_name VARCHAR(100) NOT NULL COMMENT '分组名称',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_app_group_tenant (tenant_no, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批分组';
CREATE TABLE IF NOT EXISTS oa_app (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
group_id VARCHAR(64) NULL COMMENT '分组ID',
app_name VARCHAR(50) NOT NULL COMMENT '表单/应用名称',
icon_url VARCHAR(512) NULL COMMENT '图标',
description VARCHAR(100) NULL COMMENT '表单说明',
initiator_scope VARCHAR(32) NOT NULL DEFAULT 'all' COMMENT '发起范围 all/users',
initiator_user_ids TEXT NULL COMMENT '指定发起人JSON数组',
admin_scope VARCHAR(32) NOT NULL DEFAULT 'all_oa_admin' COMMENT '管理员范围',
admin_user_ids TEXT NULL COMMENT '指定管理员JSON数组',
status CHAR(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_app_tenant (tenant_no, del_flag),
KEY idx_oa_app_group (group_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批应用';
CREATE TABLE IF NOT EXISTS oa_app_version (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
app_id VARCHAR(64) NOT NULL COMMENT '应用ID',
version_no INT NOT NULL COMMENT '版本号',
status VARCHAR(16) NOT NULL DEFAULT 'draft' COMMENT 'draft/published',
is_latest_published CHAR(1) NOT NULL DEFAULT '0' COMMENT '是否最新已发布',
form_schema_json LONGTEXT NULL COMMENT '表单Schema JSON',
flow_tree_json LONGTEXT NULL COMMENT '流程树 JSON',
advanced_settings_json TEXT NULL COMMENT '高级设置 JSON',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_app_ver_app (app_id, status, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批应用版本';
CREATE TABLE IF NOT EXISTS oa_role (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
role_name VARCHAR(100) NOT NULL COMMENT '角色名称',
role_code VARCHAR(64) NOT NULL COMMENT '角色编码',
role_kind VARCHAR(16) NOT NULL DEFAULT 'custom' COMMENT 'custom/preset',
status CHAR(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
UNIQUE KEY uk_oa_role_tenant_code (tenant_no, role_code, del_flag),
KEY idx_oa_role_tenant (tenant_no, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA工作流角色';
CREATE TABLE IF NOT EXISTS oa_role_user (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
oa_role_id VARCHAR(64) NOT NULL COMMENT '工作流角色ID',
user_id VARCHAR(64) NOT NULL COMMENT '用户ID',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_role_user_role (oa_role_id, del_flag),
KEY idx_oa_role_user_user (user_id, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA工作流角色成员';
CREATE TABLE IF NOT EXISTS oa_instance (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
app_id VARCHAR(64) NOT NULL COMMENT '应用ID',
app_version_id VARCHAR(64) NOT NULL COMMENT '锁定的已发布版本ID',
title VARCHAR(200) NULL COMMENT '实例标题',
initiator_user_id VARCHAR(64) NOT NULL COMMENT '发起人',
initiator_dept_id VARCHAR(64) NULL COMMENT '发起人部门',
form_data_json LONGTEXT NULL COMMENT '表单数据 JSON',
status VARCHAR(32) NOT NULL DEFAULT 'running' COMMENT 'running/completed/rejected/cancelled',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_inst_tenant (tenant_no, del_flag),
KEY idx_oa_inst_initiator (initiator_user_id, status),
KEY idx_oa_inst_app (app_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批实例';
CREATE TABLE IF NOT EXISTS oa_task (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
instance_id VARCHAR(64) NOT NULL COMMENT '实例ID',
node_key VARCHAR(64) NULL COMMENT '节点key',
node_name VARCHAR(200) NULL COMMENT '节点名称',
task_type VARCHAR(16) NOT NULL DEFAULT 'approval' COMMENT 'approval/cc',
assignee_user_id VARCHAR(64) NOT NULL COMMENT '处理人',
status VARCHAR(32) NOT NULL DEFAULT 'pending' COMMENT 'pending/approved/rejected/done',
comment_text VARCHAR(512) NULL COMMENT '意见',
resolve_source VARCHAR(64) NULL COMMENT '解析来源如 supervisor_fallback_dept_leader',
sign_mode VARCHAR(8) NULL COMMENT 'or/and',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_task_assignee (assignee_user_id, status, del_flag),
KEY idx_oa_task_instance (instance_id, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA审批任务';
CREATE TABLE IF NOT EXISTS oa_relation (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
from_instance_id VARCHAR(64) NOT NULL COMMENT '本实例ID',
to_instance_id VARCHAR(64) NOT NULL COMMENT '被关联实例ID',
field_key VARCHAR(64) NULL COMMENT '表单字段key',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_rel_from (from_instance_id, del_flag)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA关联审批';
-- 预置工作流角色(按租户手工或应用启动 ensure;此处示例 zkxw)
-- INSERT 由后端 ensure_presets 幂等完成,避免 UUID 硬编码冲突
-- ---------------------------------------------------------------------------
-- 3. 菜单说明
-- ---------------------------------------------------------------------------
-- 侧栏路由已写入:
-- - web-admin/src/router/modules/sqxp.ts
-- - backend/app/api/menu.py(STATIC_MENU_TREE)
-- 角色权限用的 sys_menu 注册见:
-- docs/sql/patch_2026-07-15_oa_approval_sys_menu.sql
-- (含 OA审批 节点插入,以及旧「工作流管理」伪删除)
-- =============================================================================
-- OA 审批菜单注册 + 旧「工作流管理」伪删除
-- 日期:2026-07-15
-- 说明:
-- 1. 在「系统管理」顶级(TOP...00005)下注册「OA审批」及三级页面菜单,
-- id / path / component / perms 与 web-admin sqxp.ts、backend menu.py 对齐。
-- 2. 伪删除旧「工作流管理」二级及其三级菜单(OA 已替代),并清理角色菜单关联。
-- =============================================================================
SET NAMES utf8mb4;
-- ---------------------------------------------------------------------------
-- 1. 伪删除旧「工作流管理」及其子菜单
-- ---------------------------------------------------------------------------
UPDATE `sys_menu`
SET `del_flag` = 1,
`update_time` = NOW()
WHERE `del_flag` = 0
AND (
`id` = 'WKF00000000000000000000000000001'
OR `parent_id` = 'WKF00000000000000000000000000001'
OR `id` IN (
'10000000000000000000000000000wf01',
'10000000000000000000000000000wf02',
'10000000000000000000000000000wf03',
'10000000000000000000000000000wf04',
'10000000000000000000000000000wf05'
)
);
DELETE FROM `sys_role_menu`
WHERE `menu_id` IN (
'WKF00000000000000000000000000001',
'10000000000000000000000000000wf01',
'10000000000000000000000000000wf02',
'10000000000000000000000000000wf03',
'10000000000000000000000000000wf04',
'10000000000000000000000000000wf05'
);
-- ---------------------------------------------------------------------------
-- 2. 注册「OA审批」二级目录(挂在系统管理顶级下)
-- ---------------------------------------------------------------------------
INSERT INTO `sys_menu` (
`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`,
`is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT
'OA000000000000000000000000000001', 'OA审批', 'TOP00000000000000000000000000005', 'M',
'oa-approval', NULL, NULL,
1, '1', '1', 'zkxw', 2, '钉钉式 OA 审批(替代旧工作流管理)',
) SELECT
'OA000000000000000000000000000108', '收款账户管理', 'OA000000000000000000000000000001',
'C', 'receive-accounts', '/oa-approval/receive-accounts/index', 'oa:receive-accounts:list',
1, '1', '1', 'zkxw', 10, 'OA收款账户主数据',
NULL, '', NOW(), NULL, NOW(), 0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `sys_menu` WHERE `id` = 'OA000000000000000000000000000001'
SELECT 1 FROM `sys_menu` WHERE `id` = 'OA000000000000000000000000000108' AND `del_flag` = 0
);
-- 若曾假删过同 id,则恢复
UPDATE `sys_menu`
SET `del_flag` = 0,
`menu_name` = 'OA审批',
`parent_id` = 'TOP00000000000000000000000000005',
`menu_type` = 'M',
`path` = 'oa-approval',
`component` = NULL,
`perms` = NULL,
`visible` = '1',
`status` = '1',
`order_num` = 2,
`update_time` = NOW()
WHERE `id` = 'OA000000000000000000000000000001';
-- docs/sql/sys_post_role.sql
-- 职位-角色关联:职位可绑定多个角色,用户经职位继承角色权限(与直接角色取并集)
CREATE TABLE IF NOT EXISTS `sys_post_role` (
`id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '主键ID',
`post_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '职位ID',
`role_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色ID',
`tenant_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
`order_num` int(11) DEFAULT NULL COMMENT '排序号',
`remark` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
`create_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '创建人id',
`create_dept_id` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建人部门ID',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '更新人id',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记:0-正常 1-已删除',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_spr_post` (`tenant_no`,`post_id`,`del_flag`) USING BTREE,
KEY `idx_spr_role` (`tenant_no`,`role_id`,`del_flag`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='职位-角色关联';
-- ---------------------------------------------------------------------------
-- 3. 注册 OA 三级菜单(可见页 + 隐藏详情/设计页)
-- ---------------------------------------------------------------------------
INSERT INTO `sys_menu` (
`id`, `menu_name`, `parent_id`, `menu_type`, `path`, `component`, `perms`,
`is_frame`, `visible`, `status`, `tenant_no`, `order_num`, `remark`,
`create_by`, `create_dept_id`, `create_time`, `update_by`, `update_time`, `del_flag`
)
SELECT * FROM (
SELECT 'OA000000000000000000000000000101' AS id, '审批管理' AS menu_name,
'OA000000000000000000000000000001' AS parent_id, 'C' AS menu_type,
'apps' AS path, '/oa-approval/apps/index' AS component, 'oa:apps:list' AS perms,
1 AS is_frame, '1' AS visible, '1' AS status, 'zkxw' AS tenant_no, 1 AS order_num,
NULL AS remark, NULL AS create_by, '' AS create_dept_id, NOW() AS create_time,
NULL AS update_by, NOW() AS update_time, 0 AS del_flag
UNION ALL
SELECT 'OA000000000000000000000000000102', '工作流角色',
'OA000000000000000000000000000001', 'C',
'roles', '/oa-approval/roles/index', 'oa:roles:list',
1, '1', '1', 'zkxw', 2, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000103', '发起审批',
'OA000000000000000000000000000001', 'C',
'start', '/oa-approval/start/index', 'oa:start',
1, '1', '1', 'zkxw', 3, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000104', '待办中心',
'OA000000000000000000000000000001', 'C',
'pending', '/oa-approval/pending/index', 'oa:pending',
1, '1', '1', 'zkxw', 4, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000105', '已办中心',
'OA000000000000000000000000000001', 'C',
'done', '/oa-approval/done/index', 'oa:done',
1, '1', '1', 'zkxw', 5, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000106', '我发起的',
'OA000000000000000000000000000001', 'C',
'mine', '/oa-approval/mine/index', 'oa:mine',
1, '1', '1', 'zkxw', 6, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000107', '抄送我的',
'OA000000000000000000000000000001', 'C',
'cc', '/oa-approval/cc/index', 'oa:cc',
1, '1', '1', 'zkxw', 7, NULL, NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000201', '审批设计',
'OA000000000000000000000000000001', 'C',
'designer/:id', '/oa-approval/designer/index', 'oa:designer',
1, '0', '1', 'zkxw', 8, '隐藏页:从审批管理进入', NULL, '', NOW(), NULL, NOW(), 0
UNION ALL
SELECT 'OA000000000000000000000000000202', '审批详情',
'OA000000000000000000000000000001', 'C',
'instances/:id', '/oa-approval/instances/detail', 'oa:instance:detail',
1, '0', '1', 'zkxw', 9, '隐藏页:从任务/列表进入', NULL, '', NOW(), NULL, NOW(), 0
) AS t
WHERE NOT EXISTS (
SELECT 1 FROM `sys_menu` m WHERE m.`id` = t.id
);
-- 幂等:已存在则同步字段并取消伪删除
UPDATE `sys_menu` m
JOIN (
SELECT 'OA000000000000000000000000000101' AS id, '审批管理' AS menu_name, 'apps' AS path,
'/oa-approval/apps/index' AS component, 'oa:apps:list' AS perms, '1' AS visible, 1 AS order_num
UNION ALL SELECT 'OA000000000000000000000000000102', '工作流角色', 'roles', '/oa-approval/roles/index', 'oa:roles:list', '1', 2
UNION ALL SELECT 'OA000000000000000000000000000103', '发起审批', 'start', '/oa-approval/start/index', 'oa:start', '1', 3
UNION ALL SELECT 'OA000000000000000000000000000104', '待办中心', 'pending', '/oa-approval/pending/index', 'oa:pending', '1', 4
UNION ALL SELECT 'OA000000000000000000000000000105', '已办中心', 'done', '/oa-approval/done/index', 'oa:done', '1', 5
UNION ALL SELECT 'OA000000000000000000000000000106', '我发起的', 'mine', '/oa-approval/mine/index', 'oa:mine', '1', 6
UNION ALL SELECT 'OA000000000000000000000000000107', '抄送我的', 'cc', '/oa-approval/cc/index', 'oa:cc', '1', 7
UNION ALL SELECT 'OA000000000000000000000000000201', '审批设计', 'designer/:id', '/oa-approval/designer/index', 'oa:designer', '0', 8
UNION ALL SELECT 'OA000000000000000000000000000202', '审批详情', 'instances/:id', '/oa-approval/instances/detail', 'oa:instance:detail', '0', 9
) s ON m.id = s.id
SET m.`del_flag` = 0,
m.`parent_id` = 'OA000000000000000000000000000001',
m.`menu_type` = 'C',
m.`menu_name` = s.menu_name,
m.`path` = s.path,
m.`component` = s.component,
m.`perms` = s.perms,
m.`visible` = s.visible,
m.`status` = '1',
m.`order_num` = s.order_num,
m.`update_time` = NOW();
-- docs/sql/sys_user_hire_probation.sql
-- 用户表补齐入职日期、试用期月数(转正套件主数据)
ALTER TABLE `sys_user`
ADD COLUMN `hire_date` date DEFAULT NULL COMMENT '入职日期' AFTER `phone_no`,
ADD COLUMN `probation_months` int(11) DEFAULT NULL COMMENT '试用期月数' AFTER `hire_date`;
-- OA 审批菜单重命名:待处理 → 待办中心,已处理 → 已办中心
-- 已执行过 patch_2026-07-15_oa_approval_sys_menu.sql 的环境可单独跑本脚本。
UPDATE `sys_menu`
SET `menu_name` = '待办中心',
`update_time` = NOW()
WHERE `id` = 'OA000000000000000000000000000104'
AND `del_flag` = 0;
UPDATE `sys_menu`
SET `menu_name` = '已办中心',
`update_time` = NOW()
WHERE `id` = 'OA000000000000000000000000000105'
AND `del_flag` = 0;
-- docs/sql/sys_user_last_work_day.sql
-- 用户表补齐最后工作日(离职套件主数据)
ALTER TABLE `sys_user`
ADD COLUMN `last_work_day` date DEFAULT NULL COMMENT '最后工作日' AFTER `probation_months`;
-- OA 审批进度多轮 + 打回 + 撤销重提关联
-- MySQL 5.7 / utf8mb4
ALTER TABLE oa_instance
ADD COLUMN source_instance_id VARCHAR(64) NULL COMMENT '撤销重提所关联的原实例ID' AFTER status,
ADD COLUMN current_round INT NOT NULL DEFAULT 1 COMMENT '当前提交轮次,从1起' AFTER source_instance_id;
-- status 语义:running / returned / completed / rejected / cancelled
-- returned = 已打回,待发起人修改再提交
ALTER TABLE oa_task
ADD COLUMN round_no INT NOT NULL DEFAULT 1 COMMENT '所属提交轮次' AFTER sign_mode;
CREATE TABLE IF NOT EXISTS oa_instance_event (
id VARCHAR(64) NOT NULL COMMENT '主键ID',
instance_id VARCHAR(64) NOT NULL COMMENT '实例ID',
round_no INT NOT NULL DEFAULT 1 COMMENT '轮次',
event_type VARCHAR(32) NOT NULL COMMENT 'submit/return/withdraw/complete/reject_end',
actor_user_id VARCHAR(64) NULL COMMENT '操作人',
task_id VARCHAR(64) NULL COMMENT '关联任务(打回时)',
node_key VARCHAR(64) NULL COMMENT '节点key',
comment_text VARCHAR(512) NULL COMMENT '意见',
tenant_no VARCHAR(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号',
order_num INT NULL COMMENT '排序号',
remark VARCHAR(512) NULL COMMENT '备注',
create_by VARCHAR(64) NULL COMMENT '创建人id',
create_dept_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID',
create_time DATETIME NOT NULL COMMENT '创建时间',
update_by VARCHAR(64) NULL COMMENT '更新人id',
update_time DATETIME NOT NULL COMMENT '更新时间',
del_flag SMALLINT NOT NULL DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (id),
KEY idx_oa_evt_inst (instance_id, del_flag, create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OA实例操作事件(进度轴)';
-- ---------------------------------------------------------------------------
-- OA 表排序规则对齐 sys_user(utf8mb4_unicode_ci)— 2026-07-17
-- 修复:成员弹窗 JOIN oa_role_user / sys_user 报 Illegal mix of collations
-- ---------------------------------------------------------------------------
ALTER TABLE oa_app_group CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_app CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_app_version CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_role CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_role_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_instance CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_task CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_relation CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE oa_instance_event CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;