-- ========================================== -- 工单RO20250126008更新进度按钮修复脚本 -- 功能:针对具体工单RO20250126008和维修人员zwc007的权限问题修复 -- 时间:2025-06-30 18:45:00 -- 说明:精准定位和修复特定工单的显示问题 -- ========================================== -- 第一部分:工单RO20250126008诊断查询 -- ========================================== -- 1. 检查工单RO20250126008的基本信息和当前状态 SELECT '=== 工单RO20250126008基本信息 ===' as message; SELECT ro.id, ro.order_no, ro.title, ro.order_status, CASE ro.order_status WHEN '1' THEN '待分派' WHEN '2' THEN '已分派 ✓ (应显示更新进度按钮)' WHEN '3' THEN '进行中' WHEN '4' THEN '已完成' WHEN '5' THEN '已评价' WHEN '6' THEN '已归档' WHEN '9' THEN '已取消' ELSE CONCAT('未知状态: ', ro.order_status) END as status_description, ro.assignee_id, u_assignee.user_name as assignee_name, u_assignee.nick_name as assignee_nick_name, ro.assign_time, ro.create_time, ro.repair_location, ro.priority_level FROM pm_repair_order ro LEFT JOIN sys_user u_assignee ON ro.assignee_id = u_assignee.user_id WHERE ro.order_no = 'RO20250126008'; -- 2. 检查zwc007用户信息 SELECT '=== 用户zwc007信息检查 ===' as message; SELECT u.user_id, u.user_name, u.nick_name, u.status as user_status, CASE u.status WHEN '0' THEN '正常' WHEN '1' THEN '停用' ELSE '未知' END as status_text FROM sys_user u WHERE u.user_name = 'zwc007'; -- 3. 检查当前分派情况匹配性 SELECT '=== 工单分派匹配性检查 ===' as message; SELECT ro.order_no, ro.assignee_id as current_assignee_id, u_current.user_name as current_assignee_name, u_zwc.user_id as zwc007_user_id, u_zwc.user_name as zwc007_name, CASE WHEN ro.assignee_id = u_zwc.user_id THEN '✓ zwc007是负责人' WHEN ro.assignee_id IS NULL THEN '✗ 工单未分派' ELSE CONCAT('✗ 工单分派给其他人: ', u_current.user_name) END as assignment_status, CASE WHEN ro.order_status = '2' AND ro.assignee_id = u_zwc.user_id THEN '✅ 应显示更新进度按钮' WHEN ro.order_status != '2' THEN CONCAT('❌ 工单状态不是已分派: ', ro.order_status) WHEN ro.assignee_id != u_zwc.user_id THEN '❌ zwc007不是负责人' ELSE '❌ 不满足显示条件' END as button_display_status FROM pm_repair_order ro LEFT JOIN sys_user u_current ON ro.assignee_id = u_current.user_id CROSS JOIN (SELECT user_id, user_name FROM sys_user WHERE user_name = 'zwc007') u_zwc WHERE ro.order_no = 'RO20250126008'; -- 4. 检查zwc007的角色和权限 SELECT '=== zwc007角色和权限检查 ===' as message; SELECT u.user_name, r.role_name, r.role_key, CASE WHEN r.role_key = 'maintenance_worker' THEN '✓ 维修人员角色' ELSE '其他角色' END as role_type FROM sys_user u JOIN sys_user_role ur ON u.user_id = ur.user_id JOIN sys_role r ON ur.role_id = r.role_id WHERE u.user_name = 'zwc007' ORDER BY r.role_key; -- 检查关键权限 SELECT '=== zwc007更新进度权限检查 ===' as message; SELECT m.menu_name, m.perms, m.menu_type, CASE WHEN m.perms = 'pm:repairOrder:updateProgress' THEN '*** 关键权限 ***' ELSE '' END as importance FROM sys_user u JOIN sys_user_role ur ON u.user_id = ur.user_id JOIN sys_role r ON ur.role_id = r.role_id JOIN sys_role_menu rm ON r.role_id = rm.role_id JOIN sys_menu m ON rm.menu_id = m.menu_id WHERE u.user_name = 'zwc007' AND m.perms = 'pm:repairOrder:updateProgress'; -- 第二部分:问题修复操作 -- ========================================== -- 修复1:确保zwc007有维修人员角色(如果没有) INSERT IGNORE INTO sys_user_role (user_id, role_id) SELECT u.user_id, r.role_id FROM sys_user u, sys_role r WHERE u.user_name = 'zwc007' AND r.role_key = 'maintenance_worker' AND NOT EXISTS ( SELECT 1 FROM sys_user_role ur2 WHERE ur2.user_id = u.user_id AND ur2.role_id = r.role_id ); -- 修复2:确保updateProgress权限存在 INSERT INTO sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark ) SELECT 2117, '更新进度', 2110, 6, '', '', '', 1, 0, 'F', '0', '0', 'pm:repairOrder:updateProgress', '#', 1, now(), 1, now(), '更新工单进度权限' WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE perms = 'pm:repairOrder:updateProgress'); -- 修复3:为维修人员角色分配权限 INSERT IGNORE INTO sys_role_menu (role_id, menu_id) SELECT r.role_id, m.menu_id FROM sys_role r, sys_menu m WHERE r.role_key = 'maintenance_worker' AND m.perms = 'pm:repairOrder:updateProgress'; -- 修复4:将工单RO20250126008分派给zwc007(关键修复) UPDATE pm_repair_order SET assignee_id = (SELECT user_id FROM sys_user WHERE user_name = 'zwc007'), assign_time = CASE WHEN assign_time IS NULL THEN now() ELSE assign_time END, order_status = '2', -- 设置为已分派状态 update_time = now(), update_by = 1 WHERE order_no = 'RO20250126008' AND EXISTS (SELECT 1 FROM sys_user WHERE user_name = 'zwc007'); -- 修复5:记录分派操作到进度表 INSERT INTO pm_repair_progress ( order_id, progress_type, progress_status, progress_detail, progress_time, location_info, remark, tenant_id, create_dept, create_by, create_time, update_by, update_time, deleted ) SELECT ro.id, '2', -- 分派类型 '已分派给维修人员', CONCAT('工单已分派给维修人员zwc007,负责处理报修问题'), now(), ro.repair_location, '系统自动分派 - 修复更新进度按钮显示问题', '000000', 103, 1, now(), 1, now(), 0 FROM pm_repair_order ro WHERE ro.order_no = 'RO20250126008' AND NOT EXISTS ( SELECT 1 FROM pm_repair_progress pp WHERE pp.order_id = ro.id AND pp.progress_type = '2' AND pp.progress_detail LIKE '%zwc007%' ); -- 第三部分:修复后验证 -- ========================================== -- 验证1:确认工单状态和分派 SELECT '=== 修复后:工单状态验证 ===' as message; SELECT ro.order_no, ro.title, ro.order_status, CASE ro.order_status WHEN '2' THEN '✅ 已分派状态 - 应显示更新进度按钮' ELSE CONCAT('❌ 状态异常: ', ro.order_status) END as status_check, ro.assignee_id, u.user_name as assignee_name, u.nick_name as assignee_nick_name, CASE WHEN u.user_name = 'zwc007' THEN '✅ zwc007是负责人' ELSE '❌ 负责人不是zwc007' END as assignee_check, ro.assign_time FROM pm_repair_order ro LEFT JOIN sys_user u ON ro.assignee_id = u.user_id WHERE ro.order_no = 'RO20250126008'; -- 验证2:确认zwc007权限配置 SELECT '=== 修复后:zwc007权限验证 ===' as message; SELECT '维修人员角色' as permission_type, CASE WHEN COUNT(*) > 0 THEN '✅ 已配置' ELSE '❌ 未配置' END as status FROM sys_user u JOIN sys_user_role ur ON u.user_id = ur.user_id JOIN sys_role r ON ur.role_id = r.role_id WHERE u.user_name = 'zwc007' AND r.role_key = 'maintenance_worker' UNION ALL SELECT '更新进度权限' as permission_type, CASE WHEN COUNT(*) > 0 THEN '✅ 已配置' ELSE '❌ 未配置' END as status FROM sys_user u JOIN sys_user_role ur ON u.user_id = ur.user_id JOIN sys_role r ON ur.role_id = r.role_id JOIN sys_role_menu rm ON r.role_id = rm.role_id JOIN sys_menu m ON rm.menu_id = m.menu_id WHERE u.user_name = 'zwc007' AND m.perms = 'pm:repairOrder:updateProgress'; -- 验证3:确认按钮显示条件 SELECT '=== 修复后:按钮显示条件验证 ===' as message; SELECT ro.order_no, '工单状态 = 2 (已分派)' as condition_1, CASE WHEN ro.order_status = '2' THEN '✅ 满足' ELSE '❌ 不满足' END as check_1, '用户是维修负责人' as condition_2, CASE WHEN ro.assignee_id = u.user_id THEN '✅ 满足' ELSE '❌ 不满足' END as check_2, '用户有maintenance_worker角色' as condition_3, CASE WHEN role_count.cnt > 0 THEN '✅ 满足' ELSE '❌ 不满足' END as check_3, '用户有updateProgress权限' as condition_4, CASE WHEN perm_count.cnt > 0 THEN '✅ 满足' ELSE '❌ 不满足' END as check_4, CASE WHEN ro.order_status = '2' AND ro.assignee_id = u.user_id AND role_count.cnt > 0 AND perm_count.cnt > 0 THEN '🎉 所有条件满足 - 应显示更新进度按钮' ELSE '❌ 条件不满足 - 按钮不会显示' END as final_result FROM pm_repair_order ro JOIN sys_user u ON u.user_name = 'zwc007' LEFT JOIN ( SELECT ur.user_id, COUNT(*) as cnt FROM sys_user_role ur JOIN sys_role r ON ur.role_id = r.role_id WHERE r.role_key = 'maintenance_worker' GROUP BY ur.user_id ) role_count ON role_count.user_id = u.user_id LEFT JOIN ( SELECT ur.user_id, COUNT(*) as cnt FROM sys_user_role ur JOIN sys_role_menu rm ON ur.role_id = rm.role_id JOIN sys_menu m ON rm.menu_id = m.menu_id WHERE m.perms = 'pm:repairOrder:updateProgress' GROUP BY ur.user_id ) perm_count ON perm_count.user_id = u.user_id WHERE ro.order_no = 'RO20250126008'; -- 第四部分:操作指导和确认 -- ========================================== SELECT '=== 修复完成提示 ===' as message, '1. 工单RO20250126008已分派给zwc007' as step1, '2. 工单状态已设置为已分派(状态码2)' as step2, '3. zwc007已配置维修人员角色和权限' as step3, '4. 请重启前后端服务清除权限缓存' as step4, '5. 使用zwc007账号登录查看该工单' as step5, '6. 确认更新进度按钮是否显示' as step6; -- 显示需要重启服务的提醒 SELECT '⚠️ 重要提醒' as alert_title, '权限配置修改后必须重启前后端服务' as alert_message, '用户需要重新登录以刷新权限缓存' as additional_note;