feat: 完成任务体系搭建

This commit is contained in:
chenchun
2024-08-13 16:45:56 +08:00
parent 35ebce6a85
commit 96b9cad2f8
12 changed files with 233 additions and 55 deletions

View File

@@ -19,7 +19,12 @@ public class AssignmentDefineGetListOutputDto : EntityDto<Guid>
/// 任务类型
/// </summary>
public AssignmentTypeEnum AssignmentType { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 总共步骤数
/// </summary>

View File

@@ -5,7 +5,15 @@ namespace Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
public class AssignmentGetListOutputDto:EntityDto<Guid>
{
/// <summary>
/// 任务名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 备注
/// </summary>
public string Remarks { get; set; }
/// <summary>
/// 当前步骤数
/// </summary>
@@ -16,6 +24,11 @@ public class AssignmentGetListOutputDto:EntityDto<Guid>
/// </summary>
public int TotalStepNumber { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
/// <summary>
/// 任务状态
/// </summary>
@@ -33,6 +46,6 @@ public class AssignmentGetListOutputDto:EntityDto<Guid>
public DateTime? CompleteTime { get; set; }
public DateTime CreationTime { get; }
public DateTime CreationTime { get; set; }
public int OrderNum { get; set; }
}

View File

@@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Services;
using Volo.Abp.Users;
using Yi.Framework.Bbs.Application.Contracts.Dtos.Assignment;
using Yi.Framework.Bbs.Domain.Entities.Assignment;
using Yi.Framework.Bbs.Domain.Managers;
using Yi.Framework.Bbs.Domain.Shared.Enums;
@@ -27,7 +28,7 @@ public class AssignmentService : ApplicationService
/// </summary>
/// <param name="id"></param>
[HttpPost("assignment/accept/{id}")]
public async Task AcceptAsync([FromRoute]Guid id)
public async Task AcceptAsync([FromRoute] Guid id)
{
await _assignmentManager.AcceptAsync(CurrentUser.GetId(), id);
}
@@ -37,7 +38,7 @@ public class AssignmentService : ApplicationService
/// </summary>
/// <param name="id"></param>
[HttpPost("assignment/complete/{id}")]
public async Task ReceiveRewardsAsync([FromRoute]Guid id)
public async Task ReceiveRewardsAsync([FromRoute] Guid id)
{
await _assignmentManager.ReceiveRewardsAsync(id);
}
@@ -58,18 +59,23 @@ public class AssignmentService : ApplicationService
/// 查询接受的任务
/// </summary>
[HttpGet("assignment")]
public async Task<List<AssignmentGetListOutputDto>> GetListAsync([FromQuery]AssignmentGetListInput input)
public async Task<List<AssignmentGetListOutputDto>> GetListAsync([FromQuery] AssignmentGetListInput input)
{
var entities= await _assignmentManager._assignmentRepository._DbQueryable
.Where(x => x.UserId == CurrentUser.GetId())
.WhereIF(input.AssignmentQueryState == AssignmentQueryStateEnum.Progress,
x => x.AssignmentState == AssignmentStateEnum.Progress)
.WhereIF(input.AssignmentQueryState == AssignmentQueryStateEnum.End,
x => x.AssignmentState == AssignmentStateEnum.Completed ||
x.AssignmentState == AssignmentStateEnum.Expired)
.ToListAsync();
var output = await _assignmentManager._assignmentRepository._DbQueryable
.Where(x => x.UserId == CurrentUser.GetId())
.WhereIF(input.AssignmentQueryState == AssignmentQueryStateEnum.Progress,
x => x.AssignmentState == AssignmentStateEnum.Progress)
.WhereIF(input.AssignmentQueryState == AssignmentQueryStateEnum.End,
x => x.AssignmentState == AssignmentStateEnum.Completed ||
x.AssignmentState == AssignmentStateEnum.Expired)
.OrderBy(x=>x.CreationTime)
.LeftJoin<AssignmentDefineAggregateRoot>((x, define) => x.AssignmentDefineId==define.Id)
.Select((x, define) => new AssignmentGetListOutputDto
{
Id = x.Id
},true)
.ToListAsync();
var output= entities.Adapt<List<AssignmentGetListOutputDto>>();
return output;
}
}

View File

@@ -12,15 +12,17 @@ public enum AssignmentRequirementTypeEnum
/// </summary>
Comment=4,
/// <summary>
/// 更新个人中心
/// </summary>
UpdateProfile=8,
/// <summary>
/// 点赞
/// </summary>
Agree=16
Agree=8,
/// <summary>
/// 更新个人中心
/// </summary>
UpdateProfile=16
}

View File

@@ -0,0 +1,30 @@
using Yi.Framework.Bbs.Domain.Shared.Enums;
namespace Yi.Framework.Bbs.Domain.Shared.Etos;
public class AssignmentEventArgs
{
public AssignmentEventArgs(AssignmentRequirementTypeEnum requirementType, Guid currentUserId,object? args=null)
{
RequirementType = requirementType;
Args = args;
CurrentUserId = currentUserId;
}
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum RequirementType { get; set; }
/// <summary>
/// 任务参数,可空,只需要一个触发点即可
/// </summary>
public object? Args { get; set; }
/// <summary>
/// 当前用户id
/// </summary>
public Guid CurrentUserId { get; set; }
}

View File

@@ -48,7 +48,10 @@ public class AssignmentAggregateRoot : AggregateRoot<Guid>, IHasCreationTime, IO
/// 任务过期时间
/// </summary>
public DateTime? ExpireTime { get; set; }
/// <summary>
/// 任务需求类型
/// </summary>
public AssignmentRequirementTypeEnum AssignmentRequirementType{ get; set; }
public DateTime? CompleteTime { get; set; }

View File

@@ -5,6 +5,7 @@ using Volo.Abp.EventBus.Local;
using Yi.Framework.Bbs.Domain.Entities;
using Yi.Framework.Bbs.Domain.Entities.Forum;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
@@ -14,20 +15,24 @@ namespace Yi.Framework.Bbs.Domain.EventHandlers
/// <summary>
/// 被点赞
/// </summary>
public class AgreeCreatedEventHandler : ILocalEventHandler<EntityCreatedEventData<AgreeEntity>>,
ITransientDependency
public class AgreeChangeEventHandler : ILocalEventHandler<EntityCreatedEventData<AgreeEntity>>,
ITransientDependency
{
private ISqlSugarRepository<UserAggregateRoot> _userRepository;
private ISqlSugarRepository<BbsUserExtraInfoEntity> _userInfoRepository;
private ISqlSugarRepository<AgreeEntity> _agreeRepository;
private ILocalEventBus _localEventBus;
public AgreeCreatedEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userInfoRepository, ISqlSugarRepository<AgreeEntity> agreeRepository, ILocalEventBus localEventBus, ISqlSugarRepository<UserAggregateRoot> userRepository)
public AgreeChangeEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userInfoRepository,
ISqlSugarRepository<AgreeEntity> agreeRepository, ILocalEventBus localEventBus,
ISqlSugarRepository<UserAggregateRoot> userRepository)
{
_userInfoRepository = userInfoRepository;
_agreeRepository = agreeRepository;
_localEventBus = localEventBus;
_userRepository = userRepository;
}
public async Task HandleEventAsync(EntityCreatedEventData<AgreeEntity> eventData)
{
var agreeEntity = eventData.Entity;
@@ -35,55 +40,66 @@ namespace Yi.Framework.Bbs.Domain.EventHandlers
//查询主题的信息
var discussAndAgreeDto = await _agreeRepository._DbQueryable
.LeftJoin<DiscussAggregateRoot>((agree, discuss) => agree.DiscussId == discuss.Id)
.Select((agree, discuss) =>
new
{
DiscussId=discuss.Id,
DiscussTitle = discuss.Title,
DiscussCreatorId = discuss.CreatorId,
})
.FirstAsync();
.Select((agree, discuss) =>
new
{
DiscussId = discuss.Id,
DiscussTitle = discuss.Title,
DiscussCreatorId = discuss.CreatorId,
})
.FirstAsync();
//查询点赞者用户
var agreeUser = await _userRepository.GetFirstAsync(x => x.Id == agreeEntity.CreatorId);
//给创建者点赞数量+1
await _userInfoRepository._Db.Updateable<BbsUserExtraInfoEntity>()
.SetColumns(it => it.AgreeNumber == it.AgreeNumber + 1)
.Where(it => it.UserId == discussAndAgreeDto.DiscussCreatorId)
.ExecuteCommandAsync();
.SetColumns(it => it.AgreeNumber == it.AgreeNumber + 1)
.Where(it => it.UserId == discussAndAgreeDto.DiscussCreatorId)
.ExecuteCommandAsync();
//通知主题作者,有人点赞
await _localEventBus.PublishAsync(new BbsNoticeEventArgs(discussAndAgreeDto.DiscussCreatorId!.Value, string.Format(DiscussConst.AgreeNotice, discussAndAgreeDto.DiscussTitle, agreeUser.UserName,discussAndAgreeDto.DiscussId)), false);
await _localEventBus.PublishAsync(
new BbsNoticeEventArgs(discussAndAgreeDto.DiscussCreatorId!.Value,
string.Format(DiscussConst.AgreeNotice, discussAndAgreeDto.DiscussTitle, agreeUser.UserName,
discussAndAgreeDto.DiscussId)), false);
//最后发布任务触发事件
await _localEventBus.PublishAsync(
new AssignmentEventArgs(AssignmentRequirementTypeEnum.Agree, agreeUser.Id),false);
}
}
/// <summary>
/// 取消点赞
/// </summary>
public class AgreeDeletedEventHandler : ILocalEventHandler<EntityDeletedEventData<AgreeEntity>>,
ITransientDependency
ITransientDependency
{
private ISqlSugarRepository<BbsUserExtraInfoEntity> _userRepository;
private ISqlSugarRepository<AgreeEntity> _agreeRepository;
private ILocalEventBus _localEventBus;
public AgreeDeletedEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userRepository, ISqlSugarRepository<AgreeEntity> agreeRepository, ILocalEventBus localEventBus)
public AgreeDeletedEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userRepository,
ISqlSugarRepository<AgreeEntity> agreeRepository, ILocalEventBus localEventBus)
{
_userRepository = userRepository;
_agreeRepository = agreeRepository;
_localEventBus = localEventBus;
}
public async Task HandleEventAsync(EntityDeletedEventData<AgreeEntity> eventData)
{
var agreeEntity = eventData.Entity;
var userId = await _agreeRepository._DbQueryable.LeftJoin<DiscussAggregateRoot>((agree, discuss) => agree.DiscussId == discuss.Id)
.Select((agree, discuss) => discuss.CreatorId).FirstAsync();
var userId = await _agreeRepository._DbQueryable
.LeftJoin<DiscussAggregateRoot>((agree, discuss) => agree.DiscussId == discuss.Id)
.Select((agree, discuss) => discuss.CreatorId).FirstAsync();
//给创建者点赞数量-1
await _userRepository._Db.Updateable<BbsUserExtraInfoEntity>()
.SetColumns(it => it.AgreeNumber == it.AgreeNumber - 1)
.Where(it => it.UserId == userId)
.ExecuteCommandAsync();
.SetColumns(it => it.AgreeNumber == it.AgreeNumber - 1)
.Where(it => it.UserId == userId)
.ExecuteCommandAsync();
}
}
}
}

View File

@@ -0,0 +1,78 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus;
using Yi.Framework.Bbs.Domain.Entities.Assignment;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.Domain.EventHandlers;
/// <summary>
/// 任务系统的领域事件,处理不同任务触发变化
/// </summary>
public class AssignmentEventHandler : ILocalEventHandler<AssignmentEventArgs>, ITransientDependency
{
private readonly ISqlSugarRepository<AssignmentAggregateRoot> _repository;
public AssignmentEventHandler(ISqlSugarRepository<AssignmentAggregateRoot> repository)
{
_repository = repository;
}
public async Task HandleEventAsync(AssignmentEventArgs eventData)
{
var currentAssignmentList = await _repository.GetListAsync(x =>
x.AssignmentState == AssignmentStateEnum.Progress && x.UserId == eventData.CurrentUserId);
//如果有接收的任务
if (currentAssignmentList.Count > 0)
{
switch (eventData.RequirementType)
{
//发表主题
case AssignmentRequirementTypeEnum.Discuss:
SetCurrentStepNumber(AssignmentRequirementTypeEnum.Discuss, currentAssignmentList);
break;
//发表评论
case AssignmentRequirementTypeEnum.Comment:
SetCurrentStepNumber(AssignmentRequirementTypeEnum.Comment, currentAssignmentList);
break;
//点赞
case AssignmentRequirementTypeEnum.Agree:
SetCurrentStepNumber(AssignmentRequirementTypeEnum.Agree, currentAssignmentList);
break;
//更新个人信息
case AssignmentRequirementTypeEnum.UpdateProfile:
//这里还需判断是否更新了
break;
default:
throw new ArgumentOutOfRangeException();
}
//更新
await _repository.UpdateRangeAsync(currentAssignmentList);
}
}
/// <summary>
/// 设置当前进度
/// </summary>
/// <param name="requirementType"></param>
/// <param name="currentAssignmentList"></param>
private void SetCurrentStepNumber(AssignmentRequirementTypeEnum requirementType,
List<AssignmentAggregateRoot> currentAssignmentList)
{
currentAssignmentList.ForEach(x =>
{
if (x.AssignmentRequirementType == AssignmentRequirementTypeEnum.Agree &&
x.CurrentStepNumber < x.TotalStepNumber)
{
x.CurrentStepNumber += 1;
}
});
}
}

View File

@@ -6,6 +6,7 @@ using Volo.Abp.EventBus.Local;
using Yi.Framework.Bbs.Domain.Entities;
using Yi.Framework.Bbs.Domain.Entities.Forum;
using Yi.Framework.Bbs.Domain.Shared.Consts;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.SqlSugarCore.Abstractions;
@@ -62,6 +63,10 @@ namespace Yi.Framework.Bbs.Domain.EventHandlers
await _localEventBus.PublishAsync(new BbsNoticeEventArgs(commentEntity.ParentId, string.Format(DiscussConst.CommentNoticeToReply, disucssDto.DiscussTitle, commentUser.UserName, content,commentEntity.DiscussId)), false);
}
//最后发布任务触发事件
await _localEventBus.PublishAsync(
new AssignmentEventArgs(AssignmentRequirementTypeEnum.Comment, commentUser.Id),false);
}
}

View File

@@ -1,8 +1,11 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.EventBus.Local;
using Yi.Framework.Bbs.Domain.Entities;
using Yi.Framework.Bbs.Domain.Entities.Forum;
using Yi.Framework.Bbs.Domain.Shared.Enums;
using Yi.Framework.Bbs.Domain.Shared.Etos;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.Bbs.Domain.EventHandlers
@@ -11,22 +14,31 @@ namespace Yi.Framework.Bbs.Domain.EventHandlers
/// 主题创建的领域事件
/// </summary>
public class DiscussCreatedEventHandler : ILocalEventHandler<EntityCreatedEventData<DiscussAggregateRoot>>,
ITransientDependency
ITransientDependency
{
private ISqlSugarRepository<BbsUserExtraInfoEntity> _userRepository;
public DiscussCreatedEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userRepository)
private ILocalEventBus _localEventBus;
public DiscussCreatedEventHandler(ISqlSugarRepository<BbsUserExtraInfoEntity> userRepository,
ILocalEventBus localEventBus)
{
_userRepository = userRepository;
_localEventBus = localEventBus;
}
public async Task HandleEventAsync(EntityCreatedEventData<DiscussAggregateRoot> eventData)
{
var disucussEntity = eventData.Entity;
//给创建者发布数量+1
await _userRepository._Db.Updateable<BbsUserExtraInfoEntity>()
.SetColumns(it => it.DiscussNumber == it.DiscussNumber + 1)
.Where(it => it.UserId == disucussEntity.CreatorId)
.ExecuteCommandAsync();
.SetColumns(it => it.DiscussNumber == it.DiscussNumber + 1)
.Where(it => it.UserId == disucussEntity.CreatorId)
.ExecuteCommandAsync();
//最后发布任务触发事件
await _localEventBus.PublishAsync(
new AssignmentEventArgs(AssignmentRequirementTypeEnum.Discuss, disucussEntity.CreatorId!.Value), false);
}
}
}
}

View File

@@ -52,6 +52,7 @@ public class AssignmentManager : DomainService
entity.CurrentStepNumber = 0;
entity.TotalStepNumber = assignmentDefine.TotalStepNumber;
entity.RewardsMoneyNumber = assignmentDefine.RewardsMoneyNumber;
entity.AssignmentRequirementType = assignmentDefine.AssignmentRequirementType;
entity.ExpireTime = assignmentDefine.AssignmentType.GetExpireTime();
await _assignmentRepository.InsertAsync(entity);
}
@@ -71,7 +72,7 @@ public class AssignmentManager : DomainService
//加钱加钱
await _localEventBus.PublishAsync(
new MoneyChangeEventArgs { UserId = assignment.UserId, Number = assignment.RewardsMoneyNumber }, false);
//设置已完成,并领取奖励,钱钱
assignment.SetComplete();
await _assignmentRepository.UpdateAsync(assignment);
@@ -79,7 +80,7 @@ public class AssignmentManager : DomainService
else
{
//不能领取
throw new UserFriendlyException("该任务无法领取奖励,请检查任务详情");
throw new UserFriendlyException("该任务没有满足领取条件,请检查任务详情");
}
}
@@ -98,7 +99,7 @@ public class AssignmentManager : DomainService
output.AddRange(await assignmentProvider.GetCanReceiveListAsync(context));
}
output.DistinctBy(x => x.Id);
output = output.DistinctBy(x => x.Id).OrderBy(x => x.OrderNum).ToList();
return output;
}

View File

@@ -7,6 +7,7 @@ using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json.Converters;
using Volo.Abp.AspNetCore.Authentication.JwtBearer;
using Volo.Abp.AspNetCore.ExceptionHandling;
using Volo.Abp.AspNetCore.MultiTenancy;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.AntiForgery;
@@ -68,6 +69,12 @@ namespace Yi.Abp.Web
optios.AlwaysLogSelectors.Add(x => Task.FromResult(true));
});
//配置错误处理显示详情
Configure<AbpExceptionHandlingOptions>(options =>
{
options.SendExceptionsDetailsToClients = true;
});
//动态Api
Configure<AbpAspNetCoreMvcOptions>(options =>
{