day.vue 5.3 KB

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