优化任务日志

This commit is contained in:
不做码农 2021-12-25 14:42:20 +08:00
parent 27efa6309f
commit cae6444d96
6 changed files with 64 additions and 47 deletions

View File

@ -139,7 +139,9 @@ namespace ZR.Admin.WebApi.Controllers
IntervalSecond = parm.IntervalSecond,
JobParams = parm.JobParams,
Update_by = User.Identity.Name,
Update_time = DateTime.Now
Update_time = DateTime.Now,
BeginTime = parm.BeginTime,
EndTime = parm.EndTime
});
if (response > 0)
{

View File

@ -79,7 +79,7 @@ namespace ZR.Model.System.Dto
/// 默认 :
/// </summary>
[Display(Name = "开始时间")]
public DateTime BeginTime { get; set; }
public DateTime? BeginTime { get; set; }
/// <summary>
/// 描述 : 结束时间
@ -87,7 +87,7 @@ namespace ZR.Model.System.Dto
/// 默认 :
/// </summary>
[Display(Name = "结束时间")]
public DateTime EndTime { get; set; }
public DateTime? EndTime { get; set; }
/// <summary>
/// 描述 : 触发器类型0、simple 1、cron
@ -186,7 +186,7 @@ namespace ZR.Model.System.Dto
/// 默认 :
/// </summary>
[Display(Name = "开始时间")]
public string BeginTime { get; set; }
public DateTime? BeginTime { get; set; }
/// <summary>
/// 描述 : 结束时间
@ -194,7 +194,7 @@ namespace ZR.Model.System.Dto
/// 默认 :
/// </summary>
[Display(Name = "结束时间")]
public string EndTime { get; set; }
public DateTime? EndTime { get; set; }
/// <summary>
/// 描述 : 触发器类型0、simple 1、cron

View File

@ -24,9 +24,9 @@ namespace ZR.Tasks
/// <param name="job">业务逻辑方法</param>
public async Task<Dictionary<string,object>> ExecuteJob(IJobExecutionContext context, Func<Task> job)
{
string logMsg = "";
double elapsed = 0;
int status = 0;
string logMsg;
try
{
//var s = context.Trigger.Key.Name;
@ -64,6 +64,7 @@ namespace ZR.Tasks
protected void RecordTaskLog(IJobExecutionContext context, Dictionary<string, object> executeLog)
{
var tasksLogService = (ISysTasksLogService)App.GetRequiredService(typeof(ISysTasksLogService));
var taskQzService = (ISysTasksQzService)App.GetRequiredService(typeof(ISysTasksQzService));
// 可以直接获取 JobDetail 的值
IJobDetail job = context.JobDetail;
@ -80,7 +81,10 @@ namespace ZR.Tasks
logModel.JobMessage = executeLog.GetValueOrDefault("content").ToString();
logModel.Status = executeLog.GetValueOrDefault("status", "0").ToString();
logModel = tasksLogService.AddTaskLog(job.Key.Name, logModel);
taskQzService.Update(f => f.ID == job.Key.Name, f => new SysTasksQz()
{
RunTimes = f.RunTimes + 1
});
logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}");
}
}

View File

@ -6,7 +6,6 @@ namespace ZR.Tasks
/// <summary>
/// 定时任务测试
/// </summary>
//[AppService(ServiceLifetime = LifeTime.Scoped)]
public class Job_SyncTest : JobBase, IJob
{
//private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
@ -21,7 +20,6 @@ namespace ZR.Tasks
await Task.Delay(1);
//TODO 业务逻辑
//throw new System.Exception("error");
}
}
}

View File

@ -4,7 +4,8 @@
<el-col>
<el-form :inline="true" @submit.native.prevent>
<el-form-item>
<el-input v-model="queryParams.queryText" placeholder="请输入计划任务名称" clearable prefix-icon="el-icon-search" @keyup.enter.native="handleQuery" @clear="handleQuery" />
<el-input v-model="queryParams.queryText" placeholder="请输入计划任务名称" clearable prefix-icon="el-icon-search" @keyup.enter.native="handleQuery"
@clear="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
@ -27,37 +28,43 @@
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['monitor:job:export']">导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button plain v-hasPermi="['monitor:job:query']" type="info" icon="el-icon-s-operation" size="mini" @click="handleJobLog({id: 1})">日志</el-button>
<el-button plain v-hasPermi="['monitor:job:query']" type="info" icon="el-icon-s-operation" size="mini" @click="handleJobLog({id: 1})">日志
</el-button>
</el-col>
<right-toolbar :showSearch.sync="searchToggle" @queryTable="handleQuery"></right-toolbar>
</el-row>
<el-row>
<el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" :height="tableHeight*0.65" @sort-change="handleSortable" @selection-change="handleSelectionChange">
<el-table ref="tasks" v-loading="loading" :data="dataTasks" border="" row-key="id" :height="tableHeight*0.65" @sort-change="handleSortable"
@selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column type="index" :index="handleIndexCalc" label="#" align="center" />
<el-table-column prop="name" :show-overflow-tooltip="true" label="任务名称" />
<el-table-column prop="jobGroup" :show-overflow-tooltip="true" align="center" label="任务分组" />
<el-table-column prop="assemblyName" align="center" label="程序集名称" :show-overflow-tooltip="true" />
<el-table-column prop="className" align="center" label="任务类名" :show-overflow-tooltip="true" />
<el-table-column prop="runTimes" align="center" label="运行次数"/>
<el-table-column prop="cron" align="center" label="运行表达式" />
<el-table-column sortable prop="isStart" align="center" label="状态" width="90">
<template slot-scope="scope">
<el-tag size="mini" :type="scope.row.isStart ? 'success' : 'danger'" disable-transitions>{{ scope.row.isStart ? "运行中":"已停止" }}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="300" class-name="small-padding fixed-width">
<el-table-column label="操作" align="center" width="250" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button type="text" size="mini" icon="el-icon-view" v-hasPermi="['monitor:job:query']">
<router-link :to="{path: 'job/log', query: {jobId: scope.row.id}}">日志</router-link>
</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:run']" size="mini" icon="el-icon-remove" title="运行"
@click="handleRun(scope.row)">运行</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:stop']" size="mini" icon="el-icon-video-pause" style="color:red"
title="停止" @click="handleStop(scope.row)">停止</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:run']" size="mini" icon="el-icon-remove" title="运行" @click="handleRun(scope.row)">运行</el-button>
<el-button type="text" v-if="scope.row.isStart" v-hasPermi="['monitor:job:stop']" size="mini" icon="el-icon-video-pause" style="color:red" title="停止" @click="handleStop(scope.row)">停止</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:start']" size="mini" icon="el-icon-video-play" title="启动" @click="handleStart(scope.row)">启动</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:edit']" size="mini" icon="el-icon-edit" style="color:gray" title="编辑" @click="handleUpdate(scope.row)">编辑</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:delete']" size="mini" icon="el-icon-delete" style="color:red" title="删除" @click="handleDelete(scope.row)">删除</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:start']" size="mini" icon="el-icon-video-play" title="启动"
@click="handleStart(scope.row)">启动</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:edit']" size="mini" icon="el-icon-edit" style="color:gray"
title="编辑" @click="handleUpdate(scope.row)">编辑</el-button>
<el-button type="text" v-if="!scope.row.isStart" v-hasPermi="['monitor:job:delete']" size="mini" icon="el-icon-delete" style="color:red"
title="删除" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
@ -91,11 +98,6 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务状态">
<el-tag>{{form.isStart? "运行中":"已停止" }}</el-tag>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="程序集名称" maxlength="200" prop="assemblyName">
<el-input v-model="form.assemblyName" placeholder="请输入程序集名称" />
@ -111,36 +113,41 @@
<el-input v-model="form.jobParams" placeholder="传入参数" />
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item v-show="form.triggerType == 1" label="间隔(Cron)" prop="cron">
<el-col :span="16" v-show="form.triggerType == 1">
<el-form-item label="间隔(Cron)" prop="cron">
<el-input v-model="form.cron" placeholder="如10分钟执行一次0/0 0/10 * * * ?" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-col :span="8" v-show="form.triggerType == 1">
<el-form-item label-width="20px">
<el-link href="https://cron.qqe2.com/" type="primary" target="_blank" class="mr10">cyon在线生成</el-link>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-show="form.triggerType == 0" label="开始日期" prop="beginTime">
<el-col :span="12">
<el-form-item label="开始日期" prop="beginTime">
<el-date-picker v-model="form.beginTime" style="width:100%" type="date" placeholder="选择开始日期" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-show="form.triggerType == 0" label="结束日期" prop="endTime">
<el-col :span="12">
<el-form-item label="结束日期" prop="endTime">
<el-date-picker v-model="form.endTime" style="width:100%" type="date" placeholder="选择结束日期" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item v-show="form.triggerType == 0" label="执行间隔(单位:秒)" prop="intervalSecond">
<el-form-item v-show="form.triggerType == 0" label="执行间隔(秒)" prop="intervalSecond">
<el-input-number v-model="form.intervalSecond" :max="9999999999" step-strictly controls-position="right" :min="1" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="form.remark"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
@ -155,10 +162,10 @@ import {
startTasks,
stopTasks,
runTasks,
exportTasks
exportTasks,
} from "@/api/monitor/job";
export default {
name: "tasks",
name: "job",
data() {
var cronValidate = (rule, value, callback) => {
if (this.form.triggerType === 1) {
@ -235,14 +242,19 @@ export default {
},
//
dataTasks: [],
//
isStartOptions: [
{ dictLabel: "运行中", dictValue: "true" },
{ dictLabel: "已停止", dictValue: "false", listClass: "danger" },
],
//
jobGroupOptions: [],
//
triggerTypeOptions: [
// {
// label: 'Simple / []',
// value: 0
// },
{
label: "Simple / [普通]",
value: 0,
},
{
label: "Cron / [表达式]",
value: 1,
@ -280,7 +292,6 @@ export default {
},
created() {
this.getList();
this.getDicts("sys_job_group").then((response) => {
this.jobGroupOptions = response.data;
});
@ -468,10 +479,12 @@ export default {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
})
.then(() => {
return exportTasks();
}).then(response => {
this.download(response.data.path)
})
.then((response) => {
this.download(response.data.path);
});
},
},

View File

@ -108,7 +108,7 @@ import {
} from "@/api/monitor/jobLog";
export default {
name: "JobLog",
name: "job/log",
data() {
return {
//