Эх сурвалжийг харах

fix(@six/health-remedy):修复治疗结束 左侧患者状态不改变

张田田 1 долоо хоног өмнө
parent
commit
6c88b79772

+ 60 - 37
apps/health-remedy/src/views/treatment/treatment/list.vue

@@ -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>