Commit 814ad1f57fda3e72903045b35a7e79cd9f48c9cd

Authored by ww
1 parent 86532274

perf: DEFECT-1173 任务中心新增详情页面

  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>