# 出国申请字段映射分析报告 ## 问题概述 测试发现出国申请菜单下的新增申请功能中,部分表单字段填写后未能正确保存到数据库`rs_overseas_application`表中,如`professional_title`、`position`、`exit_reason`等字段在数据库中显示为NULL。 ## 分析结论 **根本原因**:后端的`RsOverseasApplicationBo.java`和`RsOverseasApplicationVo.java`类中缺少了多个数据库字段的映射,导致前端提交的数据无法正确传递到数据库。 ## 详细字段对比分析 ### 一、字段映射状态总览 | 序号 | 前端表单字段 | 数据库字段 | Entity类 | Bo类 | Vo类 | 状态 | |------|-------------|-----------|---------|------|------|------| | 1 | applicantName | applicant_name | ✅ | ✅ | ✅ | ✅ 正常 | | 2 | gender | gender | ✅ | ✅ | ✅ | ✅ 正常 | | 3 | birthDate | birth_date | ✅ | ✅ | ✅ | ✅ 正常 | | 4 | politicalStatus | political_status | ✅ | ✅ | ✅ | ✅ 正常 | | 5 | department | department | ✅ | ✅ | ✅ | ✅ 正常 | | 6 | **professionalTitle** | **professional_title** | ✅ | ❌ | ❌ | ❌ **缺失** | | 7 | position | position | ✅ | ✅ | ✅ | ✅ 正常 | | 8 | administrativeLevel | administrative_level | ✅ | ✅ | ✅ | ✅ 正常 | | 9 | **documentName** | **document_name** | ✅ | ❌ | ❌ | ❌ **缺失** | | 10 | **documentNumber** | **document_number** | ✅ | ❌ | ❌ | ❌ **缺失** | | 11 | **destinationCountry** | **destination_country** | ✅ | ❌ | ❌ | ❌ **缺失** | | 12 | **exitReason** | **exit_reason** | ✅ | ❌ | ❌ | ❌ **缺失** | | 13 | **visitRelationship** | **visit_relationship** | ✅ | ❌ | ❌ | ❌ **缺失** | | 14 | itinerary | itinerary | ✅ | ✅ | ✅ | ✅ 正常 | | 15 | **remarks** | **remarks** | ✅ | ❌ | ❌ | ❌ **缺失** | | 16 | startDate | start_date | ✅ | ✅ | ✅ | ✅ 正常 | | 17 | endDate | end_date | ✅ | ✅ | ✅ | ✅ 正常 | | 18 | duration | duration | ✅ | ✅ | ✅ | ✅ 正常 | | 19 | destination | destination | ✅ | ✅ | ✅ | ✅ 正常 | | 20 | mobilePhone | mobile_phone | ✅ | ✅ | ✅ | ✅ 正常 | | 21 | emergencyContact | emergency_contact | ✅ | ✅ | ✅ | ✅ 正常 | | 22 | signature | signature | ✅ | ✅ | ✅ | ✅ 正常 | | 23 | **registeredAddress** | **registered_address** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 24 | **idNumber** | **id_number** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 25 | **personnelCategory** | **personnel_category** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 26 | **unitContact** | **unit_contact** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 27 | **officePhone** | **office_phone** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 28 | **registrationUnit** | **registration_unit** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | | 29 | **unitLeaderSignature** | **unit_leader_signature** | ✅ | ✅ | ✅ | ⚠️ 前端未填写 | ### 二、缺失字段详细说明 #### 1. **professionalTitle(职称)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第510行 - **数据库字段**: `professional_title` varchar(50) - **Entity类**: ✅ 存在(第109行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 用户填写的职称信息完全无法保存 #### 2. **exitReason(出境事由)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第543行 - **前端控件**: 单选框(旅游/探亲) - **数据库字段**: `exit_reason` varchar(200) - **Entity类**: ✅ 存在(第169行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 出境事由(旅游或探亲)无法保存 #### 3. **documentName(申领证件名称)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第524行 - **数据库字段**: `document_name` varchar(100) - **Entity类**: ✅ 存在(第151行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 证件名称信息无法保存 #### 4. **documentNumber(证件号码)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第529行 - **数据库字段**: `document_number` varchar(50) - **Entity类**: ✅ 存在(第157行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 证件号码无法保存 #### 5. **destinationCountry(前往国家)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第538行 - **数据库字段**: `destination_country` varchar(100) - **Entity类**: ✅ 存在(第163行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 前往国家信息无法保存 #### 6. **visitRelationship(探望对象关系)** - 严重问题 🔴 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第556行 - **前端逻辑**: 当出境事由为"探亲"时显示 - **数据库字段**: `visit_relationship` varchar(200) - **Entity类**: ✅ 存在(第175行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 探亲时的探望对象关系无法保存 #### 7. **remarks(备注)** - 一般问题 🟡 - **前端位置**: `/web/src/views/rs/overseas/index.vue` 第582行 - **数据库字段**: `remarks` varchar(500) - **Entity类**: ✅ 存在(第181行) - **Bo类**: ❌ **缺失** - **Vo类**: ❌ **缺失** - **影响**: 备注信息无法保存 ### 三、前端已有但数据库有字段未使用的情况 以下字段在数据库表和Bo/Vo类中存在,但前端表单中未包含输入控件: | 字段名 | 数据库字段 | Bo类 | Vo类 | 说明 | |-------|-----------|------|------|------| | registeredAddress | registered_address | ✅ | ✅ | 户籍所在地 | | idNumber | id_number | ✅ | ✅ | 身份证号码 | | personnelCategory | personnel_category | ✅ | ✅ | 人员类别代码 | | unitContact | unit_contact | ✅ | ✅ | 登记备案责任单位联系人 | | officePhone | office_phone | ✅ | ✅ | 办公电话 | | registrationUnit | registration_unit | ✅ | ✅ | 登记备案责任单位 | | unitLeaderSignature | unit_leader_signature | ✅ | ✅ | 责任单位负责人签名 | **建议**: 这些字段可能需要在后续版本的前端表单中添加,或者在后端自动填充。 ## 修复方案 ### 方案一:修改Bo类和Vo类(推荐) 需要在以下两个文件中添加缺失的字段: #### 1. 修改 `RsOverseasApplicationBo.java` 文件位置:`/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/bo/RsOverseasApplicationBo.java` 需要添加的字段: ```java /** * 职称 */ private String professionalTitle; /** * 申领证件名称 */ private String documentName; /** * 证件号码 */ private String documentNumber; /** * 前往国家 */ private String destinationCountry; /** * 出境事由 */ private String exitReason; /** * 探望对象姓名及与申请者关系 */ private String visitRelationship; /** * 备注 */ private String remarks; ``` #### 2. 修改 `RsOverseasApplicationVo.java` 文件位置:`/backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/domain/vo/RsOverseasApplicationVo.java` 需要添加的字段: ```java /** * 职称 */ private String professionalTitle; /** * 申领证件名称 */ private String documentName; /** * 证件号码 */ private String documentNumber; /** * 前往国家 */ private String destinationCountry; /** * 出境事由 */ private String exitReason; /** * 探望对象姓名及与申请者关系 */ private String visitRelationship; /** * 备注 */ private String remarks; ``` ### 方案二:前端表单字段重命名(不推荐) 将前端表单字段重命名以匹配现有的Bo/Vo字段,但这会导致业务逻辑混乱,不推荐使用。 ## 数据流程说明 ### 当前数据流转过程 ``` 前端表单 (Vue) ↓ (HTTP POST) Controller (RsOverseasApplicationController) ↓ (接收 RsOverseasApplicationBo) Service (IRsOverseasApplicationService) ↓ (Bo → Entity 映射) Mapper (MyBatis-Plus) ↓ (SQL INSERT/UPDATE) 数据库 (rs_overseas_application表) ``` ### 问题所在 ``` 前端提交: { professionalTitle: "副教授", exitReason: "旅游", ... } ↓ Controller接收Bo对象 ↓ ⚠️ Bo类中没有professionalTitle、exitReason等字段 ↓ ❌ 这些字段的值被忽略,不会传递给Entity ↓ ❌ 数据库中对应字段保持NULL ``` ## 预期修复效果 修复后,数据流将正常工作: ``` 前端提交: { professionalTitle: "副教授", exitReason: "旅游", documentName: "护照", ... } ↓ Controller接收Bo对象 ✅ Bo类包含所有字段 ↓ Service层: Bo → Entity映射 ✅ 字段正确映射 ↓ Mapper: 执行INSERT/UPDATE ✅ SQL包含所有字段 ↓ 数据库: ✅ professional_title="副教授", exit_reason="旅游", document_name="护照" ``` ## 测试验证计划 修复完成后,需要进行以下测试: ### 1. 新增申请测试 - [ ] 填写完整的申请表单,包括职称、出境事由等所有字段 - [ ] 提交申请 - [ ] 查询数据库验证所有字段是否正确保存 ### 2. 修改申请测试 - [ ] 编辑已有申请 - [ ] 修改职称、出境事由等字段 - [ ] 保存修改 - [ ] 验证数据库字段是否正确更新 ### 3. 查看详情测试 - [ ] 查看申请详情 - [ ] 验证所有字段是否正确显示 ### 4. 探亲特殊逻辑测试 - [ ] 选择出境事由为"探亲" - [ ] 填写探望对象关系 - [ ] 验证visitRelationship字段是否正确保存 ## 建议的完整字段列表 为确保数据完整性,建议前端表单包含以下所有必填字段: ### 基本信息 - [x] 姓名 (applicantName) - [x] 性别 (gender) - [x] 出生年月 (birthDate) - [x] 政治面貌 (politicalStatus) - [ ] 户籍所在地 (registeredAddress) - **前端缺失** - [ ] 身份证号 (idNumber) - **前端缺失** ### 工作信息 - [x] 现工作部门 (department) - [x] 职称 (professionalTitle) - **Bo/Vo缺失** - [x] 职务 (position) - [ ] 行政职级 (administrativeLevel) - **前端缺失** - [ ] 人员类别代码 (personnelCategory) - **前端缺失** ### 证件信息 - [x] 申领证件名称 (documentName) - **Bo/Vo缺失** - [x] 证件号码 (documentNumber) - **Bo/Vo缺失** ### 出国信息 - [x] 前往国家 (destinationCountry) - **Bo/Vo缺失** - [x] 出境事由 (exitReason) - **Bo/Vo缺失** - [x] 探望对象关系 (visitRelationship) - **Bo/Vo缺失** (当出境事由为探亲时) - [x] 行程安排 (itinerary) - [x] 出发日期 (startDate) - [x] 返回日期 (endDate) - [x] 出国天数 (duration) ### 联系信息 - [x] 联系电话 (mobilePhone) - [ ] 办公电话 (officePhone) - **前端缺失** - [x] 应急联系人及电话 (emergencyContact) ### 单位信息 - [ ] 登记备案责任单位 (registrationUnit) - **前端缺失** - [ ] 责任单位联系人 (unitContact) - **前端缺失** - [ ] 责任单位负责人签名 (unitLeaderSignature) - **前端缺失** ### 其他 - [x] 手写签字 (signature) - [x] 备注 (remarks) - **Bo/Vo缺失** ## 总结 **核心问题**:7个关键字段(professionalTitle、documentName、documentNumber、destinationCountry、exitReason、visitRelationship、remarks)在Bo和Vo类中缺失,导致前端提交的数据无法保存到数据库。 **解决方案**:在`RsOverseasApplicationBo.java`和`RsOverseasApplicationVo.java`两个文件中添加这7个缺失的字段。 **优先级**: 1. 🔴 高优先级:professionalTitle、exitReason、destinationCountry、documentName、documentNumber 2. 🟡 中优先级:visitRelationship、remarks 3. ⚪ 低优先级:考虑是否在前端添加缺失的必填字段(如户籍所在地、身份证号等) --- **报告生成时间**: 2025-10-08 **报告生成人**: Cursor AI Assistant