网站首页 网站源码
namespace Dpz.Core.Service.RepositoryServiceImpl;
public class WaitExecutionService(IRepository<WaitExecution> repository, IMapper mapper)
: IWaitExecutionService
{
public async Task<IList<VmWaitExecution>> GetNotExecuteTaskAsync()
{
var list = await repository
.SearchFor(x => x.Status != ExecuteStatus.ExecuteComplete)
.OrderBy(x => x.Id)
.Take(1000)
.ToListAsync();
return mapper.Map<List<VmWaitExecution>>(list);
}
public async Task UpdateStatusAsync(string id, ExecuteStatus status)
{
if (ObjectId.TryParse(id, out var oid))
{
var update = Builders<WaitExecution>
.Update.Set(x => x.Status, status)
.Set(x => x.LastUpdateTime, DateTime.Now);
await repository.UpdateAsync(x => x.Id == oid, update);
}
}
public async Task ClearExpiredAsync()
{
var ids = await repository
.SearchFor(x => x.Status == ExecuteStatus.ExecuteComplete)
.OrderByDescending(x => x.Id)
.ThenByDescending(x => x.LastUpdateTime)
.Take(1000)
.Select(x => x.Id)
.ToListAsync();
var filter = Builders<WaitExecution>.Filter.In(x => x.Id, ids);
await repository.DeleteAsync(filter);
}
public async Task AddToTaskAsync(
IReadOnlyCollection<ObjectId>? images,
IReadOnlyCollection<string>? imageUrls
)
{
//images ??= new List<ObjectId>();
imageUrls ??= new List<string>();
// var pictureKeys = images.Select(x => x.ToString()).ToList();
// pictureKeys.AddRange(imageUrls);
// var filter = Builders<Picture>.Filter.In(x => x.Info.Delete, pictureKeys);
// await _pictureRepository.DeleteAsync(filter);
var imageTasks = imageUrls
.Select(x => new WaitExecution
{
Category = ExecuteCategory.Delete,
Relation = x,
Scheme = ExecuteScheme.DeleteUpyun,
Status = ExecuteStatus.NotExecute,
CreateTime = DateTime.Now,
LastUpdateTime = null
})
.ToList();
// var dbImages = images.Select(x => new WaitExecution
// {
// Category = ExecuteCategory.Delete,
// Relation = x.ToString(),
// Scheme = ExecuteScheme.DeleteDbFile,
// Status = ExecuteStatus.NotExecute,
// CreateTime = DateTime.Now,
// LastUpdateTime = null
// }).ToArray();
//imageTasks.AddRange(dbImages);
if (imageTasks.Count > 0)
await AddExecuteTaskAsync(imageTasks.ToArray());
}
public async Task AddExecuteTaskAsync(params WaitExecution[] task)
{
await repository.InsertAsync(task);
}
}
上述代码定义了一个名为 WaitExecutionService
的服务类,它实现了 IWaitExecutionService
接口。这个服务类主要用于处理与等待执行的任务相关的操作,具体功能如下:
获取未执行的任务 (GetNotExecuteTaskAsync
):
ExecuteComplete
的 WaitExecution
记录,最多返回 1000 条记录,并将其映射到 VmWaitExecution
视图模型列表中。IRepository<WaitExecution>
接口的 SearchFor
方法进行查询,并使用 OrderBy
和 Take
方法进行排序和限制结果数量。更新任务状态 (UpdateStatusAsync
):
ObjectId
。Builders<WaitExecution>.Update
) 更新该任务的状态和最后更新时间。清除过期的任务 (ClearExpiredAsync
):
ExecuteComplete
的任务,并按 ID 和最后更新时间降序排列,最多返回 1000 条记录。添加任务 (AddToTaskAsync
):
ObjectId
集合(表示图像的 ID)和一个可选的字符串集合(表示图像的 URL)。WaitExecution
对象的列表,表示待执行的删除任务(使用图像 URL),并将其状态设置为 NotExecute
。AddExecuteTaskAsync
方法将这些任务插入到数据库中。添加执行任务 (AddExecuteTaskAsync
):
WaitExecution
对象,并将它们插入到数据库中。WaitExecutionService
类提供了一系列方法来管理等待执行的任务,包括获取未执行的任务、更新任务状态、清除已完成的任务以及添加新的执行任务。它利用了 MongoDB 的查询和更新功能,并通过 IMapper
进行对象映射。