<template>
|
<GlobalWindow
|
:title="title"
|
:visible.sync="visible"
|
:confirm-working="isWorking"
|
width="40%"
|
@confirm="confirm"
|
>
|
<el-form :model="form" ref="form" :rules="rules">
|
<el-form-item label="任务名称" prop="jobName" required>
|
<el-input v-model="form.jobName" placeholder="请输入任务名称" v-trim/>
|
</el-form-item>
|
<el-form-item label="任务描述" prop="jobDescription">
|
<el-input v-model="form.jobDescription" type="textarea" placeholder="请输入JOB描述" v-trim/>
|
</el-form-item>
|
<el-form-item label="任务处理器类" prop="handler" required>
|
<el-input v-model="form.handler" placeholder="请输入任务处理器类" v-trim/>
|
</el-form-item>
|
<el-form-item label="CRON表达式" prop="cronExpression" required>
|
<el-input v-model="form.cronExpression" placeholder="请输入CRON表达式" v-trim/>
|
</el-form-item>
|
<el-form-item label="是否启用数据分片" prop="enableSnippet" class="form-item-switch" required>
|
<el-switch v-model="form.enableSnippet"/>
|
<span class="switch-text">{{form.enableSnippet | enableText}}</span>
|
<FormItemTip>数据分片可将一个任务需处理的数据分成多个子任务来处理,以提高任务的业务处理速度。</FormItemTip>
|
</el-form-item>
|
<el-form-item v-if="form.enableSnippet" label="数据分发处理器类" prop="distributeHandler" required>
|
<el-input v-model="form.distributeHandler" placeholder="请输入数据分发处理器类" v-trim/>
|
</el-form-item>
|
<el-form-item v-if="form.enableSnippet" label="子任务最大处理数据量" prop="distributeLimit" required>
|
<el-input-number v-model="form.distributeLimit" placeholder="请输入子任务最大处理数据量" v-trim/>
|
<FormItemTip>用于限制子任务处理数据量的最大能力</FormItemTip>
|
</el-form-item>
|
<el-form-item label="是否启用并发执行" prop="disallowConcurrent" class="form-item-switch" required>
|
<el-switch v-model="form.disallowConcurrent" :active-value="false" :inactive-value="true"/>
|
<span class="switch-text">{{form.disallowConcurrent | disabledText}}</span>
|
<FormItemTip>同一任务在同一机器是否允许并发执行,关闭后将使用Quartz提供的@DisallowConcurrentExecution注解实现</FormItemTip>
|
</el-form-item>
|
<el-form-item label="是否启用异步执行" prop="withAsync" class="form-item-switch" required>
|
<el-switch v-model="form.withAsync"/>
|
<span class="switch-text">{{form.withAsync | enableText}}</span>
|
<FormItemTip>启用后任务将通过创建分片的方式异步执行,提高服务器资源的利用率</FormItemTip>
|
</el-form-item>
|
<el-form-item label="是否启用日志" prop="withLog" class="form-item-switch" required>
|
<el-switch v-model="form.withLog"/>
|
<span class="switch-text">{{form.withLog | enableText}}</span>
|
<FormItemTip>启用日志后,每次任务及其分片任务的执行都会被记录进任务日志中</FormItemTip>
|
</el-form-item>
|
<el-form-item label="服务器白名单" prop="allowServerIps">
|
<el-input type="textarea" v-model="form.allowServerIps" placeholder="请输入服务器IP,多个IP使用英文逗号隔开"/>
|
<FormItemTip>如希望当前任务仅在某(些)台服务器中执行,则可以在此填入服务器内网IP,为空时表示所有服务器均可执行。</FormItemTip>
|
</el-form-item>
|
</el-form>
|
</GlobalWindow>
|
</template>
|
|
<script>
|
import BaseOpera from '@/components/base/BaseOpera'
|
import GlobalWindow from '@/components/common/GlobalWindow'
|
import FormItemTip from '@/components/common/FormItemTip'
|
export default {
|
name: 'OperaJobWindow',
|
extends: BaseOpera,
|
components: { FormItemTip, GlobalWindow },
|
data () {
|
return {
|
// 原数据
|
originData: null,
|
// 表单数据
|
form: {
|
id: null,
|
jobName: '',
|
jobDescription: '',
|
handler: '',
|
enableSnippet: false,
|
distributeHandler: '',
|
distributeLimit: null,
|
disallowConcurrent: false,
|
withAsync: true,
|
withLog: true,
|
cronExpression: '',
|
allowServerIps: ''
|
},
|
// 验证规则
|
rules: {
|
jobName: [
|
{ required: true, message: '请输入任务名称' }
|
],
|
handler: [
|
{ required: true, message: '请输入任务处理器类' }
|
],
|
cronExpression: [
|
{ required: true, message: '请输入CRON表达式' }
|
],
|
distributeHandler: [
|
{ required: true, message: '请输入数据分发处理器类' }
|
],
|
allowServerIps: [
|
{ validator: this.__checkServerIps, trigger: 'blur' }
|
]
|
}
|
}
|
},
|
methods: {
|
/**
|
* 打开窗口
|
*
|
* @param title 标题
|
* @param target 行对象(仅编辑需该参数)
|
*/
|
open (title, target) {
|
this.title = title
|
this.visible = true
|
// 新建
|
if (target == null) {
|
this.$nextTick(() => {
|
this.$refs.form.resetFields()
|
this.form[this.configData['field.id']] = null
|
})
|
return
|
}
|
// 编辑
|
this.$nextTick(() => {
|
for (const key in this.form) {
|
this.form[key] = target[key]
|
}
|
this.form.enableSnippet = this.form.distributeHandler != null && this.form.distributeHandler.trim() !== ''
|
this.originData = JSON.parse(JSON.stringify(this.form))
|
})
|
},
|
/**
|
* 确认新建
|
*
|
* @private
|
*/
|
__confirmCreate () {
|
this.$refs.form.validate((valid) => {
|
if (!valid) {
|
return
|
}
|
// 调用新建接口
|
this.isWorking = true
|
this.api.create(this.form)
|
.then(() => {
|
this.visible = false
|
this.$emit('success')
|
setTimeout(() => {
|
this.$dialog.attentionConfirm('新建成功,需重启服务后生效').then(() => {})
|
}, 300)
|
})
|
.catch(e => {
|
this.$tip.apiFailed(e)
|
})
|
.finally(() => {
|
this.isWorking = false
|
})
|
})
|
},
|
/**
|
* 确认修改
|
*
|
* @private
|
*/
|
__confirmEdit () {
|
this.$refs.form.validate((valid) => {
|
if (!valid) {
|
return
|
}
|
// 调用更新接口
|
this.isWorking = true
|
this.api.updateById(this.form)
|
.then(() => {
|
this.visible = false
|
this.$emit('success')
|
// 如果修改了处理器、CRON表达式、分发器处理器
|
const props = []
|
if (this.originData.handler !== this.form.handler) {
|
props.push('任务处理器类')
|
}
|
if (this.originData.cronExpression !== this.form.cronExpression) {
|
props.push('CRON表达式')
|
}
|
if (this.originData.distributeHandler !== this.form.distributeHandler) {
|
props.push('数据分发处理器类')
|
}
|
if (this.originData.disallowConcurrent !== this.form.disallowConcurrent) {
|
props.push('是否启用并发执行')
|
}
|
if (props.length > 0) {
|
setTimeout(() => {
|
this.$dialog.attentionConfirm(`修改成功,由于您修改了${props.join('、')},任务配置需要重启服务后才可生效`).then(() => {})
|
}, 300)
|
return
|
}
|
this.$tip.apiSuccess('修改成功')
|
})
|
.catch(e => {
|
this.$tip.apiFailed(e)
|
})
|
.finally(() => {
|
this.isWorking = false
|
})
|
})
|
},
|
/**
|
* 验证服务器白名单配置
|
*
|
* @param rule 规则
|
* @param value 值
|
* @param callback 回调
|
* @private
|
*/
|
__checkServerIps (rule, value, callback) {
|
// 为空时不验证
|
if (value == null || value === '') {
|
return callback()
|
}
|
// 验证IP
|
const ips = value.split(',')
|
for (const ip of ips) {
|
if (!/^[\d]{1,3}.[\d]{1,3}.[\d]{1,3}.[\d]{1,3}$/.test(ip)) {
|
return callback(new Error('IP格式不正确,多个IP可使用","分割'))
|
}
|
}
|
return callback()
|
}
|
},
|
created () {
|
this.config({
|
api: '/system/job',
|
'field.id': 'id'
|
})
|
}
|
}
|
</script>
|