From ff19cb68b925209c1a590abfc162d5eb43f21a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= <454313500@qq.com> Date: Wed, 31 Jan 2024 18:16:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=88=A4=E6=96=AD=E5=BD=93=E5=89=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=B8=BA=E7=A9=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SqlSugarDbContext.cs | 4 +- .../Services/Integral/LevelService.cs | 29 ++++++++-- .../Consts/LevelConst.cs | 2 + .../Consts/MoneyConst.cs | 13 +++++ .../EventHandlers/MoneyChangeEventHandler.cs | 11 +++- .../Managers/LevelManager.cs | 58 +++++++++++++++++++ 6 files changed, 110 insertions(+), 7 deletions(-) create mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/MoneyConst.cs create mode 100644 Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs diff --git a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs index 085db784..7efaa086 100644 --- a/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs +++ b/Yi.Abp.Net8/framework/Yi.Framework.SqlSugarCore/SqlSugarDbContext.cs @@ -104,7 +104,7 @@ namespace Yi.Framework.SqlSugarCore } if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.LastModifierId))) { - if (CurrentUser != null) + if (CurrentUser.Id != null) { entityInfo.SetValue(CurrentUser.Id); } @@ -130,7 +130,7 @@ namespace Yi.Framework.SqlSugarCore } if (entityInfo.PropertyName.Equals(nameof(IAuditedObject.CreatorId))) { - if (CurrentUser != null) + if (CurrentUser.Id != null) { entityInfo.SetValue(CurrentUser.Id); } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/LevelService.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/LevelService.cs index e4103368..3c5c52ec 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/LevelService.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Services/Integral/LevelService.cs @@ -3,12 +3,17 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using SqlSugar; +using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Domain.Repositories; using Yi.Framework.Bbs.Application.Contracts.Dtos.Level; using Yi.Framework.Bbs.Application.Contracts.IServices; using Yi.Framework.Bbs.Domain.Entities.Integral; +using Yi.Framework.Bbs.Domain.Managers; +using Yi.Framework.Bbs.Domain.Shared.Consts; using Yi.Framework.Ddd.Application; using Yi.Framework.SqlSugarCore.Abstractions; @@ -20,9 +25,11 @@ namespace Yi.Framework.Bbs.Application.Services.Integral public class LevelService : YiCrudAppService, ILevelService { private ISqlSugarRepository _repository; - public LevelService(ISqlSugarRepository repository) : base(repository) + private LevelManager _levelManager; + public LevelService(ISqlSugarRepository repository, LevelManager levelManager) : base(repository) { - _repository= repository; + _repository = repository; + _levelManager = levelManager; } /// @@ -35,11 +42,25 @@ namespace Yi.Framework.Bbs.Application.Services.Integral RefAsync total = 0; var entities = await _repository._DbQueryable - .WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name.Contains(input.Name!)) - .WhereIF(input.MinLevel is not null , x => x.CurrentLevel>=input.MinLevel) + .WhereIF(!string.IsNullOrEmpty(input.Name), x => x.Name.Contains(input.Name!)) + .WhereIF(input.MinLevel is not null, x => x.CurrentLevel >= input.MinLevel) .OrderBy(x => x.CurrentLevel) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); return new PagedResultDto(total, await MapToGetListOutputDtosAsync(entities)); } + + /// + /// 升级等级 + /// + /// + [Authorize] + public async Task UpdateUpgradeAsync(int experience) + { + if (experience <= 0) + { + throw new UserFriendlyException(LevelConst.Level_Low_Zero); + } + await _levelManager.ChangeLevelByMoneyAsync(CurrentUser.Id!.Value, experience); + } } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/LevelConst.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/LevelConst.cs index dd832991..e62d9afc 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/LevelConst.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/LevelConst.cs @@ -9,5 +9,7 @@ namespace Yi.Framework.Bbs.Domain.Shared.Consts public class LevelConst { public const string LevelCacheKey=nameof(LevelCacheKey); + + public const string Level_Low_Zero = "经验提升等级低于或等于0"; } } diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/MoneyConst.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/MoneyConst.cs new file mode 100644 index 00000000..2f8a296d --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain.Shared/Consts/MoneyConst.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Bbs.Domain.Shared.Consts +{ + public class MoneyConst + { + public const string Money_Low_Zero = "钱钱不足"; + } +} diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/EventHandlers/MoneyChangeEventHandler.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/EventHandlers/MoneyChangeEventHandler.cs index 1d2fa2b2..53482f01 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/EventHandlers/MoneyChangeEventHandler.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/EventHandlers/MoneyChangeEventHandler.cs @@ -1,6 +1,8 @@ -using Volo.Abp.DependencyInjection; +using Volo.Abp; +using Volo.Abp.DependencyInjection; using Volo.Abp.EventBus; using Yi.Framework.Bbs.Domain.Entities; +using Yi.Framework.Bbs.Domain.Shared.Consts; using Yi.Framework.Bbs.Domain.Shared.Etos; using Yi.Framework.SqlSugarCore.Abstractions; @@ -15,6 +17,13 @@ namespace Yi.Framework.Bbs.Domain.EventHandlers } public async Task HandleEventAsync(MoneyChangeEventArgs eventData) { + var userIfno = await _userInfoRepository.GetFirstAsync(x => x.UserId == eventData.UserId); + + //如果变化后的钱钱少于0,直接丢出去 + if ((userIfno.Money + eventData.Number)<0) + { + throw new UserFriendlyException(MoneyConst.Money_Low_Zero); + } //原子性sql await _userInfoRepository._Db.Updateable() .SetColumns(it => it.Money == it.Money + eventData.Number) diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs new file mode 100644 index 00000000..24fa1e6f --- /dev/null +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Domain/Managers/LevelManager.cs @@ -0,0 +1,58 @@ +using Mapster; +using Volo.Abp.Caching; +using Volo.Abp.Domain.Services; +using Volo.Abp.EventBus.Local; +using Yi.Framework.Bbs.Domain.Entities; +using Yi.Framework.Bbs.Domain.Shared.Caches; +using Yi.Framework.Bbs.Domain.Shared.Consts; +using Yi.Framework.Bbs.Domain.Shared.Etos; + +namespace Yi.Framework.Bbs.Domain.Managers +{ + public class LevelManager : DomainService + { + private BbsUserManager _bbsUserManager; + private ILocalEventBus _localEventBus; + private List _levelCacheItem; + public LevelManager(BbsUserManager bbsUserManager, ILocalEventBus localEventBus, IDistributedCache> levelCache) + { + _bbsUserManager = bbsUserManager; + _localEventBus = localEventBus; + _levelCacheItem = levelCache.Get(LevelConst.LevelCacheKey); + } + + + /// + /// 使用钱钱投喂等级 + /// + /// + public async Task ChangeLevelByMoneyAsync(Guid userId, int moneyNumber) + { + //通过用户id获取用户信息的经验和等级 + var userInfo = await _bbsUserManager.GetBbsUserInfoAsync(userId); + + //钱钱和经验的比例为1:1 + //根据钱钱修改经验 + var currentNewExperience = userInfo.Experience + moneyNumber * 1; + + //修改钱钱,如果钱钱不足,直接会丢出去 + await _localEventBus.PublishAsync(new MoneyChangeEventArgs { UserId = userId, Number = moneyNumber }); + + //更改最终的经验再变化等级 + var levelList = _levelCacheItem.OrderBy(x => x.CurrentLevel).ToList(); + var currentNewLevel = 0; + foreach (var level in levelList) + { + if (currentNewExperience >= level.MinExperience) + { + currentNewLevel = level.CurrentLevel; + break; + } + } + userInfo.Level = currentNewLevel; + userInfo.Experience = currentNewExperience; + await _bbsUserManager._bbsUserInfoRepository.UpdateAsync(userInfo.Adapt()); + + } + } +}