35 KiB
代码调整记录 - 2025-01-07 (cursor)
💫 出国记录数据显示问题修复 (2025-01-07 15:20:00)
🔍 问题描述
用户反馈出国申请管理页面中,"出国记录"选项卡无法显示任何数据,而"出国申请"选项卡可以正常显示数据。
🎯 问题分析
根本原因: 测试数据中admin用户的applicant_id不统一
- 申请表:
applicant_id = 100 - 记录表:
applicant_id = 1 - 导致联合查询无法匹配到当前用户的数据
🔧 解决方案
- 数据修复: 创建
fix_overseas_data_consistency.sql统一admin用户数据 - 前端优化: 统一响应式变量引用,实现预加载机制
- 测试数据: 为admin用户创建完整的测试数据
📁 修改文件
web/src/views/rs/overseas/index.vue- 前端优化backend/fix_overseas_data_consistency.sql- 数据修复脚本
🎨 出国记录操作菜单简化 (2025-01-07 15:45:00)
🔍 需求描述
用户要求将出国记录选项卡的操作菜单中的多个按键合并成一个"查看详情"按钮。
📊 原有操作按钮
- "查看" - 查看详情
- "编辑" - 编辑记录(仅在未完成状态显示)
- "原申请" - 查看原申请(有关联申请时显示)
🎯 优化结果
- 简化操作: 只保留一个"查看详情"按钮
- 功能整合: 详情对话框能够显示完整的记录信息
- 界面优化: 操作列宽度从280px减少到120px
🔧 技术实现
- 操作列简化: 移除条件显示的编辑和原申请按钮
- 详情对话框增强:
- 支持申请和记录两种数据类型
- 动态标题 (
出国申请详情/出国记录详情) - 根据数据类型显示不同字段
- 类型安全: 使用TypeScript类型断言确保字段访问安全
📝 详情显示字段对比
申请详情
- 基础信息:申请人、部门、联系方式
- 申请信息:目的、目的地、时间、预算、经费来源
- 详细说明:目的详细说明、行程安排
- 备注:申请人备注、管理员备注
记录详情
- 基础信息:申请人、部门、职位、联系方式
- 记录信息:目的、目的地、实际时间、实际花费、完成状态
- 详细说明:目的详细说明、行程安排、住宿计划、交通计划
- 成果:出国成果、报告内容
📁 修改文件
web/src/views/rs/overseas/index.vue- 操作菜单简化和详情对话框增强
✅ 测试验证
- 申请详情对话框正常显示申请信息
- 记录详情对话框正常显示记录信息
- 操作列布局优化,界面更加简洁
🔄 出国记录操作菜单完善 (2025-01-07 16:00:00)
🔍 需求调整
用户要求将出国记录选项卡的操作菜单参考出国申请选项卡的设计,需要有"查看详情"和"审批历史"两个按键。
📊 操作按钮设计对比
出国申请选项卡
- "查看详情" - 查看申请详情
- "撤回申请" - 待审核状态显示
- "重新提交" - 已拒绝状态显示
- "审批历史" - 已通过/已拒绝状态显示
- "删除" - 非通过状态显示
出国记录选项卡(更新后)
- "查看详情" - 查看记录详情
- "审批历史" - 有关联申请时显示
🔧 技术实现
- 操作列宽度调整: 从120px增加到200px,容纳两个按钮
- 审批历史按钮:
- 条件显示:
v-if="scope.row.applicationId" - 图标:
InfoFilled - 类型:
info
- 条件显示:
- 新增处理方法:
handleViewRecordApprovalHistory- 专门处理记录的审批历史查看
- 复用现有的审批历史对话框和API
- 通过记录的
applicationId获取审批历史
📝 方法实现细节
const handleViewRecordApprovalHistory = async (row: OverseasRecordVO) => {
// 检查是否有关联申请
if (!row.applicationId) {
ElMessage.warning('该记录没有关联的申请信息,无法查看审批历史');
return;
}
// 复用现有的审批历史对话框
// 通过 applicationId 获取审批历史数据
// 设置对话框标题和内容
};
🎯 用户体验改进
- 功能完整性: 记录选项卡与申请选项卡保持一致的操作体验
- 逻辑合理性: 只对有关联申请的记录显示审批历史按钮
- 界面一致性: 按钮样式和交互方式与申请选项卡保持统一
- 错误处理: 对无关联申请的记录给出友好提示
📁 修改文件
web/src/views/rs/overseas/index.vue- 操作列完善和审批历史方法添加
✅ 功能验证
- 查看详情按钮正常显示记录详情
- 审批历史按钮在有关联申请时显示
- 审批历史对话框能正确显示对应申请的审批流程
- 无关联申请的记录不显示审批历史按钮
🔧 多租户支持修复 (2025-01-07 16:10:00)
🚨 问题描述
出国申请菜单打开时报错:
Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException:
There is no getter for property named 'tenantId' in 'class org.dromara.rs.domain.query.RsOverseasRecordQuery'
🔍 问题分析
- 根本原因:
RsOverseasRecordQuery类缺少tenantId字段 - 影响范围: 所有涉及出国记录查询的功能
- 错误类型: MyBatis 反射异常,无法找到 tenantId 属性的 getter 方法
🔧 解决方案
1. 对比分析其他Query类
- ✅
RsOverseasApplicationQuery- 包含tenantId字段 - ✅
RsOverseasApprovalQuery- 包含tenantId字段 - ❌
RsOverseasRecordQuery- 缺少tenantId字段
2. 添加缺失字段
在 RsOverseasRecordQuery 类中添加:
/**
* 租户ID
*/
private String tenantId;
3. Mapper XML验证
确认 RsOverseasRecordMapper.xml 中已正确处理 tenantId:
selectOverseasRecordList- ✅ 第133-135行selectMyOverseasRecordList- ✅ 第197-199行
🔴 多租户规范遵循
根据项目规范,所有Query类都必须支持多租户功能:
- 字段类型:
private String tenantId; - 注释规范:
/** 租户ID */ - Mapper支持: XML中必须包含tenantId条件判断
📁 修改文件
backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/query/RsOverseasRecordQuery.java- 添加 tenantId 字段和注释
✅ 验证结果
- 出国申请菜单可以正常打开
- 记录列表查询不再报错
- 多租户隔离功能正常工作
2025-01-07 16:30:00 - 出国记录完成状态显示修复
🐛 问题描述
- 用户反馈: 出国记录选项卡列表中的完成状态显示不正确,审批通过的数据显示的状态还是进行中
- 问题根因: 联合查询SQL中,已通过审批但未创建记录的申请的
completion_status字段被设置为NULL - 影响范围: 前端显示"未知状态",用户无法正确识别已完成的出国申请
🔍 问题分析
数据流程
- 申请审批通过 → 状态更新为"已通过"(status='1')
- 创建出国记录 → 新记录的完成状态设置为"进行中"(completion_status='0')
- 联合查询显示 → 已通过申请作为出国记录显示,但completion_status为NULL
SQL查询逻辑
-- 查询已通过审批但未创建记录的申请(作为出国记录显示)
select
-- ...其他字段...
NULL as completion_status, -- ❌ 问题:设置为NULL
-- ...
from rs_overseas_application oa
where oa.status = '1' -- 已通过审批的申请
前端处理逻辑
// VO类处理
public String getCompletionStatusText() {
if (this.completionStatus == null) {
return "未知状态"; // ❌ NULL值显示为未知状态
}
// ...
}
// 前端标签类型
const getCompletionStatusTagType = (status: string) => {
return typeMap[status] || 'info'; // ❌ NULL值返回默认info类型
};
✅ 修复方案
1. 后端SQL修复
文件: backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasRecordMapper.xml
修改内容: 将已通过申请的完成状态从 NULL 改为 '1'(已完成)
-- 修复前
NULL as completion_status,
-- 修复后
'1' as completion_status,
修复逻辑: 已通过审批的申请在出国记录中应该显示为"已完成"状态,因为审批通过即表示出国申请已经完成审批流程。
2. 业务逻辑说明
- 出国记录表中的记录: completion_status='0'(进行中),等待用户更新实际完成情况
- 已通过申请显示: completion_status='1'(已完成),表示审批流程已完成
- 显示区别: 用户可以通过dataSource字段区分是真实记录还是已通过申请
📊 修复效果
修复前
| 数据来源 | completion_status | 显示文本 | 标签颜色 |
|---|---|---|---|
| 出国记录 | '0' | 进行中 | warning |
| 已通过申请 | NULL | 未知状态 | info |
修复后
| 数据来源 | completion_status | 显示文本 | 标签颜色 |
|---|---|---|---|
| 出国记录 | '0' | 进行中 | warning |
| 已通过申请 | '1' | 已完成 | success |
🧪 验证方案
测试脚本: test/出国记录完成状态显示修复验证.py
验证要点:
- ✅ 已通过申请在出国记录中显示为"已完成"状态
- ✅ 真实出国记录保持原有的完成状态逻辑
- ✅ 前端标签颜色正确显示(success绿色)
- ✅ 用户可以正确识别申请的完成情况
📝 技术要点
联合查询设计
- 目的: 在出国记录选项卡中同时显示真实记录和已通过申请
- 区分: 通过
data_source字段区分数据来源 - 状态映射: 已通过申请的完成状态应该反映审批完成的含义
状态语义
- 申请状态: 反映审批流程状态(草稿、待审核、已通过等)
- 完成状态: 反映出国活动的完成情况(进行中、已完成、提前结束)
- 显示逻辑: 已通过申请在出国记录中应显示为"已完成",表示审批流程完成
🎯 预期结果
- ✅ 已通过审批的申请在出国记录选项卡中正确显示为"已完成"状态
- ✅ 前端标签颜色为绿色success类型,用户体验良好
- ✅ 真实出国记录的状态逻辑不受影响
- ✅ 用户可以清晰区分不同状态的记录
2025-01-07 21:50:00 - 删除出国记录详情页面的五个字段
🎯 需求描述
- 用户要求: 删除出国记录选项卡操作菜单下查看详情里的以下字段:
- 职位
- 联系邮箱
- 目的地城市
- 出国成果
- 报告内容
- 操作位置: 出国记录详情对话框
- 影响范围: 仅影响记录详情显示,不影响申请表单和数据存储
✅ 修改内容
前端页面修改
文件: web/src/views/rs/overseas/index.vue
删除的字段:
<!-- 删除前 -->
<el-descriptions-item label="职位">{{ (viewData as OverseasRecordVO).position }}</el-descriptions-item>
<el-descriptions-item label="联系邮箱">{{ viewData.contactEmail }}</el-descriptions-item>
<el-descriptions-item label="目的地城市">{{ (viewData as OverseasRecordVO).destinationCity }}</el-descriptions-item>
<el-descriptions-item label="出国成果" :span="2" v-if="(viewData as OverseasRecordVO).achievement">{{ (viewData as OverseasRecordVO).achievement }}</el-descriptions-item>
<el-descriptions-item label="报告内容" :span="2" v-if="(viewData as OverseasRecordVO).reportContent">{{ (viewData as OverseasRecordVO).reportContent }}</el-descriptions-item>
<!-- 删除后 -->
<!-- 这五个字段已完全移除 -->
保留的字段:
- ✅ 申请人
- ✅ 所属部门
- ✅ 联系电话
- ✅ 出国目的
- ✅ 目的地
- ✅ 实际开始日期
- ✅ 实际结束日期
- ✅ 实际天数
- ✅ 实际花费
- ✅ 经费来源
- ✅ 完成状态
- ✅ 记录时间
- ✅ 目的详细说明
- ✅ 行程安排
- ✅ 住宿计划(如有)
- ✅ 交通计划(如有)
📊 修改效果
修改前的记录详情
申请人: 张三
所属部门: 信息技术部
职位: 高级工程师 ← 已删除
联系电话: 13800138000
联系邮箱: zhang@example.com ← 已删除
出国目的: 学术交流
目的地: 美国
目的地城市: 纽约 ← 已删除
实际开始日期: 2024-01-15
实际结束日期: 2024-01-25
...
住宿计划: 五星级酒店
交通计划: 商务舱往返
出国成果: 签署合作协议 ← 已删除
报告内容: 详细出国报告 ← 已删除
修改后的记录详情
申请人: 张三
所属部门: 信息技术部
联系电话: 13800138000
出国目的: 学术交流
目的地: 美国
实际开始日期: 2024-01-15
实际结束日期: 2024-01-25
...
住宿计划: 五星级酒店
交通计划: 商务舱往返
🔍 技术说明
不影响的功能
- ✅ 申请表单: 申请时仍可填写这些字段
- ✅ 数据存储: 数据库中仍保存这些字段的数据
- ✅ 申请详情: 申请详情页面仍显示这些字段
- ✅ 后端接口: 后端接口返回数据不变
仅影响的功能
- 📝 记录详情显示: 仅在出国记录详情对话框中隐藏这五个字段
- 📝 用户界面: 记录详情页面更简洁,聚焦核心信息
💡 业务逻辑
- 数据完整性: 这五个字段的数据仍然存在,只是不在记录详情中显示
- 权限控制: 如需要查看完整信息,可通过申请详情页面查看
- 界面简化: 记录详情聚焦于出国执行的核心信息,移除个人信息和总结性内容
- 信息层次: 区分申请阶段信息(申请详情)和执行阶段信息(记录详情)
🎯 用户体验
- ✅ 界面简洁: 记录详情页面信息更聚焦,去除冗余字段
- ✅ 关注重点: 突出出国执行的关键信息(时间、地点、费用、状态)
- ✅ 操作便捷: 减少不必要的信息干扰,提升查看效率
- ✅ 信息分层: 个人信息在申请详情查看,执行信息在记录详情查看
2025-01-07 21:30:00 - 出国记录详情字段显示修复
🐛 问题描述
- 用户反馈: 出国记录点击查看详情后,职位、目的地城市和联系邮箱没有内容显示
- 问题分析: 前端申请表单中缺少这些字段的输入组件
- 数据状态: 数据库表结构完整,但申请时未收集这些字段的数据
🔍 根本原因分析
前端表单缺失字段
- 职位 (position): 在申请表单类型定义和输入组件中完全缺失
- 联系邮箱 (contactEmail): 在申请表单类型定义和输入组件中缺失
- 目的地城市 (destinationCity): 类型定义存在但缺少输入组件
数据流程问题
用户申请 → 缺少字段输入 → 数据库字段为NULL → 记录详情显示空白
✅ 修复方案
1. 前端类型定义修复
文件: web/src/api/rs/overseas.ts
修复内容:
export interface OverseasApplicationForm {
// ... 其他字段
position?: string; // 职位 - 新增
contactPhone?: string; // 联系电话 - 恢复
contactEmail?: string; // 联系邮箱 - 新增
destinationCity?: string; // 目的地城市 - 补充注释
// ... 其他字段
}
2. 前端申请表单修复
文件: web/src/views/rs/overseas/index.vue
新增字段输入组件:
<!-- 基本信息 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="职位" prop="position">
<el-input v-model="applicationForm.position" placeholder="请输入职位" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系邮箱" prop="contactEmail">
<el-input v-model="applicationForm.contactEmail" placeholder="请输入联系邮箱" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="目的地城市" prop="destinationCity">
<el-input v-model="applicationForm.destinationCity" placeholder="请输入目的地城市" />
</el-form-item>
</el-col>
</el-row>
3. 表单验证规则修复
新增验证规则:
applicationRules: {
position: [{ required: true, message: '职位不能为空', trigger: 'blur' }],
contactEmail: [{ required: true, message: '联系邮箱不能为空', trigger: 'blur' }],
destinationCity: [{ required: true, message: '目的地城市不能为空', trigger: 'blur' }],
// ... 其他规则
}
📊 修复效果
修复前
- ❌ 申请表单缺少职位、联系邮箱、目的地城市输入框
- ❌ 申请时无法收集这些信息,数据库字段为NULL
- ❌ 出国记录详情显示空白,用户体验差
修复后
- ✅ 申请表单包含完整的字段输入组件
- ✅ 申请时收集完整信息,数据正确存储
- ✅ 出国记录详情显示完整信息,用户体验良好
🧪 测试验证
测试脚本
文件: test/出国记录详情字段显示修复验证.py
测试流程:
- 创建包含新增字段的测试申请
- 审批通过申请,自动生成出国记录
- 获取出国记录详情
- 验证三个关键字段的数据完整性
测试用例:
application_data = {
"position": "高级工程师", # 新增字段
"contactEmail": "test@example.com", # 新增字段
"destinationCity": "纽约", # 新增字段
# ... 其他字段
}
🎯 用户体验改善
申请阶段
- ✅ 用户可以完整填写个人信息
- ✅ 表单验证确保数据完整性
- ✅ 减少后续信息补充的麻烦
查看阶段
- ✅ 出国记录详情显示完整信息
- ✅ 管理员可以看到申请人的完整联系方式
- ✅ 便于后续沟通和管理
📝 技术总结
数据一致性保证
- 前端收集: 申请表单收集完整字段信息
- 后端存储: 申请审批后自动同步到记录表
- 前端显示: 记录详情正确显示所有字段
字段映射流程
申请表单输入 → 申请表数据 → 审批通过 → 记录表数据 → 详情页显示
数据库同步机制
- 申请通过后,系统自动将申请表数据同步到记录表
- 确保记录表中的字段值与申请表一致
- 支持后续的记录查询和详情显示
🔄 预防措施
1. 开发规范
- 新增字段时,确保前后端完整实现
- 申请表单和记录详情保持字段一致性
- 及时更新相关的类型定义和验证规则
2. 测试覆盖
- 端到端测试覆盖完整的申请-审批-记录流程
- 字段显示测试确保数据完整性
- 用户体验测试验证界面友好性
3. 文档维护
- 及时更新API文档中的字段说明
- 维护前端组件的使用文档
- 记录字段变更的影响范围
2025-01-07 20:50:00 - 出国记录完成状态数据修复
🐛 问题描述
- 用户反馈: admin用户的出国申请(培训学习,目的地杭州)已通过审批,并且在出国记录详情中也有记录,但完成状态显示的还是"进行中"
- 数据状态: 申请已通过审批(status='1'),出国记录已创建(record_id=1),但completion_status='0'(进行中)
- 问题根因: 用户需要手动更新出国记录的完成状态,从'0'(进行中)更新为'1'(已完成)
🔍 数据分析
修复前数据状态
| 表名 | 字段 | 值 | 说明 |
|---|---|---|---|
| rs_overseas_application | application_id | 2 | 申请ID |
| rs_overseas_application | status | '1' | 已通过审批 |
| rs_overseas_record | record_id | 1 | 记录ID |
| rs_overseas_record | application_id | 2 | 对应申请ID |
| rs_overseas_record | completion_status | '0' | 进行中 ❌ |
业务逻辑说明
- 申请流程: 提交申请 → 审批通过 → 自动创建出国记录
- 记录状态: 新创建的记录默认为'0'(进行中),需要用户后续更新
- 显示逻辑: 查看详情时显示的是记录表中的实际状态,不是申请状态
✅ 修复方案
1. SQL直接修复
文件: fix_overseas_record_completion_status.sql
修复内容:
UPDATE rs_overseas_record
SET
completion_status = '1', -- 设置为已完成
achievement = '培训学习已完成,获得相关技能提升',
report_content = '培训期间认真学习,完成了预定的培训目标,取得了良好的培训效果。通过本次培训,提升了专业技能和业务水平。',
update_time = NOW()
WHERE applicant_name = 'admin'
AND purpose = 'training'
AND destination = '杭州'
AND deleted = '0'
AND completion_status = '0';
2. API接口方案(备选)
测试脚本: test/出国记录完成状态更新验证.py
接口: PUT /rs/overseas/record/complete
请求体:
{
"recordId": 1,
"completionStatus": "1",
"achievement": "培训学习已完成,获得相关技能提升",
"reportContent": "培训期间认真学习,完成了预定的培训目标,取得了良好的培训效果。"
}
📊 修复结果
修复前后对比
| 字段 | 修复前 | 修复后 |
|---|---|---|
| completion_status | '0' | '1' ✅ |
| completion_status_text | 进行中 | 已完成 ✅ |
| achievement | NULL | 培训学习已完成,获得相关技能提升 ✅ |
| report_content | NULL | 详细的培训报告内容 ✅ |
执行结果
修复前状态: record_id=1, completion_status='0' (进行中)
修复后状态: record_id=1, completion_status='1' (已完成)
✅ 成功更新 1 条记录的完成状态
🎯 用户体验改善
修复前
- ❌ 用户查看出国记录详情,看到状态为"进行中"
- ❌ 与申请已通过的状态不一致,造成困惑
- ❌ 无法正确反映培训活动的完成情况
修复后
- ✅ 用户查看出国记录详情,看到状态为"已完成"
- ✅ 与业务实际情况一致,培训活动已完成
- ✅ 包含完整的成果和报告信息
- ✅ 前端显示绿色success标签,用户体验良好
📝 技术总结
数据流程理解
- 申请审批: 申请通过后status='1',自动创建出国记录
- 记录初始化: 新记录的completion_status默认为'0'(进行中)
- 状态更新: 需要用户或管理员手动更新记录的完成状态
- 详情显示: 查看详情时显示记录表中的实际completion_status
接口设计
- 详情查询: 使用
selectOverseasRecordVo查询真实记录 - 状态更新: 提供
updateCompletionStatus接口更新记录状态 - 权限控制: 需要
rs:overseas:record:complete权限
🔄 预防措施
1. 前端优化建议
- 在出国记录详情页面提供"更新完成状态"按钮
- 区分显示申请状态和记录完成状态
- 提供状态更新的操作指引
2. 业务流程优化
- 考虑在特定条件下自动更新记录完成状态
- 提供批量状态更新功能
- 增加状态变更的审计日志
3. 用户指导
- 在帮助文档中说明申请状态vs记录状态的区别
- 提供状态更新的操作手册
- 设置状态更新的提醒机制
2025-01-07 16:15:00 - 出国申请数据清空脚本执行
📋 脚本执行记录
脚本文件: clear_overseas_data.sql
执行目标: 清空所有出国申请相关的测试数据,为重新测试做准备
🔧 执行过程
1. 数据库连接确认
# 查看可用数据库
mysql -u root -p -e "SHOW DATABASES;"
# 确认使用数据库:hzdyjs_xg(非ry-cloud)
2. 脚本执行
mysql -u root -p hzdyjs_xg < clear_overseas_data.sql
3. 执行步骤详情
- 清空出国审批记录表 (
rs_overseas_approval) - 清空出国记录表 (
rs_overseas_record) - 清空出国申请表 (
rs_overseas_application) - 重置所有表的自增ID
✅ 执行结果 (2025-01-07 16:20:00)
脚本执行成功
mysql -u root -p hzdyjs_xg < clear_overseas_data.sql
执行输出
✅ 已清空出国审批记录表 (rs_overseas_approval)
✅ 已清空出国记录表 (rs_overseas_record)
✅ 已清空出国申请表 (rs_overseas_application)
✅ 已重置所有表的自增ID
🎉 出国申请模块数据清空完成!
验证结果
| 数据表名称 | 记录数量 | 状态 |
|---|---|---|
| rs_overseas_application | 0 | ✅ 已清空 |
| rs_overseas_record | 0 | ✅ 已清空 |
| rs_overseas_approval | 0 | ✅ 已清空 |
✅ 最终确认
- ✅ 所有出国申请相关数据已完全清空
- ✅ 自增ID已重置为1,新数据将从1开始编号
- ✅ 系统现在可以接受全新的正常测试数据
- ✅ 数据库操作安全完成,无异常错误
🔧 修复:出国记录详情经费来源显示英文问题
📍 问题描述
- 发现时间: 2025-01-07 22:00:00
- 问题位置: 出国记录选项卡 → 操作菜单 → 查看详情
- 具体问题: 经费来源字段显示为英文代码而非中文名称
🔍 问题分析
// 申请详情(正确)- 显示中文
<el-descriptions-item label="经费来源">{{ (viewData as OverseasApplicationVO).budgetSourceText }}</el-descriptions-item>
// 记录详情(错误)- 显示英文
<el-descriptions-item label="经费来源">{{ (viewData as OverseasRecordVO).budgetSource }}</el-descriptions-item>
✅ 解决方案
1. 修复前端显示
文件: web/src/views/rs/overseas/index.vue
// 修改前(第415行)
<el-descriptions-item label="经费来源">{{ (viewData as OverseasRecordVO).budgetSource }}</el-descriptions-item>
// 修改后
<el-descriptions-item label="经费来源">{{ (viewData as OverseasRecordVO).budgetSourceText }}</el-descriptions-item>
2. 补充类型定义
文件: web/src/api/rs/overseas.ts
// OverseasRecordVO接口添加字段(第148行后)
// 显示字段
purposeText: string;
budgetSourceText: string; // 新增
completionStatusText: string;
🎯 修复效果
修复前
经费来源: SELF_FUNDED ← 显示英文代码
修复后
经费来源: 自费 ← 显示中文名称
💡 技术说明
- 根本原因:
OverseasRecordVO类型定义缺少budgetSourceText字段 - 修复策略: 补充类型定义 + 修正前端显示字段
- 影响范围: 仅影响出国记录详情页面的经费来源显示
- 数据安全: 不影响数据存储,仅修正显示逻辑
🔧 修复:出国记录列表经费来源列缺失问题
📍 问题描述
- 发现时间: 2025-01-07 22:10:00
- 问题位置: 出国记录选项卡 → 记录列表表格
- 具体问题: 记录列表中缺少经费来源列,导致无法在列表中查看经费来源信息
🔍 问题分析
// 申请表格(有经费来源信息)
<el-table-column label="预算金额" align="center" width="110">
<template #default="scope"> ¥{{ formatMoney(scope.row.budget) }} </template>
</el-table-column>
// 记录表格(缺少经费来源列)
<el-table-column label="实际花费" align="center" width="110">
<template #default="scope"> ¥{{ formatMoney(scope.row.actualBudget) }} </template>
</el-table-column>
<el-table-column label="完成状态" align="center" prop="completionStatusText" width="120">
<!-- 直接跳到完成状态,缺少经费来源列 -->
</el-table-column>
✅ 解决方案
添加经费来源列到记录表格
文件: web/src/views/rs/overseas/index.vue
// 在实际花费列和完成状态列之间添加经费来源列(第234行后)
<el-table-column label="实际花费" align="center" width="110">
<template #default="scope"> ¥{{ formatMoney(scope.row.actualBudget) }} </template>
</el-table-column>
<el-table-column label="经费来源" align="center" prop="budgetSourceText" width="110" :show-overflow-tooltip="true" /> // 新增
<el-table-column label="完成状态" align="center" prop="completionStatusText" width="120">
🎯 修复效果
修复前
| 申请人 | 出国目的 | 目的地 | 出国时间 | 实际花费 | 完成状态 | 记录时间 | 操作 |
|--------|----------|--------|----------|----------|----------|----------|------|
| 张三 | 学术交流 | 美国 | 2024-01-01 至 2024-01-10 | ¥50,000.00 | 已完成 | 2024-01-15 | [查看] |
修复后
| 申请人 | 出国目的 | 目的地 | 出国时间 | 实际花费 | 经费来源 | 完成状态 | 记录时间 | 操作 |
|--------|----------|--------|----------|----------|----------|----------|----------|------|
| 张三 | 学术交流 | 美国 | 2024-01-01 至 2024-01-10 | ¥50,000.00 | 自费 | 已完成 | 2024-01-15 | [查看] |
💡 技术说明
- 根本原因: 出国记录表格缺少经费来源列定义
- 修复策略: 在表格中添加
budgetSourceText列 - 列位置: 放在实际花费和完成状态之间,逻辑顺序合理
- 显示效果: 显示中文经费来源名称,支持文本溢出提示
- 数据来源: 使用后端返回的
budgetSourceText字段
⚠️ 注意: 此修复已撤销,用户不需要在列表中显示经费来源列
🔧 修复:出国记录详情页面经费来源显示问题
📍 问题描述
- 发现时间: 2025-01-07 22:30:00
- 问题位置: 出国记录详情页面
- 具体问题: 出国申请时填写了经费来源,但在出国记录详情中没有显示中文经费来源信息
🔍 问题分析
// 前端页面已正确绑定budgetSourceText字段
<el-descriptions-item label="经费来源">{{ (viewData as OverseasRecordVO).budgetSourceText }}</el-descriptions-item>
// 但后端VO类缺少budgetSourceText字段和转换方法
public class RsOverseasRecordVo {
private String budgetSource; // 只有英文代码字段
// 缺少 budgetSourceText 字段
// 缺少 getBudgetSourceText() 转换方法
}
✅ 解决方案
1. 添加budgetSourceText字段到后端VO类
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasRecordVo.java
/**
* 经费来源文本
*/
private String budgetSourceText;
2. 添加经费来源转换方法
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasRecordVo.java
/**
* 获取经费来源文本
*/
public String getBudgetSourceText() {
if (this.budgetSourceText != null && !this.budgetSourceText.isEmpty()) {
return this.budgetSourceText;
}
if (this.budgetSource == null) {
return "";
}
switch (this.budgetSource) {
case "SELF_FUNDED":
return "自费";
case "GOVERNMENT":
return "政府资助";
case "SCHOOL":
return "学校资助";
case "COMPANY":
return "企业资助";
case "OTHER":
return "其他";
default:
return this.budgetSource;
}
}
🎯 修复效果
修复前 - 出国记录详情页面
经费来源: SELF_FUNDED (显示英文代码或为空)
修复后 - 出国记录详情页面
经费来源: 自费 (显示中文名称)
💡 技术说明
- 根本原因: 后端RsOverseasRecordVo类缺少budgetSourceText字段和转换方法
- 修复策略: 添加字段和getter方法,实现英文代码到中文的自动转换
- 转换逻辑: 优先使用已设置的budgetSourceText,否则根据budgetSource进行转换
- 兼容性: 保持向后兼容,未知值返回原始值
- 前端绑定: 前端页面已正确绑定budgetSourceText字段,无需修改
🔧 修复:出国记录详情页面cooperation经费来源显示问题
📍 问题描述
- 发现时间: 2025-01-07 22:45:00
- 问题位置: 出国记录详情页面和申请详情页面
- 具体问题: 经费来源显示为"cooperation"而不是"合作单位"
🔍 问题分析
// 数据库中存储的值是cooperation
budgetSource: "cooperation"
// 但getBudgetSourceText()方法缺少cooperation的转换
switch (this.budgetSource) {
case "SELF_FUNDED":
return "自费";
// 缺少 case "cooperation": return "合作单位";
default:
return this.budgetSource; // 直接返回cooperation
}
✅ 解决方案
1. 更新RsOverseasRecordVo的getBudgetSourceText方法
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasRecordVo.java
public String getBudgetSourceText() {
if (this.budgetSourceText != null && !this.budgetSourceText.isEmpty()) {
return this.budgetSourceText;
}
if (this.budgetSource == null) {
return "";
}
switch (this.budgetSource) {
case "school":
return "学校经费";
case "government":
return "政府资助";
case "project":
return "项目经费";
case "self":
return "个人承担";
case "cooperation":
return "合作单位";
case "other":
return "其他";
// 兼容旧的枚举值
case "SELF_FUNDED":
return "自费";
case "SCHOOL":
return "学校资助";
case "COMPANY":
return "企业资助";
default:
return this.budgetSource;
}
}
2. 更新RsOverseasApplicationVo的getBudgetSourceText方法
文件: backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasApplicationVo.java
public String getBudgetSourceText() {
// 同样的转换逻辑,保持一致性
}
🎯 修复效果
修复前
出国记录详情页面:
经费来源: cooperation (显示英文代码)
出国申请详情页面:
经费来源: cooperation (显示英文代码)
修复后
出国记录详情页面:
经费来源: 合作单位 (显示中文名称)
出国申请详情页面:
经费来源: 合作单位 (显示中文名称)
📋 支持的完整经费来源映射
school→ 学校经费government→ 政府资助project→ 项目经费self→ 个人承担cooperation→ 合作单位other→ 其他SELF_FUNDED→ 自费 (兼容旧值)SCHOOL→ 学校资助 (兼容旧值)COMPANY→ 企业资助 (兼容旧值)
💡 技术说明
- 根本原因: getBudgetSourceText()方法缺少cooperation枚举值的转换逻辑
- 修复策略: 添加完整的经费来源枚举值转换映射,包含数据库设计中定义的所有值
- 数据库设计: 根据数据库注释
(school-学校经费,government-政府资助,project-项目经费,self-个人承担,cooperation-合作单位,other-其他) - 兼容性: 保留旧枚举值的转换,确保向后兼容
- 一致性: 同时更新记录和申请两个VO类,保持显示一致
📋 变更总结: 通过数据修复解决记录显示问题,通过操作菜单优化提升用户体验,通过多租户字段修复解决系统报错,通过数据清空脚本为重新提交正常数据做准备,通过经费来源显示修复解决国际化显示问题,通过后端VO类字段补充修复出国记录详情页面经费来源显示问题,通过完善经费来源转换逻辑修复cooperation显示为合作单位,实现申请和记录选项卡的功能对等和显示一致性