# 中医诊断主诊断功能实现说明 ## 问题描述 中医诊断在添加时无法设置主诊断标记,导致保存后无法正确标识主诊断。 ## 问题原因 在 `addDiagnosisDialog.vue` 中保存中医诊断时,没有传递 `maindiseFlag`(主诊断标记)字段到后端。 ## 解决方案 ### 1. 前端修改 #### 1.1 添加主诊断UI(addDiagnosisDialog.vue) 在诊断详情区域为每个中医诊断添加了主诊断复选框: ```vue ``` #### 1.2 添加主诊断逻辑处理 **新增诊断时的默认行为:** - 第一个添加的中医诊断自动设置为主诊断 - 后续添加的诊断默认不是主诊断 **主诊断唯一性校验:** ```javascript function handleMaindise(value, index) { if (value) { // 检查是否已有其他主诊断 let mainCount = 0; tcmDiagonsisList.value.forEach((item, idx) => { if (item.isMain && idx !== index) { mainCount++; } }); if (mainCount > 0) { // 取消当前选择 tcmDiagonsisList.value[index].isMain = false; proxy.$modal.msgWarning('只能有一条主诊断'); return; } // 更新保存列表中的主诊断标记 const syndromeGroupNo = tcmDiagonsisList.value[index].syndromeGroupNo; tcmDiagonsisSaveList.value.forEach((item, idx) => { if (item.syndromeGroupNo === syndromeGroupNo) { // 每个证候组有两条记录(病和证),只有第一条(病)设置主诊断标记 if (idx % 2 === 0 || tcmDiagonsisSaveList.value[idx - 1]?.syndromeGroupNo !== syndromeGroupNo) { item.maindiseFlag = 1; } } }); } else { // 取消主诊断 const syndromeGroupNo = tcmDiagonsisList.value[index].syndromeGroupNo; tcmDiagonsisSaveList.value.forEach((item) => { if (item.syndromeGroupNo === syndromeGroupNo) { item.maindiseFlag = 0; } }); } } ``` #### 1.3 保存时包含主诊断字段 **新增诊断时:** ```javascript tcmDiagonsisSaveList.value.push({ definitionId: row.id, ybNo: row.ybNo, syndromeGroupNo: timestamp.value, verificationStatusEnum: 4, medTypeCode: '11', maindiseFlag: isFirstDiagnosis ? 1 : 0, // 添加主诊断标记 }); ``` **修改诊断时:** ```javascript tcmDiagonsisSaveList.value.push({ conditionId: item.conditionId, updateId: updateIds[0], definitionId: item.illnessDefinitionId, ybNo: item.ybNo, syndromeGroupNo: item.syndromeGroupNo, verificationStatusEnum: 4, medTypeCode: '11', diagSrtNo: item.diagSrtNo, maindiseFlag: isMain ? 1 : 0, // 保留原有的主诊断标记 }); ``` #### 1.4 诊断列表显示(diagnosis.vue) 在获取中医诊断列表时,正确读取并显示主诊断标记: ```javascript form.value.diagnosisList.push({ name: item.name + '-' + res.data.symptom[index].name, diagSrtNo: item.diagSrtNo, ybNo: item.ybNo, medTypeCode: item.medTypeCode, syndromeGroupNo: item.syndromeGroupNo, typeName: '中医诊断', conditionId: item.conditionId, symptomConditionId: res.data.symptom[index].conditionId, updateId: item.encounterDiagnosisId + '-' + res.data.symptom[index].encounterDiagnosisId, illnessDefinitionId: item.definitionId, symptomDefinitionId: res.data.symptom[index].definitionId, symptomYbNo: res.data.symptom[index].ybNo, maindiseFlag: item.maindiseFlag || 0, // 添加主诊断标记 }); ``` ### 2. 后端支持 后端已经支持 `maindiseFlag` 字段的保存和读取: **SaveDiagnosisChildParam.java:** ```java /** * 主诊断标记 (1:是,0:否) */ private Integer maindiseFlag; ``` **DoctorStationChineseMedicalAppServiceImpl.java:** ```java encounterDiagnosis.setMaindiseFlag(saveDiagnosisChildParam.getMaindiseFlag()); ``` ## 业务规则 1. **主诊断标记位置**:主诊断标记在"病"上(每个病-证组合的第一条记录) 2. **主诊断唯一性**:中医诊断只能有一个主诊断 3. **与西医诊断的关系**:中医诊断和西医诊断可以各有一个主诊断(互不冲突) 4. **默认行为**:第一个添加的中医诊断自动设置为主诊断 ## 修改文件清单 1. `openhis-ui-vue3/src/views/doctorstation/components/diagnosis/addDiagnosisDialog.vue` - 添加主诊断复选框UI - 添加主诊断逻辑处理函数 - 修改保存数据时包含 maindiseFlag 字段 2. `openhis-ui-vue3/src/views/doctorstation/components/diagnosis/diagnosis.vue` - 修改获取中医诊断列表时读取 maindiseFlag 字段 - 修改传递给对话框的数据包含 maindiseFlag 字段 ## 测试要点 1. ✅ 新增中医诊断时,第一个诊断自动设置为主诊断 2. ✅ 可以手动勾选/取消主诊断复选框 3. ✅ 只能有一个主诊断(尝试勾选第二个时会提示错误) 4. ✅ 保存后主诊断标记正确保存到数据库 5. ✅ 刷新页面后主诊断标记正确显示 6. ✅ 修改已有诊断时,主诊断标记正确回显 7. ✅ 中医诊断和西医诊断的主诊断互不影响 ## 注意事项 1. 中医诊断是"病-证"成对出现的,主诊断标记只设置在"病"上 2. 证候记录的 maindiseFlag 始终为 0 3. 主诊断唯一性校验只在中医诊断内部进行,不影响西医诊断 ## 完成时间 2026年1月9日