From 909dfdf6ceff702f65bdc15bd958589c6df4195d Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期六, 26 七月 2025 15:48:48 +0800
Subject: [PATCH] ID1825-定时任务禁止修改

---
 src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue |  263 +++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 187 insertions(+), 76 deletions(-)

diff --git a/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue b/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue
index 8111fe6..6421ac5 100644
--- a/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue
+++ b/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue
@@ -13,7 +13,7 @@
     >
       <template #header>
         <div class="scheduled-task-header">
-          <span class="header-title">创建定时任务</span>
+          <span class="header-title">{{ title }}</span>
           <img
             :src="closeImg"
             class="header-close"
@@ -25,8 +25,9 @@
       <div class="scheduled-task-content" v-loading="loading">
         <div class="content-left">
           <div class="content-left-date">
-            <TimePicker v-model="timeValue" />
-            <div class="date-btn">
+            <TimePicker v-model="timeValue" :disabled="type === 1" />
+            <!-- 创建的情况 -->
+            <div class="date-btn" v-if="type === 0">
               <div
                 v-for="(item, index) in dateOptions"
                 :key="index"
@@ -36,13 +37,19 @@
                 {{ item.label }}
               </div>
             </div>
+            <!-- 查看的情况 -->
+            <div class="countdown" v-else>
+              <div class="countdown-btn">
+                剩余时间:{{ formattedCountdown }}
+              </div>
+            </div>
           </div>
           <div class="content-left-stereotyped-writing">
             <div class="stereotyped-writing">
               <input
                 v-model.trim="taskName"
                 type="text"
-                :disabled="isInpDisabled"
+                :disabled="isInpDisabled || type === 1"
                 class="stereotyped-writing-input"
                 placeholder="请输入自定义内容"
               />
@@ -60,7 +67,11 @@
             </div>
           </div>
         </div>
-        <div class="content-right"></div>
+        <div class="content-right">
+          <div class="stop-btn" v-if="type === 1" @click="stopTask">
+            紧急停止
+          </div>
+        </div>
       </div>
       <template #footer>
         <div class="my-button cancel" @click="handleCancel">取消</div>
@@ -77,30 +88,18 @@
 </template>
 
 <script lang="ts" setup>
-import { computed, ref } from "vue";
+import { computed, onUnmounted, ref, watch } from "vue";
 import dayjs from "dayjs";
-import { setTimeoutAlert } from "@/utils/httpApi";
+import { setTimeoutAlert, stopTimeoutAlert } from "@/utils/httpApi";
 import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen";
+import { taskOptions } from "@/store/type/task.type";
+import type { TaskItem } from "@/store/type/task.type";
 
 // @ts-ignore
 import TimePicker from "./TimePicker.vue";
 
 import closeImg from "@/img/close.png";
-import alertbaojin from "@/assets/alert.wav";
-import cxybaojing from "@/assets/cxy.mp3";
-import gybaojing from "@/assets/gy.mp3";
-import kclbaojing from "@/assets/kcl.mp3";
-import tdddbaojing from "@/assets/tzddd.mp3";
-import tzxllbaojing from "@/assets/tzxll.mp3";
-import cgbaojing from "@/assets/cg.mp3";
-import { ElMessage } from "element-plus";
-
-interface TaskItem {
-  label: string;
-  value: string;
-  backgroundColor: string;
-  promptTone: string;
-}
+import { ElMessage, ElMessageBox } from "element-plus";
 
 interface DateItem {
   label: string;
@@ -110,54 +109,12 @@
 const bedsideAuxiliaryScreenStore = useBedsideAuxiliaryScreenStore();
 
 const isShow = ref(false);
-
+const type = ref<0 | 1>(0); // 0 创建 | 1 查看
 const taskName = ref(""); // 任务名称
 const isInpDisabled = ref(false); // 输入框是否禁用
-
 const timeValue = ref("");
-
 const detaCheck = ref<number | null>(); // 这个是判断时间按钮的
-
 const loading = ref(false);
-
-const taskOptions = ref<TaskItem[]>([
-  {
-    label: "测血压",
-    value: "测血压",
-    backgroundColor: "#E6A23C",
-    promptTone: cxybaojing,
-  },
-  {
-    label: "开超滤",
-    value: "开超滤",
-    backgroundColor: "#E6A23C",
-    promptTone: kclbaojing,
-  },
-  {
-    label: "给药",
-    value: "给药",
-    backgroundColor: "#E6A23C",
-    promptTone: gybaojing,
-  },
-  {
-    label: "调电导度",
-    value: "调电导度",
-    backgroundColor: "#E6A23C",
-    promptTone: tdddbaojing,
-  },
-  {
-    label: "调血流量",
-    value: "调血流量",
-    backgroundColor: "#E6A23C",
-    promptTone: tzxllbaojing,
-  },
-  {
-    label: "冲管",
-    value: "冲管",
-    backgroundColor: "#E6A23C",
-    promptTone: cgbaojing,
-  },
-]);
 
 const dateOptions = ref<DateItem[]>([
   { label: "15分钟", value: 15 },
@@ -166,17 +123,101 @@
   { label: "60分钟", value: 60 },
 ]);
 
-const taskItemCheck = computed(() => {
-  return taskOptions.value.find((e) => e.value === taskName.value)?.value || "";
+let timer: ReturnType<typeof setInterval> | null = null;
+const countdown = ref(null); // 定时任务的倒计时
+
+const formattedCountdown = computed(() => {
+  if (countdown.value == null || countdown.value <= 0) return "0s";
+
+  const minutes = Math.floor(countdown.value / 60);
+  const seconds = countdown.value % 60;
+
+  if (minutes > 0) {
+    return `${minutes}m ${seconds}s`;
+  } else {
+    return `${seconds}s`;
+  }
 });
+
+const title = computed(() => {
+  return type.value ? "查看定时任务" : "创建定时任务";
+});
+
+const taskItemCheck = computed(() => {
+  return taskOptions.find((e) => e.value === taskName.value)?.value || "";
+});
+
+watch(
+  () => bedsideAuxiliaryScreenStore.taskData?.[0]?.countdown,
+  (val) => {
+    if (typeof val === "number") {
+      startCountdown(val);
+    } else {
+      clearTimer();
+    }
+  },
+  { immediate: true }
+);
+
+watch(countdown, (newVal) => {
+  if (newVal <= 0) {
+    loading.value = false;
+    handleCancel();
+    // ElMessage.warning('当前任务发生变化,请重新设置');
+  }
+});
+
+// 清除定时器函数
+function clearTimer() {
+  if (timer) {
+    clearInterval(timer);
+    timer = null;
+  }
+}
+
+// 启动新的倒计时
+function startCountdown(seconds: number) {
+  clearTimer();
+  countdown.value = seconds;
+
+  timer = setInterval(() => {
+    if (countdown.value > 0) {
+      countdown.value -= 1;
+    } else {
+      clearTimer();
+    }
+  }, 1000);
+}
 
 const openDialog = () => {
   isShow.value = true;
-  const time = dayjs();
-  timeValue.value = time.format("HH:mm");
+  if (
+    !bedsideAuxiliaryScreenStore.taskData ||
+    bedsideAuxiliaryScreenStore.taskData.length <= 0
+  ) {
+    const time = dayjs();
+    timeValue.value = time.format("HH:mm");
+    detaCheck.value = null;
+    isInpDisabled.value = false;
+    taskName.value = "";
+    type.value = 0;
+  } else {
+    const taskDataItem = bedsideAuxiliaryScreenStore.taskData[0];
+    timeValue.value = dayjs(taskDataItem.taskDate).format("HH:mm");
+    // 查是否是定型文的内容
+    const writing = taskOptions.find((e) => e.value === taskDataItem.taskName);
+    if (writing) {
+      taskName.value = writing.value;
+      isInpDisabled.value = true;
+    } else {
+      taskName.value = taskDataItem.taskName;
+    }
+    type.value = 1;
+  }
 };
 
 const onStereotypedWritingClick = (item: TaskItem) => {
+  if (type.value === 1) return;
   if (taskName.value === item.value) {
     taskName.value = "";
     isInpDisabled.value = false;
@@ -187,14 +228,9 @@
 };
 
 const onAddMinutesClick = (item: DateItem) => {
-  // if (detaCheck.value === item.value) {
-  //     detaCheck.value = null;
-  //     timeValue.value = addMinutes(timeValue.value, -item.value)
-  // } else {
+  if (type.value === 1) return;
   detaCheck.value = item.value;
   timeValue.value = addMinutes(timeValue.value, item.value);
-  // console.log('addMinutes(timeValue.value, item.value): ', addMinutes(timeValue.value, item.value))
-  // }
 };
 
 const addMinutes = (time: string, delta: number): string => {
@@ -246,12 +282,53 @@
       taskDate: dayjs(fullDateTime).format("YYYY-MM-DD HH:mm"),
       taskName: params.alertText,
       overdue: false,
+      sync: false,
+      countdown: diffMinutes * 60,
     });
+    // 这里得先把loading关了
+    loading.value = false;
     handleCancel();
+  } catch (error) {
+    console.log(error);
   } finally {
     loading.value = false;
   }
 };
+
+/** 停止任务 */
+const stopTask = () => {
+   ElMessageBox.confirm(
+    '是否确认停止当前任务?',
+    '提示',
+    {
+      confirmButtonText: '确认',
+      cancelButtonText: '取消',
+      type: 'warning',
+    }
+  )
+    .then(async () => {
+      loading.value = true;
+      try {
+        await stopTimeoutAlert(bedsideAuxiliaryScreenStore.deviceData.deviceCode);
+        bedsideAuxiliaryScreenStore.clearTask();
+        clearTimer();
+        loading.value = false;
+        handleCancel();
+        ElMessage.success('已停止')
+      } catch(error) {
+        ElMessage.error('操作失败:' + error)
+      } finally {
+        loading.value = false;
+      }
+    })
+    .catch(() => {
+
+    })
+};
+
+onUnmounted(() => {
+  clearTimer();
+});
 
 defineExpose({
   openDialog,
@@ -316,7 +393,7 @@
     }
   }
   .scheduled-task-content {
-    padding: 0 12px 0px;
+    padding: 0 12px 0px 12px;
     margin-bottom: 4px;
     border-bottom: 1px solid #d8d8d8;
     display: flex;
@@ -345,6 +422,27 @@
             text-align: center;
             font-size: 11px;
             background-color: #769aff;
+          }
+        }
+        .countdown {
+          flex: 1;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          margin-left: 5px;
+          .countdown-btn {
+            padding: 0 8px;
+            background: #769aff;
+            box-shadow: 1px 1 0px 0px rgba(130, 126, 126, 0.5);
+            border-radius: 2px;
+            font-family: PingFangSC, PingFang SC;
+            font-weight: 600;
+            font-size: 11px;
+            line-height: 23px;
+            color: #ffffff;
+            text-shadow: 1px 1px 0px rgba(130, 126, 126, 0.5);
+            text-align: left;
+            font-style: normal;
           }
         }
       }
@@ -405,6 +503,19 @@
     }
     .content-right {
       width: 59px;
+      padding: 0 3px;
+      .stop-btn {
+        width: 100%;
+        background: #ff7472;
+        border-radius: 2px;
+        font-family: PingFangSC, PingFang SC;
+        font-weight: 600;
+        font-size: 6px;
+        color: #ffffff;
+        line-height: 18px;
+        text-align: center;
+        font-style: normal;
+      }
     }
   }
   .my-button {

--
Gitblit v1.8.0