Files
his/中医诊断主诊断功能实现说明.md

180 lines
5.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.

# 中医诊断主诊断功能实现说明
## 问题描述
中医诊断在添加时无法设置主诊断标记,导致保存后无法正确标识主诊断。
## 问题原因
`addDiagnosisDialog.vue` 中保存中医诊断时,没有传递 `maindiseFlag`(主诊断标记)字段到后端。
## 解决方案
### 1. 前端修改
#### 1.1 添加主诊断UIaddDiagnosisDialog.vue
在诊断详情区域为每个中医诊断添加了主诊断复选框:
```vue
<el-checkbox
v-model="item.isMain"
label="主诊断"
:true-label="true"
:false-label="false"
border
size="small"
style="margin-right: 10px;"
@change="(value) => handleMaindise(value, index)"
/>
```
#### 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日