edb8d3113009e4a7fdfacb808fd0533ad080960a.svn-base 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import CronParser from 'cron-parser'
  2. import { replaceWeekName } from './tabs/const'
  3. export default (rule, value, callback) => {
  4. // 没填写就不校验
  5. if (!value) {
  6. callback()
  7. return true
  8. }
  9. const values = value.split(' ').filter(item => !!item)
  10. if (values.length > 7) {
  11. callback(new Error('Cron表达式最多7项!'))
  12. return false
  13. }
  14. // 检查第7项
  15. let e = value
  16. if (values.length === 7) {
  17. const year = replaceWeekName(values[6])
  18. if (year !== '*' && year !== '?') {
  19. let yearValues = []
  20. if (year.indexOf('-') >= 0) {
  21. yearValues = year.split('-')
  22. } else if (year.indexOf('/')) {
  23. yearValues = year.split('/')
  24. } else {
  25. yearValues = [year]
  26. }
  27. // console.info(yearValues)
  28. // 判断是否都是数字
  29. const checkYear = yearValues.some(item => isNaN(item))
  30. if (checkYear) {
  31. callback(new Error('Cron表达式参数[年]错误:' + year))
  32. return false
  33. }
  34. }
  35. // 取其中的前六项
  36. e = values.slice(0, 6).join(' ')
  37. }
  38. // 6位 没有年
  39. // 5位没有秒、年
  40. let result = true
  41. try {
  42. const iter = CronParser.parseExpression(e)
  43. iter.next()
  44. callback()
  45. } catch (e) {
  46. callback(new Error('Cron表达式错误:' + e))
  47. result = false
  48. }
  49. return result
  50. }