Commit 0196ae2d07701f843a4f96e8dae8c98151dcefcc
1 parent
96526939
fix: DEFECT-1169 任务中心自定义cron表达式拼接错误
Showing
2 changed files
with
34 additions
and
47 deletions
@@ -263,14 +263,20 @@ export const formSchemas: FormSchema[] = [ | @@ -263,14 +263,20 @@ export const formSchemas: FormSchema[] = [ | ||
263 | label: '周期', | 263 | label: '周期', |
264 | required: true, | 264 | required: true, |
265 | defaultValue: PeriodTypeEnum.MONTH, | 265 | defaultValue: PeriodTypeEnum.MONTH, |
266 | - componentProps: { | ||
267 | - placeholder: '请选择周期', | ||
268 | - options: [ | ||
269 | - { label: PeriodTypeNameEnum.DAY, value: PeriodTypeEnum.DAY }, | ||
270 | - { label: PeriodTypeNameEnum.WEEK, value: PeriodTypeEnum.WEEK }, | ||
271 | - { label: PeriodTypeNameEnum.MONTH, value: PeriodTypeEnum.MONTH }, | ||
272 | - ], | ||
273 | - getPopupContainer: () => document.body, | 266 | + componentProps: ({ formActionType }) => { |
267 | + const { setFieldsValue } = formActionType; | ||
268 | + return { | ||
269 | + placeholder: '请选择周期', | ||
270 | + options: [ | ||
271 | + { label: PeriodTypeNameEnum.DAY, value: PeriodTypeEnum.DAY }, | ||
272 | + { label: PeriodTypeNameEnum.WEEK, value: PeriodTypeEnum.WEEK }, | ||
273 | + { label: PeriodTypeNameEnum.MONTH, value: PeriodTypeEnum.MONTH }, | ||
274 | + ], | ||
275 | + getPopupContainer: () => document.body, | ||
276 | + onChange() { | ||
277 | + setFieldsValue({ [FormFieldsEnum.EXECUTE_TIME_PERIOD]: null }); | ||
278 | + }, | ||
279 | + }; | ||
274 | }, | 280 | }, |
275 | ifShow: ({ model }) => model[FormFieldsEnum.EXECUTE_TIME_TYPE] === ExecuteTimeTypeEnum.CUSTOM, | 281 | ifShow: ({ model }) => model[FormFieldsEnum.EXECUTE_TIME_TYPE] === ExecuteTimeTypeEnum.CUSTOM, |
276 | }, | 282 | }, |
1 | -import CronParser, { CronFields, HourRange, SixtyRange } from 'cron-parser'; | 1 | +import { HourRange, SixtyRange } from 'cron-parser'; |
2 | import { dateUtil } from '/@/utils/dateUtil'; | 2 | import { dateUtil } from '/@/utils/dateUtil'; |
3 | -import { ExecuteTimeTypeEnum, FormFieldsEnum, PushWayEnum } from './config'; | 3 | +import { ExecuteTimeTypeEnum, FormFieldsEnum, PeriodTypeEnum, PushWayEnum } from './config'; |
4 | import { CreateTaskRecordType, TaskRecordType } from '/@/api/task/model'; | 4 | import { CreateTaskRecordType, TaskRecordType } from '/@/api/task/model'; |
5 | import { DeviceCascadePickerValueType } from '../DevicePicker'; | 5 | import { DeviceCascadePickerValueType } from '../DevicePicker'; |
6 | import { TaskTargetEnum } from '../../config'; | 6 | import { TaskTargetEnum } from '../../config'; |
@@ -12,52 +12,31 @@ export interface FormValueType extends Partial<Record<FormFieldsEnum, any>> { | @@ -12,52 +12,31 @@ export interface FormValueType extends Partial<Record<FormFieldsEnum, any>> { | ||
12 | [FormFieldsEnum.DEVICE_PROFILE]: ProductCascadePickerValueType; | 12 | [FormFieldsEnum.DEVICE_PROFILE]: ProductCascadePickerValueType; |
13 | } | 13 | } |
14 | 14 | ||
15 | -type CanWrite<T> = { | ||
16 | - -readonly [K in keyof T]: T[K]; | ||
17 | -}; | ||
18 | - | ||
19 | interface GenCronExpressionResultType { | 15 | interface GenCronExpressionResultType { |
20 | effective: boolean; | 16 | effective: boolean; |
21 | expression?: string; | 17 | expression?: string; |
22 | } | 18 | } |
23 | 19 | ||
24 | -export const usePluginGenCronExpression = ( | ||
25 | - time: string, | ||
26 | - expression = '* * * * * * *', | ||
27 | - includesYear = true | ||
28 | -): GenCronExpressionResultType => { | ||
29 | - try { | ||
30 | - const separator = ' '; | ||
31 | - const removeYear = expression.split(separator).slice(0, 6).join(separator); | ||
32 | - | ||
33 | - const date = dateUtil(time, 'HH:mm:ss'); | ||
34 | - | ||
35 | - const second = date.get('second') as SixtyRange; | ||
36 | - const minute = date.get('minute') as SixtyRange; | ||
37 | - const hour = date.get('hour') as HourRange; | ||
38 | - | ||
39 | - const result = CronParser.parseExpression(removeYear, { utc: true, nthDayOfWeek: 4 }); | ||
40 | - const fields = JSON.parse(JSON.stringify(result.fields)) as CanWrite<CronFields>; | ||
41 | - fields.second = [second]; | ||
42 | - fields.minute = [minute]; | ||
43 | - fields.hour = [hour]; | ||
44 | - | ||
45 | - // console.log(CronParser.fieldsToExpression(CronParser.parseExpression('').fields).stringify()); | ||
46 | - | ||
47 | - let newExpression = CronParser.fieldsToExpression(fields).stringify(true); | ||
48 | - newExpression = includesYear ? `${newExpression} *` : newExpression; | ||
49 | - return { effective: true, expression: newExpression }; | ||
50 | - } catch (error) { | ||
51 | - // throw error; | ||
52 | - return { effective: false }; | ||
53 | - } | 20 | +export const genPollCronExpression = (value: number, type: TimeUnitEnum) => { |
21 | + const placeholder = 'placeholder'; | ||
22 | + const expression = { | ||
23 | + [TimeUnitEnum.SECOND]: `${placeholder} * * * * ? *`, | ||
24 | + [TimeUnitEnum.MINUTE]: `* ${placeholder} * * * ? *`, | ||
25 | + [TimeUnitEnum.HOUR]: `* * ${placeholder} * * ? *`, | ||
26 | + }; | ||
27 | + const newExpression = expression[type]; | ||
28 | + return newExpression.replace(placeholder, `0/${value}`); | ||
54 | }; | 29 | }; |
55 | 30 | ||
56 | export const genCronExpression = ( | 31 | export const genCronExpression = ( |
57 | time: string, | 32 | time: string, |
58 | - expression = '* * * * * * *' | 33 | + expression = '* * * * * * *', |
34 | + periodType: PeriodTypeEnum | ||
59 | ): GenCronExpressionResultType => { | 35 | ): GenCronExpressionResultType => { |
60 | try { | 36 | try { |
37 | + if (periodType === PeriodTypeEnum.DAY) { | ||
38 | + expression = '* * * * * ? *'; | ||
39 | + } | ||
61 | const separator = ' '; | 40 | const separator = ' '; |
62 | const list: (string | number)[] = expression.split(separator); | 41 | const list: (string | number)[] = expression.split(separator); |
63 | 42 | ||
@@ -103,10 +82,12 @@ export const composeData = (result: Required<FormValueType>): CreateTaskRecordTy | @@ -103,10 +82,12 @@ export const composeData = (result: Required<FormValueType>): CreateTaskRecordTy | ||
103 | deviceType: productDeviceType, | 82 | deviceType: productDeviceType, |
104 | } = deviceProfile || {}; | 83 | } = deviceProfile || {}; |
105 | 84 | ||
106 | - const { expression } = genCronExpression(time, period); | 85 | + const { expression } = genCronExpression(time, period, periodType); |
107 | 86 | ||
108 | const cron = | 87 | const cron = |
109 | - executeTimeType === ExecuteTimeTypeEnum.POLL ? `0/${interval} * * * * ? *` : expression!; | 88 | + executeTimeType === ExecuteTimeTypeEnum.POLL |
89 | + ? genPollCronExpression(interval, pollUnit) | ||
90 | + : expression!; | ||
110 | 91 | ||
111 | return { | 92 | return { |
112 | name, | 93 | name, |