feat;完成接口对接

This commit is contained in:
陈淳
2023-04-25 10:38:51 +08:00
parent 6a881e4613
commit 770e8d7310
6 changed files with 263 additions and 66 deletions

View File

@@ -25,10 +25,12 @@ namespace Yi.Furion.Application.Rbac.Services.Impl
/// <param name="jobId"></param>
/// <returns></returns>
[HttpGet("{jobId}")]
public SchedulerModel GetById([FromRoute] string jobId)
public TaskGetOutput GetById([FromRoute] string jobId)
{
var result = _schedulerFactory.TryGetJob(jobId, out var scheduler);
return scheduler.GetModel();
var data = scheduler.GetModel();
var output = data.JobDetail.Adapt<TaskGetOutput>();
return output;
}
/// <summary>

View File

@@ -9,5 +9,7 @@ namespace Yi.Furion.Core.Rbac.Dtos.Task
{
public class TaskGetListInput: PagedAllResultRequestDto
{
public string JobId { get; set; }
public string GroupName { get; set; }
}
}

View File

@@ -8,5 +8,78 @@ namespace Yi.Furion.Core.Rbac.Dtos.Task
{
public class TaskGetOutput
{
/// <summary>
/// 作业 Id
/// </summary>
public string JobId { get; internal set; }
/// <summary>
/// 作业组名称
/// </summary>
public string GroupName { get; internal set; }
/// <summary>
/// 作业处理程序类型
/// </summary>
/// <remarks>存储的是类型的 FullName</remarks>
public string JobType { get; internal set; }
/// <summary>
/// 作业处理程序类型所在程序集
/// </summary>
/// <remarks>存储的是程序集 Name</remarks>
public string AssemblyName { get; internal set; }
/// <summary>
/// 描述信息
/// </summary>
public string Description { get; internal set; }
/// <summary>
/// 是否采用并行执行
/// </summary>
/// <remarks>如果设置为 false那么使用串行执行</remarks>
public bool Concurrent { get; internal set; } = true;
/// <summary>
/// 是否扫描 IJob 实现类 [Trigger] 特性触发器
/// </summary>
public bool IncludeAnnotations { get; internal set; } = false;
/// <summary>
/// 作业信息额外数据
/// </summary>
public string Properties { get; internal set; } = "{}";
/// <summary>
/// 作业更新时间
/// </summary>
public DateTime? UpdatedTime { get; internal set; }
/// <summary>
/// 标记其他作业正在执行
/// </summary>
/// <remarks>当 <see cref="Concurrent"/> 为 false 时有效,也就是串行执行</remarks>
internal bool Blocked { get; set; } = false;
/// <summary>
/// 作业处理程序运行时类型
/// </summary>
internal string RuntimeJobType { get; set; }
/// <summary>
/// 作业信息额外数据运行时实例
/// </summary>
internal string RuntimeProperties { get; set; }
}
}

View File

@@ -430,6 +430,70 @@
作业信息额外数据运行时实例
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.JobId">
<summary>
作业 Id
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.GroupName">
<summary>
作业组名称
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.JobType">
<summary>
作业处理程序类型
</summary>
<remarks>存储的是类型的 FullName</remarks>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.AssemblyName">
<summary>
作业处理程序类型所在程序集
</summary>
<remarks>存储的是程序集 Name</remarks>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.Description">
<summary>
描述信息
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.Concurrent">
<summary>
是否采用并行执行
</summary>
<remarks>如果设置为 false那么使用串行执行</remarks>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.IncludeAnnotations">
<summary>
是否扫描 IJob 实现类 [Trigger] 特性触发器
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.Properties">
<summary>
作业信息额外数据
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.UpdatedTime">
<summary>
作业更新时间
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.Blocked">
<summary>
标记其他作业正在执行
</summary>
<remarks><see cref="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.Concurrent"/> 为 false 时有效,也就是串行执行</remarks>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.RuntimeJobType">
<summary>
作业处理程序运行时类型
</summary>
</member>
<member name="P:Yi.Furion.Core.Rbac.Dtos.Task.TaskGetOutput.RuntimeProperties">
<summary>
作业信息额外数据运行时实例
</summary>
</member>
<member name="T:Yi.Furion.Core.Rbac.Dtos.User.UserCreateInputVo">
<summary>
User输入创建对象

View File

@@ -36,7 +36,7 @@ public class Startup : AppStartup
services.AddSchedule(options =>
{
// 注册作业,并配置作业触发器
//options.AddJob<SystemDataJob>(Triggers.Period(10000)); // 表示每秒执行
options.AddJob<TestJob>(Triggers.Period(10000)); // 表示每秒执行
options.AddJob<SystemDataJob>(Triggers.Cron("0 0 0,12 ? * ?",CronStringFormat.WithSeconds)); // 表示每天凌晨与12点
});
services.AddFileLogging("application-{0:yyyy}-{0:MM}-{0:dd}.log", options =>

View File

@@ -10,14 +10,12 @@
/>
</el-form-item>
<el-form-item label="任务组名" prop="jobGroup">
<el-select v-model="queryParams.jobGroup" placeholder="请选择任务组名" clearable>
<el-option
v-for="dict in sys_job_group"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
<el-input
v-model="queryParams.jobGroup"
placeholder="请输入任务组名"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="任务状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择任务状态" clearable>
@@ -178,45 +176,81 @@
<el-form ref="jobRef" :model="form" :rules="rules" label-width="120px">
<el-row>
<el-col :span="12">
<el-form-item label="任务名称" prop="jobName">
<el-input v-model="form.jobName" placeholder="请输入任务名称" />
<el-form-item label="任务名称" prop="jobId">
<el-input v-model="form.jobId" placeholder="请输入任务名称" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="任务分组" prop="jobGroup">
<el-select v-model="form.jobGroup" placeholder="请选择">
<el-option
v-for="dict in sys_job_group"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
<el-form-item label="任务分组" prop="groupName">
<el-input v-model="form.groupName" placeholder="请输入任务分组" />
</el-form-item>
</el-col>
</el-col>
<el-col :span="24">
<el-form-item prop="invokeTarget">
<el-form-item prop="assemblyName">
<template #label>
<span>
调用方法
调用程序集
<el-tooltip placement="top">
<template #content>
<div>
Bean调用示例ryTask.ryParams('ry')
<br />Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')
<br />参数说明支持字符串布尔类型长整型浮点型整型
Bean调用示例Yi.Furion.Application
<!-- <br />Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')
<br />参数说明支持字符串布尔类型长整型浮点型整型 -->
</div>
</template>
<el-icon><question-filled /></el-icon>
</el-tooltip>
</span>
</template>
<el-input v-model="form.invokeTarget" placeholder="请输入调用目标字符串" />
<el-input v-model="form.assemblyName" placeholder="请输入调用程序集" />
</el-form-item>
<el-form-item prop="jobTypeFullName">
<template #label>
<span>
job类名
<el-tooltip placement="top">
<template #content>
<div>
Bean调用示例Yi.Furion.Application.Rbac.Job.TestJob
<br />Class类调用示例Yi.Furion.Application.Rbac.Job.TestJob
<!-- <br />参数说明支持字符串布尔类型长整型浮点型整型 -->
</div>
</template>
<el-icon><question-filled /></el-icon>
</el-tooltip>
</span>
</template>
<el-input v-model="form.jobTypeFullName" placeholder="请输入调用程序集下的job完整类名" />
</el-form-item>
<el-form-item prop="properties">
<template #label>
<span>
job任务参数
<el-tooltip placement="top">
<template #content>
<div>
参数示例{"string":"obj","string","obj"}
<br />调用示例类型为字典key:string,value:obj
<!-- <br />参数说明支持字符串布尔类型长整型浮点型整型 -->
</div>
</template>
<el-icon><question-filled /></el-icon>
</el-tooltip>
</span>
</template>
<el-input v-model="form.properties" placeholder="请输入任务参数" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="cron表达式" prop="cronExpression">
<el-input v-model="form.cronExpression" placeholder="请输入cron执行表达式">
<el-col v-show="form.type==0" :span="24">
<el-form-item label="cron表达式" prop="cron">
<el-input v-model="form.cron" placeholder="请输入cron执行表达式">
<template #append>
<el-button type="primary" @click="handleShowCron">
生成表达式
@@ -225,25 +259,30 @@
</template>
</el-input>
</el-form-item>
</el-col>
<el-col v-show="form.type==1" :span="24">
<el-form-item label="定时毫秒间隔" prop="millisecond">
<el-input v-model="form.millisecond" placeholder="请输入毫秒间隔">
</el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="执行策略" prop="misfirePolicy">
<el-radio-group v-model="form.misfirePolicy">
<el-radio-button label="1">立即执行</el-radio-button>
<el-radio-button label="2">执行一次</el-radio-button>
<el-radio-button label="3">放弃执行</el-radio-button>
<el-form-item label="执行策略" prop="type">
<el-radio-group v-model="form.type">
<el-radio-button :label=0>Cron表达式</el-radio-button>
<el-radio-button :label=1>简单毫秒间隔</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否并发" prop="concurrent">
<el-radio-group v-model="form.concurrent">
<el-radio-button label="0">允许</el-radio-button>
<el-radio-button label="1">禁止</el-radio-button>
<el-radio-button :label=true>允许</el-radio-button>
<el-radio-button :label=false>禁止</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<!-- <el-col :span="12">
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
@@ -253,7 +292,14 @@
>{{ dict.label }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-col> -->
<el-col :span="24">
<el-form-item label="描述" prop="description">
<el-input v-model="form.description" placeholder="请输入任务描述" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
@@ -318,6 +364,7 @@
<script setup name="Job">
import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job";
import { ref } from "vue";
const router = useRouter();
const { proxy } = getCurrentInstance();
@@ -336,19 +383,21 @@ const openView = ref(false);
const openCron = ref(false);
const expression = ref("");
const IsAdd=ref(true);
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
jobName: undefined,
JobId: undefined,
jobGroup: undefined,
status: undefined
},
rules: {
jobName: [{ required: true, message: "任务名称不能为空", trigger: "blur" }],
invokeTarget: [{ required: true, message: "调用目标字符串不能为空", trigger: "blur" }],
cronExpression: [{ required: true, message: "cron执行表达式不能为空", trigger: "blur" }]
JobId: [{ required: true, message: "任务Id不能为空", trigger: "blur" }],
assemblyName: [{ required: true, message: "Job程序集不能为空", trigger: "blur" }],
jobTypeFullName: [{ required: true, message: "Job全类名不能为空", trigger: "blur" }]
}
});
@@ -376,14 +425,17 @@ function cancel() {
function reset() {
form.value = {
jobId: undefined,
jobName: undefined,
jobGroup: undefined,
invokeTarget: undefined,
cronExpression: undefined,
misfirePolicy: 1,
concurrent: 1,
status: "0"
groupName: undefined,
type: undefined,
cron: undefined,
millisecond: undefined,
assemblyName: undefined,
jobTypeFullName: undefined,
concurrent: false,
description:undefined,
properties:undefined
};
IsAdd.value=true;
proxy.resetForm("jobRef");
}
/** 搜索按钮操作 */
@@ -431,7 +483,7 @@ function handleStatusChange(row) {
}
/* 立即执行一次 */
function handleRun(row) {
proxy.$modal.confirm('确认要立即执行一次"' + row.jobName + '"任务吗?').then(function () {
proxy.$modal.confirm('确认要立即执行一次"' + row.jobId + '"任务吗?').then(function () {
return runJob(row.jobId, row.jobGroup);
}).then(() => {
proxy.$modal.msgSuccess("执行成功");})
@@ -466,6 +518,7 @@ function handleAdd() {
}
/** 修改按钮操作 */
function handleUpdate(row) {
IsAdd.value=false;
reset();
const jobId = row.jobId || ids.value;
getJob(jobId).then(response => {
@@ -478,18 +531,21 @@ function handleUpdate(row) {
function submitForm() {
proxy.$refs["jobRef"].validate(valid => {
if (valid) {
if (form.value.jobId != undefined) {
updateJob(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
if (IsAdd.value) {
addJob(form.value).then(response => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
} else {
updateJob(form.value).then(response => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
}
}
});
@@ -504,12 +560,12 @@ function handleDelete(row) {
proxy.$modal.msgSuccess("删除成功");
}).catch(() => {});
}
/** 导出按钮操作 */
function handleExport() {
proxy.download("monitor/job/export", {
...queryParams.value,
}, `job_${new Date().getTime()}.xlsx`);
}
// /** 导出按钮操作 */
// function handleExport() {
// proxy.download("monitor/job/export", {
// ...queryParams.value,
// }, `job_${new Date().getTime()}.xlsx`);
// }
getList();
</script>