| | |
| | | title="定时任务" |
| | | width="80%" |
| | | :show-close="false" |
| | | class="scheduled-task-dialog" |
| | | top="0" |
| | | > |
| | | <template #header> |
| | | <div class="scheduled-task-header"> |
| | |
| | | <div class="content-left"> |
| | | <div class="content-left-date"> |
| | | <TimePicker v-model="timeValue" /> |
| | | <div class="date-btn"></div> |
| | | <div class="date-btn"> |
| | | <div |
| | | v-for="(item, index) in dateOptions" |
| | | :key="index" |
| | | class="my-button date" |
| | | @click="onAddMinutesClick(item)" |
| | | > |
| | | {{ item.label }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="content-left-stereotyped-writing"> |
| | | <div class="stereotyped-writing"> |
| | |
| | | <script lang="ts" setup> |
| | | import { computed, ref } from "vue"; |
| | | // @ts-ignore |
| | | import TimePicker from './TimePicker.vue' |
| | | import TimePicker from "./TimePicker.vue"; |
| | | |
| | | import closeImg from "@/img/close.png"; |
| | | import alertbaojin from "@/assets/alert.wav"; |
| | |
| | | } |
| | | |
| | | interface DateItem { |
| | | label: string; |
| | | value: number; |
| | | label: string; |
| | | value: number; |
| | | } |
| | | |
| | | const isShow = ref(false); |
| | |
| | | const taskName = ref(""); // 任务名称 |
| | | const isInpDisabled = ref(false); // 输入框是否禁用 |
| | | |
| | | const timeValue = ref('19:16'); |
| | | const timeValue = ref("19:16"); |
| | | |
| | | const detaCheck = ref<number | null>(); // 这个是判断时间按钮的 |
| | | |
| | |
| | | }, |
| | | ]); |
| | | |
| | | |
| | | const dateOptions = ref<DateItem[]>([ |
| | | { label: '15分钟', value: 15 }, |
| | | { label: '30分钟', value: 30 }, |
| | | { label: '45分钟', value: 45 }, |
| | | { label: '60分钟', value: 60 }, |
| | | { label: "15分钟", value: 15 }, |
| | | { label: "30分钟", value: 30 }, |
| | | { label: "45分钟", value: 45 }, |
| | | { label: "60分钟", value: 60 }, |
| | | ]); |
| | | |
| | | const taskItemCheck = computed(() => { |
| | |
| | | taskName.value = item.value; |
| | | isInpDisabled.value = true; |
| | | } |
| | | }; |
| | | |
| | | 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 => { |
| | | const [hours, minutes] = time.split(":").map(Number); |
| | | const totalMinutes = hours * 60 + minutes + delta; |
| | | |
| | | // 处理负数和超过 1440(一天分钟数)情况 |
| | | const normalized = (totalMinutes + 1440) % 1440; |
| | | |
| | | const newHours = Math.floor(normalized / 60); |
| | | const newMinutes = normalized % 60; |
| | | |
| | | return `${newHours.toString().padStart(2, "0")}:${newMinutes |
| | | .toString() |
| | | .padStart(2, "0")}`; |
| | | }; |
| | | |
| | | const handleCancel = () => { |
| | |
| | | padding-right: 12px; |
| | | .content-left-date { |
| | | border-bottom: 1px solid #d8d8d8; |
| | | |
| | | display: flex; |
| | | |
| | | .date-btn { |
| | | flex: 1; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 9px; |
| | | margin-left: 5px; |
| | | justify-content: flex-end; |
| | | .date { |
| | | margin-left: 0; |
| | | padding: 0; |
| | | width: 50px; |
| | | height: 23px; |
| | | line-height: 23px; |
| | | text-align: center; |
| | | font-size: 11px; |
| | | background-color: #769aff; |
| | | } |
| | | } |
| | | } |
| | | .content-left-stereotyped-writing { |
| | | .stereotyped-writing { |
| | |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | | <style> |
| | | .scheduled-task-dialog { |
| | | margin: 0 auto; |
| | | top: 50% !important; |
| | | transform: translateY(-50%) !important; |
| | | } |
| | | </style> |