From 347d9472ab0f5aa7f9cac10d164b25d0ea31c47e Mon Sep 17 00:00:00 2001 From: risingLee <871066422@qq.com> Date: Fri, 9 Jan 2026 10:05:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E8=B7=AF=E7=94=B1=E8=B7=B3?= =?UTF-8?q?=E8=BD=ACbug=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- check_workorder_submenu.sql | 86 ++++-- delete_all_wrong_submenus.sql | 35 +++ delete_wrong_submenu.sql | 55 +++- fix_workorder_routing_complete.sql | 138 +++++++++ .../views/system/test_work_order/index.vue | 17 ++ 工单状态参数筛选功能实现说明.md | 176 ++++++++++++ 工单路由跳转问题完整修复方案.md | 261 ++++++++++++++++++ 快速修复工单路由问题.md | 138 +++++++++ 8 files changed, 865 insertions(+), 41 deletions(-) create mode 100644 delete_all_wrong_submenus.sql create mode 100644 fix_workorder_routing_complete.sql create mode 100644 工单状态参数筛选功能实现说明.md create mode 100644 工单路由跳转问题完整修复方案.md create mode 100644 快速修复工单路由问题.md diff --git a/check_workorder_submenu.sql b/check_workorder_submenu.sql index 704f959..3b05cff 100644 --- a/check_workorder_submenu.sql +++ b/check_workorder_submenu.sql @@ -1,29 +1,59 @@ --- 查询工单管理菜单及其所有子菜单 +-- 检查工单管理菜单配置 +-- 诊断路由跳转问题的根本原因 + +-- 1. 查看工单管理的完整菜单树 SELECT - m.menu_id, - m.menu_name, - m.parent_id, - m.order_num, - m.path, - m.component, - m.query, - m.menu_type, - m.visible, - m.perms, - CASE - WHEN m.parent_id = 0 THEN '根菜单' - WHEN m.parent_id = 2098 THEN '工单管理子菜单' - WHEN m.parent_id = 2092 THEN '测试工单子菜单' - ELSE '其他' - END as menu_level -FROM sys_menu m -WHERE m.menu_id IN (2098, 2092) - OR m.parent_id IN (2098, 2092) -ORDER BY - CASE - WHEN m.menu_id = 2098 THEN 1 - WHEN m.parent_id = 2098 THEN 2 - WHEN m.parent_id = 2092 THEN 3 - ELSE 4 - END, - m.order_num; + menu_id, + menu_name, + parent_id, + order_num, + path, + component, + query, + menu_type, + visible, + status +FROM sys_menu +WHERE menu_id = 2098 -- 工单管理父菜单 + OR parent_id = 2098 -- 工单管理的子菜单 + OR menu_id = 2092 -- 测试工单菜单 + OR parent_id = 2092 -- 测试工单的子菜单 +ORDER BY parent_id, order_num; + +-- 2. 查找所有包含 testOrder 或 testWorkOrder 的错误路径 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + query, + menu_type +FROM sys_menu +WHERE path LIKE '%testOrder%' + OR path LIKE '%testWorkOrder%' + OR component LIKE '%test_order%'; + +-- 3. 查找所有状态相关的子菜单(这些可能是错误的) +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + query, + menu_type +FROM sys_menu +WHERE parent_id IN (2098, 2092) + AND menu_name IN ('进行中', '已完成', '待领取', '一审中', '二审中', '三审中', '全部工单', '测试中'); + +-- 4. 检查是否有重复的菜单配置 +SELECT + menu_name, + COUNT(*) as count, + GROUP_CONCAT(menu_id) as menu_ids, + GROUP_CONCAT(path) as paths +FROM sys_menu +WHERE parent_id IN (2098, 2092) +GROUP BY menu_name +HAVING COUNT(*) > 1; diff --git a/delete_all_wrong_submenus.sql b/delete_all_wrong_submenus.sql new file mode 100644 index 0000000..2132495 --- /dev/null +++ b/delete_all_wrong_submenus.sql @@ -0,0 +1,35 @@ +-- 删除工单管理下所有错误的子菜单 +-- 这些子菜单导致路由跳转错误 + +-- 查看所有工单管理的子菜单 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + query, + menu_type +FROM sys_menu +WHERE parent_id = 2098 -- 工单管理的menu_id +ORDER BY order_num; + +-- 删除所有状态相关的子菜单 +-- 注意:请先确认上面的查询结果,再执行删除操作 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND menu_name IN ('进行中', '已完成', '待领取', '一审中', '二审中', '三审中', '全部工单'); + +-- 验证删除结果 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + menu_type +FROM sys_menu +WHERE parent_id = 2098 +ORDER BY order_num; + +-- 应该只剩下"测试工单"这一个子菜单 diff --git a/delete_wrong_submenu.sql b/delete_wrong_submenu.sql index 22c21cc..868c816 100644 --- a/delete_wrong_submenu.sql +++ b/delete_wrong_submenu.sql @@ -1,7 +1,7 @@ --- 删除错误的"进行中"子菜单 --- 这个菜单导致点击"测试中"按钮时跳转到错误的URL +-- 删除工单管理下的错误子菜单 +-- 这些子菜单导致路由跳转到错误的URL --- 首先查看这个菜单的详细信息 +-- 步骤1:先查看要删除的菜单(确认后再执行删除) SELECT menu_id, menu_name, @@ -10,20 +10,26 @@ SELECT component, query, menu_type, - visible + perms FROM sys_menu -WHERE menu_name = '进行中' - AND parent_id = 2098 - AND path = 'testOrder01'; +WHERE parent_id = 2098 -- 工单管理的直接子菜单 + AND menu_type = 'C' -- 菜单类型 + AND path IN ('testOrder01', 'testWorkOrder02', 'test_work_order') + AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); --- 删除这个错误的菜单 --- 注意:请先确认上面的查询结果是否正确,再执行删除操作 +-- 步骤2:删除错误的状态子菜单 +-- 注意:请先执行步骤1确认要删除的菜单,再执行此步骤 DELETE FROM sys_menu -WHERE menu_name = '进行中' - AND parent_id = 2098 - AND path = 'testOrder01'; +WHERE parent_id = 2098 -- 工单管理的直接子菜单 + AND menu_type = 'C' -- 菜单类型 + AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); --- 验证删除结果 +-- 步骤3:删除所有包含错误路径的菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND path IN ('testOrder01', 'testWorkOrder02'); + +-- 步骤4:验证删除结果 SELECT menu_id, menu_name, @@ -34,3 +40,26 @@ SELECT FROM sys_menu WHERE parent_id = 2098 ORDER BY order_num; + +-- 步骤5:确保工单管理父菜单的路径正确 +UPDATE sys_menu +SET + path = 'test_work_order', + update_time = NOW() +WHERE menu_id = 2098 + AND path != 'test_work_order'; + +-- 步骤6:最终验证 - 应该只有"测试工单"(menu_id=2092)这一个子菜单 +SELECT + m1.menu_id as parent_id, + m1.menu_name as parent_name, + m1.path as parent_path, + m2.menu_id as child_id, + m2.menu_name as child_name, + m2.path as child_path, + m2.component as child_component, + m2.menu_type as child_type +FROM sys_menu m1 +LEFT JOIN sys_menu m2 ON m1.menu_id = m2.parent_id +WHERE m1.menu_id = 2098 +ORDER BY m2.order_num; diff --git a/fix_workorder_routing_complete.sql b/fix_workorder_routing_complete.sql new file mode 100644 index 0000000..2b91269 --- /dev/null +++ b/fix_workorder_routing_complete.sql @@ -0,0 +1,138 @@ +-- 工单路由跳转问题一键修复脚本 +-- 执行此脚本前请先备份数据库! +-- mysqldump -u your_username -p your_database sys_menu > sys_menu_backup.sql + +-- ============================================ +-- 步骤1:查看修复前的菜单配置 +-- ============================================ +SELECT '=== 修复前的工单管理菜单配置 ===' as info; +SELECT + menu_id, + menu_name, + parent_id, + order_num, + path, + component, + query, + menu_type, + visible, + status +FROM sys_menu +WHERE menu_id = 2098 -- 工单管理父菜单 + OR parent_id = 2098 -- 工单管理的子菜单 +ORDER BY parent_id, order_num; + +-- ============================================ +-- 步骤2:删除错误的状态子菜单 +-- ============================================ +SELECT '=== 开始删除错误的子菜单 ===' as info; + +-- 删除所有状态相关的错误子菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND menu_type = 'C' + AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); + +-- 删除包含错误路径的菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND path IN ('testOrder01', 'testWorkOrder02', 'testOrder', 'testWorkOrder'); + +-- 删除组件路径错误的菜单(指向test_order而不是test_work_order) +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND component LIKE '%test_order%' + AND component NOT LIKE '%test_work_order%'; + +SELECT '=== 错误子菜单已删除 ===' as info; + +-- ============================================ +-- 步骤3:修复父菜单路径 +-- ============================================ +SELECT '=== 开始修复父菜单路径 ===' as info; + +UPDATE sys_menu +SET + path = 'test_work_order', + update_time = NOW() +WHERE menu_id = 2098 + AND path != 'test_work_order'; + +SELECT '=== 父菜单路径已修复 ===' as info; + +-- ============================================ +-- 步骤4:确保测试工单子菜单配置正确 +-- ============================================ +SELECT '=== 检查测试工单子菜单配置 ===' as info; + +UPDATE sys_menu +SET + path = 'test_work_order', + component = 'system/test_work_order/index', + update_time = NOW() +WHERE menu_id = 2092; + +SELECT '=== 测试工单子菜单已修复 ===' as info; + +-- ============================================ +-- 步骤5:验证修复结果 +-- ============================================ +SELECT '=== 修复后的工单管理菜单配置 ===' as info; +SELECT + m1.menu_id as parent_id, + m1.menu_name as parent_name, + m1.path as parent_path, + m1.menu_type as parent_type, + m2.menu_id as child_id, + m2.menu_name as child_name, + m2.path as child_path, + m2.component as child_component, + m2.query as child_query, + m2.menu_type as child_type, + m2.order_num as child_order +FROM sys_menu m1 +LEFT JOIN sys_menu m2 ON m1.menu_id = m2.parent_id +WHERE m1.menu_id = 2098 +ORDER BY m2.order_num; + +-- ============================================ +-- 步骤6:检查是否还有其他错误配置 +-- ============================================ +SELECT '=== 检查是否还有其他错误配置 ===' as info; + +-- 查找所有包含 testOrder 或 testWorkOrder 的路径 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + '路径包含testOrder或testWorkOrder' as issue +FROM sys_menu +WHERE (path LIKE '%testOrder%' OR path LIKE '%testWorkOrder%') + AND path != 'test_work_order' + AND menu_id NOT IN (2098, 2092); + +-- 查找组件路径指向test_order的菜单 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + '组件路径错误' as issue +FROM sys_menu +WHERE component LIKE '%test_order%' + AND component NOT LIKE '%test_work_order%' + AND menu_name LIKE '%工单%'; + +-- ============================================ +-- 完成提示 +-- ============================================ +SELECT '=== 修复完成!===' as info; +SELECT '请执行以下操作:' as info; +SELECT '1. 清除Redis缓存(如果使用):redis-cli FLUSHDB' as step; +SELECT '2. 重启后端服务' as step; +SELECT '3. 清除浏览器缓存:Ctrl+Shift+R' as step; +SELECT '4. 退出并重新登录系统' as step; +SELECT '5. 测试URL:http://your-domain/system/test_work_order' as step; diff --git a/ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue b/ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue index 42a5201..e864574 100644 --- a/ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue +++ b/ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue @@ -431,8 +431,25 @@ export default { deep: true, handler(to) { const orderId = to.query.orderId || to.params.orderId; + const state = to.query.state || to.params.state; + if(orderId !== undefined && orderId !== null) { this.queryParams.batchId = orderId; + } + + // 根据 state 参数设置 testStep 筛选条件 + if(state !== undefined && state !== null) { + const stateNum = parseInt(state); + if (stateNum === 0) { + // state=0 表示进行中,对应 testStep=1 + this.queryParams.testStep = 1; + } else if (stateNum === 1) { + // state=1 表示已完成,对应 testStep=5 + this.queryParams.testStep = 5; + } + } + + if(orderId !== undefined && orderId !== null || state !== undefined && state !== null) { this.getList(); } } diff --git a/工单状态参数筛选功能实现说明.md b/工单状态参数筛选功能实现说明.md new file mode 100644 index 0000000..3370678 --- /dev/null +++ b/工单状态参数筛选功能实现说明.md @@ -0,0 +1,176 @@ +# 工单状态参数筛选功能实现说明 + +## 功能描述 + +当通过URL参数访问工单管理页面时,自动根据 `state` 参数筛选工单状态。 + +## URL参数说明 + +### state 参数映射 + +| state 值 | 含义 | testStep 值 | 显示的工单 | +|---------|------|------------|----------| +| 0 | 进行中 | 1 | 测试中的工单 | +| 1 | 已完成 | 5 | 已完成的工单 | + +### 示例URL + +1. **查看进行中的工单**: + ``` + http://123.56.98.4:8081/system/test_work_order?state=0 + ``` + 自动筛选 `testStep=1`(测试中)的工单 + +2. **查看已完成的工单**: + ``` + http://123.56.98.4:8081/system/test_work_order?state=1 + ``` + 自动筛选 `testStep=5`(已完成)的工单 + +3. **查看特定批次的进行中工单**: + ``` + http://123.56.98.4:8081/system/test_work_order?orderId=123&state=0 + ``` + 筛选批次ID为123且状态为测试中的工单 + +## 实现细节 + +### 修改文件 +`ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue` + +### 修改内容 + +在 `watch` 部分添加了对 `state` 参数的处理: + +```javascript +watch: { + '$route': { + immediate: true, + deep: true, + handler(to) { + const orderId = to.query.orderId || to.params.orderId; + const state = to.query.state || to.params.state; + + if(orderId !== undefined && orderId !== null) { + this.queryParams.batchId = orderId; + } + + // 根据 state 参数设置 testStep 筛选条件 + if(state !== undefined && state !== null) { + const stateNum = parseInt(state); + if (stateNum === 0) { + // state=0 表示进行中,对应 testStep=1 + this.queryParams.testStep = 1; + } else if (stateNum === 1) { + // state=1 表示已完成,对应 testStep=5 + this.queryParams.testStep = 5; + } + } + + if(orderId !== undefined && orderId !== null || state !== undefined && state !== null) { + this.getList(); + } + } + } +} +``` + +## 工作流程 + +1. **路由变化触发**:当URL中的查询参数变化时,触发路由监听器 +2. **参数解析**:从URL中提取 `state` 和 `orderId` 参数 +3. **状态映射**: + - `state=0` → `testStep=1`(测试中) + - `state=1` → `testStep=5`(已完成) +4. **数据加载**:调用 `getList()` 方法,根据设置的 `testStep` 筛选工单 + +## 与菜单配置的关系 + +### 菜单配置示例 + +如果您想在菜单中添加"进行中"和"已完成"的快捷入口: + +**进行中菜单**: +- 菜单名称:进行中 +- 上级菜单:工单管理 +- 菜单类型:菜单(C) +- 路由地址:test_work_order +- 组件路径:system/test_work_order/index +- 路由参数:`{"state": 0}` +- 权限字符:system:test_work_order:list + +**已完成菜单**: +- 菜单名称:已完成 +- 上级菜单:工单管理 +- 菜单类型:菜单(C) +- 路由地址:test_work_order +- 组件路径:system/test_work_order/index +- 路由参数:`{"state": 1}` +- 权限字符:system:test_work_order:list + +## 扩展功能 + +如果需要支持更多状态,可以扩展映射关系: + +```javascript +if(state !== undefined && state !== null) { + const stateNum = parseInt(state); + switch(stateNum) { + case 0: + this.queryParams.testStep = 1; // 测试中 + break; + case 1: + this.queryParams.testStep = 5; // 已完成 + break; + case 2: + this.queryParams.testStep = 0; // 待领取 + break; + case 3: + this.queryParams.testStep = 2; // 一审中 + break; + case 4: + this.queryParams.testStep = 3; // 二审中 + break; + case 5: + this.queryParams.testStep = 4; // 三审中 + break; + default: + this.queryParams.testStep = null; // 全部 + } +} +``` + +## 测试步骤 + +### 1. 清除浏览器缓存 +按 `Ctrl + Shift + R` 强制刷新页面 + +### 2. 测试进行中筛选 +访问:`http://123.56.98.4:8081/system/test_work_order?state=0` +- 应该只显示 testStep=1 的工单 +- 页面标题或筛选条件应该显示"测试中" + +### 3. 测试已完成筛选 +访问:`http://123.56.98.4:8081/system/test_work_order?state=1` +- 应该只显示 testStep=5 的工单 +- 页面标题或筛选条件应该显示"已完成" + +### 4. 测试组合筛选 +访问:`http://123.56.98.4:8081/system/test_work_order?orderId=123&state=1` +- 应该显示批次ID为123且已完成的工单 + +### 5. 测试无参数访问 +访问:`http://123.56.98.4:8081/system/test_work_order` +- 应该显示所有工单(不筛选状态) + +## 注意事项 + +1. **参数优先级**:URL参数会覆盖页面上的按钮筛选 +2. **参数持久性**:URL参数只在页面加载时生效,点击页面上的按钮会改变筛选条件 +3. **参数验证**:代码会将 state 参数转换为整数,非数字参数会被忽略 +4. **兼容性**:同时支持 query 参数和 params 参数 + +## 相关文件 +- `ruoyi-fastapi-frontend/src/views/system/test_work_order/index.vue` - 工单管理页面(已修改) +- `工单菜单错误子菜单修复说明.md` - 菜单配置修复说明 +- `工单按钮点击事件修复说明.md` - 按钮点击事件修复说明 diff --git a/工单路由跳转问题完整修复方案.md b/工单路由跳转问题完整修复方案.md new file mode 100644 index 0000000..c2db7b4 --- /dev/null +++ b/工单路由跳转问题完整修复方案.md @@ -0,0 +1,261 @@ +# 工单路由跳转问题完整修复方案 + +## 问题描述 + +点击工单管理页面的"测试中"、"已完成"等按钮时,URL跳转到错误的路径: +- 错误URL示例:`http://123.56.98.4:8081/test_work_order/testWorkOrder02?page=work_order&state=1` +- 正确URL应该是:`http://123.56.98.4:8081/system/test_work_order?state=1` + +## 根本原因 + +数据库中存在错误的菜单配置,这些菜单拦截了按钮的点击事件,导致路由跳转到错误的URL。 + +### 错误的菜单配置特征: +1. **parent_id = 2098**(工单管理的子菜单) +2. **menu_type = 'C'**(菜单类型) +3. **path = 'testOrder01'** 或 **'testWorkOrder02'** 等错误路径 +4. **menu_name = '进行中'、'已完成'** 等状态名称 +5. **component = 'system/test_order/index'**(错误!应该是 test_work_order) + +## 修复步骤 + +### 步骤1:诊断问题 + +运行诊断脚本查看当前菜单配置: + +```bash +mysql -u your_username -p your_database < check_workorder_submenu.sql +``` + +或者在数据库客户端中执行: + +```sql +-- 查看工单管理的所有子菜单 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + query, + menu_type +FROM sys_menu +WHERE parent_id = 2098 +ORDER BY order_num; +``` + +**预期结果**:应该只有一个子菜单"测试工单"(menu_id=2092) + +**实际结果**:可能有多个错误的子菜单(进行中、已完成等) + +### 步骤2:备份数据库 + +在修改前务必备份: + +```bash +mysqldump -u your_username -p your_database sys_menu > sys_menu_backup.sql +``` + +### 步骤3:删除错误的子菜单 + +执行删除脚本: + +```bash +mysql -u your_username -p your_database < delete_wrong_submenu.sql +``` + +或者手动执行: + +```sql +-- 删除所有状态相关的错误子菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND menu_type = 'C' + AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); + +-- 删除包含错误路径的菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND path IN ('testOrder01', 'testWorkOrder02'); +``` + +### 步骤4:修复父菜单路径 + +确保工单管理父菜单的路径正确: + +```sql +UPDATE sys_menu +SET + path = 'test_work_order', + update_time = NOW() +WHERE menu_id = 2098; +``` + +### 步骤5:验证修复结果 + +```sql +-- 查看工单管理的菜单树 +SELECT + m1.menu_id as parent_id, + m1.menu_name as parent_name, + m1.path as parent_path, + m2.menu_id as child_id, + m2.menu_name as child_name, + m2.path as child_path, + m2.component as child_component, + m2.menu_type as child_type +FROM sys_menu m1 +LEFT JOIN sys_menu m2 ON m1.menu_id = m2.parent_id +WHERE m1.menu_id = 2098 +ORDER BY m2.order_num; +``` + +**正确的结果应该是**: + +| parent_id | parent_name | parent_path | child_id | child_name | child_path | child_component | child_type | +|-----------|-------------|-------------|----------|------------|------------|-----------------|------------| +| 2098 | 工单管理 | test_work_order | 2092 | 测试工单 | test_work_order | system/test_work_order/index | C | + +### 步骤6:清除缓存并重新登录 + +1. **清除Redis缓存**(如果使用了Redis): + ```bash + redis-cli + FLUSHDB + ``` + +2. **重启后端服务**: + ```bash + # 停止服务 + # 启动服务 + ``` + +3. **清除浏览器缓存**: + - 按 `Ctrl + Shift + Delete` + - 或者按 `Ctrl + Shift + R` 强制刷新 + +4. **重新登录系统**: + - 退出登录 + - 重新登录 + +### 步骤7:测试功能 + +1. **测试菜单导航**: + - 点击左侧菜单"工单管理" → "测试工单" + - URL应该是:`http://123.56.98.4:8081/system/test_work_order` + +2. **测试状态筛选按钮**: + - 点击"测试中"按钮 + - URL应该保持:`http://123.56.98.4:8081/system/test_work_order`(不跳转) + - 页面应该只显示 testStep=1 的工单 + +3. **测试URL参数**: + - 访问:`http://123.56.98.4:8081/system/test_work_order?state=0` + - 应该显示测试中的工单 + - 访问:`http://123.56.98.4:8081/system/test_work_order?state=1` + - 应该显示已完成的工单 + +## 如果需要保留状态子菜单 + +如果您确实需要在菜单中显示"进行中"、"已完成"等快捷入口,请按以下方式配置: + +### 正确的菜单配置 + +**进行中菜单**: +- 菜单名称:进行中 +- 上级菜单:工单管理(menu_id=2098) +- 菜单类型:菜单(C) +- 路由地址:`test_work_order`(不是 testOrder01) +- 组件路径:`system/test_work_order/index`(不是 test_order) +- 路由参数:`{"state": 0}` +- 权限字符:`system:test_work_order:list` +- 显示顺序:2 + +**已完成菜单**: +- 菜单名称:已完成 +- 上级菜单:工单管理(menu_id=2098) +- 菜单类型:菜单(C) +- 路由地址:`test_work_order`(不是 testWorkOrder02) +- 组件路径:`system/test_work_order/index`(不是 test_order) +- 路由参数:`{"state": 1}` +- 权限字符:`system:test_work_order:list` +- 显示顺序:3 + +### 添加菜单的SQL + +```sql +-- 添加"进行中"菜单 +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, + query, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_time +) VALUES ( + '进行中', 2098, 2, 'test_work_order', 'system/test_work_order/index', + '{"state": 0}', 1, 0, 'C', '0', + '0', 'system:test_work_order:list', 'education', NOW() +); + +-- 添加"已完成"菜单 +INSERT INTO sys_menu ( + menu_name, parent_id, order_num, path, component, + query, is_frame, is_cache, menu_type, visible, + status, perms, icon, create_time +) VALUES ( + '已完成', 2098, 3, 'test_work_order', 'system/test_work_order/index', + '{"state": 1}', 1, 0, 'C', '0', + '0', 'system:test_work_order:list', 'education', NOW() +); +``` + +## 常见问题 + +### Q1: 删除菜单后还是跳转错误? +**A**: 需要清除缓存并重新登录: +1. 清除Redis缓存 +2. 重启后端服务 +3. 清除浏览器缓存(Ctrl+Shift+R) +4. 退出并重新登录 + +### Q2: 点击按钮还是会跳转? +**A**: 检查前端代码是否添加了 `.prevent` 修饰符: +```vue + + 测试中 + +``` + +### Q3: URL参数不生效? +**A**: 检查路由监听器是否正确处理了 `state` 参数(参考 `工单状态参数筛选功能实现说明.md`) + +### Q4: 如何确认菜单配置正确? +**A**: 运行以下SQL查询: +```sql +SELECT menu_id, menu_name, parent_id, path, component, query +FROM sys_menu +WHERE parent_id = 2098 +ORDER BY order_num; +``` + +应该只看到"测试工单"这一个子菜单,或者您手动添加的正确配置的子菜单。 + +## 相关文件 + +- `check_workorder_submenu.sql` - 诊断脚本 +- `delete_wrong_submenu.sql` - 删除错误菜单脚本 +- `fix_workorder_menu_path.sql` - 修复父菜单路径脚本 +- `工单状态参数筛选功能实现说明.md` - state参数功能说明 +- `工单按钮点击事件修复说明.md` - 按钮事件修复说明 +- `工单菜单错误子菜单修复说明.md` - 菜单配置说明 + +## 修复时间线 + +1. ✅ 前端按钮添加 `.prevent` 修饰符 +2. ✅ 前端路由监听器添加 `state` 参数处理 +3. ⚠️ **待完成:删除数据库中的错误菜单配置** +4. ⚠️ **待完成:清除缓存并重新登录** + +## 总结 + +路由跳转问题的根本原因是数据库中存在错误的菜单配置。这些菜单的路径(如 testOrder01、testWorkOrder02)和组件路径(system/test_order/index)都是错误的,导致点击按钮时被这些菜单拦截,跳转到错误的URL。 + +**解决方案**:删除这些错误的菜单配置,或者修改为正确的配置。修改后必须清除缓存并重新登录才能生效。 diff --git a/快速修复工单路由问题.md b/快速修复工单路由问题.md new file mode 100644 index 0000000..62c5c20 --- /dev/null +++ b/快速修复工单路由问题.md @@ -0,0 +1,138 @@ +# 快速修复工单路由问题 + +## 问题现象 + +点击"测试中"或"已完成"按钮时,URL跳转到: +``` +http://123.56.98.4:8081/test_work_order/testWorkOrder02?page=work_order&state=1 +``` + +应该是: +``` +http://123.56.98.4:8081/system/test_work_order?state=1 +``` + +## 快速修复(3步) + +### 第1步:执行SQL修复脚本 + +在数据库客户端(如Navicat、DBeaver)中执行: + +```bash +mysql -u your_username -p your_database < fix_workorder_routing_complete.sql +``` + +或者直接复制以下SQL到数据库客户端执行: + +```sql +-- 删除错误的子菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND menu_type = 'C' + AND menu_name IN ('进行中', '已完成', '测试中', '待领取', '一审中', '二审中', '三审中', '全部工单'); + +-- 删除错误路径的菜单 +DELETE FROM sys_menu +WHERE parent_id = 2098 + AND path IN ('testOrder01', 'testWorkOrder02'); + +-- 修复父菜单路径 +UPDATE sys_menu +SET path = 'test_work_order', update_time = NOW() +WHERE menu_id = 2098; + +-- 验证结果(应该只有一个子菜单"测试工单") +SELECT menu_id, menu_name, path, component +FROM sys_menu +WHERE parent_id = 2098; +``` + +### 第2步:清除缓存 + +**如果使用Redis**: +```bash +redis-cli +FLUSHDB +exit +``` + +**重启后端服务**: +```bash +# 停止后端服务 +# 启动后端服务 +``` + +### 第3步:清除浏览器缓存并重新登录 + +1. 按 `Ctrl + Shift + R` 强制刷新页面 +2. 退出登录 +3. 重新登录系统 + +## 测试验证 + +### 测试1:菜单导航 +- 点击左侧菜单"工单管理" → "测试工单" +- ✅ URL应该是:`http://123.56.98.4:8081/system/test_work_order` + +### 测试2:状态筛选按钮 +- 点击"测试中"按钮 +- ✅ URL保持不变(不跳转) +- ✅ 只显示 testStep=1 的工单 + +- 点击"已完成"按钮 +- ✅ URL保持不变(不跳转) +- ✅ 只显示 testStep=5 的工单 + +### 测试3:URL参数 +- 访问:`http://123.56.98.4:8081/system/test_work_order?state=0` +- ✅ 显示测试中的工单 + +- 访问:`http://123.56.98.4:8081/system/test_work_order?state=1` +- ✅ 显示已完成的工单 + +## 如果还有问题 + +### 问题1:删除后还是跳转错误 +**原因**:缓存未清除 +**解决**: +1. 确认已清除Redis缓存 +2. 确认已重启后端服务 +3. 确认已清除浏览器缓存 +4. 确认已重新登录 + +### 问题2:找不到菜单 +**原因**:误删了正确的菜单 +**解决**:恢复备份或重新添加菜单 + +### 问题3:权限不足 +**原因**:菜单权限配置错误 +**解决**:检查菜单的 `perms` 字段是否为 `system:test_work_order:list` + +## 诊断命令 + +如果修复后还有问题,运行以下SQL诊断: + +```sql +-- 查看工单管理的所有菜单 +SELECT + menu_id, + menu_name, + parent_id, + path, + component, + query, + menu_type +FROM sys_menu +WHERE menu_id = 2098 OR parent_id = 2098 +ORDER BY parent_id, order_num; +``` + +**正确的结果应该是**: +- 1个父菜单:工单管理(menu_id=2098, path=test_work_order) +- 1个子菜单:测试工单(menu_id=2092, path=test_work_order, component=system/test_work_order/index) + +## 相关文件 + +- `fix_workorder_routing_complete.sql` - 一键修复脚本 +- `check_workorder_submenu.sql` - 诊断脚本 +- `工单路由跳转问题完整修复方案.md` - 详细说明