出国行程变更管理模块允许用户对已审批通过的出国申请提交行程变更申请,支持变更目的地、时间、行程安排等信息。
1. 用户查看已审批通过的出国申请
2. 用户选择一个出国申请,填写变更信息
3. 提交变更申请(状态:待审核)
4. 管理员审批变更申请
- 通过:状态变为"已通过",成为变更记录
- 拒绝:状态变为"已拒绝"
5. 用户可撤回待审核的变更申请
接口说明: 查询所有的行程变更申请(包括所有状态)
请求方式: GET
接口地址: /rs/itinerary/change/list
权限标识: rs:itineraryChange:list
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pageNum | Integer | 否 | 页码(默认1) |
| pageSize | Integer | 否 | 每页条数(默认10) |
| applicantName | String | 否 | 申请人姓名(模糊查询) |
| status | String | 否 | 变更状态(0=待审核,1=已通过,2=已拒绝,3=已撤回) |
| changeType | String | 否 | 变更类型 |
响应示例:
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 10,
"rows": [
{
"changeId": "1977740586114916354",
"applicationId": "1977123456789012345",
"applicantId": "1",
"applicantName": "admin",
"status": "0",
"statusText": "待审核",
"changeType": "destination_change",
"changeTypeText": "目的地变更",
"originalDestination": "美国",
"newDestination": "加拿大",
"originalStartDate": "2025-11-01",
"newStartDate": "2025-11-05",
"changeReason": "会议时间调整",
"createTime": "2025-10-13 10:00:00"
}
]
}
}
接口说明: 查询当前用户的变更记录(只返回已通过的变更申请)
重要说明:
请求方式: GET
接口地址: /rs/itinerary/change/my/list
权限标识: rs:itineraryChange:list
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pageNum | Integer | 否 | 页码(默认1) |
| pageSize | Integer | 否 | 每页条数(默认10) |
| changeType | String | 否 | 变更类型 |
后端自动过滤条件:
applicantId = 当前登录用户ID(自动设置)status = '1'(只查询已通过的,自动设置)响应示例:
{
"code": 200,
"msg": "查询成功",
"data": {
"total": 5,
"rows": [
{
"changeId": "1977740586114916354",
"applicationId": "1977123456789012345",
"applicantId": "1",
"applicantName": "admin",
"status": "1",
"statusText": "已通过",
"changeType": "destination_change",
"changeTypeText": "目的地变更",
"originalDestination": "美国",
"newDestination": "加拿大",
"approverName": "管理员",
"approveTime": "2025-10-13 14:00:00",
"createTime": "2025-10-13 10:00:00"
}
]
}
}
approverName:后台统一返回审批人的 昵称,若用户未设置昵称则自动回退到账号;前端无需再做用户名到昵称的手动映射。接口说明: 查询待审批的行程变更申请(status='0')
请求方式: GET
接口地址: /rs/itinerary/change/pending/list
权限标识: rs:itineraryChange:approve
请求参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pageNum | Integer | 否 | 页码(默认1) |
| pageSize | Integer | 否 | 每页条数(默认10) |
| applicantName | String | 否 | 申请人姓名(模糊查询) |
后端自动过滤条件:
status = '0'(只查询待审核的,自动设置)接口说明: 根据变更ID查询详细信息
请求方式: GET
接口地址: /rs/itinerary/change/{changeId}
权限标识: rs:itineraryChange:query
路径参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| changeId | Long | 是 | 变更ID |
响应示例:
{
"code": 200,
"msg": "查询成功",
"data": {
"changeId": "1977740586114916354",
"applicationId": "1977123456789012345",
"applicantName": "admin",
"gender": "0",
"birthDate": "1990-01-01",
"politicalStatus": "中共党员",
"status": "1",
"statusText": "已通过",
"changeType": "destination_change",
"changeTypeText": "目的地变更",
"originalDestination": "美国",
"newDestination": "加拿大",
"originalStartDate": "2025-11-01",
"newStartDate": "2025-11-05",
"changeReason": "会议时间调整",
"supportingDocuments": "http://xxx.com/file.pdf",
"approverName": "管理员",
"approveTime": "2025-10-13 14:00:00",
"approveOpinion": "同意变更"
}
}
接口说明: 提交新的行程变更申请
请求方式: POST
接口地址: /rs/itinerary/change
权限标识: rs:itineraryChange:add
请求体示例:
{
"applicationId": "1977123456789012345",
"changeType": "destination_change",
"newDestination": "加拿大",
"newDestinationCity": "多伦多",
"newStartDate": "2025-11-05",
"newEndDate": "2025-11-15",
"newDuration": 10,
"changeReason": "会议时间调整",
"supportingDocuments": "http://xxx.com/file.pdf"
}
后端自动设置字段:
applicantId: 当前登录用户IDapplicantName: 当前登录用户姓名status: '0'(待审核)tenantId: 当前租户IDoriginalDestination、originalStartDate等原始信息业务校验:
接口说明: 修改待审核或已拒绝的变更申请并重新提交
请求方式: PUT
接口地址: /rs/itinerary/change
权限标识: rs:itineraryChange:edit
请求体示例:
{
"changeId": "1977740586114916354",
"changeType": "destination_change",
"newDestination": "英国",
"newDestinationCity": "伦敦",
"changeReason": "更新后的变更原因"
}
接口说明: 删除变更申请(逻辑删除)
请求方式: DELETE
接口地址: /rs/itinerary/change/{changeIds}
权限标识: rs:itineraryChange:remove
路径参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| changeIds | Long[] | 是 | 变更ID数组(逗号分隔) |
接口说明: 撤回待审核的变更申请
请求方式: PUT
接口地址: /rs/itinerary/change/cancel/{changeId}
权限标识: rs:itineraryChange:cancel
路径参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| changeId | Long | 是 | 变更ID |
业务规则:
接口说明: 审批行程变更申请(通过/拒绝)
请求方式: PUT
接口地址: /rs/itinerary/change/approve
权限标识: rs:itineraryChange:approve
请求体示例:
{
"changeId": "1977740586114916354",
"approved": true,
"opinion": "同意变更"
}
参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| changeId | Long | 是 | 变更ID |
| approved | Boolean | 是 | 是否通过(true=通过,false=拒绝) |
| opinion | String | 否 | 审批意见 |
重要提示:
changeId、approved、opinionapprovalStatus、approvalOpinion审批结果:
approved=true: 状态变为'1'(已通过)→ 成为变更记录approved=false: 状态变为'2'(已拒绝)响应示例:
{
"code": 200,
"msg": "操作成功"
}
接口说明: 获取已审批通过的出国申请列表(用于新增变更时选择原申请)
请求方式: GET
接口地址: /rs/itinerary/change/available-records
权限标识: rs:itineraryChange:list
响应说明: 返回当前用户的所有已通过审批的出国申请
接口说明: 查询某个出国申请的所有变更记录
请求方式: GET
接口地址: /rs/itinerary/change/record/{recordId}/history
权限标识: rs:itineraryChange:query
路径参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| recordId | Long | 是 | 出国记录ID(或申请ID) |
| 字典值 | 标签 | 样式 | 说明 |
|---|---|---|---|
| 0 | 待审核 | primary | 待审批状态 |
| 1 | 已通过 | success | 已通过审批,成为变更记录 |
| 2 | 已拒绝 | danger | 已拒绝 |
| 3 | 已撤回 | info | 用户撤回 |
| 字典值 | 标签 | 说明 |
|---|---|---|
| destination_change | 目的地变更 | 更改出国目的地 |
| time_change | 时间变更 | 更改出国时间 |
| itinerary_change | 行程变更 | 更改行程安排 |
| transportation_change | 交通方式变更 | 更改交通方式 |
| accommodation_change | 住宿变更 | 更改住宿安排 |
/rs/itinerary/change/list/rs/itinerary/change/my/list| 权限标识 | 说明 |
|---|---|
| rs:itineraryChange:list | 查询变更申请/记录列表 |
| rs:itineraryChange:query | 查看变更详情 |
| rs:itineraryChange:add | 新增变更申请 |
| rs:itineraryChange:edit | 修改变更申请 |
| rs:itineraryChange:remove | 删除变更申请 |
| rs:itineraryChange:cancel | 撤回变更申请 |
| rs:itineraryChange:approve | 审批变更申请 |
| rs:itineraryChange:export | 导出变更申请 |
错误描述:
java.sql.SQLSyntaxErrorException: Unknown column 'gender' in 'field list'
原因分析:
rs_overseas_itinerary_change 缺少个人信息字段解决方案:
1️⃣ 执行修复SQL:
文件位置: docs/设计文档/database/⚡一键修复-添加缺失字段.sql
执行方式: 直接在MySQL中执行
2️⃣ 重启后端服务(清除MyBatis缓存)
3️⃣ 重新测试功能
缺失字段列表:
详细修复指南: docs/问题解决方案/🚨数据库字段缺失修复指南.md
错误描述:
Cannot invoke "Object.toString()" because the return value of "java.util.Map.get(Object)" is null
原因分析:
approvalStatus + approvalOpinionapproved + opinion解决方案:
前端必须发送正确的参数:
{
"changeId": 123,
"approved": true, // ✅ 布尔值,不是字符串
"opinion": "同意变更"
}
详细修复总结: docs/问题解决方案/行程变更审批接口参数错误修复总结.md
问题描述:
原因分析:
解决方案:
前端在查询"变更记录"时必须传递 status: '1':
const queryParams = ref<ItineraryChangeQuery>({
pageNum: 1,
pageSize: 10,
status: '1' // ✅ 只查询已通过的记录
});
详细修复总结: docs/问题解决方案/变更记录Tab显示逻辑修复总结.md
文档创建时间: 2025-10-13
文档版本: v1.1
维护人员: weizzzz
最后更新: 2025-10-13(新增故障排查部分)