Files
zkxw/待同步到生产的sql脚本
T

614 lines
18 KiB
Plaintext
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.
-- 员工微信服务号 openid / unionid 绑定字段(OA 审批通知)
-- MySQL 5.7:唯一索引允许多个 NULL
ALTER TABLE `sys_user`
ADD COLUMN `wx_mp_openid` varchar(64) DEFAULT NULL COMMENT '微信服务号 openid' AFTER `wx_openid`,
ADD COLUMN `wx_unionid` varchar(64) DEFAULT NULL COMMENT '微信开放平台 unionid' AFTER `wx_mp_openid`,
ADD COLUMN `wx_mp_bind_time` datetime DEFAULT NULL COMMENT '服务号绑定时间' AFTER `wx_unionid`;
ALTER TABLE `sys_user`
ADD UNIQUE INDEX `uk_sys_user_wx_mp_openid` (`wx_mp_openid`);
ALTER TABLE `sys_user`
ADD INDEX `idx_sys_user_wx_unionid` (`wx_unionid`);
-- 将「开启微信通知」(OA007) 授予全部未删除角色
-- 前置:已执行 docs/sql/mobile_menu_oa_wechat_notify.sql(菜单须已存在)
-- 幂等:可重复执行;已有有效授权跳过;软删则恢复
-- 说明:
-- 1) 用户变量显式 utf8mb4_unicode_ci,避免 collation 混用报错 1267
-- 2) 主键用 MD5(role_id|menu_id),避免 INSERT…SELECT 中 UUID() 只算一次导致重复主键
SET @menu_id = CONVERT('MINI000000000000000000000000OA007' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
SET @tenant_no = CONVERT('zkxw' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
-- 1) 恢复历史上已软删的授权(按 role_id + menu_id)
UPDATE sys_role_menu rm
INNER JOIN sys_role r
ON r.id COLLATE utf8mb4_unicode_ci = rm.role_id COLLATE utf8mb4_unicode_ci
AND r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
SET
rm.del_flag = 0,
rm.update_time = NOW(),
rm.remark = 'grant wechat-notify to all roles'
WHERE rm.menu_id COLLATE utf8mb4_unicode_ci = @menu_id
AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm.del_flag = 1;
-- 2) 为尚未关联该菜单的角色新增授权
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
UPPER(MD5(CONCAT(r.id, '|', @menu_id))),
r.id,
@menu_id,
@tenant_no,
0,
'grant wechat-notify to all roles',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role r
WHERE r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND EXISTS (
SELECT 1 FROM sys_menu m
WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_id
AND m.del_flag = 0
)
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci
AND rm.menu_id COLLATE utf8mb4_unicode_ci = @menu_id
AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm.del_flag = 0
);
-- 小程序「发起审批」菜单种子(挂在「移动端菜单」根下)
-- 执行前请确认移动端根存在;角色授权请在 Web「角色管理」勾选本菜单。
SET @mini_root = (
SELECT id FROM sys_menu
WHERE del_flag = 0 AND parent_id = '0' AND menu_name LIKE '%移动端%'
LIMIT 1
);
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
'MINI000000000000000000000000OA001',
'发起审批',
@mini_root,
'C',
'/pages/oa/start/index',
NULL,
'mini:oa:start',
1,
'1',
'1',
'zkxw',
10,
'小程序发起审批',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA001' AND del_flag = 0
);
-- 小程序 OA 五中心菜单种子(挂在「移动端菜单」根下)
-- 前置:docs/sql/mobile_menu_oa_start.sql(发起审批 OA001)可已执行
-- 角色授权请在 Web「角色管理」勾选本菜单。
SET @mini_root = (
SELECT id FROM sys_menu
WHERE del_flag = 0 AND parent_id = '0' AND menu_name LIKE '%移动端%'
LIMIT 1
);
-- 草稿箱
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
'MINI000000000000000000000000OA002',
'草稿箱',
@mini_root,
'C',
'/pages/oa/drafts/index',
NULL,
'mini:oa:drafts',
1,
'1',
'1',
'zkxw',
20,
'小程序草稿箱',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA002' AND del_flag = 0
);
-- 待办中心
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
'MINI000000000000000000000000OA003',
'待办中心',
@mini_root,
'C',
'/pages/oa/pending/index',
NULL,
'mini:oa:pending',
1,
'1',
'1',
'zkxw',
30,
'小程序待办中心',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA003' AND del_flag = 0
);
-- 已办中心
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
'MINI000000000000000000000000OA004',
'已办中心',
@mini_root,
'C',
'/pages/oa/done/index',
NULL,
'mini:oa:done',
1,
'1',
'1',
'zkxw',
40,
'小程序已办中心',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA004' AND del_flag = 0
);
-- 我发起的
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
'MINI000000000000000000000000OA005',
'我发起的',
@mini_root,
'C',
'/pages/oa/mine/index',
NULL,
'mini:oa:mine',
1,
'1',
'1',
'zkxw',
50,
'小程序我发起的',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA005' AND del_flag = 0
);
-- 抄送我的
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
'MINI000000000000000000000000OA006',
'抄送我的',
@mini_root,
'C',
'/pages/oa/cc/index',
NULL,
'mini:oa:cc',
1,
'1',
'1',
'zkxw',
60,
'小程序抄送我的',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA006' AND del_flag = 0
);
-- 小程序「开启微信通知」菜单(抄送我的之后)
-- 前置:docs/sql/mobile_menu_oa_task_centers.sql(OA006)可已执行
-- 角色授权请在 Web「角色管理」勾选本菜单。
SET @mini_root = (
SELECT id FROM sys_menu
WHERE del_flag = 0 AND parent_id = '0' AND menu_name LIKE '%移动端%'
LIMIT 1
);
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
'MINI000000000000000000000000OA007',
'开启微信通知',
@mini_root,
'C',
'/pages/oa/wechat-notify/index',
NULL,
'mini:oa:wechat-notify',
1,
'1',
'1',
'zkxw',
70,
'小程序开启微信通知(关注+绑定)',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM DUAL
WHERE @mini_root IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE id = 'MINI000000000000000000000000OA007' AND del_flag = 0
);
-- 将「移动端菜单」根及其全部子孙菜单,授予全部未删除角色
-- 前置:移动端根菜单已存在(parent_id=0 且名称含「移动端」)
-- 幂等:可重复执行;已有有效授权跳过;软删则恢复
-- 说明:
-- 1) 用户变量显式 utf8mb4_unicode_ci,避免 collation 混用报错 1267
-- 2) 主键用 MD5(role_id|menu_id),避免 INSERT…SELECT 中 UUID() 只算一次导致重复主键
-- 3) MySQL 5.7 无递归 CTE,按最多 3 层子孙展开(根→一级→二级→三级)
SET @tenant_no = CONVERT('zkxw' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
SET @mini_root = (
SELECT CONVERT(id USING utf8mb4) COLLATE utf8mb4_unicode_ci
FROM sys_menu
WHERE del_flag = 0
AND parent_id COLLATE utf8mb4_unicode_ci = CONVERT('0' USING utf8mb4) COLLATE utf8mb4_unicode_ci
AND menu_name LIKE '%移动端%'
AND tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
LIMIT 1
);
-- 1) 恢复历史上已软删的授权(菜单属于移动端树)
UPDATE sys_role_menu rm
INNER JOIN sys_role r
ON r.id COLLATE utf8mb4_unicode_ci = rm.role_id COLLATE utf8mb4_unicode_ci
AND r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
INNER JOIN sys_menu m
ON m.id COLLATE utf8mb4_unicode_ci = rm.menu_id COLLATE utf8mb4_unicode_ci
AND m.del_flag = 0
AND m.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND (
m.id COLLATE utf8mb4_unicode_ci = @mini_root
OR m.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
OR EXISTS (
SELECT 1 FROM sys_menu p1
WHERE p1.del_flag = 0
AND p1.id COLLATE utf8mb4_unicode_ci = m.parent_id COLLATE utf8mb4_unicode_ci
AND p1.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
)
OR EXISTS (
SELECT 1 FROM sys_menu p1
INNER JOIN sys_menu p2
ON p2.del_flag = 0
AND p2.id COLLATE utf8mb4_unicode_ci = p1.parent_id COLLATE utf8mb4_unicode_ci
WHERE p1.del_flag = 0
AND p1.id COLLATE utf8mb4_unicode_ci = m.parent_id COLLATE utf8mb4_unicode_ci
AND p2.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
)
)
SET
rm.del_flag = 0,
rm.update_time = NOW(),
rm.remark = 'grant all mobile menus to all roles'
WHERE @mini_root IS NOT NULL
AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm.del_flag = 1;
-- 2) 为尚未关联的「角色 × 移动端菜单」新增授权
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
UPPER(MD5(CONCAT(r.id, '|', m.id))),
r.id,
m.id,
@tenant_no,
0,
'grant all mobile menus to all roles',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM sys_role r
INNER JOIN sys_menu m
ON m.del_flag = 0
AND m.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND (
m.id COLLATE utf8mb4_unicode_ci = @mini_root
OR m.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
OR EXISTS (
SELECT 1 FROM sys_menu p1
WHERE p1.del_flag = 0
AND p1.id COLLATE utf8mb4_unicode_ci = m.parent_id COLLATE utf8mb4_unicode_ci
AND p1.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
)
OR EXISTS (
SELECT 1 FROM sys_menu p1
INNER JOIN sys_menu p2
ON p2.del_flag = 0
AND p2.id COLLATE utf8mb4_unicode_ci = p1.parent_id COLLATE utf8mb4_unicode_ci
WHERE p1.del_flag = 0
AND p1.id COLLATE utf8mb4_unicode_ci = m.parent_id COLLATE utf8mb4_unicode_ci
AND p2.parent_id COLLATE utf8mb4_unicode_ci = @mini_root
)
)
WHERE @mini_root IS NOT NULL
AND r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND NOT EXISTS (
SELECT 1 FROM sys_role_menu rm
WHERE rm.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci
AND rm.menu_id COLLATE utf8mb4_unicode_ci = m.id COLLATE utf8mb4_unicode_ci
AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm.del_flag = 0
);
commit;
-- ===== 生产管理:预产及在途样本菜单(独立权限码)=====
-- 权威脚本:docs/sql/alter_sys_menu_add_production_pre_transit_sample.sql
-- 生产管理:预产及在途样本(独立页面 + 独立权限码)
-- 幂等:可重复执行
-- 授权:已有【生产管理】PRM 下任一有效子菜单的角色 → 授予本 C/F,并补授 PRM 祖先
SET @tenant_no = CONVERT('zkxw' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
SET @prm_id = CONVERT('PRM00000000000000000000000000001' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
SET @menu_c = CONVERT('95200000000000000000000000000001' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
SET @menu_f = CONVERT('95200000000000000000000000000002' USING utf8mb4) COLLATE utf8mb4_unicode_ci;
-- 1) C 菜单
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
@menu_c,
'预产及在途样本',
@prm_id,
'C',
'pre-transit-sample',
'/production/pre-transit-sample/index',
'production:preTransitSample:list',
1, '1', '1', @tenant_no, 0,
'生产看板:在途样本与预产协议(协议单维度只读;与质检页代码独立)',
NULL, '', NOW(), NULL, NOW(), 0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu m
WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_c
);
UPDATE sys_menu
SET
menu_name = '预产及在途样本',
parent_id = @prm_id,
menu_type = 'C',
path = 'pre-transit-sample',
component = '/production/pre-transit-sample/index',
perms = 'production:preTransitSample:list',
visible = '1',
status = '1',
order_num = 0,
remark = '生产看板:在途样本与预产协议(协议单维度只读;与质检页代码独立)',
del_flag = 0,
update_time = NOW()
WHERE id COLLATE utf8mb4_unicode_ci = @menu_c;
-- 2) F 按钮
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
@menu_f,
'预产及在途查询',
@menu_c,
'F',
'',
'',
'production:preTransitSample:list',
1, '0', '1', @tenant_no, 1,
'生产侧预产及在途样本列表查询',
NULL, '', NOW(), NULL, NOW(), 0
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu m
WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_f
);
UPDATE sys_menu
SET
menu_name = '预产及在途查询',
parent_id = @menu_c,
menu_type = 'F',
path = '',
component = '',
perms = 'production:preTransitSample:list',
visible = '0',
status = '1',
order_num = 1,
remark = '生产侧预产及在途样本列表查询',
del_flag = 0,
update_time = NOW()
WHERE id COLLATE utf8mb4_unicode_ci = @menu_f;
-- 3) 目标角色:已有 PRM 下任一有效子菜单授权
-- MySQL 5.7:UPDATE 目标表不可在同句 FROM/EXISTS 中直接引用自身,须用派生表
-- 3a) 恢复软删的 PRM / C / F 授权
UPDATE sys_role_menu rm
INNER JOIN sys_role r
ON r.id COLLATE utf8mb4_unicode_ci = rm.role_id COLLATE utf8mb4_unicode_ci
AND r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
INNER JOIN (
SELECT DISTINCT rm2.role_id AS role_id
FROM sys_role_menu rm2
INNER JOIN sys_menu m2
ON m2.id COLLATE utf8mb4_unicode_ci = rm2.menu_id COLLATE utf8mb4_unicode_ci
AND m2.del_flag = 0
AND m2.parent_id COLLATE utf8mb4_unicode_ci = @prm_id
WHERE rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm2.del_flag = 0
) eligible
ON eligible.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci
SET
rm.del_flag = 0,
rm.update_time = NOW(),
rm.remark = 'grant production pre-transit to PRM roles'
WHERE rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm.del_flag = 1
AND rm.menu_id COLLATE utf8mb4_unicode_ci IN (@prm_id, @menu_c, @menu_f);
-- 3b) 插入缺失授权(PRM + C + F)
INSERT INTO sys_role_menu (
id, role_id, menu_id, tenant_no, order_num, remark,
create_by, create_dept_id, create_time, update_by, update_time, del_flag
)
SELECT
UPPER(MD5(CONCAT(src.role_id, '|', src.menu_id))),
src.role_id,
src.menu_id,
@tenant_no,
0,
'grant production pre-transit to PRM roles',
'admin',
'',
NOW(),
NULL,
NOW(),
0
FROM (
SELECT
r.id AS role_id,
x.menu_id AS menu_id
FROM sys_role r
INNER JOIN (
SELECT @prm_id AS menu_id
UNION ALL SELECT @menu_c
UNION ALL SELECT @menu_f
) x
INNER JOIN (
SELECT DISTINCT rm2.role_id AS role_id
FROM sys_role_menu rm2
INNER JOIN sys_menu m2
ON m2.id COLLATE utf8mb4_unicode_ci = rm2.menu_id COLLATE utf8mb4_unicode_ci
AND m2.del_flag = 0
AND m2.parent_id COLLATE utf8mb4_unicode_ci = @prm_id
WHERE rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND rm2.del_flag = 0
) eligible
ON eligible.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci
INNER JOIN sys_menu m
ON m.id COLLATE utf8mb4_unicode_ci = x.menu_id
AND m.del_flag = 0
WHERE r.del_flag = 0
AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
) src
LEFT JOIN sys_role_menu existing
ON existing.role_id COLLATE utf8mb4_unicode_ci = src.role_id COLLATE utf8mb4_unicode_ci
AND existing.menu_id COLLATE utf8mb4_unicode_ci = src.menu_id COLLATE utf8mb4_unicode_ci
AND existing.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no
AND existing.del_flag = 0
WHERE existing.id IS NULL;
-- ===== 质检:检测项目模版建表 + 菜单授权 =====
-- 权威脚本:docs/sql/alter_biz_qc_inspection_item_template.sql