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 | 21 | enum DropMenuEvent { |
22 | 22 | DELETE = 'DELETE', |
23 | 23 | EDIT = 'EDIT', |
24 | + DETAIL = 'DETAIL', | |
24 | 25 | } |
25 | 26 | |
26 | 27 | const props = withDefaults( |
... | ... | @@ -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 | 41 | const loading = ref(false); |
41 | 42 | |
... | ... | @@ -131,6 +132,12 @@ |
131 | 132 | :trigger="['hover']" |
132 | 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 | 141 | text: '编辑', |
135 | 142 | event: DropMenuEvent.DELETE, |
136 | 143 | disabled: !!getRecord.state, | ... | ... |
... | ... | @@ -18,13 +18,11 @@ export enum FormFieldsEnum { |
18 | 18 | export enum TaskTargetEnum { |
19 | 19 | DEVICES = 'DEVICES', |
20 | 20 | PRODUCTS = 'PRODUCTS', |
21 | - ALL = 'all', | |
22 | 21 | } |
23 | 22 | |
24 | 23 | export enum TaskTargetNameEnum { |
25 | 24 | DEVICES = '设备', |
26 | 25 | PRODUCTS = '产品', |
27 | - ALL = '不限任务目标类型', | |
28 | 26 | } |
29 | 27 | |
30 | 28 | export enum TaskTypeEnum { | ... | ... |
... | ... | @@ -17,8 +17,11 @@ |
17 | 17 | import { Authority } from '/@/components/Authority'; |
18 | 18 | import { getBoundingClientRect } from '/@/utils/domUtils'; |
19 | 19 | import { RunTaskModal } from './components/RunTaskModal'; |
20 | + import { DetailDrawer } from './components/DetailDrawer'; | |
21 | + import { useDrawer } from '/@/components/Drawer'; | |
20 | 22 | |
21 | 23 | const [registerModal, { openModal }] = useModal(); |
24 | + const [registerDrawer, { openDrawer }] = useDrawer(); | |
22 | 25 | const [registerRunTaskModal, { openModal: openRunTaskModal }] = useModal(); |
23 | 26 | |
24 | 27 | const [registerForm, { getFieldsValue }] = useForm({ |
... | ... | @@ -66,6 +69,10 @@ |
66 | 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 | 76 | const reload = () => getDataSource(); |
70 | 77 | |
71 | 78 | const listElRef = ref<Nullable<ComponentElRef>>(null); |
... | ... | @@ -136,11 +143,18 @@ |
136 | 143 | </template> |
137 | 144 | <template #renderItem="{ item }"> |
138 | 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 | 153 | </List.Item> |
141 | 154 | </template> |
142 | 155 | </List> |
143 | 156 | </section> |
157 | + <DetailDrawer @register="registerDrawer" /> | |
144 | 158 | <DetailModal @register="registerModal" :reload="reload" /> |
145 | 159 | <RunTaskModal :reload="reload" @register="registerRunTaskModal" /> |
146 | 160 | </PageWrapper> | ... | ... |