diff --git a/docs/sql/alter_sys_menu_add_production_pre_transit_sample.sql b/docs/sql/alter_sys_menu_add_production_pre_transit_sample.sql new file mode 100644 index 00000000..fe8089ba --- /dev/null +++ b/docs/sql/alter_sys_menu_add_production_pre_transit_sample.sql @@ -0,0 +1,162 @@ +-- 生产管理:预产及在途样本(独立页面 + 独立权限码) +-- 幂等:可重复执行 +-- 授权:已有【生产管理】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 下任一有效子菜单授权 +-- 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 +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) + AND EXISTS ( + SELECT 1 + 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.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci + AND rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no + AND rm2.del_flag = 0 + ); + +-- 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(r.id, '|', x.menu_id))), + r.id, + x.menu_id, + @tenant_no, + 0, + 'grant production pre-transit to PRM roles', + 'admin', + '', + NOW(), + NULL, + NOW(), + 0 +FROM sys_role r +INNER JOIN ( + SELECT @prm_id AS menu_id + UNION ALL SELECT @menu_c + UNION ALL SELECT @menu_f +) x +WHERE r.del_flag = 0 + AND r.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no + AND EXISTS ( + SELECT 1 + 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.role_id COLLATE utf8mb4_unicode_ci = r.id COLLATE utf8mb4_unicode_ci + AND rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no + AND rm2.del_flag = 0 + ) + AND EXISTS ( + SELECT 1 FROM sys_menu m + WHERE m.id COLLATE utf8mb4_unicode_ci = x.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 = x.menu_id + AND rm.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no + AND rm.del_flag = 0 + );