-- 生产任务集合:头表 + 条目 + 菜单授权(幂等) -- 授权:已有【生产基础信息】PRB 下任一有效子菜单 或 已有生产工单菜单 的角色 → 授予 PRB + C + 四个 F SET @tenant_no = CONVERT('zkxw' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @prb_id = CONVERT('PRB00000000000000000000000000001' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @wo_menu_id = CONVERT('90000000000000000000000000000011' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @menu_c = CONVERT('95400000000000000000000000000001' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @menu_list = CONVERT('95400000000000000000000000000002' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @menu_add = CONVERT('95400000000000000000000000000003' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @menu_edit = CONVERT('95400000000000000000000000000004' USING utf8mb4) COLLATE utf8mb4_unicode_ci; SET @menu_remove = CONVERT('95400000000000000000000000000005' USING utf8mb4) COLLATE utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `biz_production_task_set` ( `id` varchar(64) NOT NULL COMMENT '主键ID', `set_name` varchar(200) NOT NULL COMMENT '集合名称', `status` char(1) NOT NULL DEFAULT '1' COMMENT '1启用 0停用', `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号', `order_num` int(11) DEFAULT NULL COMMENT '排序号', `remark` varchar(512) DEFAULT NULL COMMENT '备注', `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id', `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID', `create_time` datetime NOT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id', `update_time` datetime NOT NULL COMMENT '更新时间', `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`) USING BTREE, KEY `idx_pts_tenant_status` (`tenant_no`,`del_flag`,`status`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务集合'; CREATE TABLE IF NOT EXISTS `biz_production_task_set_item` ( `id` varchar(64) NOT NULL COMMENT '主键ID', `set_id` varchar(64) NOT NULL COMMENT '集合ID', `task_name` varchar(200) NOT NULL COMMENT '任务名称', `route_id` varchar(64) DEFAULT NULL COMMENT '工艺路线ID', `route_name` varchar(100) DEFAULT NULL COMMENT '路线名称快照', `description` varchar(500) DEFAULT NULL COMMENT '描述', `remark` varchar(512) DEFAULT NULL COMMENT '备注', `tenant_no` varchar(64) NOT NULL DEFAULT 'zkxw' COMMENT '租户编号', `order_num` int(11) DEFAULT NULL COMMENT '排序号', `create_by` varchar(64) DEFAULT NULL COMMENT '创建人id', `create_dept_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人部门ID', `create_time` datetime NOT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT NULL COMMENT '更新人id', `update_time` datetime NOT NULL COMMENT '更新时间', `del_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`) USING BTREE, KEY `idx_ptsi_set` (`set_id`,`del_flag`,`order_num`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务集合条目'; -- 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, '生产任务集合', @prb_id, 'C', 'production-task-set', '/production/production-task-set/index', 'production:task-set:list', 1, '1', '1', @tenant_no, 12, '生产基础信息:生产任务集合主数据', 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 = @prb_id, menu_type = 'C', path = 'production-task-set', component = '/production/production-task-set/index', perms = 'production:task-set:list', visible = '1', status = '1', order_num = 12, 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_list, '查询', @menu_c, 'F', '', '', 'production:task-set: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_list ); UPDATE sys_menu SET menu_name = '查询', parent_id = @menu_c, menu_type = 'F', path = '', component = '', perms = 'production:task-set:list', visible = '0', status = '1', order_num = 1, remark = '生产任务集合列表查询', del_flag = 0, update_time = NOW() WHERE id COLLATE utf8mb4_unicode_ci = @menu_list; -- 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_add, '新增', @menu_c, 'F', '', '', 'production:task-set:add', 1, '0', '1', @tenant_no, 2, '生产任务集合新增', NULL, '', NOW(), NULL, NOW(), 0 FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM sys_menu m WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_add ); UPDATE sys_menu SET menu_name = '新增', parent_id = @menu_c, menu_type = 'F', path = '', component = '', perms = 'production:task-set:add', visible = '0', status = '1', order_num = 2, remark = '生产任务集合新增', del_flag = 0, update_time = NOW() WHERE id COLLATE utf8mb4_unicode_ci = @menu_add; -- 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_edit, '编辑', @menu_c, 'F', '', '', 'production:task-set:edit', 1, '0', '1', @tenant_no, 3, '生产任务集合编辑', NULL, '', NOW(), NULL, NOW(), 0 FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM sys_menu m WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_edit ); UPDATE sys_menu SET menu_name = '编辑', parent_id = @menu_c, menu_type = 'F', path = '', component = '', perms = 'production:task-set:edit', visible = '0', status = '1', order_num = 3, remark = '生产任务集合编辑', del_flag = 0, update_time = NOW() WHERE id COLLATE utf8mb4_unicode_ci = @menu_edit; -- 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_remove, '删除', @menu_c, 'F', '', '', 'production:task-set:remove', 1, '0', '1', @tenant_no, 4, '生产任务集合删除', NULL, '', NOW(), NULL, NOW(), 0 FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM sys_menu m WHERE m.id COLLATE utf8mb4_unicode_ci = @menu_remove ); UPDATE sys_menu SET menu_name = '删除', parent_id = @menu_c, menu_type = 'F', path = '', component = '', perms = 'production:task-set:remove', visible = '0', status = '1', order_num = 4, remark = '生产任务集合删除', del_flag = 0, update_time = NOW() WHERE id COLLATE utf8mb4_unicode_ci = @menu_remove; -- 3) 目标角色:PRB 下任一有效子菜单 或 已有生产工单菜单 -- MySQL 5.7:UPDATE 目标表不可在同句 FROM/EXISTS 中直接引用自身,须用派生表 -- 3a) 恢复软删的 PRB / 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 role_id FROM ( 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 = @prb_id WHERE rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no AND rm2.del_flag = 0 UNION SELECT DISTINCT rm3.role_id AS role_id FROM sys_role_menu rm3 WHERE rm3.menu_id COLLATE utf8mb4_unicode_ci = @wo_menu_id AND rm3.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no AND rm3.del_flag = 0 ) eligible_roles ) 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 task-set to PRB/work-order 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 ( @prb_id, @menu_c, @menu_list, @menu_add, @menu_edit, @menu_remove ); -- 3b) 插入缺失授权(PRB + 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 task-set to PRB/work-order 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 @prb_id AS menu_id UNION ALL SELECT @menu_c UNION ALL SELECT @menu_list UNION ALL SELECT @menu_add UNION ALL SELECT @menu_edit UNION ALL SELECT @menu_remove ) x INNER JOIN ( SELECT DISTINCT role_id FROM ( 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 = @prb_id WHERE rm2.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no AND rm2.del_flag = 0 UNION SELECT DISTINCT rm3.role_id AS role_id FROM sys_role_menu rm3 WHERE rm3.menu_id COLLATE utf8mb4_unicode_ci = @wo_menu_id AND rm3.tenant_no COLLATE utf8mb4_unicode_ci = @tenant_no AND rm3.del_flag = 0 ) eligible_roles ) 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;