Files
hzdyjs/出国申请字段对齐分析报告.md
T
2025-10-14 16:41:19 +08:00

12 KiB
Raw Blame History

出国申请字段对齐分析报告

问题描述: 通过出国申请菜单下的新增申请按钮填写内容后,只有部分字段存到数据库,大部分字段未正常存入

分析时间: 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默认逻辑的不确定性
  • 便于调试和维护

实施步骤:

  1. 在Mapper XML中添加insertOverseasApplication语句
  2. 在Mapper XML中添加updateOverseasApplication语句
  3. 确保所有数据库字段都包含在SQL中
  4. 使用动态SQL处理可选字段

方案2:优化前端字段映射逻辑

优点:

  • 集中处理字段映射
  • 减少后端处理压力
  • 提高代码可读性

实施步骤:

  1. 创建统一的字段映射函数
  2. 在提交前调用映射函数
  3. 确保所有必填字段都有值
  4. 处理特殊字段的转换逻辑

方案3:优化Bo类和实体类的映射

优点:

  • 利用MapStruct自动映射
  • 减少手动映射代码
  • 提高类型安全性

实施步骤:

  1. 检查@AutoMapper配置
  2. 添加自定义映射规则
  3. 处理特殊字段的映射逻辑

📝 建议实施顺序

第1步:添加Mapper XML的insert和update语句

这是最根本的解决方案,确保数据能正确存储到数据库。

第2步:优化前端字段映射

确保前端提交的数据格式正确,所有必填字段都有值。

第3步:测试验证

创建测试数据,验证所有字段都能正常存储和读取。

第4步:文档更新

更新API文档,说明字段映射关系和注意事项。


🎯 预期效果

实施完成后:

  • ✅ 前端填写的所有字段都能正常存储到数据库
  • ✅ 字段映射关系清晰明确
  • ✅ 数据库查询能正确返回所有字段
  • ✅ 前端页面能正常显示所有数据
  • ✅ 代码易于维护和扩展

下一步: 开始实施方案1,在Mapper XML中添加完整的insert和update语句。