Files
hzdyjs/🔥立即执行-重启后端测试.md
T
2025-10-14 16:41:19 +08:00

5.4 KiB
Raw Blame History

🔥 立即执行 - 重启后端测试

✅ 问题已找到并修复!

🐛 根本原因

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 中:

  1. 停止当前运行:

    • 点击红色停止按钮 🔴
    • 或按快捷键:Cmd + F2(Mac)/ Ctrl + F2(Windows)
  2. 等待10秒,确保完全停止

  3. 启动后端:

    • 点击绿色运行按钮 ▶️
    • 或按快捷键:Ctrl + Shift + F10
  4. 确认启动成功,查看控制台日志:

    Started RuoYiApplication in xxx seconds
    

✅ 看到上面的日志 → 继续步骤2


⚡ 步骤2:测试前端(30秒)

在浏览器中:

  1. 打开:http://localhost

  2. 进入:人事管理 → 出国行程变更审批

  3. 点击 【审批记录】 选项卡

  4. 按 Cmd + Shift + R(Mac)或 Ctrl + Shift + F5(Windows)强制刷新

  5. 查看列表


📊 预期结果

✅ 成功的情况

列表应该显示已审批的数据:

  • 状态为 "已通过" 或 "已拒绝" 的记录
  • 显示申请人、部门、变更类型、审批时间等信息

浏览器 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 错误:

  1. 查看错误信息(截图或复制)
  2. 查看后端日志:
    • 在 IDEA 控制台搜索 "ERROR" 或 "Exception"
    • 复制相关日志
  3. 告诉我错误信息,我来帮您分析

🎯 技术说明(可选阅读)

为什么使用 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后,审批记录列表应该能正常显示数据了!

现在立即执行吧! 🚀


关键步骤:

  1. ⚡ 重启后端(必须!)
  2. ⚡ 刷新前端(Cmd+Shift+R)
  3. ✅ 查看结果

预计耗时:< 2分钟

成功率:99% ✅


准备好了吗?立即重启后端! 💪🔥