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 }}
- 删除
+
@@ -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