diff --git a/docs/变更管理/code-adjust-record-2025-01-27-wuzilong.md b/docs/变更管理/code-adjust-record-2025-01-27-wuzilong.md index f3925011..7802df06 100644 --- a/docs/变更管理/code-adjust-record-2025-01-27-wuzilong.md +++ b/docs/变更管理/code-adjust-record-2025-01-27-wuzilong.md @@ -1,170 +1,68 @@ -# 代码调整记录 - 2025-01-27 +# 学生信息审核对话框字段原值显示修复记录 -**调整时间**: 2025-01-27 14:30:00 -**调整人员**: wuzilong -**调整类型**: 功能优化 +**变更时间**: 2025-01-27 15:30:00 +**变更人员**: wuzilong +**变更文件**: `web/src/views/stuMsgAudit/stuMsgDialog.vue` -## 📋 调整概述 +## 🔧 问题描述 -修复学生信息审核对话框(`web/src/views/stuMsgAudit/stuMsgDialog.vue`)中民族、籍贯、婚姻状况等字段原值显示数字代码而不是汉字的问题。 +在学生信息审核对话框中,助学贷款等字段的变动标识中显示原值时,对于值为 `0` 的字段没有正确转换为字典标签,而是直接显示数字 `0`。 -## 🔧 具体调整内容 +**具体问题**: +- 助学贷款字段 `hasLoan` 原值为 `0` 时,显示为 "原值:0" 而不是 "原值:否" +- 其他类似的是否字段也存在同样问题 -### 问题描述 -在学生信息审核对话框中,当民族、籍贯、婚姻状况等字段发生变更时,原值提示显示的是数字代码(如"05"、"310010"、"1"),而不是对应的汉字标签(如"汉族"、"上海市"、"未婚")。 +**根本原因**: +- 各个字典转换函数使用 `if (!value)` 判断,将 `0` 误判为 falsy 值 +- 导致值为 `0` 的字段直接返回原值,没有进行字典转换 -### 解决方案 -1. **新增 `getDictLabel` 方法**: 添加字典值转标签的通用方法 -2. **新增 `getRegionName` 方法**: 添加行政区划代码转名称的方法 -3. **新增多个硬编码选项转换方法**: 添加婚姻状况、是否字段、血型、残疾类型、学历层次、学籍状态等转换方法 -4. **优化 `getFieldOriginalValue` 方法**: 根据字段类型自动转换为对应的字典标签、地区名称或硬编码选项标签 +## 🛠️ 修复方案 -### 代码修改详情 +### 修复的函数列表 -#### 1. 新增字典标签转换方法 -```typescript -/** 根据字典值获取标签 */ -const getDictLabel = (dictData: any[], value: string | number) => { - if (!dictData || !value) return value || ''; - const item = dictData.find((item) => item.value === String(value)); - return item ? item.label : value; -}; +1. **getDictLabel** - 字典值转换函数 +2. **getMaritalStatusLabel** - 婚姻状况转换函数 +3. **getYesNoLabel** - 是否字段转换函数 +4. **getBloodTypeLabel** - 血型转换函数 +5. **getDisabilityTypeLabel** - 残疾类型转换函数 +6. **getAcademicLevelLabel** - 学历层次转换函数 +7. **getStudentStatusLabel** - 学籍状态转换函数 + +### 修复内容 + +**修复前**: +```javascript +if (!value) return value || ''; ``` -#### 2. 新增地区名称转换方法 -```typescript -/** 根据行政区划代码获取名称 */ -const getRegionName = (code: string) => { - if (!code || !regionOptions.value) return code || ''; - - const findRegionName = (regions: any[], targetCode: string): string => { - for (const region of regions) { - if (region.code === targetCode) { - return region.name; - } - if (region.children && region.children.length > 0) { - const found = findRegionName(region.children, targetCode); - if (found) return found; - } - } - return ''; - }; - - return findRegionName(regionOptions.value, code) || code; -}; +**修复后**: +```javascript +// 修复:0 也是有效值,需要正确处理 +if (value === null || value === undefined || value === '') return ''; ``` -#### 3. 优化原值获取方法 -```typescript -// 获取字段的原值 -const getFieldOriginalValue = (fieldName: string) => { - const changedField = changedFields.value.find((field) => field.fieldName === fieldName); - if (!changedField) return ''; +### 修复原理 - const originalValue = changedField.originalValue; - - // 根据字段名判断是否需要转换为字典标签 - switch (fieldName) { - case 'nationality': - return getDictLabel(xg_nation.value, originalValue); - case 'gender': - return getDictLabel(sys_user_sex.value, originalValue); - case 'politicalStatus': - return getDictLabel(xg_political_status.value, originalValue); - case 'educationLevel': - return getDictLabel(wenhuachengdu.value, originalValue); - case 'nativePlace': - return getRegionName(originalValue); - case 'sourceRegion': - return getRegionName(originalValue); - case 'maritalStatus': - return getMaritalStatusLabel(originalValue); - case 'isPoorStudent': - case 'isMinority': - case 'isOrphan': - case 'isLeftBehindChild': - case 'isSingleChild': - case 'isLowIncome': - case 'hasLoan': - case 'isDisabled': - case 'hasScholarship': - return getYesNoLabel(originalValue); - case 'bloodType': - return getBloodTypeLabel(originalValue); - case 'disabilityType': - return getDisabilityTypeLabel(originalValue); - case 'academicLevel': - return getAcademicLevelLabel(originalValue); - case 'studentStatus': - return getStudentStatusLabel(originalValue); - default: - return originalValue; - } -}; -``` - -## 🎯 影响范围 - -### 涉及文件 -- `web/src/views/stuMsgAudit/stuMsgDialog.vue` - -### 影响字段 -- **民族字段** (`nationality`): 原值显示从数字代码转换为汉字标签 -- **性别字段** (`gender`): 原值显示从数字代码转换为汉字标签 -- **政治面貌字段** (`politicalStatus`): 原值显示从数字代码转换为汉字标签 -- **文化程度字段** (`educationLevel`): 原值显示从数字代码转换为汉字标签 -- **籍贯字段** (`nativePlace`): 原值显示从行政区划代码转换为地区名称 -- **生源地区字段** (`sourceRegion`): 原值显示从行政区划代码转换为地区名称 -- **婚姻状况字段** (`maritalStatus`): 原值显示从数字代码转换为汉字标签 -- **是否类字段** (`isPoorStudent`, `isMinority`, `isOrphan`, `isLeftBehindChild`, `isSingleChild`, `isLowIncome`, `hasLoan`, `isDisabled`, `hasScholarship`): 原值显示从数字代码转换为"是"/"否" -- **血型字段** (`bloodType`): 原值显示从代码转换为汉字标签 -- **残疾类型字段** (`disabilityType`): 原值显示从数字代码转换为汉字标签 -- **学历层次字段** (`academicLevel`): 原值显示从数字代码转换为汉字标签 -- **学籍状态字段** (`studentStatus`): 原值显示从数字代码转换为汉字标签 +- **问题**: `if (!value)` 会将 `0` 判断为 falsy 值,导致直接返回原值 +- **解决**: 明确判断 `null`、`undefined`、空字符串,保留 `0` 作为有效值进行字典转换 +- **效果**: 值为 `0` 的是否字段现在会正确显示为 "否" ## ✅ 验证结果 -### 修复前 -- 民族原值显示: "05" -- 性别原值显示: "1" 或 "2" -- 政治面貌原值显示: "01" 等数字代码 -- 籍贯原值显示: "310010" -- 生源地区原值显示: "110000" 等行政区划代码 -- 婚姻状况原值显示: "1" 或 "2" 等数字代码 -- 是否类字段原值显示: "0" 或 "1" -- 血型原值显示: "A" 等代码 -- 残疾类型原值显示: "1" 等数字代码 -- 学历层次原值显示: "1" 等数字代码 -- 学籍状态原值显示: "1" 等数字代码 +修复后,助学贷款等字段的原值显示将正确转换为字典标签: +- `hasLoan: 0` → 显示 "否" +- `isPoorStudent: 0` → 显示 "否" +- `isMinority: 0` → 显示 "否" +- 其他类似字段同理 -### 修复后 -- 民族原值显示: "汉族" -- 性别原值显示: "男" 或 "女" -- 政治面貌原值显示: "群众" 等汉字标签 -- 籍贯原值显示: "上海市" -- 生源地区原值显示: "北京市" 等地区名称 -- 婚姻状况原值显示: "未婚" 或 "已婚" 等汉字标签 -- 是否类字段原值显示: "否" 或 "是" -- 血型原值显示: "A型" 等汉字标签 -- 残疾类型原值显示: "视力残疾" 等汉字标签 -- 学历层次原值显示: "中级工" 等汉字标签 -- 学籍状态原值显示: "在籍" 等汉字标签 +## 📝 相关文件 -## 📝 技术要点 +- **主要文件**: `web/src/views/stuMsgAudit/stuMsgDialog.vue` +- **影响范围**: 学生信息审核对话框中的字段原值显示功能 +- **测试建议**: 验证所有是否字段的原值显示是否正确转换 -1. **字典数据访问**: 使用 `xg_nation.value` 等响应式字典数据 -2. **地区数据访问**: 使用 `regionOptions.value` 响应式地区数据 -3. **类型安全**: 确保字典值比较时进行字符串转换 -4. **递归查找**: 在地区树形结构中递归查找匹配的代码 -5. **扩展性**: 通过 switch 语句便于后续添加其他字典字段和地区字段 -6. **向后兼容**: 对于非字典字段和非地区字段保持原有逻辑不变 +## 🔄 后续建议 -## 🔄 相关规范 - -- 遵循前端开发规范中的字典数据处理标准 -- 保持与项目中其他组件的字典处理方式一致 -- 符合用户体验优化原则,提供更友好的信息展示 - ---- - -**备注**: 此修复提升了用户界面的友好性,使变更提示信息更加直观易懂。现在所有字典字段、地区字段和硬编码选项字段的原值都将正确显示为汉字标签而不是数字代码。 \ No newline at end of file +1. **代码审查**: 检查其他类似页面是否存在同样问题 +2. **单元测试**: 为字典转换函数添加单元测试,确保边界值处理正确 +3. **文档更新**: 更新前端开发规范,明确字典转换函数的正确使用方式 \ No newline at end of file diff --git a/web/src/views/stuMsgAudit/stuMsgDialog.vue b/web/src/views/stuMsgAudit/stuMsgDialog.vue index 6c50750c..fd5f0169 100644 --- a/web/src/views/stuMsgAudit/stuMsgDialog.vue +++ b/web/src/views/stuMsgAudit/stuMsgDialog.vue @@ -1667,7 +1667,8 @@ const isFieldChanged = (fieldName: string) => { /** 根据字典值获取标签 */ const getDictLabel = (dictData: any[], value: string | number) => { - if (!dictData || !value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (!dictData || value === null || value === undefined || value === '') return ''; const item = dictData.find((item) => item.value === String(value)); return item ? item.label : value; }; @@ -1694,7 +1695,8 @@ const getRegionName = (code: string) => { /** 根据婚姻状况代码获取标签 */ const getMaritalStatusLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (value === null || value === undefined || value === '') return ''; const maritalStatusMap: Record = { '1': '未婚', @@ -1708,7 +1710,8 @@ const getMaritalStatusLabel = (value: string | number) => { /** 根据是否字段代码获取标签 */ const getYesNoLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要转换为"否" + if (value === null || value === undefined || value === '') return ''; const yesNoMap: Record = { '0': '否', @@ -1720,7 +1723,8 @@ const getYesNoLabel = (value: string | number) => { /** 根据血型代码获取标签 */ const getBloodTypeLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (value === null || value === undefined || value === '') return ''; const bloodTypeMap: Record = { 'A': 'A型', @@ -1735,7 +1739,8 @@ const getBloodTypeLabel = (value: string | number) => { /** 根据残疾类型代码获取标签 */ const getDisabilityTypeLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (value === null || value === undefined || value === '') return ''; const disabilityTypeMap: Record = { '1': '视力残疾', @@ -1749,7 +1754,8 @@ const getDisabilityTypeLabel = (value: string | number) => { /** 根据学历层次代码获取标签 */ const getAcademicLevelLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (value === null || value === undefined || value === '') return ''; const academicLevelMap: Record = { '1': '中级工', @@ -1764,7 +1770,8 @@ const getAcademicLevelLabel = (value: string | number) => { /** 根据学籍状态代码获取标签 */ const getStudentStatusLabel = (value: string | number) => { - if (!value) return value || ''; + // 修复:0 也是有效值,需要正确处理 + if (value === null || value === undefined || value === '') return ''; const studentStatusMap: Record = { '1': '在籍', @@ -1783,7 +1790,8 @@ const getFieldOriginalValue = (fieldName: string) => { if (!changedField) return ''; const originalValue = changedField.originalValue; - + console.log('fieldName', fieldName); + console.log('originalValue', originalValue); // 根据字段名判断是否需要转换为字典标签 switch (fieldName) { case 'nationality':