|
|
@@ -4,6 +4,7 @@ import type { TreatmentModel } from '#/api/method/treatment';
|
|
|
import { onActivated, onBeforeUnmount, onMounted, ref } from 'vue';
|
|
|
|
|
|
import {
|
|
|
+ endTreatmentMethod,
|
|
|
getTreatmentDetailMethod,
|
|
|
listPatientsMethod,
|
|
|
} from '#/api/method/treatment';
|
|
|
@@ -45,9 +46,39 @@ const selectedTreatmentIndex = ref<number>(0);
|
|
|
// 每个治疗项的倒计时管理
|
|
|
const treatmentCountdowns = ref<Record<string, number>>({});
|
|
|
const countdownTimers = ref<Record<string, number>>({});
|
|
|
-// 移除endingTreatments,现在由子组件处理治疗结束逻辑
|
|
|
// 刷新中的节流/去重标记
|
|
|
const isRefreshing = ref(false);
|
|
|
+// 防止同一治疗项被重复结束
|
|
|
+const endingTreatments = ref<Set<string>>(new Set());
|
|
|
+
|
|
|
+// 本地把某个治疗项标记为完成,
|
|
|
+function markTreatmentCompletedLocally(targetId: string) {
|
|
|
+ const updated = patients.value.map((p) => {
|
|
|
+ return {
|
|
|
+ ...p,
|
|
|
+ itemVOS: p.itemVOS.map((it) =>
|
|
|
+ it.id === targetId ? { ...it, itemState: 2 } : it,
|
|
|
+ ),
|
|
|
+ } as any;
|
|
|
+ });
|
|
|
+ patients.value = updated as any;
|
|
|
+}
|
|
|
+
|
|
|
+// 本地把某个治疗项标记为治疗中
|
|
|
+function markTreatmentInProgressLocally(targetId: string) {
|
|
|
+ const updated = patients.value.map((p) => {
|
|
|
+ return {
|
|
|
+ ...p,
|
|
|
+ itemVOS: p.itemVOS.map((it) =>
|
|
|
+ it.id === targetId ? { ...it, itemState: 1 } : it,
|
|
|
+ ),
|
|
|
+ } as any;
|
|
|
+ });
|
|
|
+ patients.value = updated as any;
|
|
|
+ if (selectedTreatment.value?.id === targetId) {
|
|
|
+ selectedTreatment.value.itemState = 1 as any;
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
onMounted(async () => {
|
|
|
const res = await listPatientsMethod();
|
|
|
@@ -187,10 +218,10 @@ const refreshData = async (payload?: {
|
|
|
|
|
|
if (updatedPatient) {
|
|
|
selectedPatient.value = updatedPatient;
|
|
|
+ // 保持当前详情选择,不因他项刷新而跳转
|
|
|
+ const currentSelectedId = selectedTreatment.value?.id;
|
|
|
const targetTreatmentId =
|
|
|
- payload?.treatmentId ||
|
|
|
- selectedTreatment.value?.id ||
|
|
|
- updatedPatient.itemVOS?.[0]?.id;
|
|
|
+ currentSelectedId || updatedPatient.itemVOS?.[0]?.id;
|
|
|
if (targetTreatmentId) {
|
|
|
const treatmentIndex = updatedPatient.itemVOS.findIndex(
|
|
|
(item) => item.id === targetTreatmentId,
|
|
|
@@ -198,9 +229,7 @@ const refreshData = async (payload?: {
|
|
|
if (treatmentIndex !== -1) {
|
|
|
selectedTreatmentIndex.value = treatmentIndex;
|
|
|
}
|
|
|
- await buildTreatmentDetailFromBasic({
|
|
|
- id: targetTreatmentId,
|
|
|
- });
|
|
|
+ await buildTreatmentDetailFromBasic({ id: targetTreatmentId });
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -249,42 +278,36 @@ const handleStartTreatment = async (payload: {
|
|
|
delete countdownTimers.value[treatmentId];
|
|
|
delete treatmentCountdowns.value[treatmentId];
|
|
|
}
|
|
|
+ // 若是当前选中的治疗项,则交由详情组件处理结束逻辑,父层不再重复调用
|
|
|
+ if (selectedTreatment.value?.id === treatmentId) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 避免重复结束
|
|
|
+ if (endingTreatments.value.has(treatmentId)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ endingTreatments.value.add(treatmentId);
|
|
|
+ // 结束治疗并刷新数据(即使当前未选中该项目)
|
|
|
+ void (async () => {
|
|
|
+ try {
|
|
|
+ // 先本地标记完成,减少视觉延迟
|
|
|
+ markTreatmentCompletedLocally(treatmentId);
|
|
|
+ await endTreatmentMethod([treatmentId]);
|
|
|
+ } catch {
|
|
|
+ // 忽略错误,仍尝试刷新以获取真实状态
|
|
|
+ } finally {
|
|
|
+ await refreshData({ treatmentId });
|
|
|
+ endingTreatments.value.delete(treatmentId);
|
|
|
+ }
|
|
|
+ })();
|
|
|
}
|
|
|
}, 1000);
|
|
|
|
|
|
// 更新左侧状态为治疗中
|
|
|
- await updateTreatmentStatus(treatmentId, 'in-progress');
|
|
|
+ markTreatmentInProgressLocally(treatmentId);
|
|
|
};
|
|
|
|
|
|
-// 更新治疗项状态(需要与 PatientList 组件通信)
|
|
|
-const updateTreatmentStatus = async (
|
|
|
- treatmentId: string,
|
|
|
- status: 'completed' | 'in-progress' | 'not-started',
|
|
|
-) => {
|
|
|
- try {
|
|
|
- const res = await listPatientsMethod();
|
|
|
- patients.value = res?.items ?? ([] as TreatmentModel.Patient[]);
|
|
|
-
|
|
|
- // 更新当前选中的患者数据
|
|
|
- const currentPatientId = selectedPatient.value.patientId;
|
|
|
- const updatedPatient = patients.value.find(
|
|
|
- (p) => p.patientId === currentPatientId,
|
|
|
- );
|
|
|
- if (updatedPatient) {
|
|
|
- selectedPatient.value = updatedPatient;
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('更新患者列表失败:', error);
|
|
|
- }
|
|
|
-
|
|
|
- // 更新当前选中的治疗项状态
|
|
|
- if (selectedTreatment.value?.id === treatmentId) {
|
|
|
- selectedTreatment.value.status = status;
|
|
|
- selectedTreatmentDetail.value = buildTreatmentDetailFromBasic(
|
|
|
- selectedTreatment.value,
|
|
|
- );
|
|
|
- }
|
|
|
-};
|
|
|
+// 已废弃:此前用于开始治疗后的拉取刷新,现改为本地乐观更新
|
|
|
</script>
|
|
|
|
|
|
<template>
|