Skip to content

Commit 02b3048

Browse files
committed
feat: 任务列表-周期任务 执行/取消执行/删除功能完成
1 parent 5b3f7c4 commit 02b3048

File tree

7 files changed

+268
-39
lines changed

7 files changed

+268
-39
lines changed

.env.development

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# 高鹏 本地
2-
# VITE_BASE_URL = "http://192.168.3.3:8082/"
2+
VITE_BASE_URL = "http://192.168.3.3:8082/"
33

44
# 秦晨凯 本地
5-
VITE_BASE_URL = "http://192.168.3.179:8082/"
5+
# VITE_BASE_URL = "http://192.168.3.179:8082/"
66

77
# 线上 地址
88
# "http://legion-4g.yaklang.com:8080/pre/"

src/compoments/WizardTable/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ const WizardTable = <T extends AnyObject = AnyObject>(
4444
const { runAsync } = useRequest(
4545
async (requests, reset?: boolean, arg?: any) => {
4646
dispatch({ loading: true });
47-
console.log(dataSource, page, 'data');
4847
try {
4948
if (!state.loading) {
5049
const data = await requests(

src/pages/TaskPageList/compoment/Columns.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ const CommonTasksColumns = (
3535
const {
3636
data: { list },
3737
} = result;
38-
const resultData = list.map((it) => ({ label: it, value: it }));
38+
const resultData = Array.isArray(list)
39+
? list.map((it) => ({ label: it, value: it }))
40+
: [];
3941
return resultData;
4042
});
4143

@@ -156,14 +158,12 @@ const CommonTasksColumns = (
156158
// 周期任务 任务状态
157159
const executionTaskStatus: TColumns['columnsRender'] = [
158160
{
159-
title: '任务状态',
161+
title: '周期状态',
160162
dataIndex: 'task_status',
161163
width: 240,
162164
columnsHeaderFilterType: 'checkbox',
163165
wizardColumnsOptions: taskListStatus.filter((it) =>
164-
['disabled', 'waiting', 'finished', 'enabled'].includes(
165-
it.value,
166-
),
166+
['disabled', 'finished', 'enabled'].includes(it.value),
167167
),
168168
render: (_, record) => TaskStatus(record?.status),
169169
},

src/pages/TaskPageList/compoment/TaskOperateTableRender.tsx

Lines changed: 98 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ const PublicAndExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
100100
},
101101
},
102102
);
103-
104103
// 确定执行操作
105104
const headImplement = async () => {
106105
if (record.id) {
@@ -134,7 +133,6 @@ const PublicAndExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
134133
},
135134
},
136135
);
137-
138136
// 取消执行操作
139137
const headTaskStop = async () => {
140138
if (record.id) {
@@ -488,6 +486,94 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
488486
},
489487
);
490488

489+
// 删除任务
490+
const { runAsync: deleteRunAsync, loading: DeleteLoading } = useRequest(
491+
async (id: number) => {
492+
const result = await deleteTask(id);
493+
return result;
494+
},
495+
{ manual: true },
496+
);
497+
const headDeleteTask = async () => {
498+
if (record.id) {
499+
await deleteRunAsync(record.id);
500+
localRefrech({ operate: 'delete', oldObj: { id: record.id } });
501+
message.success('删除成功');
502+
setOpen((val) => ({ ...val, delete: false }));
503+
} else {
504+
message.error('未获取到当前任务ID');
505+
}
506+
};
507+
508+
// 取消执行
509+
const { loading: stopRunning, runAsync: stopRunAsync } = useRequest(
510+
async (params: StopOnRunTsakResponse) => {
511+
const result = await getTaskStop(params);
512+
const { data } = result;
513+
return data;
514+
},
515+
{
516+
manual: true,
517+
onSuccess: async (value) => {
518+
localRefrech({
519+
operate: 'edit',
520+
newObj: value,
521+
oldObj: record,
522+
});
523+
message.success('取消执行成功');
524+
setOpen((val) => ({ ...val, action: false }));
525+
},
526+
onError(error) {
527+
message.destroy();
528+
message.error(error?.message ?? '取消执行失败');
529+
},
530+
},
531+
);
532+
// 取消执行操作
533+
const headTaskStop = async () => {
534+
if (record.id) {
535+
await stopRunAsync({
536+
task_id: record.id,
537+
task_type: headerGroupValue,
538+
});
539+
} else {
540+
message.error('未获取到当前任务ID');
541+
}
542+
};
543+
544+
// 执行
545+
const { loading: starLoading, runAsync } = useRequest(
546+
async (params: StopOnRunTsakResponse) => {
547+
const result = await getTaskRun(params);
548+
const { data } = result;
549+
return data;
550+
},
551+
{
552+
manual: true,
553+
onSuccess: async (value) => {
554+
localRefrech({
555+
operate: 'edit',
556+
newObj: value,
557+
oldObj: record,
558+
});
559+
message.success('执行成功');
560+
setOpen((val) => ({ ...val, action: false }));
561+
},
562+
onError(error) {
563+
message.destroy();
564+
message.error(error?.message ?? '执行失败');
565+
},
566+
},
567+
);
568+
// 确定执行操作
569+
const headImplement = async () => {
570+
if (record.id) {
571+
await runAsync({ task_id: record.id, task_type: headerGroupValue });
572+
} else {
573+
message.error('未获取到当前任务ID');
574+
}
575+
};
576+
491577
// 编辑任务
492578
const onEdit = async () => {
493579
if (record?.id) {
@@ -560,8 +646,8 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
560646
style={{
561647
fontSize: '12px',
562648
}}
563-
// onClick={headDeleteTask}
564-
// loading={DeleteLoading}
649+
onClick={headDeleteTask}
650+
loading={DeleteLoading}
565651
>
566652
确定
567653
</Button>
@@ -606,7 +692,7 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
606692
)
607693
.with(P.string, (value) => (
608694
<div className="flex">
609-
{(value === 'waiting' || value === 'disabled') && (
695+
{value === 'disabled' && (
610696
<Popover
611697
open={open.action}
612698
content={
@@ -630,8 +716,8 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
630716
style={{
631717
fontSize: '12px',
632718
}}
633-
// onClick={headImplement}
634-
// loading={loading}
719+
onClick={headImplement}
720+
loading={starLoading}
635721
>
636722
确定
637723
</Button>
@@ -682,8 +768,8 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
682768
style={{
683769
fontSize: '12px',
684770
}}
685-
// onClick={headTaskStop}
686-
// loading={stopRunning}
771+
onClick={headTaskStop}
772+
loading={stopRunning}
687773
>
688774
确定
689775
</Button>
@@ -710,9 +796,9 @@ const ExecutionOperateRender: FC<TCommonTasksColumnsRenderProps> = ({
710796
</div>
711797
</Popover>
712798
)}
713-
{!['waiting', 'disabled', 'enabled'].includes(
714-
value,
715-
) && <div className="w-7 mr-2">{''}</div>}
799+
{!['disabled', 'enabled'].includes(value) && (
800+
<div className="w-7 mr-2">{''}</div>
801+
)}
716802
{executionOperateOpearte}
717803
</div>
718804
))

src/pages/TaskScript/compoment/CreateTaskItems.tsx

Lines changed: 124 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
import { match } from 'ts-pattern';
1515
import { NodeCard } from './NodeCard';
1616
import { AddPlugins } from './AddPlugins';
17-
import { generateUniqueId } from '@/utils';
17+
import { createRules, generateUniqueId } from '@/utils';
1818
import {
1919
PresetPorts,
2020
presetProtsGroupOptions,
@@ -25,6 +25,7 @@ import { QuestionCircleOutlined } from '@ant-design/icons';
2525
import { ChunkUpload } from '@/compoments';
2626
import { TScannerDataList } from './StartUpScriptModal';
2727
import { useMemoizedFn } from 'ahooks';
28+
import dayjs, { Dayjs } from 'dayjs';
2829

2930
type PresetKey = keyof typeof PresetPorts;
3031

@@ -38,6 +39,74 @@ const CreateTaskItems = (
3839
scriptGroupList: { value: string; label: string }[],
3940
scannerDataList?: TScannerDataList,
4041
) => {
42+
const disabledDate = (current: Dayjs | null): boolean => {
43+
// 禁用当前日期之前的日期
44+
return !!current && current.isBefore(dayjs(), 'day');
45+
};
46+
47+
const disabledTime = (selectedDate: Dayjs | null) => {
48+
const now = dayjs();
49+
50+
if (!selectedDate || !selectedDate.isSame(now, 'day')) {
51+
// 如果日期不是今天,不禁用时间
52+
return {};
53+
}
54+
55+
return {
56+
disabledHours: (): number[] => [...Array(now.hour()).keys()], // 禁用当前小时之前的小时
57+
disabledMinutes: (): number[] => [...Array(now.minute()).keys()], // 禁用当前分钟之前的分钟
58+
};
59+
};
60+
61+
const validateStartTime = (
62+
value: [Dayjs | null, Dayjs | null],
63+
): string | void => {
64+
if (!value || !value[0]) {
65+
return '开始时间不能为空';
66+
}
67+
if (value[0].isBefore(dayjs())) {
68+
return '开始时间不能小于当前时间';
69+
}
70+
};
71+
72+
const disabledTimeRangePicker = (
73+
date: Dayjs | null,
74+
type: 'start' | 'end',
75+
range: [Dayjs | null, Dayjs | null],
76+
) => {
77+
const now = dayjs();
78+
79+
if (!date) return {};
80+
81+
if (type === 'start') {
82+
// 开始时间禁用到当前时间
83+
return date.isSame(now, 'day')
84+
? {
85+
disabledHours: () => [...Array(now.hour()).keys()],
86+
disabledMinutes: () => [...Array(now.minute()).keys()],
87+
}
88+
: {};
89+
}
90+
91+
if (type === 'end' && range[0]) {
92+
// 结束时间禁用早于开始时间的时间
93+
const startDate = range[0];
94+
return date.isSame(startDate, 'day')
95+
? {
96+
disabledHours: () => [
97+
...Array(startDate.hour() + 1).keys(),
98+
],
99+
disabledMinutes: () =>
100+
date.hour() === startDate.hour()
101+
? [...Array(startDate.minute()).keys()]
102+
: [],
103+
}
104+
: {};
105+
}
106+
107+
return {};
108+
};
109+
41110
const schedulingTypeFn = useMemoizedFn((schedulingType: 1 | 2 | 3) => {
42111
return match(schedulingType)
43112
.with(1, () => {
@@ -47,14 +116,33 @@ const CreateTaskItems = (
47116
return (
48117
<Item
49118
name={'execution_date'}
50-
rules={[{ required: true, message: '请选择执行时间' }]}
119+
rules={[
120+
{ required: true, message: '请选择执行时间' },
121+
{
122+
validator: (_, value: Dayjs) => {
123+
if (!value) {
124+
return Promise.resolve();
125+
}
126+
if (value.isBefore(dayjs())) {
127+
return Promise.reject(
128+
new Error(
129+
'所选时间不能小于当前时间',
130+
),
131+
);
132+
}
133+
return Promise.resolve();
134+
},
135+
},
136+
]}
51137
label={'执行时间'}
52138
className="ml-14"
53139
>
54140
<DatePicker
55141
className="w-full"
56142
showTime={{ format: 'YYYY-MM-DD HH:mm' }}
57143
format={'YYYY-MM-DD HH:mm'}
144+
disabledDate={disabledDate} // 禁用日期部分
145+
disabledTime={disabledTime} // 禁用时间部分到分钟
58146
/>
59147
</Item>
60148
);
@@ -72,21 +160,40 @@ const CreateTaskItems = (
72160
>
73161
<Switch />
74162
</Item>
75-
<Item
76-
name={'timestamp'}
77-
label="设定周期时间范围"
78-
rules={[
79-
{
80-
required: true,
81-
message: '请设定周期时间范围',
82-
},
83-
]}
84-
>
85-
<RangePicker
86-
className="w-full"
87-
showTime={{ format: 'HH:mm' }}
88-
format="YYYY-MM-DD HH:mm"
89-
/>
163+
<Item dependencies={[]} noStyle>
164+
{({ getFieldValue }) => {
165+
return (
166+
<Item
167+
name={'timestamp'}
168+
label="设定周期时间范围"
169+
rules={createRules({
170+
required: true,
171+
requiredMessage:
172+
'请设定周期时间范围',
173+
validateStartTime,
174+
})}
175+
>
176+
<RangePicker
177+
className="w-full"
178+
showTime={{ format: 'HH:mm' }}
179+
format="YYYY-MM-DD HH:mm"
180+
disabledDate={disabledDate} // 禁用日期部分
181+
disabledTime={(date, type) =>
182+
disabledTimeRangePicker(
183+
date,
184+
type,
185+
(getFieldValue(
186+
'timestamp',
187+
) as [Dayjs, Dayjs]) || [
188+
null,
189+
null,
190+
],
191+
)
192+
}
193+
/>
194+
</Item>
195+
);
196+
}}
90197
</Item>
91198
<Item
92199
label={

0 commit comments

Comments
 (0)