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:
@@ -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;
|
||||
|
||||
@@ -28,38 +28,55 @@
|
||||
</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) {
|
||||
|
||||
Reference in New Issue
Block a user