diff --git a/openhis-ui-vue3/src/views/doctorstation/components/prescription/prescriptionlist.vue b/openhis-ui-vue3/src/views/doctorstation/components/prescription/prescriptionlist.vue index 523c5af6..12cfb93e 100644 --- a/openhis-ui-vue3/src/views/doctorstation/components/prescription/prescriptionlist.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/prescription/prescriptionlist.vue @@ -12,9 +12,17 @@
-
- {{ prescription.name }} - 删除 +
+ {{ prescription.name }} + + 删除西药方 +
@@ -977,7 +985,7 @@ import { getActivityBindDevice, } from '../api'; import adviceBaseList from '../adviceBaseList.vue'; -import { computed, getCurrentInstance, nextTick, watch, unref } from 'vue'; +import { computed, getCurrentInstance, nextTick, watch, unref, reactive } from 'vue'; import { calculateQuantityByDays, formatNumber } from '@/utils/his'; import OrderGroupDrawer from './orderGroupDrawer'; import PrescriptionHistory from './prescriptionHistory'; @@ -1447,8 +1455,17 @@ function getListInfo(addNewRow) { } function getDiagnosisInfo() { - getEncounterDiagnosis(props.patientInfo.encounterId).then((res) => { - diagnosisList.value = res.data; + if (!props.patientInfo || !props.patientInfo.encounterId) { + console.warn('患者信息不完整,无法获取诊断信息'); + return Promise.resolve({ data: [] }); + } + + return getEncounterDiagnosis(props.patientInfo.encounterId).then((res) => { + console.log('getDiagnosisInfo - API返回结果:', res); + const diagnosisData = res.data || res || []; + diagnosisList.value = Array.isArray(diagnosisData) ? diagnosisData : []; + console.log('getDiagnosisInfo - 诊断列表已更新:', diagnosisList.value); + let diagnosisInfo = diagnosisList.value.filter((item) => { return item.maindiseFlag == 1; }); @@ -1458,7 +1475,20 @@ function getDiagnosisInfo() { conditionId.value = diagnosisInfo[0].conditionId; encounterDiagnosisId.value = diagnosisInfo[0].encounterDiagnosisId; diagnosisName.value = diagnosisInfo[0].name; + console.log('getDiagnosisInfo - 已设置主诊断:', diagnosisInfo[0]); + } else if (diagnosisList.value.length > 0) { + // 如果没有主诊断,使用第一个诊断 + conditionDefinitionId.value = diagnosisList.value[0].definitionId; + conditionId.value = diagnosisList.value[0].conditionId; + encounterDiagnosisId.value = diagnosisList.value[0].encounterDiagnosisId; + diagnosisName.value = diagnosisList.value[0].name; + console.log('getDiagnosisInfo - 已设置第一个诊断:', diagnosisList.value[0]); } + return res; + }).catch((error) => { + console.error('获取诊断信息失败:', error); + diagnosisList.value = []; + return { data: [] }; }); } @@ -3213,23 +3243,147 @@ function validateGroups(saveList) { /** * 新增西药处方 + * 自动引入诊断和费用性质 */ -function handleAddWesternPrescription() { +async function handleAddWesternPrescription() { + // 检查患者信息是否完整 + if (!props.patientInfo || !props.patientInfo.encounterId) { + proxy.$modal.msgWarning('患者信息不完整,无法创建处方'); + return; + } + prescriptionCounter.value++; const newPrescriptionId = `prescription_${Date.now()}_${prescriptionCounter.value}`; - const newPrescription = { + + // 如果诊断列表为空,先加载诊断信息 + if (!diagnosisList.value || diagnosisList.value.length === 0) { + try { + const diagnosisRes = await getDiagnosisInfo(); + console.log('诊断信息加载完成:', diagnosisRes); + // 确保诊断列表已更新 + if (diagnosisRes && diagnosisRes.data) { + diagnosisList.value = diagnosisRes.data || []; + } + } catch (error) { + console.error('加载诊断信息失败:', error); + // 即使加载失败,也继续创建处方,只是不自动引入诊断 + } + } + + // 如果费用性质列表为空,先加载费用性质信息 + if (!contractList.value || contractList.value.length === 0) { + try { + const res = await getContract({ encounterId: props.patientInfo.encounterId }); + console.log('费用性质信息加载完成:', res); + if (res && res.data) { + contractList.value = res.data; + } + } catch (error) { + console.error('加载费用性质失败:', error); + // 即使加载失败,也继续创建处方,只是不自动引入费用性质 + } + } + + // 再次确认数据已加载 + console.log('数据加载检查 - 诊断列表:', diagnosisList.value?.length || 0, diagnosisList.value); + console.log('数据加载检查 - 费用性质列表:', contractList.value?.length || 0, contractList.value); + + // 自动引入诊断:优先使用全局变量,否则从诊断列表中获取第一个主诊断,再否则获取第一个诊断 + let autoConditionDefinitionId = conditionDefinitionId.value; + console.log('自动引入诊断 - 当前全局诊断ID:', autoConditionDefinitionId); + console.log('自动引入诊断 - 诊断列表:', diagnosisList.value); + + if (!autoConditionDefinitionId && diagnosisList.value && diagnosisList.value.length > 0) { + // 优先获取主诊断 + const mainDiagnosis = diagnosisList.value.find(item => item.maindiseFlag == 1); + if (mainDiagnosis) { + autoConditionDefinitionId = mainDiagnosis.definitionId; + console.log('自动引入诊断 - 找到主诊断:', mainDiagnosis); + // 同时更新全局变量 + conditionDefinitionId.value = autoConditionDefinitionId; + conditionId.value = mainDiagnosis.conditionId; + encounterDiagnosisId.value = mainDiagnosis.encounterDiagnosisId; + diagnosisName.value = mainDiagnosis.name; + } else { + // 如果没有主诊断,使用第一个诊断 + autoConditionDefinitionId = diagnosisList.value[0].definitionId; + console.log('自动引入诊断 - 使用第一个诊断:', diagnosisList.value[0]); + // 同时更新全局变量 + conditionDefinitionId.value = autoConditionDefinitionId; + conditionId.value = diagnosisList.value[0].conditionId; + encounterDiagnosisId.value = diagnosisList.value[0].encounterDiagnosisId; + diagnosisName.value = diagnosisList.value[0].name; + } + } else if (!autoConditionDefinitionId) { + console.warn('自动引入诊断 - 无法自动引入:诊断列表为空或全局变量未设置'); + } + + // 自动引入费用性质:优先使用全局变量,否则从费用性质列表中获取第一个,再否则使用患者信息中的费用性质 + let autoAccountId = accountId.value; + console.log('自动引入费用性质 - 当前全局费用性质ID:', autoAccountId); + console.log('自动引入费用性质 - 费用性质列表:', contractList.value); + console.log('自动引入费用性质 - 患者信息中的费用性质:', props.patientInfo?.accountId); + + if (!autoAccountId) { + if (contractList.value && contractList.value.length > 0) { + autoAccountId = contractList.value[0].accountId; + console.log('自动引入费用性质 - 从列表获取:', contractList.value[0]); + // 同时更新全局变量 + accountId.value = autoAccountId; + } else if (props.patientInfo && props.patientInfo.accountId) { + autoAccountId = props.patientInfo.accountId; + console.log('自动引入费用性质 - 从患者信息获取:', autoAccountId); + // 同时更新全局变量 + accountId.value = autoAccountId; + } else { + console.warn('自动引入费用性质 - 无法自动引入:费用性质列表为空且患者信息中也没有'); + } + } + + // 创建处方对象,确保诊断和费用性质被正确设置 + const newPrescription = reactive({ id: newPrescriptionId, name: `西药方${prescriptionCounter.value}`, prescriptionNo: '', // 处方单号码,保存时由后端生成 - conditionDefinitionId: conditionDefinitionId.value, // 诊断 - accountId: accountId.value, // 费用性质 + conditionDefinitionId: autoConditionDefinitionId || undefined, // 诊断(自动引入) + accountId: autoAccountId || undefined, // 费用性质(自动引入) expandOrder: [], // 展开的行 - }; + }); westernPrescriptions.value.push(newPrescription); allPrescriptionsData.value[newPrescriptionId] = []; // 初始化空数据 - console.log('新增西药处方:', newPrescription); + console.log('新增西药处方完成:', { + prescriptionId: newPrescriptionId, + prescription: newPrescription, + autoConditionDefinitionId: autoConditionDefinitionId, + autoAccountId: autoAccountId, + diagnosisListLength: diagnosisList.value?.length || 0, + contractListLength: contractList.value?.length || 0, + diagnosisList: diagnosisList.value, + contractList: contractList.value + }); + + // 使用 nextTick 确保 Vue 响应式更新,然后再次检查并更新处方对象 + await nextTick(); + + // 确保处方对象中的诊断和费用性质已正确设置(使用响应式对象直接更新) + if (autoConditionDefinitionId) { + newPrescription.conditionDefinitionId = autoConditionDefinitionId; + console.log('已设置诊断ID到处方对象:', autoConditionDefinitionId); + } + if (autoAccountId) { + newPrescription.accountId = autoAccountId; + console.log('已设置费用性质ID到处方对象:', autoAccountId); + } + + // 再次等待一个tick,确保视图更新 + await nextTick(); + console.log('最终处方对象:', { + id: newPrescription.id, + conditionDefinitionId: newPrescription.conditionDefinitionId, + accountId: newPrescription.accountId + }); } /** @@ -3293,24 +3447,60 @@ function updateExpandOrder(keys) { } /** - * 关闭处方 + * 关闭处方(删除西药方) + * 控制规则: + * 1. 西药方有已保存的数据不能删除 + * 2. 西药方已签发和已收费不能删除 + * 3. 西药方只有在待保存和无数据的情况才能删除 */ function handleClosePrescription(prescriptionId) { // 检查该处方是否有数据 const prescriptionData = allPrescriptionsData.value[prescriptionId] || []; const hasData = prescriptionData.length > 0; - if (hasData) { - // 如果有数据,提示用户确认 - proxy.$modal.confirm('该处方包含数据,确定要关闭吗?').then(() => { - doClosePrescription(prescriptionId); - }).catch(() => { - console.log('取消关闭处方'); - }); - } else { - // 如果没有数据,直接关闭 + if (!hasData) { + // 如果没有数据,直接删除 doClosePrescription(prescriptionId); + return; } + + // 检查是否有已保存的数据(statusEnum == 1 && (requestId || isSaved)) + const hasSavedData = prescriptionData.some(item => { + return item.statusEnum == 1 && (item.requestId || item.isSaved); + }); + + if (hasSavedData) { + proxy.$modal.msgWarning('西药方有已保存的数据,不能删除'); + return; + } + + // 检查是否有已签发的数据(statusEnum == 2) + const hasIssuedData = prescriptionData.some(item => { + return item.statusEnum == 2; + }); + + if (hasIssuedData) { + proxy.$modal.msgWarning('西药方已签发,不能删除'); + return; + } + + // 检查是否有已收费的数据(chargeStatus == 5 表示已收费) + const hasChargedData = prescriptionData.some(item => { + return item.chargeStatus == 5; + }); + + if (hasChargedData) { + proxy.$modal.msgWarning('西药方已收费,不能删除'); + return; + } + + // 如果所有数据都是待保存状态(statusEnum == 1 && !requestId && !isSaved)或无数据,可以删除 + // 提示用户确认 + proxy.$modal.confirm('确定要删除该西药方吗?').then(() => { + doClosePrescription(prescriptionId); + }).catch(() => { + console.log('取消删除西药方'); + }); } /** @@ -3480,4 +3670,18 @@ defineExpose({ getListInfo, getDiagnosisInfo, getSignedPrescriptionInfo }); .prescription-scroll-container .el-table__body-wrapper { overflow-x: auto; } + +/* 确保标题栏删除按钮可见 */ +.prescription-header { + position: relative; + z-index: 1; +} + +.prescription-header .el-button { + position: relative; + z-index: 10; + visibility: visible !important; + display: inline-block !important; + opacity: 1 !important; +} \ No newline at end of file