fix(#628 [住院医生工作站-] 诊断录入模块缺少中医诊断录入,诊断体系及中医证候关联逻辑): 住院医生站诊断录入增加中医诊断体系及证候关联逻辑

diagnosis.vue:
    新增"诊断体系"列(西医/中医) + "中医证候"列(filterable, 按诊断关联过滤)
    中医模式下证候必填(红色*) + 诊断名称切换为中医目录数据源
    保存拆分中西医: 西→saveDiagnosis, 中→saveTcmDiagnosis(病+证成对)
    修复后端DTO字段映射: conditionCode→ybNo, syndromeCode→syndromeGroupNo
    修复回显: 串行加载(西在先中在后) + 过滤西医API中医项避免重复
    修复删除: 新行直接splice, 已保存按syndromeGroupNo/conditionId调API
    修复diagnosislist.id映射: item.id替代item.ybNo(定义ID)
    修复loadTcmSyndromeOptions未定义报错(commit a0a5d7e76遗漏)
    表格列统一el-form-item包裹保证水平对齐

  diagnosislist.vue:
    新增diagnosisSystem prop, 中医模式调用getTcmCondition
This commit is contained in:
wangjian963
2026-06-01 11:30:20 +08:00
parent 310331f921
commit 296e825fbd
2 changed files with 354 additions and 126 deletions

View File

@@ -142,6 +142,34 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="诊断体系"
align="center"
prop="diagnosisSystem"
width="120"
>
<template #default="scope">
<el-form-item
:prop="`diagnosisList.${scope.$index}.diagnosisSystem`"
>
<el-select
v-model="scope.row.diagnosisSystem"
placeholder=" "
style="width: 100%"
@change="handleDiagnosisSystemChange(scope.row)"
>
<el-option
label="西医"
value="西医"
/>
<el-option
label="中医"
value="中医"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="诊断类别"
align="center"
@@ -187,6 +215,7 @@
>
<diagnosislist
:diagnosis-searchkey="diagnosisSearchkey"
:diagnosis-system="scope.row.diagnosisSystem || '西医'"
@select-diagnosis="handleSelsectDiagnosis"
/>
<template #reference>
@@ -208,19 +237,74 @@
align="center"
prop="diagnosisDoctor"
width="120"
>
<template #default="scope">
<el-form-item>
<span style="display: block; text-align: center; width: 100%;">{{ scope.row.diagnosisDoctor || '—' }}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column
align="center"
prop="tcmSyndromeName"
width="180"
>
<template #header>
<span>中医证候 <span style="color: #f56c6c;">*</span></span>
</template>
<template #default="scope">
<template v-if="scope.row.diagnosisSystem === '中医'">
<el-form-item
:prop="`diagnosisList.${scope.$index}.tcmSyndromeCode`"
:rules="scope.row.diagnosisSystem === '中医' ? [{ required: true, message: '请选择中医证候', trigger: 'change' }] : []"
>
<el-select
v-model="scope.row.tcmSyndromeCode"
placeholder="请选择中医证候"
filterable
clearable
style="width: 100%"
@focus="loadSyndromeOptions(scope.row.ybNo)"
@change="(val) => handleSyndromeSelect(val, scope.row)"
>
<el-option
v-for="item in syndromeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</template>
<el-form-item v-else>
<span>—</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="诊断时间"
align="center"
prop="diagnosisTime"
width="150"
/>
>
<template #default="scope">
<el-form-item>
<span style="display: block; text-align: center; width: 100%;">{{ scope.row.diagnosisTime || '—' }}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="诊断代码"
align="center"
prop="ybNo"
width="180"
/>
>
<template #default="scope">
<el-form-item>
<span style="display: block; text-align: center; width: 100%;">{{ scope.row.ybNo || '—' }}</span>
</el-form-item>
</template>
</el-table-column>
<el-table-column
label="诊断类型"
align="center"
@@ -228,6 +312,7 @@
width="120"
>
<template #default="scope">
<el-form-item>
<div style="display:flex;flex-direction:column;align-items:center;gap:5px;">
<el-checkbox
v-model="scope.row.maindiseFlag"
@@ -252,6 +337,7 @@
/>
</el-select>
</div>
</el-form-item>
</template>
</el-table-column>
<el-table-column
@@ -260,6 +346,7 @@
width="130"
>
<template #default="scope">
<el-form-item>
<el-button
link
type="primary"
@@ -267,6 +354,7 @@
>
删除
</el-button>
</el-form-item>
</template>
</el-table-column>
</el-table>
@@ -288,7 +376,7 @@
</template>
<script setup>
import {getCurrentInstance} from 'vue'; // 添加 nextTick 导入
import {getCurrentInstance, ref, watch} from 'vue'; // 添加 nextTick 导入
import useUserStore from '@/store/modules/user';
import {
delEncounterDiagnosis,
@@ -299,8 +387,10 @@ import {
getEmrDetail,
getEncounterDiagnosis,
getTcmDiagnosis,
getTcmSyndrome,
isFoodDiseasesNew,
saveDiagnosis,
saveTcmDiagnosis,
} from '../api';
import {deleteTcmDiagnosis} from '@/views/doctorstation/components/api.js';
import diagnosisdialog from '../diagnosis/diagnosisdialog.vue';
@@ -319,6 +409,7 @@ const diagnosisOptions = ref([]);
const rowIndex = ref();
const diagnosis = ref();
const orgOrUser = ref();
const syndromeOptions = ref([]);
const form = ref({
diagnosisList: [],
});
@@ -397,14 +488,21 @@ function getList() {
return;
}
// 初始化中医诊断列表
const newList = [];
// 先加载西医诊断,再加载中医诊断(避免竞态覆盖)
getEncounterDiagnosis(props.patientInfo.encounterId).then((res) => {
if (res.code == 200) {
const datas = (res.data || []).map((item) => {
// 过滤掉中医诊断typeName: '中医诊断'),中医数据由 getTcmDiagnosis 统一管理
const datas = (res.data || [])
.filter((item) => item.typeName !== '中医诊断')
.map((item) => {
let obj = {
...item,
diagnosisSystem: '西医',
tcmSyndromeCode: '',
tcmSyndromeName: '',
syndromeDefinitionId: '',
syndromeGroupNo: '',
showPopover: false,
};
if (obj.diagSrtNo == null) {
obj.diagSrtNo = 1;
@@ -412,27 +510,42 @@ function getList() {
return obj;
});
form.value.diagnosisList = datas;
// form.value.diagnosisList = res.data;
emits('diagnosisSave', false);
}
});
// 西医数据就绪后再加载中医诊断并追加
getTcmDiagnosis({ encounterId: props.patientInfo.encounterId }).then((res) => {
console.log('getTcmDiagnosis=======>', JSON.stringify(res.data.illness));
if (res.code == 200) {
if (res.data.illness.length > 0) {
diagnosisNetDatas.value = res.data.illness;
const newList = [];
res.data.illness.forEach((item, index) => {
newList.push({
conditionId: item.conditionId || '',
encounterDiagnosisId: item.encounterDiagnosisId || '',
syndromeGroupNo: item.syndromeGroupNo || res.data.symptom[index]?.syndromeGroupNo || '',
name: item.name + '-' + (res.data.symptom[index]?.name || ''),
ybNo: item.ybNo,
definitionId: item.definitionId || '',
diagnosisSystem: '中医',
tcmSyndromeCode: res.data.symptom[index]?.ybNo || '',
tcmSyndromeName: res.data.symptom[index]?.name || '',
syndromeDefinitionId: res.data.symptom[index]?.definitionId || '',
diagSrtNo: item.diagSrtNo,
medTypeCode: item.medTypeCode,
diagnosisDoctor: props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name,
diagnosisTime: new Date().toLocaleString('zh-CN')
maindiseFlag: item.maindiseFlag,
verificationStatusEnum: item.verificationStatusEnum,
diagnosisDesc: item.diagnosisDesc || '',
iptDiseTypeCode: item.iptDiseTypeCode,
showPopover: false,
diagnosisDoctor: item.diagnosisDoctor || props.patientInfo.practitionerName || props.patientInfo.doctorName || props.patientInfo.physicianName || userStore.name,
diagnosisTime: item.diagnosisTime || new Date().toLocaleString('zh-CN')
});
});
// 将新数据添加到现有列表
// 将新数据添加到现有列表现有列表
form.value.diagnosisList.push(...newList);
// 重新排序整个列表
@@ -446,6 +559,8 @@ function getList() {
}
});
});
getTree();
}
@@ -596,6 +711,11 @@ function addDiagnosisItem() {
form.value.diagnosisList.push({
showPopover: false,
name: undefined,
diagnosisSystem: '西医',
tcmSyndromeCode: '',
tcmSyndromeName: '',
syndromeDefinitionId: '',
syndromeGroupNo: '',
verificationStatusEnum: 4,
medTypeCode: undefined,
diagSrtNo: form.value.diagnosisList.length + 1,
@@ -613,6 +733,48 @@ function addDiagnosisItem() {
}
}
// 诊断体系切换
function handleDiagnosisSystemChange(row) {
if (row.diagnosisSystem === '西医') {
row.tcmSyndromeCode = '';
row.tcmSyndromeName = '';
row.syndromeDefinitionId = '';
row.syndromeGroupNo = '';
}
row.name = '';
row.ybNo = '';
row.definitionId = '';
row.showPopover = false;
}
// 加载中医证候选项(按诊断名称关联过滤)
function loadSyndromeOptions(conditionCode) {
const params = conditionCode ? { conditionCode } : {};
getTcmSyndrome(params).then((res) => {
if (res.data && res.data.records) {
syndromeOptions.value = res.data.records.map((item) => ({
value: item.ybNo,
label: item.name,
id: item.id,
}));
} else {
syndromeOptions.value = [];
}
});
}
// 中医证候选中赋值
function handleSyndromeSelect(val, row) {
if (val) {
const selected = syndromeOptions.value.find((item) => item.value === val);
row.tcmSyndromeName = selected ? selected.label : '';
row.syndromeDefinitionId = selected ? selected.id : '';
} else {
row.tcmSyndromeName = '';
row.syndromeDefinitionId = '';
}
}
// 添加中医诊断
function handleAddTcmDiagonsis() {
tcmDiagnosisListForEdit.value = form.value.diagnosisList.filter(
@@ -632,41 +794,28 @@ function handleAddTcmDiagonsis() {
* 删除诊断
*/
function handleDeleteDiagnosis(row, index) {
//中医诊断用-拼接 例如:疳气-表里俱实证
const nameArr = row.name?.split('-') || [];
if (row.conditionId) {
if (nameArr.length > 1) {
// 新行(未保存):直接从列表中移除
if (!row.conditionId && !row.encounterDiagnosisId) {
form.value.diagnosisList.splice(index, 1);
return;
}
// 已保存的中医诊断name含'-'且syndromeGroupNo有值
if (row.syndromeGroupNo) {
deleteTcmDiagnosis(row.syndromeGroupNo).then(() => {
getList();
getTree();
});
} else {
return;
}
// 已保存的西医诊断
if (row.conditionId) {
delEncounterDiagnosis(row.conditionId).then(() => {
getList();
getTree();
});
}
} else {
console.log('row============>', JSON.stringify(row));
console.log('item============>', index);
if (nameArr.length > 1) {
let obj = null;
for (let index = 0; index < diagnosisNetDatas.value.length; index++) {
const item = diagnosisNetDatas.value[index];
console.log('item.name============>', item.name);
console.log('row.name============>', row.name);
if (item.ybNo == row.ybNo) {
obj = item;
}
}
deleteTcmDiagnosis(obj.syndromeGroupNo).then(() => {
getList();
getTree();
});
} else {
form.value.diagnosisList.splice(index, 1);
}
}
}
function handleMaindise(value, index) {
@@ -723,6 +872,19 @@ function handleSaveDiagnosis() {
return;
}
// 校验中医诊断证候完整性
for (let i = 0; i < form.value.diagnosisList.length; i++) {
const item = form.value.diagnosisList[i];
if (!item.name) {
ElMessage.warning(`第${i + 1}行诊断名称不能为空`);
return;
}
if (item.diagnosisSystem === '中医' && !item.tcmSyndromeCode) {
ElMessage.error('中医诊断不完整,请录入对应的证候!');
return;
}
}
// 设置保存标志避免触发watch监听器
isSaving.value = true;
@@ -735,16 +897,66 @@ function handleSaveDiagnosis() {
// 步骤2重新分配连续的序号从1开始
sortedList.forEach((item, index) => {
item.diagSrtNo = index + 1; // 这里是关键!把”诊断排序”改成新顺序
item.diagSrtNo = index + 1;
});
// 步骤3提交排序后的数据
// 步骤3拆分为西医诊断和中医诊断
const westernList = sortedList.filter((item) => item.diagnosisSystem !== '中医');
const tcmList = sortedList.filter((item) => item.diagnosisSystem === '中医');
const savePromises = [];
// 保存西医诊断
if (westernList.length > 0) {
savePromises.push(
saveDiagnosis({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
diagnosisChildList: sortedList,
}).then((res) => {
if (res.code === 200) {
diagnosisChildList: westernList,
})
);
}
// 保存中医诊断
tcmList.forEach((item) => {
const syndromeGroupNo = item.conditionId
? `${item.conditionId}-${item.tcmSyndromeCode || Date.now()}`
: `${Date.now()}-${item.tcmSyndromeCode || '0'}`;
savePromises.push(
saveTcmDiagnosis({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
diagnosisChildList: [
// 病illness
{
conditionId: item.conditionId || null,
name: item.name,
ybNo: item.ybNo,
definitionId: item.definitionId || null,
diagSrtNo: item.diagSrtNo,
medTypeCode: item.medTypeCode,
maindiseFlag: item.maindiseFlag,
verificationStatusEnum: item.verificationStatusEnum,
diagnosisDesc: item.diagnosisDesc || '',
diagnosisDoctor: item.diagnosisDoctor || '',
diagnosisTime: item.diagnosisTime || '',
iptDiseTypeCode: item.iptDiseTypeCode,
syndromeGroupNo: syndromeGroupNo,
},
// 证syndrome
{
name: item.tcmSyndromeName,
ybNo: item.tcmSyndromeCode,
definitionId: item.syndromeDefinitionId || null,
diagSrtNo: null,
syndromeGroupNo: syndromeGroupNo,
},
],
})
);
});
Promise.all(savePromises).then(() => {
emits('diagnosisSave', false);
proxy.$modal.msgSuccess('诊断已保存');
@@ -757,7 +969,6 @@ function handleSaveDiagnosis() {
window.open(res2.data, '_blank');
}
});
}
}).finally(() => {
setTimeout(() => {
isSaving.value = false;

View File

@@ -28,39 +28,56 @@
</template>
<script setup>
import {getDiagnosisDefinitionList} from '../api';
import {getDiagnosisDefinitionList, getTcmCondition} from '../api';
const props = defineProps({
diagnosisSearchkey: {
type: String,
default: '',
},
diagnosisSystem: {
type: String,
default: '西医',
},
});
const emit = defineEmits(['selectDiagnosis']);
const total = ref(0);
const queryParams = ref({
pageSize: 1000,
pageNo: 1,
// typeCode: 1,
});
const diagnosisDefinitionList = ref([]);
watch(
() => props.diagnosisSearchkey,
(newValue) => {
queryParams.value.searchKey = newValue;
() => [props.diagnosisSearchkey, props.diagnosisSystem],
() => {
getList();
},
{ immdiate: true }
{ immediate: true }
);
getList();
function getList() {
if (props.diagnosisSystem === '中医') {
getTcmCondition({ searchKey: props.diagnosisSearchkey || undefined }).then((res) => {
if (res.data && res.data.records) {
diagnosisDefinitionList.value = res.data.records.map((item) => ({
name: item.name,
ybNo: item.ybNo,
typeName: '中医诊断',
id: item.id,
}));
}
total.value = res.data?.total || 0;
});
} else {
queryParams.value.searchKey = props.diagnosisSearchkey || undefined;
getDiagnosisDefinitionList(queryParams.value).then((res) => {
diagnosisDefinitionList.value = res.data.records;
total.value = res.data.total;
});
}
}
function clickRow(row) {
emit('selectDiagnosis', row);