using System.Linq;
using System.Threading.Tasks;
using ZhonTai.Admin.Core.Repositories;
using ZhonTai.Admin.Core.Dto;
using ZhonTai.Admin.Services.TaskScheduler.Dto;
using ZhonTai.Admin.Domain.Task.Dto;
using ZhonTai.DynamicApi;
using ZhonTai.DynamicApi.Attributes;
using Microsoft.AspNetCore.Mvc;
using ZhonTai.Admin.Core.Consts;
using FreeScheduler;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using ZhonTai.Common.Extensions;
using ZhonTai.Admin.Repositories;
namespace ZhonTai.Admin.Services.TaskScheduler;
///
/// 任务服务
///
[DynamicApi(Area = AdminConsts.AreaName)]
public class TaskService : BaseService, ITaskService, IDynamicApi
{
private ITaskRepository _taskInfoRepository => LazyGetRequiredService();
public TaskService()
{
}
///
/// 查询任务
///
///
///
public async Task GetAsync(long id)
{
var result = await _taskInfoRepository.GetAsync(id);
return ResultOutput.Ok(result);
}
///
/// 查询任务列表
///
///
///
[HttpPost]
public async Task GetPageAsync(PageInput input)
{
var topic = input.Filter?.Topic;
var list = await _taskInfoRepository.Select
.WhereDynamicFilter(input.DynamicFilter)
.WhereIf(topic.NotNull(), a => a.Topic.Contains(topic))
.Count(out var total)
.OrderByDescending(true, c => c.Id)
.Page(input.CurrentPage, input.PageSize)
.ToListAsync();
var data = new PageOutput()
{
List = list,
Total = total
};
return ResultOutput.Ok(data);
}
///
/// 新增
///
///
///
public IResultOutput Add(TaskAddInput input)
{
if (input.IntervalArgument.IsNull())
{
return ResultOutput.NotOk("请输入定时参数");
}
var scheduler = LazyGetRequiredService();
if(input.Interval == TaskInterval.SEC && input.Round == -1)
{
scheduler.AddTask(input.Topic, input.Body, input.Round, input.IntervalArgument.ToInt());
}
else if (input.Interval == TaskInterval.SEC && input.Round > 0)
{
int[] seconds = System.Array.Empty();
var intervalArguments = input.IntervalArgument.Split(",");
foreach(var arg in intervalArguments)
{
seconds.Append(arg.ToInt());
}
scheduler.AddTask(input.Topic, input.Body, seconds);
}
else if (input.Interval == TaskInterval.RunOnDay && input.Round > 0)
{
scheduler.AddTaskRunOnDay(input.Topic, input.Body, input.Round, input.IntervalArgument);
}
else if (input.Interval == TaskInterval.RunOnWeek && input.Round > 0)
{
scheduler.AddTaskRunOnWeek(input.Topic, input.Body, input.Round, input.IntervalArgument);
}
else if (input.Interval == TaskInterval.RunOnMonth && input.Round > 0)
{
scheduler.AddTaskRunOnMonth(input.Topic, input.Body, input.Round, input.IntervalArgument);
}
else if (input.Interval == TaskInterval.Custom && input.Round > 0)
{
scheduler.AddTaskCustom(input.Topic, input.Body, input.IntervalArgument);
}
return ResultOutput.Ok();
}
///
/// 修改
///
///
///
public async Task UpdateAsync(TaskUpdateInput input)
{
if (input.Id.IsNull())
{
return ResultOutput.NotOk();
}
var entity = await _taskInfoRepository.GetAsync(a => a.Id == input.Id);
if (entity != null && entity.Id.NotNull())
{
return ResultOutput.NotOk("任务不存在!");
}
Mapper.Map(input, entity);
await _taskInfoRepository.UpdateAsync(entity);
return ResultOutput.Ok();
}
///
/// 暂停任务
///
///
///
public IResultOutput Pause([BindRequired]string id)
{
if (id.IsNull())
{
return ResultOutput.NotOk();
}
var scheduler = LazyGetRequiredService();
scheduler.PauseTask(id);
return ResultOutput.Ok();
}
///
/// 启动任务
///
///
///
public IResultOutput Resume([BindRequired] string id)
{
if (id.IsNull())
{
return ResultOutput.NotOk();
}
var scheduler = LazyGetRequiredService();
scheduler.ResumeTask(id);
return ResultOutput.Ok();
}
///
/// 执行任务
///
///
///
public IResultOutput Run([BindRequired] string id)
{
if (id.IsNull())
{
return ResultOutput.NotOk();
}
var scheduler = LazyGetRequiredService();
scheduler.RunNowTask(id);
return ResultOutput.Ok();
}
///
/// 删除任务
///
///
///
public IResultOutput Delete([BindRequired] string id)
{
if (id.IsNull())
{
return ResultOutput.NotOk();
}
var scheduler = LazyGetRequiredService();
scheduler.RemoveTask(id);
return ResultOutput.Ok();
}
}