修复了中医诊断保存时主诊断标记不唯一的问题,并优化了诊断保存逻辑

This commit is contained in:
2026-01-09 15:33:06 +08:00
parent 86673d7be3
commit 840983ac94
5 changed files with 655 additions and 13 deletions

View File

@@ -0,0 +1,179 @@
# 中医诊断主诊断功能实现说明
## 问题描述
中医诊断在添加时无法设置主诊断标记,导致保存后无法正确标识主诊断。
## 问题原因
`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日