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;
///
/// 任务领域,任务相关核心逻辑
///
public class AssignmentManager : DomainService
{
private readonly IEnumerable _assignmentProviders;
private readonly ISqlSugarRepository _assignmentRepository;
private readonly ISqlSugarRepository _assignmentDefineRepository;
private readonly ILocalEventBus _localEventBus;
public AssignmentManager(IEnumerable assignmentProviders,
ISqlSugarRepository assignmentRepository,
ISqlSugarRepository assignmentDefineRepository, ILocalEventBus localEventBus)
{
this._assignmentProviders = assignmentProviders;
_assignmentRepository = assignmentRepository;
_assignmentDefineRepository = assignmentDefineRepository;
_localEventBus = localEventBus;
}
///
/// 接受任务
///
/// 领取用户
/// 任务定义id
///
public async Task AcceptAsync(Guid userId, Guid asignmentDefineId)
{
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);
}
}
///
/// 领取任务奖励
///
/// 任务id
///
///
public async Task ReceiveRewardsAsync(Guid asignmentId)
{
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);
}
}
///
/// 根据用户id获取能够领取的任务列表
///
/// 用户id
///
public async Task> GetCanReceiveListAsync(Guid userId)
{
var context = await GetAssignmentContext(userId);
var output = new List();
foreach (var assignmentProvider in _assignmentProviders)
{
output.AddRange(await assignmentProvider.GetCanReceiveListAsync(context));
}
output.DistinctBy(x => x.Id);
throw new NotImplementedException();
}
///
/// 获取任务的上下文
///
///
///
private async Task 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;
}
///
/// 过期超时的任务,定时任务去处理即可
///
public async Task ExpireTimeoutAsync()
{
var progressEntities = await _assignmentRepository._DbQueryable
.Where(x => x.AssignmentState == AssignmentStateEnum.Progress)
.ToListAsync();
var needUpdateEntities = new List();
foreach (var progressEntity in progressEntities)
{
if (progressEntity.TrySetExpire())
{
needUpdateEntities.Add(progressEntity);
}
}
if (needUpdateEntities.Any())
{
await _assignmentRepository._Db.Updateable(needUpdateEntities).ExecuteCommandAsync();
}
}
}