week.vue 6.2 KB

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