网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 WaitExecutionService 的服务类,它实现了 IWaitExecutionService 接口。这个服务类主要用于处理与等待执行的任务相关的操作,具体功能如下:

  1. 获取未执行的任务 (GetNotExecuteTaskAsync):

    • 该方法从数据库中检索状态不为 ExecuteCompleteWaitExecution 记录,最多返回 1000 条记录,并将其映射到 VmWaitExecution 视图模型列表中。
    • 使用 IRepository<WaitExecution> 接口的 SearchFor 方法进行查询,并使用 OrderByTake 方法进行排序和限制结果数量。
  2. 更新任务状态 (UpdateStatusAsync):

    • 该方法接受一个任务的 ID 和新的执行状态。首先,它尝试将字符串 ID 解析为 ObjectId
    • 如果解析成功,使用 MongoDB 的更新构建器 (Builders<WaitExecution>.Update) 更新该任务的状态和最后更新时间。
  3. 清除过期的任务 (ClearExpiredAsync):

    • 该方法查找所有状态为 ExecuteComplete 的任务,并按 ID 和最后更新时间降序排列,最多返回 1000 条记录。
    • 然后,它使用这些任务的 ID 构建一个过滤器,并从数据库中删除这些记录。
  4. 添加任务 (AddToTaskAsync):

    • 该方法接受两个参数:一个可选的 ObjectId 集合(表示图像的 ID)和一个可选的字符串集合(表示图像的 URL)。
    • 它会创建一个 WaitExecution 对象的列表,表示待执行的删除任务(使用图像 URL),并将其状态设置为 NotExecute
    • 如果有待执行的任务,则调用 AddExecuteTaskAsync 方法将这些任务插入到数据库中。
  5. 添加执行任务 (AddExecuteTaskAsync):

    • 该方法接受一个或多个 WaitExecution 对象,并将它们插入到数据库中。

总结

WaitExecutionService 类提供了一系列方法来管理等待执行的任务,包括获取未执行的任务、更新任务状态、清除已完成的任务以及添加新的执行任务。它利用了 MongoDB 的查询和更新功能,并通过 IMapper 进行对象映射。

loading