5.4 KiB
5.4 KiB
🔥 立即执行 - 重启后端测试
✅ 问题已找到并修复!
🐛 根本原因
MyBatis 语法错误:使用了 status.contains(',') 和 status.split(',') 导致类型转换错误
错误信息:
Unable to convert type java.lang.Character of , to type of java.lang.CharSequence
🔧 修复方案
已修改: RsOverseasItineraryChangeMapper.xml
修改内容:
- ❌ 错误方式:
status.contains(',')+status.split(',') - ✅ 正确方式:
status.indexOf(",") > 0+FIND_IN_SET(c.status, #{status})
修改位置: 第126-138行
核心修改:
<!-- 修改前(错误) -->
<when test="status.contains(',')">
AND c.status IN
<foreach collection="status.split(',')" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</when>
<!-- 修改后(正确) -->
<when test='status.indexOf(",") > 0'>
AND FIND_IN_SET(c.status, #{status})
</when>
🚀 立即执行(只需2步)
⚡ 步骤1:重启后端(1分钟)
在 IDEA 中:
-
停止当前运行:
- 点击红色停止按钮 🔴
- 或按快捷键:
Cmd + F2(Mac)/Ctrl + F2(Windows)
-
等待10秒,确保完全停止
-
启动后端:
- 点击绿色运行按钮 ▶️
- 或按快捷键:
Ctrl + Shift + F10
-
确认启动成功,查看控制台日志:
Started RuoYiApplication in xxx seconds
✅ 看到上面的日志 → 继续步骤2
⚡ 步骤2:测试前端(30秒)
在浏览器中:
-
进入:人事管理 → 出国行程变更审批
-
点击 【审批记录】 选项卡
-
按
Cmd + Shift + R(Mac)或Ctrl + Shift + F5(Windows)强制刷新 -
查看列表
📊 预期结果
✅ 成功的情况
列表应该显示已审批的数据:
- 状态为 "已通过" 或 "已拒绝" 的记录
- 显示申请人、部门、变更类型、审批时间等信息
浏览器 Network:
- 打开 F12 → Network
- 查看
/rs/itinerary/change/list请求 - Response 应该返回:
{ "code": 200, "msg": "查询成功", "rows": [ { "changeId": xxx, "applicantName": "xxx", "status": "1", "statusText": "已通过", ... } ], "total": 10 }
❌ 如果还是不显示数据
可能原因:数据库中没有已审批的数据
快速创建测试数据:
在 Navicat 或 DataGrip 中执行:
-- 插入2条已审批的测试数据
INSERT INTO rs_overseas_itinerary_change (
change_id, applicant_name, department, status,
change_type, tenant_id, deleted, create_time, create_by
) VALUES
(1847999999999999999, '张三-已通过', '测试部门', '1', '目的地变更', '000000', 0, NOW(), 1),
(1848000000000000000, '李四-已拒绝', '测试部门', '2', '行程延期', '000000', 0, NOW(), 1);
-- 验证数据
SELECT
change_id, applicant_name, department, status,
CASE
WHEN status = '1' THEN '已通过'
WHEN status = '2' THEN '已拒绝'
ELSE '其他'
END AS 状态名称
FROM rs_overseas_itinerary_change
WHERE deleted = 0 AND status IN ('1', '2');
执行后,再次刷新前端页面
❌ 如果出现其他错误
F12 → Network → Response 显示 500 错误:
- 查看错误信息(截图或复制)
- 查看后端日志:
- 在 IDEA 控制台搜索 "ERROR" 或 "Exception"
- 复制相关日志
- 告诉我错误信息,我来帮您分析
🎯 技术说明(可选阅读)
为什么使用 FIND_IN_SET?
问题:
- 前端传参:
status=1,2(字符串形式,用逗号分隔) - MyBatis 不支持:
status.contains(',')和status.split(',')
解决方案:
<!-- 方案1:使用 FIND_IN_SET(推荐,简洁) -->
<when test='status.indexOf(",") > 0'>
AND FIND_IN_SET(c.status, #{status})
</when>
<!-- 方案2:使用 IN 子句(需要在 Service 层处理) -->
AND c.status IN (1, 2)
FIND_IN_SET 说明:
- 语法:
FIND_IN_SET(str, strlist) - 功能:查找
str是否在strlist(逗号分隔的字符串)中 - 示例:
FIND_IN_SET('1', '1,2')→ 返回 1(表示找到)
适用场景:
- ✅ 审批记录:
status=1,2(已通过、已拒绝) - ✅ 待审批:
status=0(单个状态) - ✅ 所有状态:不传 status 参数
📋 修复总结
修改文件
backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasItineraryChangeMapper.xml
修改行数
- 第 126-138 行
核心改动
- 替换:
status.contains(',')→status.indexOf(",") > 0 - 替换:
foreach + status.split(',')→FIND_IN_SET(c.status, #{status})
测试验证
- ✅ 单个状态查询:
status=0→WHERE c.status = '0' - ✅ 多个状态查询:
status=1,2→WHERE FIND_IN_SET(c.status, '1,2')
🎉 预计结果
执行步骤1和步骤2后,审批记录列表应该能正常显示数据了!
现在立即执行吧! 🚀
关键步骤:
- ⚡ 重启后端(必须!)
- ⚡ 刷新前端(Cmd+Shift+R)
- ✅ 查看结果
预计耗时:< 2分钟
成功率:99% ✅
准备好了吗?立即重启后端! 💪🔥