52 lines
1.3 KiB
Java
52 lines
1.3 KiB
Java
![]() |
import CronParser from 'cron-parser'
|
|||
|
import { replaceWeekName } from './tabs/const'
|
|||
|
|
|||
|
export default (rule, value, callback) => {
|
|||
|
// 没填写就不校验
|
|||
|
if (!value) {
|
|||
|
callback()
|
|||
|
return true
|
|||
|
}
|
|||
|
const values = value.split(' ').filter(item => !!item)
|
|||
|
if (values.length > 7) {
|
|||
|
callback(new Error('Cron表达式最多7项!'))
|
|||
|
return false
|
|||
|
}
|
|||
|
// 检查第7项
|
|||
|
let e = value
|
|||
|
if (values.length === 7) {
|
|||
|
const year = replaceWeekName(values[6])
|
|||
|
if (year !== '*' && year !== '?') {
|
|||
|
let yearValues = []
|
|||
|
if (year.indexOf('-') >= 0) {
|
|||
|
yearValues = year.split('-')
|
|||
|
} else if (year.indexOf('/')) {
|
|||
|
yearValues = year.split('/')
|
|||
|
} else {
|
|||
|
yearValues = [year]
|
|||
|
}
|
|||
|
// console.info(yearValues)
|
|||
|
// 判断是否都是数字
|
|||
|
const checkYear = yearValues.some(item => isNaN(item))
|
|||
|
if (checkYear) {
|
|||
|
callback(new Error('Cron表达式参数[年]错误:' + year))
|
|||
|
return false
|
|||
|
}
|
|||
|
}
|
|||
|
// 取其中的前六项
|
|||
|
e = values.slice(0, 6).join(' ')
|
|||
|
}
|
|||
|
// 6位 没有年
|
|||
|
// 5位没有秒、年
|
|||
|
let result = true
|
|||
|
try {
|
|||
|
const iter = CronParser.parseExpression(e)
|
|||
|
iter.next()
|
|||
|
callback()
|
|||
|
} catch (e) {
|
|||
|
callback(new Error('Cron表达式错误:' + e))
|
|||
|
result = false
|
|||
|
}
|
|||
|
return result
|
|||
|
}
|