12 KiB
12 KiB
出国申请字段对齐分析报告
问题描述: 通过出国申请菜单下的新增申请按钮填写内容后,只有部分字段存到数据库,大部分字段未正常存入
分析时间: 2025-10-08
分析人: AI Assistant
📊 问题分析
核心问题
Mapper XML文件中缺少insert和update语句,导致MyBatis-Plus使用默认插入逻辑时,某些字段无法正常映射和存储。
🔍 字段对齐分析
1. 前端表单字段(新增申请弹窗)
根据 web/src/views/rs/overseas/index.vue 分析,前端表单包含以下字段:
基础信息字段
| 前端字段名 | 字段说明 | 是否必填 |
|---|---|---|
applicantName |
姓名 | ✅ 必填 |
gender |
性别 | ✅ 必填 |
birthDate |
出生年月 | ✅ 必填 |
politicalStatus |
政治面貌 | ✅ 必填 |
department |
现工作部门 | ✅ 必填 |
professionalTitle |
职称 | ✅ 必填 |
position |
职务 | ✅ 必填 |
documentName |
申领证件名称 | ❌ 选填 |
documentNumber |
证件号码 | ❌ 选填 |
出国信息字段
| 前端字段名 | 字段说明 | 是否必填 |
|---|---|---|
destinationCountry |
前往国家 | ✅ 必填 |
exitReason |
出境事由(旅游/探亲) | ✅ 必填 |
visitRelationship |
探望对象关系(探亲时) | ❌ 条件必填 |
itinerary |
行程安排 | ✅ 必填 |
remarks |
备注 | ❌ 选填 |
startDate |
出发日期 | ✅ 必填 |
endDate |
返回日期 | ✅ 必填 |
duration |
出国天数 | ✅ 自动计算 |
联系信息字段
| 前端字段名 | 字段说明 | 是否必填 |
|---|---|---|
mobilePhone |
联系电话 | ✅ 必填 |
emergencyContact |
应急联系人及电话 | ✅ 必填 |
其他字段
| 前端字段名 | 字段说明 | 是否必填 |
|---|---|---|
signature |
手写签字(base64) | ❌ 选填 |
stampedRegistrationFilePath |
盖章文件路径 | ✅ 必填 |
stampedRegistrationFileName |
盖章文件名 | ✅ 必填 |
stampedFileUploadStatus |
盖章文件上传状态 | ✅ 必填 |
2. 数据库表字段(rs_overseas_application)
根据数据库表结构和实体类分析,数据库包含以下字段:
基础信息字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
application_id |
申请ID | applicationId |
serial_number |
编号 | serialNumber |
applicant_id |
申请人ID | applicantId |
applicant_name |
申请人姓名 | applicantName |
gender |
性别 | gender |
birth_date |
出生日期 | birthDate |
photo |
照片地址 | photo |
id_number |
身份证号 | idNumber |
political_status |
政治面貌 | politicalStatus |
registered_address |
户籍所在地 | registeredAddress |
department |
所属部门 | department |
position |
职务职称 | position |
professional_title |
职称 | professionalTitle |
administrative_level |
行政职级 | administrativeLevel |
personnel_category |
人员类别代码 | personnelCategory |
登记备案相关字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
registration_unit |
登记备案责任单位 | registrationUnit |
unit_leader_signature |
单位负责人签名 | unitLeaderSignature |
unit_contact |
单位联系人 | unitContact |
office_phone |
办公电话 | officePhone |
mobile_phone |
移动电话 | mobilePhone |
contact_phone |
联系电话 | contactPhone |
证件信息字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
document_name |
申领证件名称 | documentName |
document_number |
证件号码 | documentNumber |
出国信息字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
destination_country |
前往国家 | destinationCountry |
exit_reason |
出境事由 | exitReason |
visit_relationship |
探望对象关系 | visitRelationship |
remarks |
备注 | remarks |
purpose |
出国目的 | purpose |
purpose_detail |
目的详细说明 | purposeDetail |
destination |
目的地国家 | destination |
destination_city |
目的地城市 | destinationCity |
start_date |
开始日期 | startDate |
end_date |
结束日期 | endDate |
duration |
出国天数 | duration |
budget |
预算金额 | budget |
invitation |
邀请函信息 | invitation |
itinerary |
行程安排 | itinerary |
accommodation_plan |
住宿安排 | accommodationPlan |
transportation_plan |
交通安排 | transportationPlan |
审批相关字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
status |
申请状态 | status |
current_approver |
当前审批人 | currentApprover |
approval_level |
审批级别 | approvalLevel |
apply_time |
申请时间 | applyTime |
approval_time |
审批时间 | approvalTime |
admin_remark |
管理员备注 | adminRemark |
applicant_remark |
申请人备注 | applicantRemark |
其他字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
emergency_contact |
应急联系人及电话 | emergencyContact |
signature |
手写签字 | signature |
stamped_registration_file_path |
盖章文件路径 | stampedRegistrationFilePath |
stamped_registration_file_name |
盖章文件名 | stampedRegistrationFileName |
stamped_file_upload_time |
盖章文件上传时间 | stampedFileUploadTime |
stamped_file_upload_status |
盖章文件上传状态 | stampedFileUploadStatus |
系统字段(数据库)
| 数据库字段名 | 字段说明 | Java实体字段 |
|---|---|---|
tenant_id |
租户ID | tenantId |
deleted |
删除标志 | deleted |
create_by |
创建者 | createBy |
create_time |
创建时间 | createTime |
update_by |
更新者 | updateBy |
update_time |
更新时间 | updateTime |
3. 字段映射关系
✅ 直接映射(前端字段名 = 数据库字段名)
| 前端字段 | 数据库字段 | 说明 |
|---|---|---|
applicantName |
applicant_name |
申请人姓名 |
gender |
gender |
性别 |
birthDate |
birth_date |
出生日期 |
politicalStatus |
political_status |
政治面貌 |
department |
department |
所属部门 |
professionalTitle |
professional_title |
职称 |
position |
position |
职务 |
documentName |
document_name |
申领证件名称 |
documentNumber |
document_number |
证件号码 |
exitReason |
exit_reason |
出境事由 |
visitRelationship |
visit_relationship |
探望对象关系 |
remarks |
remarks |
备注 |
startDate |
start_date |
开始日期 |
endDate |
end_date |
结束日期 |
duration |
duration |
出国天数 |
itinerary |
itinerary |
行程安排 |
mobilePhone |
mobile_phone |
移动电话 |
emergencyContact |
emergency_contact |
应急联系人 |
signature |
signature |
手写签字 |
⚠️ 需要映射转换的字段
| 前端字段 | 数据库字段 | 转换说明 |
|---|---|---|
destinationCountry |
destination |
前往国家 → 目的地国家 |
destinationCountry |
destination_country |
同时存储到destination_country字段 |
documentNumber |
id_number |
证件号码 → 身份证号(如果是身份证格式) |
department |
registered_address |
部门 → 户籍所在地(默认值) |
applicantName |
unit_contact |
申请人 → 单位联系人(默认值) |
politicalStatus |
personnel_category |
政治面貌 → 人员类别代码(映射规则) |
❌ 前端缺失但数据库需要的字段
| 数据库字段 | 说明 | 处理方式 |
|---|---|---|
serial_number |
编号 | 后端自动生成 |
photo |
照片 | 暂不填写(可选) |
administrative_level |
行政职级 | 暂不填写(可选) |
registration_unit |
登记备案责任单位 | 后端自动填充或默认值 |
unit_leader_signature |
单位负责人签名 | 暂不填写(可选) |
office_phone |
办公电话 | 暂不填写(可选) |
contact_phone |
联系电话 | 从mobilePhone映射 |
purpose |
出国目的 | 从exitReason映射 |
purpose_detail |
目的详细说明 | 从remarks映射 |
destination_city |
目的地城市 | 暂不填写(可选) |
budget |
预算金额 | 默认值0 |
invitation |
邀请函信息 | 暂不填写(可选) |
accommodation_plan |
住宿安排 | 暂不填写(可选) |
transportation_plan |
交通安排 | 暂不填写(可选) |
status |
申请状态 | 默认值'0'(待审核) |
apply_time |
申请时间 | 后端自动生成 |
🔧 问题根源
1. Mapper XML缺少insert和update语句
文件: backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml
问题:
- 该文件只包含查询语句(select)
- 没有insert和update语句
- MyBatis-Plus使用默认插入逻辑时,可能无法正确映射所有字段
影响:
- 前端提交的某些字段无法存储到数据库
- 字段映射关系不明确
- 特殊字段(如下划线命名)可能映射失败
2. 前端字段映射处理不完整
文件: web/src/views/rs/overseas/index.vue
问题:
- 前端在提交前做了部分字段映射(如destinationCountry → destination)
- 但某些数据库必填字段没有处理
- 字段映射逻辑分散在提交函数中,不够集中和清晰
3. Bo类和实体类字段不一致
问题:
- Bo类(RsOverseasApplicationBo)包含前端字段
- 实体类(RsOverseasApplication)包含数据库字段
- 两者之间的映射依赖@AutoMapper注解,但可能存在映射遗漏
💡 解决方案
方案1:在Mapper XML中添加完整的insert和update语句(推荐)
优点:
- 明确指定所有字段的映射关系
- 避免MyBatis-Plus默认逻辑的不确定性
- 便于调试和维护
实施步骤:
- 在Mapper XML中添加insertOverseasApplication语句
- 在Mapper XML中添加updateOverseasApplication语句
- 确保所有数据库字段都包含在SQL中
- 使用动态SQL处理可选字段
方案2:优化前端字段映射逻辑
优点:
- 集中处理字段映射
- 减少后端处理压力
- 提高代码可读性
实施步骤:
- 创建统一的字段映射函数
- 在提交前调用映射函数
- 确保所有必填字段都有值
- 处理特殊字段的转换逻辑
方案3:优化Bo类和实体类的映射
优点:
- 利用MapStruct自动映射
- 减少手动映射代码
- 提高类型安全性
实施步骤:
- 检查@AutoMapper配置
- 添加自定义映射规则
- 处理特殊字段的映射逻辑
📝 建议实施顺序
第1步:添加Mapper XML的insert和update语句
这是最根本的解决方案,确保数据能正确存储到数据库。
第2步:优化前端字段映射
确保前端提交的数据格式正确,所有必填字段都有值。
第3步:测试验证
创建测试数据,验证所有字段都能正常存储和读取。
第4步:文档更新
更新API文档,说明字段映射关系和注意事项。
🎯 预期效果
实施完成后:
- ✅ 前端填写的所有字段都能正常存储到数据库
- ✅ 字段映射关系清晰明确
- ✅ 数据库查询能正确返回所有字段
- ✅ 前端页面能正常显示所有数据
- ✅ 代码易于维护和扩展
下一步: 开始实施方案1,在Mapper XML中添加完整的insert和update语句。