284 lines
9.8 KiB
C#
Raw Normal View History

2021-08-23 16:57:25 +08:00
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.Enums;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Quartz;
using SqlSugar;
using System;
using System.Threading.Tasks;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters;
using ZR.Model;
2021-09-16 19:07:49 +08:00
using ZR.Model.System.Dto;
2021-08-23 16:57:25 +08:00
using ZR.Model.System;
2021-09-16 19:35:17 +08:00
using ZR.Service.System.IService;
2021-08-23 16:57:25 +08:00
using ZR.Tasks;
2022-04-03 13:00:30 +08:00
using Infrastructure.Extensions;
2021-08-23 16:57:25 +08:00
namespace ZR.Admin.WebApi.Controllers
{
/// <summary>
/// 计划任务
/// </summary>
2021-12-04 08:24:38 +08:00
[Verify]
2021-08-23 16:57:25 +08:00
[Route("system/Tasks")]
public class TasksController : BaseController
{
private ISysTasksQzService _tasksQzService;
private ITaskSchedulerServer _schedulerServer;
public TasksController(
ISysTasksQzService sysTasksQzService,
ITaskSchedulerServer taskScheduler)
{
_tasksQzService = sysTasksQzService;
_schedulerServer = taskScheduler;
}
/// <summary>
/// 查询计划任务列表
/// </summary>
/// <returns></returns>
[HttpGet("list")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:list")]
2022-12-01 17:01:41 +08:00
public IActionResult ListTask([FromQuery] TasksQueryDto parm, [FromQuery] PagerInfo pager)
2021-08-23 16:57:25 +08:00
{
//开始拼装查询条件
var predicate = Expressionable.Create<SysTasks>();
2021-08-23 16:57:25 +08:00
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.QueryText),
m => m.Name.Contains(parm.QueryText) ||
m.JobGroup.Contains(parm.QueryText) ||
m.AssemblyName.Contains(parm.QueryText));
2022-12-01 17:01:41 +08:00
predicate.AndIF(parm.TaskType != null, m => m.TaskType == parm.TaskType);
2021-08-23 16:57:25 +08:00
var response = _tasksQzService.GetPages(predicate.ToExpression(), pager);
2021-08-23 16:57:25 +08:00
return SUCCESS(response, TIME_FORMAT_FULL);
}
/// <summary>
/// 查询单个计划任务
/// </summary>
/// <param name="id">编码</param>
/// <returns></returns>
2022-04-03 13:00:30 +08:00
[HttpGet("get")]
2021-08-23 16:57:25 +08:00
public IActionResult Get(string id)
{
if (!string.IsNullOrEmpty(id))
{
return SUCCESS(_tasksQzService.GetId(id));
}
2022-08-15 20:22:19 +08:00
return SUCCESS(0);
2021-08-23 16:57:25 +08:00
}
/// <summary>
/// 添加任务
/// </summary>
/// <returns></returns>
[HttpPost("create")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:add")]
2021-08-23 16:57:25 +08:00
[Log(Title = "添加任务", BusinessType = BusinessType.INSERT)]
public IActionResult Create([FromBody] TasksCreateDto parm)
{
//判断是否已经存在
if (_tasksQzService.Any(m => m.Name == parm.Name))
{
throw new CustomException($"添加 {parm.Name} 失败,该用任务存在,不能重复!");
}
if (!string.IsNullOrEmpty(parm.Cron) && !CronExpression.IsValidExpression(parm.Cron))
2021-08-23 16:57:25 +08:00
{
throw new CustomException($"cron表达式不正确");
}
2022-04-03 13:00:30 +08:00
if (string.IsNullOrEmpty(parm.ApiUrl) && parm.TaskType == 2)
{
throw new CustomException($"地址不能为空");
}
2022-12-01 17:01:41 +08:00
if (string.IsNullOrEmpty(parm.SqlText) && parm.TaskType == 3)
{
throw new CustomException($"sql语句不能为空");
}
2022-05-10 08:17:19 +08:00
if (parm.TaskType == 1 && (parm.AssemblyName.IsEmpty() || parm.ClassName.IsEmpty()))
{
throw new CustomException($"程序集或者类名不能为空");
}
2021-08-23 16:57:25 +08:00
//从 Dto 映射到 实体
var tasksQz = parm.Adapt<SysTasks>().ToCreate();
tasksQz.Create_by = HttpContext.GetName();
tasksQz.ID = SnowFlakeSingle.Instance.NextId().ToString();
return SUCCESS(_tasksQzService.AddTasks(tasksQz));
2021-08-23 16:57:25 +08:00
}
/// <summary>
/// 更新任务
/// </summary>
/// <returns></returns>
[HttpPost("update")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:edit")]
2021-08-23 16:57:25 +08:00
[Log(Title = "修改任务", BusinessType = BusinessType.UPDATE)]
2022-12-01 17:01:41 +08:00
public async Task<IActionResult> Update([FromBody] TasksCreateDto parm)
2021-08-23 16:57:25 +08:00
{
//判断是否已经存在
if (_tasksQzService.Any(m => m.Name == parm.Name && m.ID != parm.ID))
{
throw new CustomException($"更新 {parm.Name} 失败,该用任务存在,不能重复!");
}
if (string.IsNullOrEmpty(parm.Cron) && parm.TriggerType == 1)
2021-08-23 16:57:25 +08:00
{
throw new CustomException($"触发器 Corn 模式下,运行时间表达式必须填写");
}
if (!string.IsNullOrEmpty(parm.Cron) && !CronExpression.IsValidExpression(parm.Cron))
2021-08-23 16:57:25 +08:00
{
throw new CustomException($"cron表达式不正确");
}
var tasksQz = _tasksQzService.GetFirst(m => m.ID == parm.ID);
2022-04-03 13:00:30 +08:00
if (string.IsNullOrEmpty(parm.ApiUrl) && parm.TaskType == 2)
{
throw new CustomException($"api地址不能为空");
}
2021-08-23 16:57:25 +08:00
if (tasksQz.IsStart)
{
throw new CustomException($"该任务正在运行中,请先停止在更新");
}
var model = parm.Adapt<SysTasks>();
model.Update_by = HttpContextExtension.GetName(HttpContext);
int response = _tasksQzService.UpdateTasks(model);
2021-12-14 21:51:19 +08:00
if (response > 0)
2021-08-23 16:57:25 +08:00
{
var respon = await _schedulerServer.UpdateTaskScheduleAsync(tasksQz);
2021-08-23 16:57:25 +08:00
}
return SUCCESS(response);
}
/// <summary>
/// 删除任务
/// </summary>
/// <returns></returns>
[HttpDelete("delete")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:delete")]
2021-08-23 16:57:25 +08:00
[Log(Title = "删除任务", BusinessType = BusinessType.DELETE)]
public async Task<IActionResult> Delete(string id)
{
if (string.IsNullOrEmpty(id))
{
throw new CustomException("删除任务 Id 不能为空");
}
if (!_tasksQzService.Any(m => m.ID == id))
{
throw new CustomException("任务不存在");
}
var tasksQz = _tasksQzService.GetFirst(m => m.ID == id);
var taskResult = await _schedulerServer.DeleteTaskScheduleAsync(tasksQz);
if (taskResult.Code == 200)
{
_tasksQzService.Delete(id);
}
2021-09-27 16:07:55 +08:00
return ToResponse(taskResult);
2021-08-23 16:57:25 +08:00
}
/// <summary>
/// 启动任务
/// </summary>
/// <returns></returns>
[HttpGet("start")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:start")]
2021-08-23 16:57:25 +08:00
[Log(Title = "启动任务", BusinessType = BusinessType.OTHER)]
public async Task<IActionResult> Start(string id)
{
if (string.IsNullOrEmpty(id))
{
throw new CustomException("启动任务 Id 不能为空");
}
if (!_tasksQzService.Any(m => m.ID == id))
{
throw new CustomException("任务不存在");
}
var tasksQz = _tasksQzService.GetFirst(m => m.ID == id);
var taskResult = await _schedulerServer.AddTaskScheduleAsync(tasksQz);
if (taskResult.Code == 200)
{
tasksQz.IsStart = true;
_tasksQzService.Update(tasksQz);
}
2021-09-27 16:07:55 +08:00
return ToResponse(taskResult);
2021-08-23 16:57:25 +08:00
}
/// <summary>
/// 停止任务
/// </summary>
/// <returns></returns>
[HttpGet("stop")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:stop")]
2021-08-23 16:57:25 +08:00
[Log(Title = "停止任务", BusinessType = BusinessType.OTHER)]
public async Task<IActionResult> Stop(string id)
{
if (string.IsNullOrEmpty(id))
{
throw new CustomException("停止任务 Id 不能为空");
}
if (!_tasksQzService.Any(m => m.ID == id))
{
throw new CustomException("任务不存在");
}
var tasksQz = _tasksQzService.GetFirst(m => m.ID == id);
var taskResult = await _schedulerServer.DeleteTaskScheduleAsync(tasksQz);//await _schedulerServer.PauseTaskScheduleAsync(tasksQz);
if (taskResult.Code == 200)
{
tasksQz.IsStart = false;
_tasksQzService.Update(tasksQz);
}
2021-09-27 16:07:55 +08:00
return ToResponse(taskResult);
2021-08-23 16:57:25 +08:00
}
/// <summary>
/// 定时任务立即执行一次
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("run")]
2021-10-10 21:31:23 +08:00
[ActionPermissionFilter(Permission = "monitor:job:run")]
2021-08-23 16:57:25 +08:00
[Log(Title = "执行任务", BusinessType = BusinessType.OTHER)]
public async Task<IActionResult> Run(string id)
{
if (!_tasksQzService.Any(m => m.ID == id))
{
throw new CustomException("任务不存在");
}
var tasksQz = _tasksQzService.GetFirst(m => m.ID == id);
var taskResult = await _schedulerServer.RunTaskScheduleAsync(tasksQz);
2021-09-27 16:07:55 +08:00
return ToResponse(taskResult);
2021-08-23 16:57:25 +08:00
}
2021-11-21 15:48:24 +08:00
/// <summary>
/// 定时任务导出
/// </summary>
/// <returns></returns>
[Log(BusinessType = BusinessType.EXPORT, IsSaveResponseData = false, Title = "定时任务导出")]
[HttpGet("export")]
[ActionPermissionFilter(Permission = "monitor:job:export")]
public IActionResult Export()
{
var list = _tasksQzService.GetAll();
string sFileName = ExportExcel(list, "monitorjob", "定时任务");
return SUCCESS(new { path = "/export/" + sFileName, fileName = sFileName });
}
2021-08-23 16:57:25 +08:00
}
}