Showing
6 changed files
with
162 additions
and
4 deletions
| 1 | +import { DescItem } from '/@/components/Description'; | ||
| 2 | +import { | ||
| 3 | + ExecuteTimeTypeEnum, | ||
| 4 | + ExecuteTimeTypeNameEnum, | ||
| 5 | + FormFieldsEnum, | ||
| 6 | + PeriodTypeNameEnum, | ||
| 7 | +} from '../DetailModal/config'; | ||
| 8 | +import { TaskStatusEnum, TaskTargetEnum, TaskTargetNameEnum } from '../../config'; | ||
| 9 | +import { h } from 'vue'; | ||
| 10 | +import { Tag } from 'ant-design-vue'; | ||
| 11 | +import { TaskStatusNameEnum } from '../../config'; | ||
| 12 | +import { TaskRecordType } from '/@/api/task/model'; | ||
| 13 | +import { TaskTypeNameEnum } from '../../config'; | ||
| 14 | +import { TimeUnitNameEnum } from '/@/enums/toolEnum'; | ||
| 15 | +import { PeriodTypeEnum } from '../DetailModal/config'; | ||
| 16 | + | ||
| 17 | +enum WeekEnum { | ||
| 18 | + MON = 'MON', | ||
| 19 | + TUES = 'TUES', | ||
| 20 | + WED = 'WED', | ||
| 21 | + THUR = 'THUR', | ||
| 22 | + FRI = 'FRI', | ||
| 23 | + SAT = 'SAT', | ||
| 24 | + SUN = 'SUN', | ||
| 25 | +} | ||
| 26 | + | ||
| 27 | +enum WeekNameEnum { | ||
| 28 | + MON = '星期一', | ||
| 29 | + TUES = '星期二', | ||
| 30 | + WED = '星期三', | ||
| 31 | + THUR = '星期四', | ||
| 32 | + FRI = '星期五', | ||
| 33 | + SAT = '星期六', | ||
| 34 | + SUN = '星期天', | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +const isWeek = (string: string) => { | ||
| 38 | + return Object.keys(WeekEnum).some((item) => string.includes(item)); | ||
| 39 | +}; | ||
| 40 | + | ||
| 41 | +const extractCronExpression = (expression: string) => { | ||
| 42 | + const flag = isWeek(expression); | ||
| 43 | + const list = expression.split(' '); | ||
| 44 | + const unit = flag ? list[list.length - 1] : list[3]; | ||
| 45 | + return flag ? WeekNameEnum[unit] : unit; | ||
| 46 | +}; | ||
| 47 | + | ||
| 48 | +export const schemas: DescItem[] = [ | ||
| 49 | + { | ||
| 50 | + field: FormFieldsEnum.NAME, | ||
| 51 | + label: '任务名', | ||
| 52 | + }, | ||
| 53 | + { | ||
| 54 | + field: FormFieldsEnum.TARGET_TYPE, | ||
| 55 | + label: '目标类型', | ||
| 56 | + render(val: TaskTargetEnum) { | ||
| 57 | + return h( | ||
| 58 | + Tag, | ||
| 59 | + { color: val === TaskTargetEnum.DEVICES ? 'blue' : 'cyan' }, | ||
| 60 | + () => TaskTargetNameEnum[val] | ||
| 61 | + ); | ||
| 62 | + }, | ||
| 63 | + }, | ||
| 64 | + { | ||
| 65 | + field: 'state', | ||
| 66 | + label: '任务状态', | ||
| 67 | + render(val: TaskStatusEnum) { | ||
| 68 | + return h( | ||
| 69 | + Tag, | ||
| 70 | + { color: val === TaskStatusEnum.NORMAL ? 'success' : 'error' }, | ||
| 71 | + () => TaskStatusNameEnum[TaskStatusEnum[val]] | ||
| 72 | + ); | ||
| 73 | + }, | ||
| 74 | + }, | ||
| 75 | + { | ||
| 76 | + field: FormFieldsEnum.EXECUTE_CONTENT_TYPE, | ||
| 77 | + label: '任务类型', | ||
| 78 | + render(_val: any, data: TaskRecordType) { | ||
| 79 | + return TaskTypeNameEnum[data.executeContent.type]; | ||
| 80 | + }, | ||
| 81 | + }, | ||
| 82 | + { | ||
| 83 | + field: FormFieldsEnum.EXECUTE_TIME_TYPE, | ||
| 84 | + label: '定时方式', | ||
| 85 | + render(_val: any, data: TaskRecordType) { | ||
| 86 | + return ExecuteTimeTypeNameEnum[data.executeTime.type]; | ||
| 87 | + }, | ||
| 88 | + }, | ||
| 89 | + { | ||
| 90 | + field: FormFieldsEnum.EXECUTE_TIME_INTERVAL, | ||
| 91 | + label: '间隔时间', | ||
| 92 | + render(_val: any, data: TaskRecordType) { | ||
| 93 | + const { executeTime } = data; | ||
| 94 | + const { time, type, periodType, pollUnit, period } = executeTime; | ||
| 95 | + console.log({ time, type, periodType, pollUnit }); | ||
| 96 | + return type === ExecuteTimeTypeEnum.POLL | ||
| 97 | + ? `${time}${TimeUnitNameEnum[pollUnit]}` | ||
| 98 | + : `${PeriodTypeNameEnum[periodType]} ${ | ||
| 99 | + periodType === PeriodTypeEnum.DAY | ||
| 100 | + ? '' | ||
| 101 | + : `/ ${extractCronExpression(period)}${isWeek(period) ? '' : '号'}` | ||
| 102 | + } / ${time}`; | ||
| 103 | + }, | ||
| 104 | + }, | ||
| 105 | + { | ||
| 106 | + field: 'createTime', | ||
| 107 | + label: '创建时间', | ||
| 108 | + }, | ||
| 109 | + { | ||
| 110 | + field: 'updateTime', | ||
| 111 | + label: '修改时间', | ||
| 112 | + }, | ||
| 113 | +]; |
| 1 | +export { default as DetailDrawer } from './index.vue'; |
| 1 | +<script lang="ts" setup> | ||
| 2 | + import { useDescription, Description } from '/@/components/Description'; | ||
| 3 | + import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | ||
| 4 | + import { schemas } from './config'; | ||
| 5 | + import { ModalParamsType } from '/#/utils'; | ||
| 6 | + import { TaskRecordType } from '/@/api/task/model'; | ||
| 7 | + defineEmits(['register']); | ||
| 8 | + | ||
| 9 | + const [registerDrawer] = useDrawerInner((data: ModalParamsType<TaskRecordType>) => { | ||
| 10 | + const { record } = data; | ||
| 11 | + setDescProps({ data: record }); | ||
| 12 | + }); | ||
| 13 | + | ||
| 14 | + const [registerDescription, { setDescProps }] = useDescription({ | ||
| 15 | + schema: schemas, | ||
| 16 | + labelStyle: { width: '120px' }, | ||
| 17 | + column: 1, | ||
| 18 | + }); | ||
| 19 | +</script> | ||
| 20 | + | ||
| 21 | +<template> | ||
| 22 | + <BasicDrawer title="任务详情" @register="registerDrawer" width="30%"> | ||
| 23 | + <Description @register="registerDescription" /> | ||
| 24 | + </BasicDrawer> | ||
| 25 | +</template> |
| @@ -21,6 +21,7 @@ | @@ -21,6 +21,7 @@ | ||
| 21 | enum DropMenuEvent { | 21 | enum DropMenuEvent { |
| 22 | DELETE = 'DELETE', | 22 | DELETE = 'DELETE', |
| 23 | EDIT = 'EDIT', | 23 | EDIT = 'EDIT', |
| 24 | + DETAIL = 'DETAIL', | ||
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | const props = withDefaults( | 27 | const props = withDefaults( |
| @@ -35,7 +36,7 @@ | @@ -35,7 +36,7 @@ | ||
| 35 | } | 36 | } |
| 36 | ); | 37 | ); |
| 37 | 38 | ||
| 38 | - const emit = defineEmits(['edit', 'runTask']); | 39 | + const emit = defineEmits(['edit', 'runTask', 'detail']); |
| 39 | 40 | ||
| 40 | const loading = ref(false); | 41 | const loading = ref(false); |
| 41 | 42 | ||
| @@ -131,6 +132,12 @@ | @@ -131,6 +132,12 @@ | ||
| 131 | :trigger="['hover']" | 132 | :trigger="['hover']" |
| 132 | :drop-menu-list="[ | 133 | :drop-menu-list="[ |
| 133 | { | 134 | { |
| 135 | + text: '详情', | ||
| 136 | + event: DropMenuEvent.DETAIL, | ||
| 137 | + icon: 'ant-design:eye-outlined', | ||
| 138 | + onClick: emit.bind(null, 'detail', getRecord), | ||
| 139 | + }, | ||
| 140 | + { | ||
| 134 | text: '编辑', | 141 | text: '编辑', |
| 135 | event: DropMenuEvent.DELETE, | 142 | event: DropMenuEvent.DELETE, |
| 136 | disabled: !!getRecord.state, | 143 | disabled: !!getRecord.state, |
| @@ -18,13 +18,11 @@ export enum FormFieldsEnum { | @@ -18,13 +18,11 @@ export enum FormFieldsEnum { | ||
| 18 | export enum TaskTargetEnum { | 18 | export enum TaskTargetEnum { |
| 19 | DEVICES = 'DEVICES', | 19 | DEVICES = 'DEVICES', |
| 20 | PRODUCTS = 'PRODUCTS', | 20 | PRODUCTS = 'PRODUCTS', |
| 21 | - ALL = 'all', | ||
| 22 | } | 21 | } |
| 23 | 22 | ||
| 24 | export enum TaskTargetNameEnum { | 23 | export enum TaskTargetNameEnum { |
| 25 | DEVICES = '设备', | 24 | DEVICES = '设备', |
| 26 | PRODUCTS = '产品', | 25 | PRODUCTS = '产品', |
| 27 | - ALL = '不限任务目标类型', | ||
| 28 | } | 26 | } |
| 29 | 27 | ||
| 30 | export enum TaskTypeEnum { | 28 | export enum TaskTypeEnum { |
| @@ -17,8 +17,11 @@ | @@ -17,8 +17,11 @@ | ||
| 17 | import { Authority } from '/@/components/Authority'; | 17 | import { Authority } from '/@/components/Authority'; |
| 18 | import { getBoundingClientRect } from '/@/utils/domUtils'; | 18 | import { getBoundingClientRect } from '/@/utils/domUtils'; |
| 19 | import { RunTaskModal } from './components/RunTaskModal'; | 19 | import { RunTaskModal } from './components/RunTaskModal'; |
| 20 | + import { DetailDrawer } from './components/DetailDrawer'; | ||
| 21 | + import { useDrawer } from '/@/components/Drawer'; | ||
| 20 | 22 | ||
| 21 | const [registerModal, { openModal }] = useModal(); | 23 | const [registerModal, { openModal }] = useModal(); |
| 24 | + const [registerDrawer, { openDrawer }] = useDrawer(); | ||
| 22 | const [registerRunTaskModal, { openModal: openRunTaskModal }] = useModal(); | 25 | const [registerRunTaskModal, { openModal: openRunTaskModal }] = useModal(); |
| 23 | 26 | ||
| 24 | const [registerForm, { getFieldsValue }] = useForm({ | 27 | const [registerForm, { getFieldsValue }] = useForm({ |
| @@ -66,6 +69,10 @@ | @@ -66,6 +69,10 @@ | ||
| 66 | openRunTaskModal(true, record); | 69 | openRunTaskModal(true, record); |
| 67 | }; | 70 | }; |
| 68 | 71 | ||
| 72 | + const handleDetail = (record: TaskRecordType) => { | ||
| 73 | + openDrawer(true, { mode: DataActionModeEnum.READ, record } as ModalParamsType); | ||
| 74 | + }; | ||
| 75 | + | ||
| 69 | const reload = () => getDataSource(); | 76 | const reload = () => getDataSource(); |
| 70 | 77 | ||
| 71 | const listElRef = ref<Nullable<ComponentElRef>>(null); | 78 | const listElRef = ref<Nullable<ComponentElRef>>(null); |
| @@ -136,11 +143,18 @@ | @@ -136,11 +143,18 @@ | ||
| 136 | </template> | 143 | </template> |
| 137 | <template #renderItem="{ item }"> | 144 | <template #renderItem="{ item }"> |
| 138 | <List.Item :key="item.id"> | 145 | <List.Item :key="item.id"> |
| 139 | - <TaskCard :record="item" :reload="reload" @runTask="handleRunTask" @edit="handleEdit" /> | 146 | + <TaskCard |
| 147 | + :record="item" | ||
| 148 | + :reload="reload" | ||
| 149 | + @runTask="handleRunTask" | ||
| 150 | + @detail="handleDetail" | ||
| 151 | + @edit="handleEdit" | ||
| 152 | + /> | ||
| 140 | </List.Item> | 153 | </List.Item> |
| 141 | </template> | 154 | </template> |
| 142 | </List> | 155 | </List> |
| 143 | </section> | 156 | </section> |
| 157 | + <DetailDrawer @register="registerDrawer" /> | ||
| 144 | <DetailModal @register="registerModal" :reload="reload" /> | 158 | <DetailModal @register="registerModal" :reload="reload" /> |
| 145 | <RunTaskModal :reload="reload" @register="registerRunTaskModal" /> | 159 | <RunTaskModal :reload="reload" @register="registerRunTaskModal" /> |
| 146 | </PageWrapper> | 160 | </PageWrapper> |