year.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <el-form size="small">
  3. <el-form-item>
  4. <el-radio :label="1" v-model='radioValue'>
  5. 不填,允许的通配符[, - * /]
  6. </el-radio>
  7. </el-form-item>
  8. <el-form-item>
  9. <el-radio :label="2" v-model='radioValue'>
  10. 每年
  11. </el-radio>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-radio :label="3" v-model='radioValue'>
  15. 周期从
  16. <el-input-number v-model='cycle01' :min='fullYear' :max="maxFullYear - 1" /> -
  17. <el-input-number v-model='cycle02' :min="cycle01 + 1" :max="maxFullYear" />
  18. </el-radio>
  19. </el-form-item>
  20. <el-form-item>
  21. <el-radio :label="4" v-model='radioValue'>
  22. <el-input-number v-model='average01' :min='fullYear' :max="maxFullYear - 1"/> 年开始,每
  23. <el-input-number v-model='average02' :min="1" :max="10" /> 年执行一次
  24. </el-radio>
  25. </el-form-item>
  26. <el-form-item>
  27. <el-radio :label="5" v-model='radioValue'>
  28. 指定
  29. <el-select clearable v-model="checkboxList" placeholder="可多选" multiple :multiple-limit="8">
  30. <el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" />
  31. </el-select>
  32. </el-radio>
  33. </el-form-item>
  34. </el-form>
  35. </template>
  36. <script setup>
  37. const emit = defineEmits(['update'])
  38. const props = defineProps({
  39. cron: {
  40. type: Object,
  41. default: {
  42. second: "*",
  43. min: "*",
  44. hour: "*",
  45. day: "*",
  46. month: "*",
  47. week: "?",
  48. year: ""
  49. }
  50. },
  51. check: {
  52. type: Function,
  53. default: () => {
  54. }
  55. }
  56. })
  57. const fullYear = ref(0)
  58. const maxFullYear = ref(0)
  59. const radioValue = ref(1)
  60. const cycle01 = ref(0)
  61. const cycle02 = ref(0)
  62. const average01 = ref(0)
  63. const average02 = ref(1)
  64. const checkboxList = ref([])
  65. const checkCopy = ref([])
  66. const cycleTotal = computed(() => {
  67. cycle01.value = props.check(cycle01.value, fullYear.value, maxFullYear.value - 1)
  68. cycle02.value = props.check(cycle02.value, cycle01.value + 1, maxFullYear.value)
  69. return cycle01.value + '-' + cycle02.value
  70. })
  71. const averageTotal = computed(() => {
  72. average01.value = props.check(average01.value, fullYear.value, maxFullYear.value - 1)
  73. average02.value = props.check(average02.value, 1, 10)
  74. return average01.value + '/' + average02.value
  75. })
  76. const checkboxString = computed(() => {
  77. return checkboxList.value.join(',')
  78. })
  79. watch(() => props.cron.year, value => changeRadioValue(value))
  80. watch([radioValue, cycleTotal, averageTotal, checkboxString], () => onRadioChange())
  81. function changeRadioValue(value) {
  82. if (value === '') {
  83. radioValue.value = 1
  84. } else if (value === "*") {
  85. radioValue.value = 2
  86. } else if (value.indexOf("-") > -1) {
  87. const indexArr = value.split('-')
  88. cycle01.value = Number(indexArr[0])
  89. cycle02.value = Number(indexArr[1])
  90. radioValue.value = 3
  91. } else if (value.indexOf("/") > -1) {
  92. const indexArr = value.split('#')
  93. average01.value = Number(indexArr[1])
  94. average02.value = Number(indexArr[0])
  95. radioValue.value = 4
  96. } else {
  97. checkboxList.value = [...new Set(value.split(',').map(item => Number(item)))]
  98. radioValue.value = 5
  99. }
  100. }
  101. function onRadioChange() {
  102. switch (radioValue.value) {
  103. case 1:
  104. emit('update', 'year', '', 'year')
  105. break
  106. case 2:
  107. emit('update', 'year', '*', 'year')
  108. break
  109. case 3:
  110. emit('update', 'year', cycleTotal.value, 'year')
  111. break
  112. case 4:
  113. emit('update', 'year', averageTotal.value, 'year')
  114. break
  115. case 5:
  116. if (checkboxList.value.length === 0) {
  117. checkboxList.value.push(checkCopy.value[0])
  118. } else {
  119. checkCopy.value = checkboxList.value
  120. }
  121. emit('update', 'year', checkboxString.value, 'year')
  122. break
  123. }
  124. }
  125. onMounted(() => {
  126. fullYear.value = Number(new Date().getFullYear())
  127. maxFullYear.value = fullYear.value + 10
  128. cycle01.value = fullYear.value
  129. cycle02.value = cycle01.value + 1
  130. average01.value = fullYear.value
  131. checkCopy.value = [fullYear.value]
  132. })
  133. </script>
  134. <style lang="scss" scoped>
  135. .el-input-number--small, .el-select, .el-select--small {
  136. margin: 0 0.2rem;
  137. }
  138. .el-select, .el-select--small {
  139. width: 18.8rem;
  140. }
  141. </style>