<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> 
 |