定时任务支持在线生成cron表达式
This commit is contained in:
		
							parent
							
								
									cfa86bd4fe
								
							
						
					
					
						commit
						6361e4efdc
					
				| @ -60,10 +60,17 @@ | ||||
| 	color: inherit; | ||||
| } | ||||
| 
 | ||||
| .el-dialog:not(.is-fullscreen){ | ||||
| .el-dialog:not(.is-fullscreen) { | ||||
| 	margin-top: 6vh !important; | ||||
| } | ||||
| 
 | ||||
| .el-dialog .el-dialog__body { | ||||
|     overflow: auto; | ||||
| 	overflow-x: hidden; | ||||
| 	max-height: 70vh; | ||||
| 	padding: 10px 20px 0; | ||||
| } | ||||
| 
 | ||||
| .el-table { | ||||
| 	.el-table__header-wrapper, .el-table__fixed-header-wrapper { | ||||
| 		th { | ||||
|  | ||||
							
								
								
									
										179
									
								
								ruoyi-ui/src/components/Crontab/day.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								ruoyi-ui/src/components/Crontab/day.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,179 @@ | ||||
| <template> | ||||
| 	<el-form size="small"> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				日,允许的通配符[, - * / L M] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				不指定 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min="0" :max="31" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="0" :max="31" /> 日 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min="0" :max="31" /> 号开始,每 | ||||
| 				<el-input-number v-model='average02' :min="0" :max="31" /> 日执行一次 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="5"> | ||||
| 				每月 | ||||
| 				<el-input-number v-model='workday' :min="0" :max="31" /> 号最近的那个工作日 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="6"> | ||||
| 				本月最后一天 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="7"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="item in 31" :key="item" :value="item">{{item}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 1, | ||||
| 			workday: 1, | ||||
| 			cycle01: 1, | ||||
| 			cycle02: 2, | ||||
| 			average01: 1, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-day', | ||||
| 	props: ['check', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			('day rachange'); | ||||
| 			if (this.radioValue === 1) { | ||||
| 				this.$emit('update', 'day', '*', 'day'); | ||||
| 				this.$emit('update', 'week', '?', 'day'); | ||||
| 				this.$emit('update', 'mouth', '*', 'day'); | ||||
| 			} else { | ||||
| 				if (this.cron.hour === '*') { | ||||
| 					this.$emit('update', 'hour', '0', 'day'); | ||||
| 				} | ||||
| 				if (this.cron.min === '*') { | ||||
| 					this.$emit('update', 'min', '0', 'day'); | ||||
| 				} | ||||
| 				if (this.cron.second === '*') { | ||||
| 					this.$emit('update', 'second', '0', 'day'); | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			switch (this.radioValue) { | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'day', '?'); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'day', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'day', this.average01 + '/' + this.average02); | ||||
| 					break; | ||||
| 				case 5: | ||||
| 					this.$emit('update', 'day', this.workday + 'W'); | ||||
| 					break; | ||||
| 				case 6: | ||||
| 					this.$emit('update', 'day', 'L'); | ||||
| 					break; | ||||
| 				case 7: | ||||
| 					this.$emit('update', 'day', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 			('day rachange end'); | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'day', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'day', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 最近工作日值变化时 | ||||
| 		workdayChange() { | ||||
| 			if (this.radioValue == '5') { | ||||
| 				this.$emit('update', 'day', this.workday + 'W'); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '7') { | ||||
| 				this.$emit('update', 'day', this.checkboxString); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 父组件传递的week发生变化触发 | ||||
| 		weekChange() { | ||||
| 			//判断week值与day不能同时为“?” | ||||
| 			if (this.cron.week == '?' && this.radioValue == '2') { | ||||
| 				this.radioValue = '1'; | ||||
| 			} else if (this.cron.week !== '?' && this.radioValue != '2') { | ||||
| 				this.radioValue = '2'; | ||||
| 			} | ||||
| 		}, | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'workdayCheck': 'workdayChange', | ||||
| 		'checkboxString': 'checkboxChange', | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 1, 31) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 1, 31) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 1, 31) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 31) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算工作日格式 | ||||
| 		workdayCheck: function () { | ||||
| 			this.workday = this.checkNum(this.workday, 1, 31) | ||||
| 			return this.workday; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										122
									
								
								ruoyi-ui/src/components/Crontab/hour.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								ruoyi-ui/src/components/Crontab/hour.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| <template> | ||||
| 	<el-form size="small"> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				小时,允许的通配符[, - * /] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min="0" :max="60" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="0" :max="60" /> 小时 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min="0" :max="60" /> 小时开始,每 | ||||
| 				<el-input-number v-model='average02' :min="0" :max="60" /> 小时执行一次 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 1, | ||||
| 			cycle01: 0, | ||||
| 			cycle02: 1, | ||||
| 			average01: 0, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-hour', | ||||
| 	props: ['check', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			if (this.radioValue === 1) { | ||||
| 				this.$emit('update', 'hour', '*', 'hour'); | ||||
| 				this.$emit('update', 'day', '*', 'hour'); | ||||
| 			} else { | ||||
| 				if (this.cron.min === '*') { | ||||
| 					this.$emit('update', 'min', '0', 'hour'); | ||||
| 				} | ||||
| 				if (this.cron.second === '*') { | ||||
| 					this.$emit('update', 'second', '0', 'hour'); | ||||
| 				} | ||||
| 			} | ||||
| 			switch (this.radioValue) { | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'hour', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'hour', this.average01 + '/' + this.average02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'hour', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '2') { | ||||
| 				this.$emit('update', 'hour', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'hour', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'hour', this.checkboxString); | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'checkboxString': 'checkboxChange' | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 0, 23) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 0, 23) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 0, 23) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 23) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										425
									
								
								ruoyi-ui/src/components/Crontab/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										425
									
								
								ruoyi-ui/src/components/Crontab/index.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,425 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <el-tabs type="border-card"> | ||||
|       <el-tab-pane label="秒" v-if="shouldHide('second')"> | ||||
|         <CrontabSecond @update="updateContabValue" :check="checkNumber" ref="cronsecond" /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="分钟" v-if="shouldHide('min')"> | ||||
|         <CrontabMin | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronmin" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="小时" v-if="shouldHide('hour')"> | ||||
|         <CrontabHour | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronhour" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="日" v-if="shouldHide('day')"> | ||||
|         <CrontabDay | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronday" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="月" v-if="shouldHide('mouth')"> | ||||
|         <CrontabMouth | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronmouth" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="周" v-if="shouldHide('week')"> | ||||
|         <CrontabWeek | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronweek" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
| 
 | ||||
|       <el-tab-pane label="年" v-if="shouldHide('year')"> | ||||
|         <CrontabYear | ||||
|           @update="updateContabValue" | ||||
|           :check="checkNumber" | ||||
|           :cron="contabValueObj" | ||||
|           ref="cronyear" | ||||
|         /> | ||||
|       </el-tab-pane> | ||||
|     </el-tabs> | ||||
| 
 | ||||
|     <div class="popup-main"> | ||||
|       <div class="popup-result"> | ||||
|         <p class="title">时间表达式</p> | ||||
|         <table> | ||||
|           <thead> | ||||
|             <th v-for="item of tabTitles" width="40" :key="item">{{item}}</th> | ||||
|             <th>Cron 表达式</th> | ||||
|           </thead> | ||||
|           <tbody> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.second}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.min}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.hour}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.day}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.mouth}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.week}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueObj.year}}</span> | ||||
|             </td> | ||||
|             <td> | ||||
|               <span>{{contabValueString}}</span> | ||||
|             </td> | ||||
|           </tbody> | ||||
|         </table> | ||||
|       </div> | ||||
|       <CrontabResult :ex="contabValueString"></CrontabResult> | ||||
| 
 | ||||
|       <div class="pop_btn"> | ||||
|         <el-button size="small" type="primary" @click="submitFill">确定</el-button> | ||||
|         <el-button size="small" type="warning" @click="clearCron">重置</el-button> | ||||
|         <el-button size="small" @click="hidePopup">取消</el-button> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| import CrontabSecond from "./second.vue"; | ||||
| import CrontabMin from "./min.vue"; | ||||
| import CrontabHour from "./hour.vue"; | ||||
| import CrontabDay from "./day.vue"; | ||||
| import CrontabMouth from "./mouth.vue"; | ||||
| import CrontabWeek from "./week.vue"; | ||||
| import CrontabYear from "./year.vue"; | ||||
| import CrontabResult from "./result.vue"; | ||||
| 
 | ||||
| export default { | ||||
|   data() { | ||||
|     return { | ||||
|       tabTitles: ["秒", "分钟", "小时", "日", "月", "周", "年"], | ||||
|       tabActive: 0, | ||||
|       myindex: 0, | ||||
|       contabValueObj: { | ||||
|         second: "*", | ||||
|         min: "*", | ||||
|         hour: "*", | ||||
|         day: "*", | ||||
|         mouth: "*", | ||||
|         week: "?", | ||||
|         year: "", | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   name: "vcrontab", | ||||
|   props: ["expression", "hideComponent"], | ||||
|   methods: { | ||||
|     shouldHide(key) { | ||||
|       if (this.hideComponent && this.hideComponent.includes(key)) return false; | ||||
|       return true; | ||||
|     }, | ||||
|     resolveExp() { | ||||
|       //反解析 表达式 | ||||
|       if (this.expression) { | ||||
|         let arr = this.expression.split(" "); | ||||
|         if (arr.length >= 6) { | ||||
|           //6 位以上是合法表达式 | ||||
|           let obj = { | ||||
|             second: arr[0], | ||||
|             min: arr[1], | ||||
|             hour: arr[2], | ||||
|             day: arr[3], | ||||
|             mouth: arr[4], | ||||
|             week: arr[5], | ||||
|             year: arr[6] ? arr[6] : "", | ||||
|           }; | ||||
|           this.contabValueObj = { | ||||
|             ...obj, | ||||
|           }; | ||||
|           for (let i in obj) { | ||||
|             if (obj[i]) this.changeRadio(i, obj[i]); | ||||
|           } | ||||
|         } | ||||
|       } else { | ||||
|         //没有传入的表达式 则还原 | ||||
|         this.clearCron(); | ||||
|       } | ||||
|     }, | ||||
|     // tab切换值 | ||||
|     tabCheck(index) { | ||||
|       this.tabActive = index; | ||||
|     }, | ||||
|     // 由子组件触发,更改表达式组成的字段值 | ||||
|     updateContabValue(name, value, from) { | ||||
|       "updateContabValue", name, value, from; | ||||
|       this.contabValueObj[name] = value; | ||||
|       if (from && from !== name) { | ||||
|         console.log(`来自组件 ${from} 改变了 ${name} ${value}`); | ||||
|         this.changeRadio(name, value); | ||||
|       } | ||||
|     }, | ||||
|     //赋值到组件 | ||||
|     changeRadio(name, value) { | ||||
|       let arr = ["second", "min", "hour", "mouth"], | ||||
|         refName = "cron" + name, | ||||
|         insVlaue; | ||||
| 
 | ||||
|       if (!this.$refs[refName]) return; | ||||
| 
 | ||||
|       if (arr.includes(name)) { | ||||
|         if (value === "*") { | ||||
|           insVlaue = 1; | ||||
|         } else if (value.indexOf("-") > -1) { | ||||
|           let indexArr = value.split("-"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].cycle01 = 0) | ||||
|             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||
|           this.$refs[refName].cycle02 = indexArr[1]; | ||||
|           insVlaue = 2; | ||||
|         } else if (value.indexOf("/") > -1) { | ||||
|           let indexArr = value.split("/"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].average01 = 0) | ||||
|             : (this.$refs[refName].average01 = indexArr[0]); | ||||
|           this.$refs[refName].average02 = indexArr[1]; | ||||
|           insVlaue = 3; | ||||
|         } else { | ||||
|           insVlaue = 4; | ||||
|           this.$refs[refName].checkboxList = value.split(","); | ||||
|         } | ||||
|       } else if (name == "day") { | ||||
|         if (value === "*") { | ||||
|           insVlaue = 1; | ||||
|         } else if (value == "?") { | ||||
|           insVlaue = 2; | ||||
|         } else if (value.indexOf("-") > -1) { | ||||
|           let indexArr = value.split("-"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].cycle01 = 0) | ||||
|             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||
|           this.$refs[refName].cycle02 = indexArr[1]; | ||||
|           insVlaue = 3; | ||||
|         } else if (value.indexOf("/") > -1) { | ||||
|           let indexArr = value.split("/"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].average01 = 0) | ||||
|             : (this.$refs[refName].average01 = indexArr[0]); | ||||
|           this.$refs[refName].average02 = indexArr[1]; | ||||
|           insVlaue = 4; | ||||
|         } else if (value.indexOf("W") > -1) { | ||||
|           let indexArr = value.split("W"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].workday = 0) | ||||
|             : (this.$refs[refName].workday = indexArr[0]); | ||||
|           insVlaue = 5; | ||||
|         } else if (value === "L") { | ||||
|           insVlaue = 6; | ||||
|         } else { | ||||
|           this.$refs[refName].checkboxList = value.split(","); | ||||
|           insVlaue = 7; | ||||
|         } | ||||
|       } else if (name == "week") { | ||||
|         if (value === "*") { | ||||
|           insVlaue = 1; | ||||
|         } else if (value == "?") { | ||||
|           insVlaue = 2; | ||||
|         } else if (value.indexOf("-") > -1) { | ||||
|           let indexArr = value.split("-"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].cycle01 = 0) | ||||
|             : (this.$refs[refName].cycle01 = indexArr[0]); | ||||
|           this.$refs[refName].cycle02 = indexArr[1]; | ||||
|           insVlaue = 3; | ||||
|         } else if (value.indexOf("#") > -1) { | ||||
|           let indexArr = value.split("#"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].average01 = 1) | ||||
|             : (this.$refs[refName].average01 = indexArr[0]); | ||||
|           this.$refs[refName].average02 = indexArr[1]; | ||||
|           insVlaue = 4; | ||||
|         } else if (value.indexOf("L") > -1) { | ||||
|           let indexArr = value.split("L"); | ||||
|           isNaN(indexArr[0]) | ||||
|             ? (this.$refs[refName].weekday = 1) | ||||
|             : (this.$refs[refName].weekday = indexArr[0]); | ||||
|           insVlaue = 5; | ||||
|         } else { | ||||
|           this.$refs[refName].checkboxList = value.split(","); | ||||
|           insVlaue = 7; | ||||
|         } | ||||
|       } else if (name == "year") { | ||||
|         if (value == "") { | ||||
|           insVlaue = 1; | ||||
|         } else if (value == "*") { | ||||
|           insVlaue = 2; | ||||
|         } else if (value.indexOf("-") > -1) { | ||||
|           insVlaue = 3; | ||||
|         } else if (value.indexOf("/") > -1) { | ||||
|           insVlaue = 4; | ||||
|         } else { | ||||
|           this.$refs[refName].checkboxList = value.split(","); | ||||
|           insVlaue = 5; | ||||
|         } | ||||
|       } | ||||
|       this.$refs[refName].radioValue = insVlaue; | ||||
|     }, | ||||
|     // 表单选项的子组件校验数字格式(通过-props传递) | ||||
|     checkNumber(value, minLimit, maxLimit) { | ||||
|       //检查必须为整数 | ||||
|       value = Math.floor(value); | ||||
|       if (value < minLimit) { | ||||
|         value = minLimit; | ||||
|       } else if (value > maxLimit) { | ||||
|         value = maxLimit; | ||||
|       } | ||||
|       return value; | ||||
|     }, | ||||
|     // 隐藏弹窗 | ||||
|     hidePopup() { | ||||
|       this.$emit("hide"); | ||||
|     }, | ||||
|     // 填充表达式 | ||||
|     submitFill() { | ||||
|       this.$emit("fill", this.contabValueString); | ||||
|       this.hidePopup(); | ||||
|     }, | ||||
|     clearCron() { | ||||
|       // 还原选择项 | ||||
|       ("准备还原"); | ||||
|       this.contabValueObj = { | ||||
|         second: "*", | ||||
|         min: "*", | ||||
|         hour: "*", | ||||
|         day: "*", | ||||
|         mouth: "*", | ||||
|         week: "?", | ||||
|         year: "", | ||||
|       }; | ||||
|       for (let j in this.contabValueObj) { | ||||
|         this.changeRadio(j, this.contabValueObj[j]); | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   computed: { | ||||
|     contabValueString: function() { | ||||
|       let obj = this.contabValueObj; | ||||
|       let str = | ||||
|         obj.second + | ||||
|         " " + | ||||
|         obj.min + | ||||
|         " " + | ||||
|         obj.hour + | ||||
|         " " + | ||||
|         obj.day + | ||||
|         " " + | ||||
|         obj.mouth + | ||||
|         " " + | ||||
|         obj.week + | ||||
|         (obj.year == "" ? "" : " " + obj.year); | ||||
|       return str; | ||||
|     }, | ||||
|   }, | ||||
|   components: { | ||||
|     CrontabSecond, | ||||
|     CrontabMin, | ||||
|     CrontabHour, | ||||
|     CrontabDay, | ||||
|     CrontabMouth, | ||||
|     CrontabWeek, | ||||
|     CrontabYear, | ||||
|     CrontabResult, | ||||
|   }, | ||||
|   watch: { | ||||
|     expression: "resolveExp", | ||||
|     hideComponent(value) { | ||||
|       // 隐藏部分组件 | ||||
|     }, | ||||
|   }, | ||||
|   mounted: function() { | ||||
|     this.resolveExp(); | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
| <style scoped> | ||||
| .pop_btn { | ||||
|   text-align: center; | ||||
|   margin-top: 20px; | ||||
| } | ||||
| .popup-main { | ||||
|   position: relative; | ||||
|   margin: 10px auto; | ||||
|   background: #fff; | ||||
|   border-radius: 5px; | ||||
|   font-size: 12px; | ||||
|   overflow: hidden; | ||||
| } | ||||
| .popup-title { | ||||
|   overflow: hidden; | ||||
|   line-height: 34px; | ||||
|   padding-top: 6px; | ||||
|   background: #f2f2f2; | ||||
| } | ||||
| .popup-result { | ||||
|   box-sizing: border-box; | ||||
|   line-height: 24px; | ||||
|   margin: 25px auto; | ||||
|   padding: 15px 10px 10px; | ||||
|   border: 1px solid #ccc; | ||||
|   position: relative; | ||||
| } | ||||
| .popup-result .title { | ||||
|   position: absolute; | ||||
|   top: -28px; | ||||
|   left: 50%; | ||||
|   width: 140px; | ||||
|   font-size: 14px; | ||||
|   margin-left: -70px; | ||||
|   text-align: center; | ||||
|   line-height: 30px; | ||||
|   background: #fff; | ||||
| } | ||||
| .popup-result table { | ||||
|   text-align: center; | ||||
|   width: 100%; | ||||
|   margin: 0 auto; | ||||
| } | ||||
| .popup-result table span { | ||||
|   display: block; | ||||
|   width: 100%; | ||||
|   font-family: arial; | ||||
|   line-height: 30px; | ||||
|   height: 30px; | ||||
|   white-space: nowrap; | ||||
|   overflow: hidden; | ||||
|   border: 1px solid #e8e8e8; | ||||
| } | ||||
| .popup-result-scroll { | ||||
|   font-size: 12px; | ||||
|   line-height: 24px; | ||||
|   height: 10em; | ||||
|   overflow-y: auto; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										120
									
								
								ruoyi-ui/src/components/Crontab/min.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								ruoyi-ui/src/components/Crontab/min.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | ||||
| <template> | ||||
| 	<el-form size="small"> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				分钟,允许的通配符[, - * /] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min="0" :max="60" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="0" :max="60" /> 分钟 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min="0" :max="60" /> 分钟开始,每 | ||||
| 				<el-input-number v-model='average02' :min="0" :max="60" /> 分钟执行一次 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| 
 | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 1, | ||||
| 			cycle01: 1, | ||||
| 			cycle02: 2, | ||||
| 			average01: 0, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-min', | ||||
| 	props: ['check', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			if (this.radioValue !== 1 && this.cron.second === '*') { | ||||
| 				this.$emit('update', 'second', '0', 'min'); | ||||
| 			} | ||||
| 			switch (this.radioValue) { | ||||
| 				case 1: | ||||
| 					this.$emit('update', 'min', '*', 'min'); | ||||
| 					this.$emit('update', 'hour', '*', 'min'); | ||||
| 					break; | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'min', this.cycle01 + '-' + this.cycle02, 'min'); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'min', this.average01 + '/' + this.average02, 'min'); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'min', this.checkboxString, 'min'); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '2') { | ||||
| 				this.$emit('update', 'min', this.cycleTotal, 'min'); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'min', this.averageTotal, 'min'); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'min', this.checkboxString, 'min'); | ||||
| 			} | ||||
| 		}, | ||||
| 
 | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'checkboxString': 'checkboxChange', | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 0, 59) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 0, 59) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 0, 59) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 59) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										128
									
								
								ruoyi-ui/src/components/Crontab/mouth.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								ruoyi-ui/src/components/Crontab/mouth.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | ||||
| <template> | ||||
| 	<el-form size='small'> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				月,允许的通配符[, - * /] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min="1" :max="12" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="1" :max="12" /> 月 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min="1" :max="12" /> 月开始,每 | ||||
| 				<el-input-number v-model='average02' :min="1" :max="12" /> 月月执行一次 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="item in 12" :key="item" :value="item">{{item}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 1, | ||||
| 			cycle01: 1, | ||||
| 			cycle02: 2, | ||||
| 			average01: 1, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-mouth', | ||||
| 	props: ['check', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			if (this.radioValue === 1) { | ||||
| 				this.$emit('update', 'mouth', '*'); | ||||
| 				this.$emit('update', 'year', '*'); | ||||
| 			} else { | ||||
| 				if (this.cron.day === '*') { | ||||
| 					this.$emit('update', 'day', '0', 'mouth'); | ||||
| 				} | ||||
| 				if (this.cron.hour === '*') { | ||||
| 					this.$emit('update', 'hour', '0', 'mouth'); | ||||
| 				} | ||||
| 				if (this.cron.min === '*') { | ||||
| 					this.$emit('update', 'min', '0', 'mouth'); | ||||
| 				} | ||||
| 				if (this.cron.second === '*') { | ||||
| 					this.$emit('update', 'second', '0', 'mouth'); | ||||
| 				} | ||||
| 			} | ||||
| 			switch (this.radioValue) { | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'mouth', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'mouth', this.average01 + '/' + this.average02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'mouth', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '2') { | ||||
| 				this.$emit('update', 'mouth', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'mouth', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'mouth', this.checkboxString); | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'checkboxString': 'checkboxChange' | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 1, 12) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 1, 12) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 1, 12) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 12) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										566
									
								
								ruoyi-ui/src/components/Crontab/result.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										566
									
								
								ruoyi-ui/src/components/Crontab/result.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,566 @@ | ||||
| <template> | ||||
| 	<div class="popup-result"> | ||||
| 		<p class="title">最近5次运行时间</p> | ||||
| 		<ul class="popup-result-scroll"> | ||||
| 			<template v-if='isShow'> | ||||
| 				<li v-for='item in resultList' :key="item">{{item}}</li> | ||||
| 			</template> | ||||
| 			<li v-else>计算结果中...</li> | ||||
| 		</ul> | ||||
| 	</div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			dayRule: '', | ||||
| 			dayRuleSup: '', | ||||
| 			dateArr: [], | ||||
| 			resultList: [], | ||||
| 			isShow: false | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-result', | ||||
| 	methods: { | ||||
| 		// 表达式值变化时,开始去计算结果 | ||||
| 		expressionChange() { | ||||
| 
 | ||||
| 			// 计算开始-隐藏结果 | ||||
| 			this.isShow = false; | ||||
| 			// 获取规则数组[0秒、1分、2时、3日、4月、5星期、6年] | ||||
| 			let ruleArr = this.$options.propsData.ex.split(' '); | ||||
| 			// 用于记录进入循环的次数 | ||||
| 			let nums = 0; | ||||
| 			// 用于暂时存符号时间规则结果的数组 | ||||
| 			let resultArr = []; | ||||
| 			// 获取当前时间精确至[年、月、日、时、分、秒] | ||||
| 			let nTime = new Date(); | ||||
| 			let nYear = nTime.getFullYear(); | ||||
| 			let nMouth = nTime.getMonth() + 1; | ||||
| 			let nDay = nTime.getDate(); | ||||
| 			let nHour = nTime.getHours(); | ||||
| 			let nMin = nTime.getMinutes(); | ||||
| 			let nSecond = nTime.getSeconds(); | ||||
| 			// 根据规则获取到近100年可能年数组、月数组等等 | ||||
| 			this.getSecondArr(ruleArr[0]); | ||||
| 			this.getMinArr(ruleArr[1]); | ||||
| 			this.getHourArr(ruleArr[2]); | ||||
| 			this.getDayArr(ruleArr[3]); | ||||
| 			this.getMouthArr(ruleArr[4]); | ||||
| 			this.getWeekArr(ruleArr[5]); | ||||
| 			this.getYearArr(ruleArr[6], nYear); | ||||
| 			// 将获取到的数组赋值-方便使用 | ||||
| 			let sDate = this.dateArr[0]; | ||||
| 			let mDate = this.dateArr[1]; | ||||
| 			let hDate = this.dateArr[2]; | ||||
| 			let DDate = this.dateArr[3]; | ||||
| 			let MDate = this.dateArr[4]; | ||||
| 			let YDate = this.dateArr[5]; | ||||
| 			// 获取当前时间在数组中的索引 | ||||
| 			let sIdx = this.getIndex(sDate, nSecond); | ||||
| 			let mIdx = this.getIndex(mDate, nMin); | ||||
| 			let hIdx = this.getIndex(hDate, nHour); | ||||
| 			let DIdx = this.getIndex(DDate, nDay); | ||||
| 			let MIdx = this.getIndex(MDate, nMouth); | ||||
| 			let YIdx = this.getIndex(YDate, nYear); | ||||
| 			// 重置月日时分秒的函数(后面用的比较多) | ||||
| 			const resetSecond = function () { | ||||
| 				sIdx = 0; | ||||
| 				nSecond = sDate[sIdx] | ||||
| 			} | ||||
| 			const resetMin = function () { | ||||
| 				mIdx = 0; | ||||
| 				nMin = mDate[mIdx] | ||||
| 				resetSecond(); | ||||
| 			} | ||||
| 			const resetHour = function () { | ||||
| 				hIdx = 0; | ||||
| 				nHour = hDate[hIdx] | ||||
| 				resetMin(); | ||||
| 			} | ||||
| 			const resetDay = function () { | ||||
| 				DIdx = 0; | ||||
| 				nDay = DDate[DIdx] | ||||
| 				resetHour(); | ||||
| 			} | ||||
| 			const resetMouth = function () { | ||||
| 				MIdx = 0; | ||||
| 				nMouth = MDate[MIdx] | ||||
| 				resetDay(); | ||||
| 			} | ||||
| 			// 如果当前年份不为数组中当前值 | ||||
| 			if (nYear !== YDate[YIdx]) { | ||||
| 				resetMouth(); | ||||
| 			} | ||||
| 			// 如果当前月份不为数组中当前值 | ||||
| 			if (nMouth !== MDate[MIdx]) { | ||||
| 				resetDay(); | ||||
| 			} | ||||
| 			// 如果当前“日”不为数组中当前值 | ||||
| 			if (nDay !== DDate[DIdx]) { | ||||
| 				resetHour(); | ||||
| 			} | ||||
| 			// 如果当前“时”不为数组中当前值 | ||||
| 			if (nHour !== hDate[hIdx]) { | ||||
| 				resetMin(); | ||||
| 			} | ||||
| 			// 如果当前“分”不为数组中当前值 | ||||
| 			if (nMin !== mDate[mIdx]) { | ||||
| 				resetSecond(); | ||||
| 			} | ||||
| 
 | ||||
| 			// 循环年份数组 | ||||
| 			goYear: for (let Yi = YIdx; Yi < YDate.length; Yi++) { | ||||
| 				let YY = YDate[Yi]; | ||||
| 				// 如果到达最大值时 | ||||
| 				if (nMouth > MDate[MDate.length - 1]) { | ||||
| 					resetMouth(); | ||||
| 					continue; | ||||
| 				} | ||||
| 				// 循环月份数组 | ||||
| 				goMouth: for (let Mi = MIdx; Mi < MDate.length; Mi++) { | ||||
| 					// 赋值、方便后面运算 | ||||
| 					let MM = MDate[Mi]; | ||||
| 					MM = MM < 10 ? '0' + MM : MM; | ||||
| 					// 如果到达最大值时 | ||||
| 					if (nDay > DDate[DDate.length - 1]) { | ||||
| 						resetDay(); | ||||
| 						if (Mi == MDate.length - 1) { | ||||
| 							resetMouth(); | ||||
| 							continue goYear; | ||||
| 						} | ||||
| 						continue; | ||||
| 					} | ||||
| 					// 循环日期数组 | ||||
| 					goDay: for (let Di = DIdx; Di < DDate.length; Di++) { | ||||
| 						// 赋值、方便后面运算 | ||||
| 						let DD = DDate[Di]; | ||||
| 						let thisDD = DD < 10 ? '0' + DD : DD; | ||||
| 
 | ||||
| 						// 如果到达最大值时 | ||||
| 						if (nHour > hDate[hDate.length - 1]) { | ||||
| 							resetHour(); | ||||
| 							if (Di == DDate.length - 1) { | ||||
| 								resetDay(); | ||||
| 								if (Mi == MDate.length - 1) { | ||||
| 									resetMouth(); | ||||
| 									continue goYear; | ||||
| 								} | ||||
| 								continue goMouth; | ||||
| 							} | ||||
| 							continue; | ||||
| 						} | ||||
| 
 | ||||
| 						// 判断日期的合法性,不合法的话也是跳出当前循环 | ||||
| 						if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true && this.dayRule !== 'workDay' && this.dayRule !== 'lastWeek' && this.dayRule !== 'lastDay') { | ||||
| 							resetDay(); | ||||
| 							continue goMouth; | ||||
| 						} | ||||
| 						// 如果日期规则中有值时 | ||||
| 						if (this.dayRule == 'lastDay') { | ||||
| 							//如果不是合法日期则需要将前将日期调到合法日期即月末最后一天 | ||||
| 
 | ||||
| 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 									DD--; | ||||
| 
 | ||||
| 									thisDD = DD < 10 ? '0' + DD : DD; | ||||
| 								} | ||||
| 							} | ||||
| 						} else if (this.dayRule == 'workDay') { | ||||
| 							//校验并调整如果是2月30号这种日期传进来时需调整至正常月底 | ||||
| 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 									DD--; | ||||
| 									thisDD = DD < 10 ? '0' + DD : DD; | ||||
| 								} | ||||
| 							} | ||||
| 							// 获取达到条件的日期是星期X | ||||
| 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week'); | ||||
| 							// 当星期日时 | ||||
| 							if (thisWeek == 0) { | ||||
| 								//先找下一个日,并判断是否为月底 | ||||
| 								DD++; | ||||
| 								thisDD = DD < 10 ? '0' + DD : DD; | ||||
| 								//判断下一日已经不是合法日期 | ||||
| 								if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 									DD -= 3; | ||||
| 								} | ||||
| 							} else if (thisWeek == 6) { | ||||
| 								//当星期6时只需判断不是1号就可进行操作 | ||||
| 								if (this.dayRuleSup !== 1) { | ||||
| 									DD--; | ||||
| 								} else { | ||||
| 									DD += 2; | ||||
| 								} | ||||
| 							} | ||||
| 						} else if (this.dayRule == 'weekDay') { | ||||
| 							//如果指定了是星期几 | ||||
| 							//获取当前日期是属于星期几 | ||||
| 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week'); | ||||
| 							//校验当前星期是否在星期池(dayRuleSup)中 | ||||
| 							if (Array.indexOf(this.dayRuleSup, thisWeek) < 0) { | ||||
| 								// 如果到达最大值时 | ||||
| 								if (Di == DDate.length - 1) { | ||||
| 									resetDay(); | ||||
| 									if (Mi == MDate.length - 1) { | ||||
| 										resetMouth(); | ||||
| 										continue goYear; | ||||
| 									} | ||||
| 									continue goMouth; | ||||
| 								} | ||||
| 								continue; | ||||
| 							} | ||||
| 						} else if (this.dayRule == 'assWeek') { | ||||
| 							//如果指定了是第几周的星期几 | ||||
| 							//获取每月1号是属于星期几 | ||||
| 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + DD + ' 00:00:00'), 'week'); | ||||
| 							if (this.dayRuleSup[1] >= thisWeek) { | ||||
| 								DD = (this.dayRuleSup[0] - 1) * 7 + this.dayRuleSup[1] - thisWeek + 1; | ||||
| 							} else { | ||||
| 								DD = this.dayRuleSup[0] * 7 + this.dayRuleSup[1] - thisWeek + 1; | ||||
| 							} | ||||
| 						} else if (this.dayRule == 'lastWeek') { | ||||
| 							//如果指定了每月最后一个星期几 | ||||
| 							//校验并调整如果是2月30号这种日期传进来时需调整至正常月底 | ||||
| 							if (this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 								while (DD > 0 && this.checkDate(YY + '-' + MM + '-' + thisDD + ' 00:00:00') !== true) { | ||||
| 									DD--; | ||||
| 									thisDD = DD < 10 ? '0' + DD : DD; | ||||
| 								} | ||||
| 							} | ||||
| 							//获取月末最后一天是星期几 | ||||
| 							let thisWeek = this.formatDate(new Date(YY + '-' + MM + '-' + thisDD + ' 00:00:00'), 'week'); | ||||
| 							//找到要求中最近的那个星期几 | ||||
| 							if (this.dayRuleSup < thisWeek) { | ||||
| 								DD -= thisWeek - this.dayRuleSup; | ||||
| 							} else if (this.dayRuleSup > thisWeek) { | ||||
| 								DD -= 7 - (this.dayRuleSup - thisWeek) | ||||
| 							} | ||||
| 						} | ||||
| 						// 判断时间值是否小于10置换成“05”这种格式 | ||||
| 						DD = DD < 10 ? '0' + DD : DD; | ||||
| 
 | ||||
| 						// 循环“时”数组 | ||||
| 						goHour: for (let hi = hIdx; hi < hDate.length; hi++) { | ||||
| 							let hh = hDate[hi] < 10 ? '0' + hDate[hi] : hDate[hi] | ||||
| 
 | ||||
| 							// 如果到达最大值时 | ||||
| 							if (nMin > mDate[mDate.length - 1]) { | ||||
| 								resetMin(); | ||||
| 								if (hi == hDate.length - 1) { | ||||
| 									resetHour(); | ||||
| 									if (Di == DDate.length - 1) { | ||||
| 										resetDay(); | ||||
| 										if (Mi == MDate.length - 1) { | ||||
| 											resetMouth(); | ||||
| 											continue goYear; | ||||
| 										} | ||||
| 										continue goMouth; | ||||
| 									} | ||||
| 									continue goDay; | ||||
| 								} | ||||
| 								continue; | ||||
| 							} | ||||
| 							// 循环"分"数组 | ||||
| 							goMin: for (let mi = mIdx; mi < mDate.length; mi++) { | ||||
| 								let mm = mDate[mi] < 10 ? '0' + mDate[mi] : mDate[mi]; | ||||
| 
 | ||||
| 								// 如果到达最大值时 | ||||
| 								if (nSecond > sDate[sDate.length - 1]) { | ||||
| 									resetSecond(); | ||||
| 									if (mi == mDate.length - 1) { | ||||
| 										resetMin(); | ||||
| 										if (hi == hDate.length - 1) { | ||||
| 											resetHour(); | ||||
| 											if (Di == DDate.length - 1) { | ||||
| 												resetDay(); | ||||
| 												if (Mi == MDate.length - 1) { | ||||
| 													resetMouth(); | ||||
| 													continue goYear; | ||||
| 												} | ||||
| 												continue goMouth; | ||||
| 											} | ||||
| 											continue goDay; | ||||
| 										} | ||||
| 										continue goHour; | ||||
| 									} | ||||
| 									continue; | ||||
| 								} | ||||
| 								// 循环"秒"数组 | ||||
| 								goSecond: for (let si = sIdx; si <= sDate.length - 1; si++) { | ||||
| 									let ss = sDate[si] < 10 ? '0' + sDate[si] : sDate[si]; | ||||
| 									// 添加当前时间(时间合法性在日期循环时已经判断) | ||||
| 									if (MM !== '00' && DD !== '00') { | ||||
| 										resultArr.push(YY + '-' + MM + '-' + DD + ' ' + hh + ':' + mm + ':' + ss) | ||||
| 										nums++; | ||||
| 									} | ||||
| 									//如果条数满了就退出循环 | ||||
| 									if (nums == 5) break goYear; | ||||
| 									//如果到达最大值时 | ||||
| 									if (si == sDate.length - 1) { | ||||
| 										resetSecond(); | ||||
| 										if (mi == mDate.length - 1) { | ||||
| 											resetMin(); | ||||
| 											if (hi == hDate.length - 1) { | ||||
| 												resetHour(); | ||||
| 												if (Di == DDate.length - 1) { | ||||
| 													resetDay(); | ||||
| 													if (Mi == MDate.length - 1) { | ||||
| 														resetMouth(); | ||||
| 														continue goYear; | ||||
| 													} | ||||
| 													continue goMouth; | ||||
| 												} | ||||
| 												continue goDay; | ||||
| 											} | ||||
| 											continue goHour; | ||||
| 										} | ||||
| 										continue goMin; | ||||
| 									} | ||||
| 								} //goSecond | ||||
| 							} //goMin | ||||
| 						}//goHour | ||||
| 					}//goDay | ||||
| 				}//goMouth | ||||
| 			} | ||||
| 			// 判断100年内的结果条数 | ||||
| 			if (resultArr.length == 0) { | ||||
| 				this.resultList = ['没有达到条件的结果!']; | ||||
| 			} else { | ||||
| 				this.resultList = resultArr; | ||||
| 				if (resultArr.length !== 5) { | ||||
| 					this.resultList.push('最近100年内只有上面' + resultArr.length + '条结果!') | ||||
| 				} | ||||
| 			} | ||||
| 			// 计算完成-显示结果 | ||||
| 			this.isShow = true; | ||||
| 
 | ||||
| 
 | ||||
| 		}, | ||||
| 		//用于计算某位数字在数组中的索引 | ||||
| 		getIndex(arr, value) { | ||||
| 			if (value <= arr[0] || value > arr[arr.length - 1]) { | ||||
| 				return 0; | ||||
| 			} else { | ||||
| 				for (let i = 0; i < arr.length - 1; i++) { | ||||
| 					if (value > arr[i] && value <= arr[i + 1]) { | ||||
| 						return i + 1; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"年"数组 | ||||
| 		getYearArr(rule, year) { | ||||
| 			this.dateArr[5] = this.getOrderArr(year, year + 100); | ||||
| 			if (rule !== undefined) { | ||||
| 				if (rule.indexOf('-') >= 0) { | ||||
| 					this.dateArr[5] = this.getCycleArr(rule, year + 100, false) | ||||
| 				} else if (rule.indexOf('/') >= 0) { | ||||
| 					this.dateArr[5] = this.getAverageArr(rule, year + 100) | ||||
| 				} else if (rule !== '*') { | ||||
| 					this.dateArr[5] = this.getAssignArr(rule) | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"月"数组 | ||||
| 		getMouthArr(rule) { | ||||
| 			this.dateArr[4] = this.getOrderArr(1, 12); | ||||
| 			if (rule.indexOf('-') >= 0) { | ||||
| 				this.dateArr[4] = this.getCycleArr(rule, 12, false) | ||||
| 			} else if (rule.indexOf('/') >= 0) { | ||||
| 				this.dateArr[4] = this.getAverageArr(rule, 12) | ||||
| 			} else if (rule !== '*') { | ||||
| 				this.dateArr[4] = this.getAssignArr(rule) | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"日"数组-主要为日期规则 | ||||
| 		getWeekArr(rule) { | ||||
| 			//只有当日期规则的两个值均为“”时则表达日期是有选项的 | ||||
| 			if (this.dayRule == '' && this.dayRuleSup == '') { | ||||
| 				if (rule.indexOf('-') >= 0) { | ||||
| 					this.dayRule = 'weekDay'; | ||||
| 					this.dayRuleSup = this.getCycleArr(rule, 7, false) | ||||
| 				} else if (rule.indexOf('#') >= 0) { | ||||
| 					this.dayRule = 'assWeek'; | ||||
| 					let matchRule = rule.match(/[0-9]{1}/g); | ||||
| 					this.dayRuleSup = [Number(matchRule[0]), Number(matchRule[1])]; | ||||
| 					this.dateArr[3] = [1]; | ||||
| 					if (this.dayRuleSup[1] == 7) { | ||||
| 						this.dayRuleSup[1] = 0; | ||||
| 					} | ||||
| 				} else if (rule.indexOf('L') >= 0) { | ||||
| 					this.dayRule = 'lastWeek'; | ||||
| 					this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]); | ||||
| 					this.dateArr[3] = [31]; | ||||
| 					if (this.dayRuleSup == 7) { | ||||
| 						this.dayRuleSup = 0; | ||||
| 					} | ||||
| 				} else if (rule !== '*' && rule !== '?') { | ||||
| 					this.dayRule = 'weekDay'; | ||||
| 					this.dayRuleSup = this.getAssignArr(rule) | ||||
| 				} | ||||
| 				//如果weekDay时将7调整为0【week值0即是星期日】 | ||||
| 				if (this.dayRule == 'weekDay') { | ||||
| 					for (let i = 0; i < this.dayRuleSup.length; i++) { | ||||
| 						if (this.dayRuleSup[i] == 7) { | ||||
| 							this.dayRuleSup[i] = 0; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"日"数组-少量为日期规则 | ||||
| 		getDayArr(rule) { | ||||
| 			this.dateArr[3] = this.getOrderArr(1, 31); | ||||
| 			this.dayRule = ''; | ||||
| 			this.dayRuleSup = ''; | ||||
| 			if (rule.indexOf('-') >= 0) { | ||||
| 				this.dateArr[3] = this.getCycleArr(rule, 31, false) | ||||
| 				this.dayRuleSup = 'null'; | ||||
| 			} else if (rule.indexOf('/') >= 0) { | ||||
| 				this.dateArr[3] = this.getAverageArr(rule, 31) | ||||
| 				this.dayRuleSup = 'null'; | ||||
| 			} else if (rule.indexOf('W') >= 0) { | ||||
| 				this.dayRule = 'workDay'; | ||||
| 				this.dayRuleSup = Number(rule.match(/[0-9]{1,2}/g)[0]); | ||||
| 				this.dateArr[3] = [this.dayRuleSup]; | ||||
| 			} else if (rule.indexOf('L') >= 0) { | ||||
| 				this.dayRule = 'lastDay'; | ||||
| 				this.dayRuleSup = 'null'; | ||||
| 				this.dateArr[3] = [31]; | ||||
| 			} else if (rule !== '*' && rule !== '?') { | ||||
| 				this.dateArr[3] = this.getAssignArr(rule) | ||||
| 				this.dayRuleSup = 'null'; | ||||
| 			} else if (rule == '*') { | ||||
| 				this.dayRuleSup = 'null'; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"时"数组 | ||||
| 		getHourArr(rule) { | ||||
| 			this.dateArr[2] = this.getOrderArr(0, 23); | ||||
| 			if (rule.indexOf('-') >= 0) { | ||||
| 				this.dateArr[2] = this.getCycleArr(rule, 24, true) | ||||
| 			} else if (rule.indexOf('/') >= 0) { | ||||
| 				this.dateArr[2] = this.getAverageArr(rule, 23) | ||||
| 			} else if (rule !== '*') { | ||||
| 				this.dateArr[2] = this.getAssignArr(rule) | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"分"数组 | ||||
| 		getMinArr(rule) { | ||||
| 			this.dateArr[1] = this.getOrderArr(0, 59); | ||||
| 			if (rule.indexOf('-') >= 0) { | ||||
| 				this.dateArr[1] = this.getCycleArr(rule, 60, true) | ||||
| 			} else if (rule.indexOf('/') >= 0) { | ||||
| 				this.dateArr[1] = this.getAverageArr(rule, 59) | ||||
| 			} else if (rule !== '*') { | ||||
| 				this.dateArr[1] = this.getAssignArr(rule) | ||||
| 			} | ||||
| 		}, | ||||
| 		// 获取"秒"数组 | ||||
| 		getSecondArr(rule) { | ||||
| 			this.dateArr[0] = this.getOrderArr(0, 59); | ||||
| 			if (rule.indexOf('-') >= 0) { | ||||
| 				this.dateArr[0] = this.getCycleArr(rule, 60, true) | ||||
| 			} else if (rule.indexOf('/') >= 0) { | ||||
| 				this.dateArr[0] = this.getAverageArr(rule, 59) | ||||
| 			} else if (rule !== '*') { | ||||
| 				this.dateArr[0] = this.getAssignArr(rule) | ||||
| 			} | ||||
| 		}, | ||||
| 		// 根据传进来的min-max返回一个顺序的数组 | ||||
| 		getOrderArr(min, max) { | ||||
| 			let arr = []; | ||||
| 			for (let i = min; i <= max; i++) { | ||||
| 				arr.push(i); | ||||
| 			} | ||||
| 			return arr; | ||||
| 		}, | ||||
| 		// 根据规则中指定的零散值返回一个数组 | ||||
| 		getAssignArr(rule) { | ||||
| 			let arr = []; | ||||
| 			let assiginArr = rule.split(','); | ||||
| 			for (let i = 0; i < assiginArr.length; i++) { | ||||
| 				arr[i] = Number(assiginArr[i]) | ||||
| 			} | ||||
| 			arr.sort(this.compare) | ||||
| 			return arr; | ||||
| 		}, | ||||
| 		// 根据一定算术规则计算返回一个数组 | ||||
| 		getAverageArr(rule, limit) { | ||||
| 			let arr = []; | ||||
| 			let agArr = rule.split('/'); | ||||
| 			let min = Number(agArr[0]); | ||||
| 			let step = Number(agArr[1]); | ||||
| 			while (min <= limit) { | ||||
| 				arr.push(min); | ||||
| 				min += step; | ||||
| 			} | ||||
| 			return arr; | ||||
| 		}, | ||||
| 		// 根据规则返回一个具有周期性的数组 | ||||
| 		getCycleArr(rule, limit, status) { | ||||
| 			//status--表示是否从0开始(则从1开始) | ||||
| 			let arr = []; | ||||
| 			let cycleArr = rule.split('-'); | ||||
| 			let min = Number(cycleArr[0]); | ||||
| 			let max = Number(cycleArr[1]); | ||||
| 			if (min > max) { | ||||
| 				max += limit; | ||||
| 			} | ||||
| 			for (let i = min; i <= max; i++) { | ||||
| 				let add = 0; | ||||
| 				if (status == false && i % limit == 0) { | ||||
| 					add = limit; | ||||
| 				} | ||||
| 				arr.push(Math.round(i % limit + add)) | ||||
| 			} | ||||
| 			arr.sort(this.compare) | ||||
| 			return arr; | ||||
| 		}, | ||||
| 		//比较数字大小(用于Array.sort) | ||||
| 		compare(value1, value2) { | ||||
| 			if (value2 - value1 > 0) { | ||||
| 				return -1; | ||||
| 			} else { | ||||
| 				return 1; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 格式化日期格式如:2017-9-19 18:04:33 | ||||
| 		formatDate(value, type) { | ||||
| 			// 计算日期相关值 | ||||
| 			let time = typeof value == 'number' ? new Date(value) : value; | ||||
| 			let Y = time.getFullYear(); | ||||
| 			let M = time.getMonth() + 1; | ||||
| 			let D = time.getDate(); | ||||
| 			let h = time.getHours(); | ||||
| 			let m = time.getMinutes(); | ||||
| 			let s = time.getSeconds(); | ||||
| 			let week = time.getDay(); | ||||
| 			// 如果传递了type的话 | ||||
| 			if (type == undefined) { | ||||
| 				return Y + '-' + (M < 10 ? '0' + M : M) + '-' + (D < 10 ? '0' + D : D) + ' ' + (h < 10 ? '0' + h : h) + ':' + (m < 10 ? '0' + m : m) + ':' + (s < 10 ? '0' + s : s); | ||||
| 			} else if (type == 'week') { | ||||
| 				return week; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 检查日期是否存在 | ||||
| 		checkDate(value) { | ||||
| 			let time = new Date(value); | ||||
| 			let format = this.formatDate(time) | ||||
| 			return value == format ? true : false; | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		'ex': 'expressionChange' | ||||
| 	}, | ||||
| 	props: ['ex'], | ||||
| 	mounted: function () { | ||||
| 		// 初始化 获取一次结果 | ||||
| 		this.expressionChange(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| </script> | ||||
							
								
								
									
										133
									
								
								ruoyi-ui/src/components/Crontab/second.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								ruoyi-ui/src/components/Crontab/second.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | ||||
| <template> | ||||
| 	<el-form size="small"> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				秒,允许的通配符[, - * /] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min="0" :max="60" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="0" :max="60" /> 秒 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min="0" :max="60" /> 秒开始,每 | ||||
| 				<el-input-number v-model='average02' :min="0" :max="60" /> 秒执行一次 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="item in 60" :key="item" :value="item-1">{{item-1}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 1, | ||||
| 			cycle01: 1, | ||||
| 			cycle02: 2, | ||||
| 			average01: 0, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-second', | ||||
| 	props: ['check', 'radioParent'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			switch (this.radioValue) { | ||||
| 				case 1: | ||||
| 					this.$emit('update', 'second', '*', 'second'); | ||||
| 					this.$emit('update', 'min', '*', 'second'); | ||||
| 					break; | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'second', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'second', this.average01 + '/' + this.average02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'second', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '2') { | ||||
| 				this.$emit('update', 'second', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'second', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'second', this.checkboxString); | ||||
| 			} | ||||
| 		}, | ||||
| 		othChange() { | ||||
| 			//反解析  | ||||
| 			let ins = this.cron.second | ||||
| 			('反解析 second', ins); | ||||
| 			if (ins === '*') { | ||||
| 				this.radioValue = 1; | ||||
| 			} else if (ins.indexOf('-') > -1) { | ||||
| 				this.radioValue = 2 | ||||
| 			} else if (ins.indexOf('/') > -1) { | ||||
| 				this.radioValue = 3 | ||||
| 			} else { | ||||
| 				this.radioValue = 4 | ||||
| 				this.checkboxList = ins.split(',') | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'checkboxString': 'checkboxChange', | ||||
| 		radioParent() { | ||||
| 			this.radioValue = this.radioParent | ||||
| 		} | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 0, 59) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 0, 59) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 0, 59) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 59) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										167
									
								
								ruoyi-ui/src/components/Crontab/week.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								ruoyi-ui/src/components/Crontab/week.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,167 @@ | ||||
| <template> | ||||
| 	<el-form size='small'> | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="1"> | ||||
| 				周,允许的通配符[, - * / L #] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="2"> | ||||
| 				不指定 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="3"> | ||||
| 				周期从星期 | ||||
| 				<el-input-number v-model='cycle01' :min="1" :max="7" /> - | ||||
| 				<el-input-number v-model='cycle02' :min="1" :max="7" /> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="4"> | ||||
| 				第 | ||||
| 				<el-input-number v-model='average01' :min="1" :max="4" /> 周的星期 | ||||
| 				<el-input-number v-model='average02' :min="1" :max="7" /> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="5"> | ||||
| 				本月最后一个星期 | ||||
| 				<el-input-number v-model='weekday' :min="1" :max="7" /> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio v-model='radioValue' :label="6"> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple style="width:100%"> | ||||
| 					<el-option v-for="(item,index) of weekList" :key="index" :value="index+1">{{item}}</el-option> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			radioValue: 2, | ||||
| 			weekday: 1, | ||||
| 			cycle01: 1, | ||||
| 			cycle02: 2, | ||||
| 			average01: 1, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			weekList: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-week', | ||||
| 	props: ['check', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			if (this.radioValue === 1) { | ||||
| 				this.$emit('update', 'week', '*'); | ||||
| 				this.$emit('update', 'year', '*'); | ||||
| 			} else { | ||||
| 				if (this.cron.mouth === '*') { | ||||
| 					this.$emit('update', 'mouth', '0', 'week'); | ||||
| 				} | ||||
| 				if (this.cron.day === '*') { | ||||
| 					this.$emit('update', 'day', '0', 'week'); | ||||
| 				} | ||||
| 				if (this.cron.hour === '*') { | ||||
| 					this.$emit('update', 'hour', '0', 'week'); | ||||
| 				} | ||||
| 				if (this.cron.min === '*') { | ||||
| 					this.$emit('update', 'min', '0', 'week'); | ||||
| 				} | ||||
| 				if (this.cron.second === '*') { | ||||
| 					this.$emit('update', 'second', '0', 'week'); | ||||
| 				} | ||||
| 			} | ||||
| 			switch (this.radioValue) { | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'week', '?'); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'week', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'week', this.average01 + '#' + this.average02); | ||||
| 					break; | ||||
| 				case 5: | ||||
| 					this.$emit('update', 'week', this.weekday + 'L'); | ||||
| 					break; | ||||
| 				case 6: | ||||
| 					this.$emit('update', 'week', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 根据互斥事件,更改radio的值 | ||||
| 
 | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'week', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'week', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 最近工作日值变化时 | ||||
| 		weekdayChange() { | ||||
| 			if (this.radioValue == '5') { | ||||
| 				this.$emit('update', 'week', this.weekday + 'L'); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '6') { | ||||
| 				this.$emit('update', 'week', this.checkboxString); | ||||
| 			} | ||||
| 		}, | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'weekdayCheck': 'weekdayChange', | ||||
| 		'checkboxString': 'checkboxChange', | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, 1, 7) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, 1, 7) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, 1, 4) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 7) | ||||
| 			return this.average01 + '#' + this.average02; | ||||
| 		}, | ||||
| 		// 最近的工作日(格式) | ||||
| 		weekdayCheck: function () { | ||||
| 			this.weekday = this.checkNum(this.weekday, 1, 7) | ||||
| 			return this.weekday; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str == '' ? '*' : str; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
							
								
								
									
										144
									
								
								ruoyi-ui/src/components/Crontab/year.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								ruoyi-ui/src/components/Crontab/year.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,144 @@ | ||||
| <template> | ||||
| 	<el-form size="small"> | ||||
| 		<el-form-item> | ||||
| 			<el-radio :label="1" v-model='radioValue'> | ||||
| 				不填,允许的通配符[, - * /] | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio :label="2" v-model='radioValue'> | ||||
| 				每年 | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio :label="3" v-model='radioValue'> | ||||
| 				周期从 | ||||
| 				<el-input-number v-model='cycle01' :min='fullYear' /> - | ||||
| 				<el-input-number v-model='cycle02' :min='fullYear' /> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio :label="4" v-model='radioValue'> | ||||
| 				从 | ||||
| 				<el-input-number v-model='average01' :min='fullYear' /> 年开始,每 | ||||
| 				<el-input-number v-model='average02' :min='fullYear' /> 年执行一次 | ||||
| 			</el-radio> | ||||
| 
 | ||||
| 		</el-form-item> | ||||
| 
 | ||||
| 		<el-form-item> | ||||
| 			<el-radio :label="5" v-model='radioValue'> | ||||
| 				指定 | ||||
| 				<el-select clearable v-model="checkboxList" placeholder="可多选" multiple> | ||||
| 					<el-option v-for="item in 9" :key="item" :value="item - 1 + fullYear" :label="item -1 + fullYear" /> | ||||
| 				</el-select> | ||||
| 			</el-radio> | ||||
| 		</el-form-item> | ||||
| 	</el-form> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
| 	data() { | ||||
| 		return { | ||||
| 			fullYear: 0, | ||||
| 			radioValue: 1, | ||||
| 			cycle01: 0, | ||||
| 			cycle02: 0, | ||||
| 			average01: 0, | ||||
| 			average02: 1, | ||||
| 			checkboxList: [], | ||||
| 			checkNum: this.$options.propsData.check | ||||
| 		} | ||||
| 	}, | ||||
| 	name: 'crontab-year', | ||||
| 	props: ['check', 'mouth', 'cron'], | ||||
| 	methods: { | ||||
| 		// 单选按钮值变化时 | ||||
| 		radioChange() { | ||||
| 			if (this.cron.mouth === '*') { | ||||
| 				this.$emit('update', 'mouth', '0', 'year'); | ||||
| 			} | ||||
| 			if (this.cron.day === '*') { | ||||
| 				this.$emit('update', 'day', '0', 'year'); | ||||
| 			} | ||||
| 			if (this.cron.hour === '*') { | ||||
| 				this.$emit('update', 'hour', '0', 'year'); | ||||
| 			} | ||||
| 			if (this.cron.min === '*') { | ||||
| 				this.$emit('update', 'min', '0', 'year'); | ||||
| 			} | ||||
| 			if (this.cron.second === '*') { | ||||
| 				this.$emit('update', 'second', '0', 'year'); | ||||
| 			} | ||||
| 			switch (this.radioValue) { | ||||
| 				case 1: | ||||
| 					this.$emit('update', 'year', ''); | ||||
| 					break; | ||||
| 				case 2: | ||||
| 					this.$emit('update', 'year', '*'); | ||||
| 					break; | ||||
| 				case 3: | ||||
| 					this.$emit('update', 'year', this.cycle01 + '-' + this.cycle02); | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					this.$emit('update', 'year', this.average01 + '/' + this.average02); | ||||
| 					break; | ||||
| 				case 5: | ||||
| 					this.$emit('update', 'year', this.checkboxString); | ||||
| 					break; | ||||
| 			} | ||||
| 		}, | ||||
| 		// 周期两个值变化时 | ||||
| 		cycleChange() { | ||||
| 			if (this.radioValue == '3') { | ||||
| 				this.$emit('update', 'year', this.cycleTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// 平均两个值变化时 | ||||
| 		averageChange() { | ||||
| 			if (this.radioValue == '4') { | ||||
| 				this.$emit('update', 'year', this.averageTotal); | ||||
| 			} | ||||
| 		}, | ||||
| 		// checkbox值变化时 | ||||
| 		checkboxChange() { | ||||
| 			if (this.radioValue == '5') { | ||||
| 				this.$emit('update', 'year', this.checkboxString); | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| 	watch: { | ||||
| 		"radioValue": "radioChange", | ||||
| 		'cycleTotal': 'cycleChange', | ||||
| 		'averageTotal': 'averageChange', | ||||
| 		'checkboxString': 'checkboxChange' | ||||
| 	}, | ||||
| 	computed: { | ||||
| 		// 计算两个周期值 | ||||
| 		cycleTotal: function () { | ||||
| 			this.cycle01 = this.checkNum(this.cycle01, this.fullYear, this.fullYear + 100) | ||||
| 			this.cycle02 = this.checkNum(this.cycle02, this.fullYear + 1, this.fullYear + 101) | ||||
| 			return this.cycle01 + '-' + this.cycle02; | ||||
| 		}, | ||||
| 		// 计算平均用到的值 | ||||
| 		averageTotal: function () { | ||||
| 			this.average01 = this.checkNum(this.average01, this.fullYear, this.fullYear + 100) | ||||
| 			this.average02 = this.checkNum(this.average02, 1, 10) | ||||
| 			return this.average01 + '/' + this.average02; | ||||
| 		}, | ||||
| 		// 计算勾选的checkbox值合集 | ||||
| 		checkboxString: function () { | ||||
| 			let str = this.checkboxList.join(); | ||||
| 			return str; | ||||
| 		} | ||||
| 	}, | ||||
| 	mounted: function () { | ||||
| 		// 仅获取当前年份 | ||||
| 		this.fullYear = Number(new Date().getFullYear()); | ||||
| 	} | ||||
| } | ||||
| </script> | ||||
| @ -156,7 +156,7 @@ | ||||
|     /> | ||||
| 
 | ||||
|     <!-- 添加或修改定时任务对话框 --> | ||||
|     <el-dialog :title="title" :visible.sync="open" width="700px" append-to-body> | ||||
|     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> | ||||
|       <el-form ref="form" :model="form" :rules="rules" label-width="120px"> | ||||
|         <el-row> | ||||
|           <el-col :span="12"> | ||||
| @ -192,17 +192,16 @@ | ||||
|               <el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|           <el-col :span="24"> | ||||
|             <el-form-item label="cron表达式" prop="cronExpression"> | ||||
|               <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式" /> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="是否并发" prop="concurrent"> | ||||
|               <el-radio-group v-model="form.concurrent" size="small"> | ||||
|                 <el-radio-button label="0">允许</el-radio-button> | ||||
|                 <el-radio-button label="1">禁止</el-radio-button> | ||||
|               </el-radio-group> | ||||
|               <el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式"> | ||||
|                 <template slot="append"> | ||||
|                   <el-button type="primary" @click="handleShowCron"> | ||||
|                     生成表达式 | ||||
|                     <i class="el-icon-time el-icon--right"></i> | ||||
|                   </el-button> | ||||
|                 </template> | ||||
|               </el-input> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="24"> | ||||
| @ -214,7 +213,15 @@ | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="24"> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="是否并发" prop="concurrent"> | ||||
|               <el-radio-group v-model="form.concurrent" size="small"> | ||||
|                 <el-radio-button label="0">允许</el-radio-button> | ||||
|                 <el-radio-button label="1">禁止</el-radio-button> | ||||
|               </el-radio-group> | ||||
|             </el-form-item> | ||||
|           </el-col> | ||||
|           <el-col :span="12"> | ||||
|             <el-form-item label="状态"> | ||||
|               <el-radio-group v-model="form.status"> | ||||
|                 <el-radio | ||||
| @ -233,6 +240,10 @@ | ||||
|       </div> | ||||
|     </el-dialog> | ||||
| 
 | ||||
|     <el-dialog title="Cron表达式生成器" :visible.sync="openCron"> | ||||
|       <crontab @hide="openCron=false" @fill="crontabFill" :expression="expression"></crontab> | ||||
|     </el-dialog> | ||||
| 
 | ||||
|     <!-- 任务日志详细 --> | ||||
|     <el-dialog title="任务详细" :visible.sync="openView" width="700px" append-to-body> | ||||
|       <el-form ref="form" :model="form" label-width="120px" size="mini"> | ||||
| @ -285,8 +296,10 @@ | ||||
| 
 | ||||
| <script> | ||||
| import { listJob, getJob, delJob, addJob, updateJob, exportJob, runJob, changeJobStatus } from "@/api/monitor/job"; | ||||
| import Crontab from '@/components/Crontab' | ||||
| 
 | ||||
| export default { | ||||
|   components: { Crontab }, | ||||
|   name: "Job", | ||||
|   data() { | ||||
|     return { | ||||
| @ -312,6 +325,10 @@ export default { | ||||
|       open: false, | ||||
|       // 是否显示详细弹出层 | ||||
|       openView: false, | ||||
|       // 是否显示Cron表达式弹出层 | ||||
|       openCron: false, | ||||
|       // 传入的表达式 | ||||
|       expression: "", | ||||
|       // 任务组名字典 | ||||
|       jobGroupOptions: [], | ||||
|       // 状态字典 | ||||
| @ -448,6 +465,15 @@ export default { | ||||
|         this.openView = true; | ||||
|       }); | ||||
|     }, | ||||
|     /** cron表达式按钮操作 */ | ||||
|     handleShowCron() { | ||||
|       this.expression = this.form.cronExpression; | ||||
|       this.openCron = true; | ||||
|     }, | ||||
|     /** 确定后回传值 */ | ||||
|     crontabFill(value) { | ||||
|       this.form.cronExpression = value; | ||||
|     }, | ||||
|     /** 任务日志列表查询 */ | ||||
|     handleJobLog(row) { | ||||
|       const jobId = row.jobId || 0; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 RuoYi
						RuoYi