任务新增执行SQL脚本&优化列表显示
This commit is contained in:
parent
5441962c37
commit
17c871d88f
@ -4,7 +4,7 @@ export function queryTasks(data) {
|
|||||||
return request({
|
return request({
|
||||||
url: '/system/tasks/list',
|
url: '/system/tasks/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
data
|
params: data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,5 +111,4 @@ export function exportTasks() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export default { queryTasks, getTasks, getAllTasks, createTasks, updateTasks, deleteTasks, startTasks, stopTasks, runTasks, exportTasks }
|
export default { queryTasks, getTasks, getAllTasks, createTasks, updateTasks, deleteTasks, startTasks, stopTasks, runTasks, exportTasks }
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-row v-if="searchToggle" :gutter="20">
|
<el-form :model="queryParams" inline @submit.prevent ref="queryRef" v-show="searchToggle">
|
||||||
<el-col>
|
<el-form-item prop="taskType">
|
||||||
<el-form :inline="true" @submit.prevent>
|
<el-select clearable v-model="queryParams.taskType" placeholder="请选择任务类型">
|
||||||
<el-form-item>
|
<el-option v-for="item in options.taskTypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)" />
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item prop="queryText">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.queryText"
|
v-model="queryParams.queryText"
|
||||||
placeholder="请输入计划任务名称"
|
placeholder="请输入计划任务名称"
|
||||||
@ -17,8 +20,7 @@
|
|||||||
<el-button icon="refresh" @click="handleReset">{{ $t('btn.reset') }}</el-button>
|
<el-button icon="refresh" @click="handleReset">{{ $t('btn.reset') }}</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
<el-row class="mb8" :gutter="20">
|
<el-row class="mb8" :gutter="20">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button v-hasPermi="['monitor:job:add']" plain type="primary" icon="plus" @click="handleCreate">
|
<el-button v-hasPermi="['monitor:job:add']" plain type="primary" icon="plus" @click="handleCreate">
|
||||||
@ -35,26 +37,55 @@
|
|||||||
{{ $t('btn.log') }}
|
{{ $t('btn.log') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
<right-toolbar :showSearch="searchToggle" @queryTable="handleQuery"></right-toolbar>
|
<right-toolbar :showSearch="searchToggle" :columns="columns" @queryTable="handleQuery"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" @sort-change="handleSortable">
|
<el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" @sort-change="handleSortable">
|
||||||
<el-table-column type="index" :index="handleIndexCalc" label="#" align="center" />
|
<el-table-column type="index" :index="handleIndexCalc" label="#" align="center" />
|
||||||
|
<el-table-column prop="id" label="id" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('id')" />
|
||||||
<el-table-column prop="name" label="任务名称" width="100" />
|
<el-table-column prop="name" label="任务名称" width="100" />
|
||||||
<el-table-column prop="jobGroup" :show-overflow-tooltip="true" align="center" label="任务分组" width="80" />
|
<el-table-column prop="taskType" label="任务类型" align="center" v-if="columns.showColumn('taskType')">
|
||||||
<el-table-column prop="assemblyName" align="center" label="程序集名称" :show-overflow-tooltip="true" />
|
<template #default="scope">
|
||||||
<el-table-column prop="className" align="center" label="任务类名" :show-overflow-tooltip="true" />
|
<dict-tag :options="options.taskTypeOptions" :value="scope.row.taskType" />
|
||||||
<el-table-column prop="runTimes" align="center" label="运行次数" width="80" />
|
</template>
|
||||||
<el-table-column prop="intervalSecond" align="center" label="执行间隔(s)" width="90" />
|
</el-table-column>
|
||||||
<el-table-column prop="cron" align="center" label="运行表达式" :show-overflow-tooltip="true" />
|
<el-table-column prop="triggerType" label="触发器类型" align="center" v-if="columns.showColumn('triggerType')">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :options="options.triggerTypeOptions" :value="scope.row.triggerType" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column sortable prop="isStart" align="center" label="任务状态" width="100">
|
<el-table-column sortable prop="isStart" align="center" label="任务状态" width="100">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<dict-tag :value="scope.row.isStart" :options="isStartOptions"></dict-tag>
|
<dict-tag :value="scope.row.isStart" :options="isStartOptions"></dict-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="lastRunTime" align="center" label="最后运行时间" :show-overflow-tooltip="true" /> -->
|
<el-table-column
|
||||||
<el-table-column prop="remark" align="center" label="备注" :show-overflow-tooltip="true" />
|
prop="jobGroup"
|
||||||
<el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width">
|
:show-overflow-tooltip="true"
|
||||||
|
align="center"
|
||||||
|
label="任务分组"
|
||||||
|
width="80"
|
||||||
|
v-if="columns.showColumn('jobGroup')" />
|
||||||
|
<el-table-column
|
||||||
|
prop="assemblyName"
|
||||||
|
align="center"
|
||||||
|
label="程序集名称"
|
||||||
|
v-if="columns.showColumn('assemblyName')"
|
||||||
|
:show-overflow-tooltip="true" />
|
||||||
|
<el-table-column prop="className" align="center" label="任务类名" v-if="columns.showColumn('className')" :show-overflow-tooltip="true" />
|
||||||
|
<el-table-column prop="runTimes" align="center" label="运行次数" width="80" />
|
||||||
|
<el-table-column prop="intervalSecond" align="center" label="执行间隔(s)" v-if="columns.showColumn('intervalSecond')" width="90" />
|
||||||
|
<el-table-column prop="cron" align="center" label="运行表达式" v-if="columns.showColumn('cron')" :show-overflow-tooltip="true" />
|
||||||
|
<el-table-column prop="remark" align="center" label="备注" v-if="columns.showColumn('remark')" :show-overflow-tooltip="true" />
|
||||||
|
<el-table-column prop="jobParams" label="任务参数" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('jobParams')" />
|
||||||
|
<el-table-column
|
||||||
|
prop="lastRunTime"
|
||||||
|
label="最后运行时间"
|
||||||
|
align="center"
|
||||||
|
:show-overflow-tooltip="true"
|
||||||
|
v-if="columns.showColumn('lastRunTime')" />
|
||||||
|
|
||||||
|
<el-table-column label="操作" width="250" class-name="small-padding fixed-width">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-link size="small" class="ml10" icon="view" v-hasPermi="['monitor:job:query']" @click="handleDetails(scope.row)">
|
<el-link size="small" class="ml10" icon="view" v-hasPermi="['monitor:job:query']" @click="handleDetails(scope.row)">
|
||||||
{{ $t('btn.details') }}
|
{{ $t('btn.details') }}
|
||||||
@ -126,7 +157,7 @@
|
|||||||
<pagination v-model:total="total" v-model:page="queryParams.PageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
<pagination v-model:total="total" v-model:page="queryParams.PageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-dialog :title="title" v-model="open" width="600px" append-to-body>
|
<el-dialog :title="title" v-model="open" width="600px" draggable append-to-body>
|
||||||
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :lg="24" v-if="form.id">
|
<el-col :lg="24" v-if="form.id">
|
||||||
@ -142,13 +173,17 @@
|
|||||||
<el-col :lg="12">
|
<el-col :lg="12">
|
||||||
<el-form-item label="触发器类型" prop="triggerType">
|
<el-form-item label="触发器类型" prop="triggerType">
|
||||||
<el-select v-model="form.triggerType" placeholder="请选择触发器类型" style="width: 100%">
|
<el-select v-model="form.triggerType" placeholder="请选择触发器类型" style="width: 100%">
|
||||||
<el-option v-for="item in triggerTypeOptions" :key="item.value" :label="item.label" :value="parseInt(item.value)" />
|
<el-option
|
||||||
|
v-for="item in options.triggerTypeOptions"
|
||||||
|
:key="item.dictValue"
|
||||||
|
:label="item.dictLabel"
|
||||||
|
:value="parseInt(item.dictValue)" />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :lg="12">
|
<el-col :lg="12">
|
||||||
<el-form-item label="任务分组" maxlength="200" prop="jobGroup">
|
<el-form-item label="任务分组" maxlength="200" prop="jobGroup">
|
||||||
<el-select v-model="form.jobGroup" placeholder="请选择">
|
<el-select v-model="form.jobGroup" placeholder="请选择任务分组">
|
||||||
<el-option v-for="dict in jobGroupOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue"></el-option>
|
<el-option v-for="dict in jobGroupOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -158,6 +193,7 @@
|
|||||||
<el-radio-group v-model="form.taskType">
|
<el-radio-group v-model="form.taskType">
|
||||||
<el-radio :label="1">执行程序集</el-radio>
|
<el-radio :label="1">执行程序集</el-radio>
|
||||||
<el-radio :label="2">执行url</el-radio>
|
<el-radio :label="2">执行url</el-radio>
|
||||||
|
<el-radio :label="3">执行SQL语句</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
@ -169,7 +205,12 @@
|
|||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<template v-else>
|
<el-col :lg="24" v-if="form.taskType == 3">
|
||||||
|
<el-form-item label="SQL语句" prop="sqlText">
|
||||||
|
<el-input :rows="5" type="textarea" v-model="form.sqlText" placeholder="请输入SQL语句,批量执行SQL请换行"> </el-input>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<template v-if="form.taskType == 1">
|
||||||
<el-col :lg="24">
|
<el-col :lg="24">
|
||||||
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName">
|
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName">
|
||||||
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" />
|
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" />
|
||||||
@ -186,7 +227,7 @@
|
|||||||
<el-form-item label="传入参数" prop="jobParams">
|
<el-form-item label="传入参数" prop="jobParams">
|
||||||
<template #label>
|
<template #label>
|
||||||
<span>
|
<span>
|
||||||
<el-tooltip content="eg:{ token: abc123}" placement="top">
|
<el-tooltip content="eg:{ token: abc123} or token=abc123&uid=1000" placement="top">
|
||||||
<el-icon :size="15">
|
<el-icon :size="15">
|
||||||
<questionFilled />
|
<questionFilled />
|
||||||
</el-icon>
|
</el-icon>
|
||||||
@ -262,7 +303,7 @@
|
|||||||
<el-drawer :title="logTitle" v-model="drawer">
|
<el-drawer :title="logTitle" v-model="drawer">
|
||||||
<el-form :inline="true" @submit.prevent>
|
<el-form :inline="true" @submit.prevent>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-date-picker v-model="logForm.beginTime" clearable type="date" />
|
<el-date-picker v-model="logForm.beginTime" placeholder="请选择时间" :shortcuts="dateOptions" clearable type="date" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="search" @click="handleJobLog">{{ $t('btn.search') }}</el-button>
|
<el-button type="primary" icon="search" @click="handleJobLog">{{ $t('btn.search') }}</el-button>
|
||||||
@ -272,7 +313,7 @@
|
|||||||
<el-timeline>
|
<el-timeline>
|
||||||
<el-timeline-item :timestamp="item.createTime" placement="top" v-for="(item, i) in jobLogList" :key="i">
|
<el-timeline-item :timestamp="item.createTime" placement="top" v-for="(item, i) in jobLogList" :key="i">
|
||||||
<h4>{{ item.jobMessage }}</h4>
|
<h4>{{ item.jobMessage }}</h4>
|
||||||
<p>{{ item.exception }}</p>
|
<p style="color: red">{{ item.exception }}</p>
|
||||||
</el-timeline-item>
|
</el-timeline-item>
|
||||||
</el-timeline>
|
</el-timeline>
|
||||||
<el-empty v-if="jobLogList.length <= 0"></el-empty>
|
<el-empty v-if="jobLogList.length <= 0"></el-empty>
|
||||||
@ -283,7 +324,6 @@
|
|||||||
<script setup name="job">
|
<script setup name="job">
|
||||||
import { queryTasks, getTasks, createTasks, updateTasks, deleteTasks, startTasks, stopTasks, runTasks, exportTasks } from '@/api/monitor/job'
|
import { queryTasks, getTasks, createTasks, updateTasks, deleteTasks, startTasks, stopTasks, runTasks, exportTasks } from '@/api/monitor/job'
|
||||||
import { listJobLog } from '@/api/monitor/jobLog'
|
import { listJobLog } from '@/api/monitor/jobLog'
|
||||||
// import Vue3CronCore from '@/components/vue3-cron-core/Index.vue'
|
|
||||||
import Crontab from '@/components/Crontab'
|
import Crontab from '@/components/Crontab'
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@ -302,21 +342,44 @@ const searchToggle = ref(true)
|
|||||||
// 合计条数
|
// 合计条数
|
||||||
const total = ref(0)
|
const total = ref(0)
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
const loading = ref(true)
|
const loading = ref(false)
|
||||||
// 查询参数
|
// 查询参数
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
queryText: undefined,
|
queryText: undefined,
|
||||||
PageNum: 1,
|
PageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
orderby: 'createTime',
|
orderby: '',
|
||||||
sort: 'descending'
|
sort: '',
|
||||||
|
taskType: undefined
|
||||||
})
|
})
|
||||||
|
const columns = ref([
|
||||||
|
// { visible: true, prop: 'name', label: '名称' },
|
||||||
|
{ visible: true, prop: 'taskType', label: '任务类型' },
|
||||||
|
{ visible: true, prop: 'triggerType', label: '触发器类型' },
|
||||||
|
{ visible: true, prop: 'jobGroup', label: '任务分组' },
|
||||||
|
{ visible: true, prop: 'assemblyName', label: '程序集名称' },
|
||||||
|
{ visible: true, prop: 'className', label: '类名' },
|
||||||
|
{ visible: false, prop: 'remark', label: '备注' },
|
||||||
|
{ visible: false, prop: 'id', label: '任务id' },
|
||||||
|
{ visible: false, prop: 'cron', label: 'cron表达式' },
|
||||||
|
// { visible: true, prop: 'runTimes', label: '运行次数' },
|
||||||
|
// { visible: false, prop: 'beginTime', label: '开始时间' },
|
||||||
|
// { visible: false, prop: 'endTime', label: '结束时间' },
|
||||||
|
{ visible: false, prop: 'intervalSecond', label: '执行每隔(s)' },
|
||||||
|
// { visible: false, prop: 'isStart', label: '是否启动' },
|
||||||
|
{ visible: false, prop: 'jobParams', label: '任务参数' },
|
||||||
|
{ visible: true, prop: 'lastRunTime', label: '最后运行时间' }
|
||||||
|
// { visible: false, prop: 'apiUrl', label: '网络请求地址' },
|
||||||
|
// { visible: false, prop: 'sqlText', label: 'sql脚本' }
|
||||||
|
])
|
||||||
// 计划任务列表
|
// 计划任务列表
|
||||||
const dataTasks = ref([])
|
const dataTasks = ref([])
|
||||||
// 任务日志列表
|
// 任务日志列表
|
||||||
const jobLogList = ref([])
|
const jobLogList = ref([])
|
||||||
const logTitle = ref('')
|
const logTitle = ref('')
|
||||||
const formRef = ref(null)
|
const formRef = ref(null)
|
||||||
|
const queryRef = ref(null)
|
||||||
|
|
||||||
// 任务状态字典
|
// 任务状态字典
|
||||||
const isStartOptions = ref([
|
const isStartOptions = ref([
|
||||||
{ dictLabel: '运行中', dictValue: 'true', listClass: 'success' },
|
{ dictLabel: '运行中', dictValue: 'true', listClass: 'success' },
|
||||||
@ -324,17 +387,7 @@ const isStartOptions = ref([
|
|||||||
])
|
])
|
||||||
// 任务组名字典
|
// 任务组名字典
|
||||||
const jobGroupOptions = ref([])
|
const jobGroupOptions = ref([])
|
||||||
// 触发器类型
|
|
||||||
const triggerTypeOptions = ref([
|
|
||||||
{
|
|
||||||
label: '[普通]',
|
|
||||||
value: 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '[表达式]',
|
|
||||||
value: 1
|
|
||||||
}
|
|
||||||
])
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
form: {},
|
form: {},
|
||||||
// 表单校验
|
// 表单校验
|
||||||
@ -348,18 +401,26 @@ const state = reactive({
|
|||||||
cron: [{ required: true, message: 'cron表达式不能为空', trigger: 'change' }],
|
cron: [{ required: true, message: 'cron表达式不能为空', trigger: 'change' }],
|
||||||
beginTime: [{ required: false, message: '请选择开始日期', trigger: 'blur' }],
|
beginTime: [{ required: false, message: '请选择开始日期', trigger: 'blur' }],
|
||||||
endTime: [{ required: false, message: '请选择结束日期', trigger: 'blur' }],
|
endTime: [{ required: false, message: '请选择结束日期', trigger: 'blur' }],
|
||||||
intervalSecond: [{ message: '请设置执行间隔', type: 'number', trigger: 'blur' }]
|
intervalSecond: [{ message: '请设置执行间隔', type: 'number', trigger: 'blur' }],
|
||||||
|
sqlText: [{ required: true, message: '请输入sql语句', trigger: 'blur' }]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
// 触发器类型
|
||||||
|
triggerTypeOptions: [
|
||||||
|
{ dictLabel: '普通', dictValue: '0' },
|
||||||
|
{ dictLabel: '表达式', dictValue: '1' }
|
||||||
|
],
|
||||||
|
taskTypeOptions: [
|
||||||
|
{ dictLabel: '程序集', dictValue: '1' },
|
||||||
|
{ dictLabel: 'api请求', dictValue: '2' },
|
||||||
|
{ dictLabel: 'sql脚本', dictValue: '3' }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// 按钮是否可见
|
// 按钮是否可见
|
||||||
const btnVisible = ref(true)
|
const btnVisible = ref(true)
|
||||||
const { rules, form } = toRefs(state)
|
const { rules, form, options } = toRefs(state)
|
||||||
// 时间的选择
|
|
||||||
// const pickerOptions = reactive({
|
|
||||||
// disabledDate(time) {
|
|
||||||
// return time.getTime() < Date.now() - 8.64e7
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
/** 查询计划任务列表 */
|
/** 查询计划任务列表 */
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
@ -374,7 +435,7 @@ function handleQuery() {
|
|||||||
}
|
}
|
||||||
/** 重置按钮操作 */
|
/** 重置按钮操作 */
|
||||||
function handleReset() {
|
function handleReset() {
|
||||||
queryParams.queryText = ''
|
proxy.resetForm('queryRef')
|
||||||
getList()
|
getList()
|
||||||
}
|
}
|
||||||
/** 新增按钮操作 */
|
/** 新增按钮操作 */
|
||||||
|
|||||||
@ -22,7 +22,8 @@
|
|||||||
type="daterange"
|
type="daterange"
|
||||||
range-separator="-"
|
range-separator="-"
|
||||||
start-placeholder="开始日期"
|
start-placeholder="开始日期"
|
||||||
end-placeholder="结束日期"></el-date-picker>
|
end-placeholder="结束日期"
|
||||||
|
:shortcuts="dateOptions"></el-date-picker>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="search" @click="handleQuery">搜索</el-button>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user