| | |
| | | <template> |
| | | <div class="scheduled-task-container"> |
| | | <el-dialog |
| | | v-model="isShow" |
| | | center |
| | | title="定时任务" |
| | | width="80%" |
| | | :show-close="false" |
| | | > |
| | | <template #header> |
| | | <div class="scheduled-task-header"> |
| | | <span class="header-title">创建定时任务</span> |
| | | <img |
| | | :src="closeImg" |
| | | class="header-close" |
| | | @click="handleCancel" |
| | | alt="" |
| | | /> |
| | | </div> |
| | | </template> |
| | | <div class="scheduled-task-content"> |
| | | <div class="content-left"> |
| | | <div class="content-left-date"> |
| | | <TimePicker v-model="timeValue" /> |
| | | <div class="date-btn"></div> |
| | | </div> |
| | | <div class="content-left-stereotyped-writing"> |
| | | <div class="stereotyped-writing"> |
| | | <input |
| | | v-model="taskName" |
| | | type="text" |
| | | :disabled="isInpDisabled" |
| | | class="stereotyped-writing-input" |
| | | placeholder="请输入自定义内容" |
| | | /> |
| | | </div> |
| | | <div class="stereotyped-writing-list"> |
| | | <div |
| | | v-for="(item, index) in taskOptions" |
| | | :key="index" |
| | | class="my-button list-item" |
| | | @click="onStereotypedWritingClick(item)" |
| | | :class="taskItemCheck === item.value ? 'check' : ''" |
| | | > |
| | | {{ item.label }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="content-right"></div> |
| | | </div> |
| | | <template #footer> |
| | | <div class="my-button cancel" @click="handleCancel">取消</div> |
| | | <div class="my-button confirm" @click="handleConfirm">确认</div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { computed, ref } from "vue"; |
| | | // @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"; |
| | | |
| | | interface TaskItem { |
| | | label: string; |
| | | value: string; |
| | | backgroundColor: string; |
| | | promptTone: string; |
| | | } |
| | | |
| | | interface DateItem { |
| | | label: string; |
| | | value: number; |
| | | } |
| | | |
| | | const isShow = ref(false); |
| | | |
| | | const taskName = ref(""); // 任务名称 |
| | | const isInpDisabled = ref(false); // 输入框是否禁用 |
| | | |
| | | const timeValue = ref('19:16'); |
| | | |
| | | const detaCheck = ref<number | null>(); // 这个是判断时间按钮的 |
| | | |
| | | 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 }, |
| | | { label: '30分钟', value: 30 }, |
| | | { label: '45分钟', value: 45 }, |
| | | { label: '60分钟', value: 60 }, |
| | | ]); |
| | | |
| | | const taskItemCheck = computed(() => { |
| | | return taskOptions.value.find((e) => e.value === taskName.value)?.value || ""; |
| | | }); |
| | | |
| | | const openDialog = () => { |
| | | isShow.value = true; |
| | | }; |
| | | |
| | | const onStereotypedWritingClick = (item: TaskItem) => { |
| | | if (taskName.value === item.value) { |
| | | taskName.value = ""; |
| | | isInpDisabled.value = false; |
| | | } else { |
| | | taskName.value = item.value; |
| | | isInpDisabled.value = true; |
| | | } |
| | | }; |
| | | |
| | | const handleCancel = () => { |
| | | isShow.value = false; |
| | | }; |
| | | |
| | | const handleConfirm = () => {}; |
| | | |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | * { |
| | | box-sizing: border-box; |
| | | } |
| | | .scheduled-task-container { |
| | | ::v-deep(.el-dialog) { |
| | | padding: 0; |
| | | border-radius: 6px; |
| | | overflow: hidden; |
| | | } |
| | | ::v-deep(.el-dialog__footer) { |
| | | padding: 4px; |
| | | } |
| | | ::v-deep(.el-upload-dragger) { |
| | | height: 65px; |
| | | padding: 0 !important; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | ::v-deep(.el-upload-dragger .el-icon--upload) { |
| | | display: none; |
| | | } |
| | | ::v-deep(.el-dialog__header) { |
| | | padding-bottom: 6px; |
| | | } |
| | | .scheduled-task-header { |
| | | position: relative; |
| | | height: 16px; |
| | | background: #ff7472; |
| | | .header-title { |
| | | position: absolute; |
| | | left: 50%; |
| | | top: 50%; |
| | | transform: translateX(-50%) translateY(-50%); |
| | | font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; |
| | | font-weight: 500; |
| | | font-size: 8px; |
| | | color: #ffffff; |
| | | line-height: 11px; |
| | | text-align: center; |
| | | } |
| | | .header-close { |
| | | position: absolute; |
| | | top: 50%; |
| | | transform: translateY(-50%); |
| | | right: 6px; |
| | | width: 15px; |
| | | height: 15px; |
| | | transition: transform 0.2s; |
| | | |
| | | &:active { |
| | | opacity: 0.6; |
| | | transform: translateY(-50%) scale(0.95); |
| | | } |
| | | } |
| | | } |
| | | .scheduled-task-content { |
| | | padding: 0 12px 0px; |
| | | margin-bottom: 4px; |
| | | border-bottom: 1px solid #d8d8d8; |
| | | display: flex; |
| | | .content-left { |
| | | flex: 1; |
| | | border-right: 1px solid #d8d8d8; |
| | | padding-bottom: 6px; |
| | | padding-right: 12px; |
| | | .content-left-date { |
| | | border-bottom: 1px solid #d8d8d8; |
| | | |
| | | } |
| | | .content-left-stereotyped-writing { |
| | | .stereotyped-writing { |
| | | position: relative; |
| | | height: 16px; |
| | | padding-top: 6px; |
| | | margin-bottom: 6px; |
| | | border-radius: 2px; |
| | | border: 1px solid #979797; |
| | | overflow: hidden; |
| | | .stereotyped-writing-input { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | border: none; |
| | | outline: none; |
| | | padding: 0 4px; |
| | | line-height: 16px; |
| | | font-size: 9px; |
| | | font-family: PingFangSC, PingFang SC; |
| | | vertical-align: middle; |
| | | box-sizing: border-box; // 避免padding撑高 |
| | | |
| | | &::placeholder { |
| | | font-family: inherit; |
| | | font-size: inherit; |
| | | line-height: inherit; |
| | | color: #aaaaaa; |
| | | opacity: 1; |
| | | } |
| | | &:disabled { |
| | | background-color: #f5f5f5; // 灰色背景 |
| | | color: #999999; // 灰色文字 |
| | | cursor: not-allowed; |
| | | } |
| | | } |
| | | } |
| | | .stereotyped-writing-list { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 7px; |
| | | .list-item { |
| | | width: 40px; |
| | | margin-left: 0; |
| | | padding-left: 0; |
| | | padding-right: 0; |
| | | background-color: #e6a23c; |
| | | &.check { |
| | | background-color: #bbc6dd; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .content-right { |
| | | width: 59px; |
| | | } |
| | | } |
| | | .my-button { |
| | | display: inline-block; |
| | | border-radius: 2px; |
| | | padding: 0px 10px; |
| | | font-family: PingFangSC, PingFang SC; |
| | | font-weight: 500; |
| | | font-size: 7px; |
| | | color: #ffffff; |
| | | line-height: 16px; |
| | | letter-spacing: 1px; |
| | | text-align: center; |
| | | font-style: normal; |
| | | transition: transform 0.1s ease, opacity 0.1s ease; |
| | | cursor: pointer; |
| | | &:active { |
| | | transform: scale(0.95); |
| | | opacity: 0.8; |
| | | } |
| | | |
| | | &:not(:first-child) { |
| | | margin-left: 6px; |
| | | } |
| | | &.cancel { |
| | | background: #bbc6dd; |
| | | } |
| | | &.confirm { |
| | | background: #769aff; |
| | | } |
| | | &.refresh { |
| | | background: #e6a23c; |
| | | } |
| | | } |
| | | } |
| | | </style> |