QuartzJobList.vue 8.41 KB
<template>
  <a-card :bordered="false">
    <!-- 查询区域 -->
    <div class="table-page-search-wrapper">
      <a-form layout="inline" :model="queryParam" @keyup.enter.native="searchQuery">
        <a-row :gutter="24">
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item :label="$t('task.scheduledTaskName')" prop="jobClassName">
              <j-input :placeholder="$t('task.inputScheduledTaskName')" v-model="queryParam.description"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item :label="$t('task.scheduledTaskClass')" prop="jobClassName">
              <j-input :placeholder="$t('task.inputScheduledTaskClass')" v-model="queryParam.jobClassName"></j-input>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <a-form-item :label="$t('task.taskStatus')" prop="status">
              <a-select v-model="queryParam.status" :placeholder="$t('task.inputTaskStatus')">
                <a-select-option value="">{{ $t('task.taskStatusAll') }}</a-select-option>
                <a-select-option value="0">{{ $t('task.taskStatusStarted') }}</a-select-option>
                <a-select-option value="-1">{{ $t('task.taskStatusPaused') }}</a-select-option>
              </a-select>
            </a-form-item>
          </a-col>
          <a-col :xl="6" :lg="7" :md="8" :sm="24">
            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
              <a-button type="primary" @click="searchQuery" icon="search">{{ $t('button.search') }}</a-button>
              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">
                {{ $t('button.reset') }}
              </a-button>
            </span>
          </a-col>
        </a-row>
      </a-form>
    </div>

    <!-- table区域-begin -->
    <div>
      <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :pagination="ipagination"
        :loading="loading"
        :scroll="{ x: true }"
        @change="handleTableChange"
      >
        <!-- 字符串超长截取省略号显示-->
        <span slot="description" slot-scope="text">
          <j-ellipsis :value="text" :length="20" />
        </span>
        <span slot="parameterRender" slot-scope="text">
          <j-ellipsis :value="text" :length="20" />
        </span>

        <span slot="action" slot-scope="text, record">
          <a @click="resumeJob(record)" v-if="record.status == -1">
            {{ $t('button.start') }} <a-divider type="vertical" />
          </a>
          <a @click="pauseJob(record)" v-if="record.status == 0">{{ $t('button.stop') }}<a-divider type="vertical"/></a>
          <a @click="executeImmediately(record)">{{ $t('button.runOnce') }}<a-divider type="vertical"/></a>
          <a @click="handleEdit(record)">{{ $t('button.edit') }}</a>
        </span>

        <!-- 状态渲染模板 -->
        <template slot="customRenderStatus" slot-scope="status">
          <a-tag v-if="status == 0" color="green">{{ $t('task.taskStatusStarted') }}</a-tag>
          <a-tag v-if="status == -1" color="orange">{{ $t('task.taskStatusPaused') }}</a-tag>
        </template>
      </a-table>
    </div>
    <!-- table区域-end -->

    <!-- 表单区域 -->
    <quartzJob-modal ref="modalForm" @ok="modalFormOk"></quartzJob-modal>
  </a-card>
</template>

<script>
import QuartzJobModal from './modules/QuartzJobModal'
import { getAction } from '@/api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import JEllipsis from '@/components/jeecg/JEllipsis'

export default {
  name: 'QuartzJobList',
  mixins: [JeecgListMixin],
  components: {
    QuartzJobModal,
    JEllipsis
  },
  data() {
    return {
      description: '定时任务在线管理',
      // 查询条件
      queryParam: {},
      // 表头
      columns: [
        {
          title: '#',
          dataIndex: '',
          key: 'rowIndex',
          width: 60,
          align: 'center',
          customRender: function(t, r, index) {
            return parseInt(index) + 1
          }
        },
        {
          title: this.$t('task.scheduledTaskName'),
          align: 'center',
          width: 250,
          dataIndex: 'description',
          scopedSlots: { customRender: 'description' }
        },
        {
          title: this.$t('task.scheduledTaskClass'),
          align: 'center',
          dataIndex: 'jobClassName'
        },
        {
          title: this.$t('task.cronExpression'),
          align: 'center',
          dataIndex: 'cronExpression'
        },
        {
          title: this.$t('task.parameter'),
          align: 'center',
          width: 170,
          dataIndex: 'parameter',
          scopedSlots: { customRender: 'parameterRender' }
        },
        {
          title: this.$t('task.taskStatus'),
          align: 'center',
          dataIndex: 'status',
          scopedSlots: { customRender: 'customRenderStatus' }
        },
        {
          title: this.$t('system.createTime'),
          align: 'center',
          dataIndex: 'createTime'
        },
        {
          title: this.$t('system.updateTime'),
          align: 'center',
          dataIndex: 'updateTime'
        },
        {
          title: this.$t('system.options'),
          dataIndex: 'action',
          align: 'center',
          width: 195,
          scopedSlots: { customRender: 'action' }
        }
      ],
      url: {
        list: '/sys/quartzJob/list',
        delete: '/sys/quartzJob/delete',
        deleteBatch: '/sys/quartzJob/deleteBatch',
        pause: '/sys/quartzJob/pause',
        resume: '/sys/quartzJob/resume',
        exportXlsUrl: 'sys/quartzJob/exportXls',
        importExcelUrl: 'sys/quartzJob/importExcel',
        execute: 'sys/quartzJob/execute'
      }
    }
  },
  computed: {
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    }
  },

  methods: {
    //筛选需要重写handleTableChange
    handleTableChange(pagination, filters, sorter) {
      //分页、排序、筛选变化时触发
      //TODO 筛选
      if (Object.keys(sorter).length > 0) {
        this.isorter.column = sorter.field
        this.isorter.order = 'ascend' == sorter.order ? 'asc' : 'desc'
      }
      //这种筛选方式只支持单选

      // update-begin-author:liusq date:20210624 for:前台定时任务无法翻页  #2666
      if (filters && Object.keys(filters).length > 0 && filters.status) {
        this.filters.status = filters.status[0]
      }
      // update-end-author:liusq date:20210624 for:前台定时任务无法翻页  #2666
      this.ipagination = pagination
      this.loadData()
    },
    pauseJob: function(record) {
      var that = this
      //暂停定时任务
      this.$confirm({
        title: '确认暂停',
        content: '是否暂停选中任务?',
        onOk: function() {
          getAction(that.url.pause, { id: record.id }).then(res => {
            if (res.success) {
              that.$message.success(res.message)
              that.loadData()
              that.onClearSelected()
            } else {
              that.$message.warning(res.message)
            }
          })
        }
      })
    },
    resumeJob: function(record) {
      var that = this
      //恢复定时任务
      this.$confirm({
        title: '确认启动',
        content: '是否启动选中任务?',
        onOk: function() {
          getAction(that.url.resume, { id: record.id }).then(res => {
            if (res.success) {
              that.$message.success(res.message)
              that.loadData()
              that.onClearSelected()
            } else {
              that.$message.warning(res.message)
            }
          })
        }
      })
    },
    executeImmediately(record) {
      var that = this
      //立即执行定时任务
      this.$confirm({
        title: '确认提示',
        content: '是否立即执行任务?',
        onOk: function() {
          getAction(that.url.execute, { id: record.id }).then(res => {
            if (res.success) {
              that.$message.success(res.message)
              that.loadData()
              that.onClearSelected()
            } else {
              that.$message.warning(res.message)
            }
          })
        }
      })
    }
  }
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>