Files
his/.analysis/bug461_analysis.md
关羽 ede95be8f3 Fix Bug #461: 执行科室配置-项目名称回显为ID码,前后端类型不一致导致匹配失败
根因:ActivityDefinition.id 未加 @JsonSerialize,后端序列化为 JS Number(大数精度丢失),
而 OrgLocQueryDto.activityDefinitionId 有 ToStringSerializer 序列化为 String。
前端 === 严格比较 Number !== String,导致 filteredOptions 匹配失败。

修复:
1. ActivityDefinition.id 添加 @JsonSerialize(using = ToStringSerializer.class)
2. 前端 getAllImplementDepartment 中 value 转为 String() 统一类型

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-16 18:25:20 +08:00

36 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Bug #461 分析报告
## Bug 描述
[系统管理-执行科室配置] 保存项目配置后项目名称回显为ID码未显示正确名称
## 根因分析
### 数据流
1. 前端 `getAllTreatmentList()` 调用 `/app-common/activity-definition`,返回 `ActivityDefinition` 实体列表
2. 前端 `getDiagnosisTreatmentList()` 调用 `/base-data-manage/org-loc/org-loc`,返回 `Page<OrgLocQueryDto>`
3. 后端 `OrgLocQueryDto.activityDefinitionId``@JsonSerialize(using = ToStringSerializer.class)`,序列化为字符串
4. `ActivityDefinition.id` **没有** `@JsonSerialize`,序列化为 JavaScript Number大数精度丢失
### 核心问题
前端 `getList()``filteredOptions` 的初始化逻辑存在 **类型不一致** 问题:
- `allImplementDepartmentList` 中的 `value`**Number**(来自 ActivityDefinition 实体,未做 ToStringSerializer
- `res.data.records` 中的 `activityDefinitionId`**String**(来自 OrgLocQueryDto做了 ToStringSerializer
`filteredOptions.some(o => o.value === record.activityDefinitionId)` 使用 `===` 严格比较Number !== String**永远返回 false**。
虽然 fallback 代码会添加缺失项,但 `label` 取值依赖 `record.activityDefinitionId_dictText`,而该字段由 `DictAspect` 通过 SQL 查询填充。如果 SQL 查询返回空结果(如 `jdbcTemplate.queryForObject` 抛出 `DataAccessException``DictAspect` 返回空字符串 `""`,导致 `label` 被设为 `""`
**最终结果**`el-select` 找不到匹配的选项fallback 添加的条目 label 为空,显示为 ID 码。
## 修复结果:✅ 成功5行改动
### 改动清单
1. **前端** `index.vue` L258`value: item.activityDefinitionId``value: String(item.activityDefinitionId)`
- 确保 `allImplementDepartmentList` 中的 `value` 为 String 类型
- 与后端 `OrgLocQueryDto.activityDefinitionId`ToStringSerializer 序列化)类型一致
- 使 `filteredOptions.some(o => o.value === record.activityDefinitionId)` 能正确匹配
2. **后端** `ActivityDefinition.java`:给 `id` 字段添加 `@JsonSerialize(using = ToStringSerializer.class)`
- 根因修复:防止大数 ID 在 JavaScript 中精度丢失
- 全局影响:所有返回 ActivityDefinition 的 API 现在统一返回字符串 ID