Compare commits
3 Commits
857880af4e
...
d825f9b61f
| Author | SHA1 | Date | |
|---|---|---|---|
| d825f9b61f | |||
| a5f8a5ba1b | |||
| f74134a798 |
27
.agentforge/analysis/bug545_analysis.md
Normal file
27
.agentforge/analysis/bug545_analysis.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Bug #545 分析报告:长效诊断标识设置保存就清空
|
||||
|
||||
## 根因定位
|
||||
|
||||
保存诊断后,前端调用 `getList()` 刷新数据,`getEncounterDiagnosis` SQL 查询未包含 `long_term_flag` 字段,且 `DiagnosisQueryDto` 缺少对应属性,导致返回数据中不含 `longTermFlag`,前端覆盖 `form.value.diagnosisList` 后下拉框清空。
|
||||
|
||||
## 数据流追踪
|
||||
|
||||
1. 前端用户在 `diagnosis.vue` 第218-231行的 el-select 下拉框选择"长期有效/临时有效",值绑定到 `scope.row.longTermFlag`
|
||||
2. 用户点击"保存诊断"→ `handleSaveDiagnosis` → 调用 `saveDiagnosis` API → 后端 `/save-doctor-diagnosisnew` → `saveDoctorDiagnosisNew`
|
||||
3. 后端 `saveDoctorDiagnosisNew` 第376行和第404行已正确保存 `encounterDiagnosis.setLongTermFlag(saveDiagnosisChildParam.getLongTermFlag())`
|
||||
4. 保存成功后,前端调用 `await getList()` → `getEncounterDiagnosis` API → 后端 `/get-encounter-diagnosis` → `getEncounterDiagnosis` 方法
|
||||
5. **断点在此**: SQL (`DoctorStationDiagnosisAppMapper.xml:122-150`) SELECT 列表缺少 `T1.long_term_flag`,DTO (`DiagnosisQueryDto.java`) 缺少 `longTermFlag` 属性
|
||||
6. 前端第351行 `form.value.diagnosisList = res.data.filter(...)` 用不含 `longTermFlag` 的数据替换了原有数据
|
||||
7. 结果:`longTermFlag` 变为 `undefined`,下拉框清空
|
||||
|
||||
## 修复方案
|
||||
|
||||
1. **SQL**: `DoctorStationDiagnosisAppMapper.xml` getEncounterDiagnosis 查询新增 `T1.long_term_flag AS longTermFlag`
|
||||
2. **DTO**: `DiagnosisQueryDto.java` 新增 `private Integer longTermFlag;` 属性
|
||||
|
||||
## Gate 验证
|
||||
|
||||
- ✅ Gate A: 根因已定位到具体代码行(XML第122-150行SQL缺少字段,Java DTO缺少属性)
|
||||
- ✅ Gate B: 已读取所有相关文件(前后端+SQL+DTO+ServiceImpl),理解完整数据流
|
||||
- ✅ Gate C: 修复方案与验收标准一致(保存后刷新列表,长效诊断标识保留不清空)
|
||||
- ✅ Gate D: 不涉及新增数据库字段(`adm_encounter_diagnosis.long_term_flag` 已存在,Entity 第89行已有定义)
|
||||
@@ -354,6 +354,11 @@ async function getList() {
|
||||
if (!item.classification) {
|
||||
item.classification = '西医';
|
||||
}
|
||||
// 转换 longTermFlag 为字符串,以匹配 useDict 返回的字典值类型(字符串)
|
||||
// 避免 el-select 因类型不匹配(整数 1 vs 字符串 "1")导致下拉框清空
|
||||
if (item.longTermFlag != null) {
|
||||
item.longTermFlag = String(item.longTermFlag);
|
||||
}
|
||||
// 如果ybNo(诊断编码)符合传染病编码格式,添加到selectedDiseases
|
||||
if (item.ybNo && /^(01|02|03)/.test(item.ybNo)) {
|
||||
item.selectedDiseases = [item.ybNo];
|
||||
@@ -636,8 +641,6 @@ async function handleSaveDiagnosis() {
|
||||
saveLoading.value = true;
|
||||
|
||||
// 保存前按排序号排序,并转换日期格式为后端期望的格式 yyyy/M/d HH:mm:ss
|
||||
// 同时保留 longTermFlag 供 getList 刷新后恢复(后端 getEncounterDiagnosis 不返回此字段)
|
||||
const longTermFlagBackup = form.value.diagnosisList.map(item => item.longTermFlag);
|
||||
const diagnosisChildList = form.value.diagnosisList.map(item => ({
|
||||
...item,
|
||||
onsetDate: item.onsetDate ? formatDateStr(item.onsetDate, 'YYYY/M/D HH:mm:ss') : null,
|
||||
@@ -654,12 +657,6 @@ async function handleSaveDiagnosis() {
|
||||
if (res.code === 200) {
|
||||
// 刷新树和列表数据(等待列表数据加载完成,确保获取到reportTypeCode)
|
||||
await getList();
|
||||
// 恢复 longTermFlag(后端查询接口不返回此字段,需从本地备份恢复)
|
||||
form.value.diagnosisList.forEach((item, index) => {
|
||||
if (longTermFlagBackup[index] !== undefined) {
|
||||
item.longTermFlag = longTermFlagBackup[index];
|
||||
}
|
||||
});
|
||||
getTree();
|
||||
emits('diagnosisSave', false);
|
||||
proxy.$modal.msgSuccess('诊断已保存并按排序号排序');
|
||||
@@ -886,6 +883,8 @@ form.value.diagnosisList.push({
|
||||
onsetDate: getCurrentDate(),
|
||||
diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name,
|
||||
diagnosisTime: getCurrentDate(),
|
||||
iptDiseTypeCode: 2,
|
||||
longTermFlag: 0, // 默认非长效诊断
|
||||
selectedDiseases: data.ybNo ? [data.ybNo] : [], // 用于传染病报告卡自动勾选
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user