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 | 263 | label: '周期', |
| 264 | 264 | required: true, |
| 265 | 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 | 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 | 2 | import { dateUtil } from '/@/utils/dateUtil'; |
| 3 | -import { ExecuteTimeTypeEnum, FormFieldsEnum, PushWayEnum } from './config'; | |
| 3 | +import { ExecuteTimeTypeEnum, FormFieldsEnum, PeriodTypeEnum, PushWayEnum } from './config'; | |
| 4 | 4 | import { CreateTaskRecordType, TaskRecordType } from '/@/api/task/model'; |
| 5 | 5 | import { DeviceCascadePickerValueType } from '../DevicePicker'; |
| 6 | 6 | import { TaskTargetEnum } from '../../config'; |
| ... | ... | @@ -12,52 +12,31 @@ export interface FormValueType extends Partial<Record<FormFieldsEnum, any>> { |
| 12 | 12 | [FormFieldsEnum.DEVICE_PROFILE]: ProductCascadePickerValueType; |
| 13 | 13 | } |
| 14 | 14 | |
| 15 | -type CanWrite<T> = { | |
| 16 | - -readonly [K in keyof T]: T[K]; | |
| 17 | -}; | |
| 18 | - | |
| 19 | 15 | interface GenCronExpressionResultType { |
| 20 | 16 | effective: boolean; |
| 21 | 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 | 31 | export const genCronExpression = ( |
| 57 | 32 | time: string, |
| 58 | - expression = '* * * * * * *' | |
| 33 | + expression = '* * * * * * *', | |
| 34 | + periodType: PeriodTypeEnum | |
| 59 | 35 | ): GenCronExpressionResultType => { |
| 60 | 36 | try { |
| 37 | + if (periodType === PeriodTypeEnum.DAY) { | |
| 38 | + expression = '* * * * * ? *'; | |
| 39 | + } | |
| 61 | 40 | const separator = ' '; |
| 62 | 41 | const list: (string | number)[] = expression.split(separator); |
| 63 | 42 | |
| ... | ... | @@ -103,10 +82,12 @@ export const composeData = (result: Required<FormValueType>): CreateTaskRecordTy |
| 103 | 82 | deviceType: productDeviceType, |
| 104 | 83 | } = deviceProfile || {}; |
| 105 | 84 | |
| 106 | - const { expression } = genCronExpression(time, period); | |
| 85 | + const { expression } = genCronExpression(time, period, periodType); | |
| 107 | 86 | |
| 108 | 87 | const cron = |
| 109 | - executeTimeType === ExecuteTimeTypeEnum.POLL ? `0/${interval} * * * * ? *` : expression!; | |
| 88 | + executeTimeType === ExecuteTimeTypeEnum.POLL | |
| 89 | + ? genPollCronExpression(interval, pollUnit) | |
| 90 | + : expression!; | |
| 110 | 91 | |
| 111 | 92 | return { |
| 112 | 93 | name, | ... | ... |