feat: 完成任务系统的领域服务

This commit is contained in:
chenchun
2024-08-12 17:16:30 +08:00
parent d46d6a58ab
commit b4751ea87a
11 changed files with 256 additions and 44 deletions

View File

@@ -1,5 +1,12 @@
using Volo.Abp.Domain.Services;
using SqlSugar;
using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Users;
using Yi.Framework.Bbs.Domain.Entities.Assignment;
using Yi.Framework.Bbs.Domain.Managers.AssignmentProviders;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.Domain.Managers;
@@ -8,36 +15,125 @@ namespace Yi.Framework.Bbs.Domain.Managers;
/// </summary>
public class AssignmentManager : DomainService
{
private readonly IEnumerable<IAssignmentProvider> _assignmentProviders;
private readonly ISqlSugarRepository<AssignmentAggregateRoot> _assignmentRepository;
private readonly ISqlSugarRepository<AssignmentDefineAggregateRoot> _assignmentDefineRepository;
private readonly ILocalEventBus _localEventBus;
public AssignmentManager(IEnumerable<IAssignmentProvider> assignmentProviders,
ISqlSugarRepository<AssignmentAggregateRoot> assignmentRepository,
ISqlSugarRepository<AssignmentDefineAggregateRoot> assignmentDefineRepository, ILocalEventBus localEventBus)
{
this._assignmentProviders = assignmentProviders;
_assignmentRepository = assignmentRepository;
_assignmentDefineRepository = assignmentDefineRepository;
_localEventBus = localEventBus;
}
/// <summary>
/// 接受任务
/// </summary>
/// <param name="userId">领取用户</param>
/// <param name="asignmentDefineId">任务定义id</param>
/// <returns></returns>
public Task AcceptAsync(Guid userId, Guid asignmentDefineId)
public async Task AcceptAsync(Guid userId, Guid asignmentDefineId)
{
throw new NotImplementedException();
var canReceiveList = await GetCanReceiveListAsync(userId);
//如果要接收的任务id在可领取的任务列表中就可以接收任务
if (canReceiveList.Select(x => x.Id).Contains(asignmentDefineId))
{
var assignmentDefine = await _assignmentDefineRepository.GetByIdAsync(asignmentDefineId);
var entity = new AssignmentAggregateRoot();
entity.AssignmentDefineId = asignmentDefineId;
entity.UserId = userId;
entity.AssignmentState = AssignmentStateEnum.Progress;
entity.CurrentStepNumber = 0;
entity.TotalStepNumber = assignmentDefine.TotalStepNumber;
entity.RewardsMoneyNumber = assignmentDefine.RewardsMoneyNumber;
entity.ExpireTime = assignmentDefine.AssignmentType.GetExpireTime();
await _assignmentRepository.InsertAsync(entity);
}
}
/// <summary>
/// 领取任务奖励
/// </summary>
/// <param name="asignmentId">任务id</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public Task ReceiveRewardsAsync(Guid asignmentId)
public async Task ReceiveRewardsAsync(Guid asignmentId)
{
throw new NotImplementedException();
var assignment = await _assignmentRepository.GetByIdAsync(asignmentId);
if (assignment.IsAllowCompleted())
{
//设置已完成,并领取奖励,钱钱
assignment.AssignmentState = AssignmentStateEnum.Completed;
//加钱加钱
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = assignment.UserId, Number = assignment.RewardsMoneyNumber }, false);
}
}
/// <summary>
/// 根据用户id获取能够领取的任务列表
/// </summary>
/// <param name="userId">用户id</param>
/// <returns></returns>
public Task<List<AssignmentDefineAggregateRoot>> GetCanReceiveListAsync(Guid userId)
public async Task<List<AssignmentDefineAggregateRoot>> GetCanReceiveListAsync(Guid userId)
{
var context = await GetAssignmentContext(userId);
var output = new List<AssignmentDefineAggregateRoot>();
foreach (var assignmentProvider in _assignmentProviders)
{
output.AddRange(await assignmentProvider.GetCanReceiveListAsync(context));
}
output.DistinctBy(x => x.Id);
throw new NotImplementedException();
}
/// <summary>
/// 获取任务的上下文
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
private async Task<AssignmentContext> GetAssignmentContext(Guid userId)
{
var allAssignmentDefine = await _assignmentDefineRepository.GetListAsync();
var currentUserAssignment = await _assignmentRepository.GetListAsync(x => x.UserId == userId);
var context = new AssignmentContext(userId, allAssignmentDefine, currentUserAssignment);
return context;
}
/// <summary>
/// 过期超时的任务,定时任务去处理即可
/// </summary>
public async Task ExpireTimeoutAsync()
{
var progressEntities = await _assignmentRepository._DbQueryable
.Where(x => x.AssignmentState == AssignmentStateEnum.Progress)
.ToListAsync();
var needUpdateEntities = new List<AssignmentAggregateRoot>();
foreach (var progressEntity in progressEntities)
{
if (progressEntity.TrySetExpire())
{
needUpdateEntities.Add(progressEntity);
}
}
if (needUpdateEntities.Any())
{
await _assignmentRepository._Db.Updateable(needUpdateEntities).ExecuteCommandAsync();
}
}
}