From 58a343b3b9cf80c5d778fbe28672f198b366ea0c Mon Sep 17 00:00:00 2001
From: zhangchen <1652267879@qq.com>
Date: 星期六, 26 七月 2025 14:14:36 +0800
Subject: [PATCH] ID1625-定时任务修改完成
---
src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue | 205 +++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 175 insertions(+), 30 deletions(-)
diff --git a/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue b/src/views/mobile/bedsideAuxiliaryScreen/components/ScheduledTask.vue
index 58d72f4..d931077 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"
@@ -26,7 +26,8 @@
<div class="content-left">
<div class="content-left-date">
<TimePicker v-model="timeValue" />
- <div class="date-btn">
+ <!-- 创建的情况 -->
+ <div class="date-btn" v-if="type === 0">
<div
v-for="(item, index) in dateOptions"
:key="index"
@@ -34,6 +35,12 @@
@click="onAddMinutesClick(item)"
>
{{ item.label }}
+ </div>
+ </div>
+ <!-- 查看的情况 -->
+ <div class="countdown" v-else>
+ <div class="countdown-btn">
+ 剩余时间:{{ formattedCountdown }}
</div>
</div>
</div>
@@ -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,26 +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, stopTimeoutAlert } from "@/utils/httpApi";
import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen";
-import { taskOptions } from '@/store/type/task.type';
-import type { TaskItem } from '@/store/type/task.type';
+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";
-
+import { ElMessage, ElMessageBox } from "element-plus";
interface DateItem {
label: string;
@@ -106,16 +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 dateOptions = ref<DateItem[]>([
{ label: "15分钟", value: 15 },
@@ -124,14 +123,97 @@
{ label: "60分钟", value: 60 },
]);
+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) => {
@@ -145,14 +227,8 @@
};
const onAddMinutesClick = (item: DateItem) => {
- // if (detaCheck.value === item.value) {
- // detaCheck.value = null;
- // timeValue.value = addMinutes(timeValue.value, -item.value)
- // } else {
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 => {
@@ -211,11 +287,46 @@
loading.value = false;
handleCancel();
} catch (error) {
- console.log(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,
@@ -280,7 +391,7 @@
}
}
.scheduled-task-content {
- padding: 0 12px 0px;
+ padding: 0 12px 0px 12px;
margin-bottom: 4px;
border-bottom: 1px solid #d8d8d8;
display: flex;
@@ -309,6 +420,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;
}
}
}
@@ -369,6 +501,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