From 76d94c0bc914420d712892fa9d11e3c9f021e0db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sat, 2 Nov 2024 13:31:18 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jobs/AccessLogCacheJob.cs | 2 +- .../Jobs/OnHookAutoMiningJob.cs | 12 ++- .../Services/CollectiblesService.cs | 2 +- .../Services/InvitationCodeService.cs | 89 +++++++++++++++++++ .../Record/CollectiblesRecordService.cs | 5 +- .../Services/Tool/CollectiblesToolService.cs | 68 +++++++++++--- .../Enums/RarityEnum.cs | 17 ++++ .../Managers/MiningPoolManager.cs | 15 +++- 8 files changed, 188 insertions(+), 22 deletions(-) create mode 100644 Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/InvitationCodeService.cs diff --git a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Jobs/AccessLogCacheJob.cs b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Jobs/AccessLogCacheJob.cs index 8f936574..ddedea02 100644 --- a/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Jobs/AccessLogCacheJob.cs +++ b/Yi.Abp.Net8/module/bbs/Yi.Framework.Bbs.Application/Jobs/AccessLogCacheJob.cs @@ -27,7 +27,7 @@ public class AccessLogCacheJob : QuartzBackgroundWorkerBase //每10秒执行一次,将本地缓存转入redis,防止丢数据 Trigger = TriggerBuilder.Create().WithIdentity(nameof(AccessLogCacheJob)) - .WithSimpleSchedule((schedule) => { schedule.WithInterval(TimeSpan.FromSeconds(10)).RepeatForever();; }) + .WithSimpleSchedule((schedule) => { schedule.WithInterval(TimeSpan.FromSeconds(10)).RepeatForever(); }) .Build(); } diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/OnHookAutoMiningJob.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/OnHookAutoMiningJob.cs index fe6f69f6..2f43324e 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/OnHookAutoMiningJob.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/OnHookAutoMiningJob.cs @@ -1,4 +1,5 @@ -using Quartz; +using Microsoft.Extensions.Logging; +using Quartz; using Volo.Abp.BackgroundWorkers.Quartz; using Yi.Framework.DigitalCollectibles.Domain.Entities; using Yi.Framework.DigitalCollectibles.Domain.Managers; @@ -12,15 +13,18 @@ namespace Yi.Framework.DigitalCollectibles.Application.Jobs; public class OnHookAutoMiningJob : QuartzBackgroundWorkerBase { private readonly MiningPoolManager _miningPoolManager; + private readonly ILogger _logger; - public OnHookAutoMiningJob(MiningPoolManager miningPoolManager) + public OnHookAutoMiningJob(MiningPoolManager miningPoolManager, ILogger logger) { _miningPoolManager = miningPoolManager; - JobDetail = JobBuilder.Create().WithIdentity(nameof(AutoRefreshMiningPoolJob)) + _logger = logger; + JobDetail = JobBuilder.Create().WithIdentity(nameof(OnHookAutoMiningJob)) .Build(); //每小时执行一次 - Trigger = TriggerBuilder.Create().WithIdentity(nameof(AutoRefreshMiningPoolJob)) + Trigger = TriggerBuilder.Create().WithIdentity(nameof(OnHookAutoMiningJob)) + // .WithCronSchedule("10 * * * * ?") .WithCronSchedule("0 0 * * * ?") .Build(); } diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/CollectiblesService.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/CollectiblesService.cs index 1fa34e46..e94e430c 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/CollectiblesService.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/CollectiblesService.cs @@ -99,7 +99,7 @@ public class CollectiblesService : ApplicationService input.StartTime is not null && input.EndTime is not null, u => u.CreationTime >= input.StartTime && u.CreationTime <= input.EndTime) .LeftJoin((u, c) => u.CollectiblesId == c.Id) - .OrderBy((u, c) => c.OrderNum) + .OrderBy((u, c) => c.CreationTime) .GroupBy((u, c) => u.CollectiblesId) .Select((u, c) => new CollectiblesUserGetOutputDto diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/InvitationCodeService.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/InvitationCodeService.cs new file mode 100644 index 00000000..1fa2be68 --- /dev/null +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/InvitationCodeService.cs @@ -0,0 +1,89 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.Application.Services; +using Volo.Abp.Users; +using Yi.Framework.DigitalCollectibles.Domain.Entities; +using Yi.Framework.SqlSugarCore.Abstractions; + +namespace Yi.Framework.DigitalCollectibles.Application.Services; + +/// +/// 邀请码应用服务 +/// +public class InvitationCodeService : ApplicationService +{ + private readonly ISqlSugarRepository _repository; + + public InvitationCodeService(ISqlSugarRepository repository) + { + _repository = repository; + } + + /// + /// 查询当前登录用户的邀请码数据 + /// + /// + [Authorize] + public async Task GetAsync() + { + var userId = CurrentUser.GetId(); + var entity = await _repository.GetFirstAsync(x => x.UserId == userId); + if (entity is null) + { + return new { IsInvited=false, PointsNumber=0 }; + } + + return new { entity.IsInvited, entity.PointsNumber }; + } + + /// + /// 当前用户填写邀请码 + /// + /// + /// + [Authorize] + public async Task SetAsync([FromQuery] Guid invitedUserId) + { + var userId = CurrentUser.GetId(); + var entity = await _repository.GetFirstAsync(x => x.UserId == userId); + if (entity is null) + { + await _repository.InsertAsync(new InvitationCodeAggregateRoot + { + UserId = userId, + IsInvited = true, + PointsNumber = 0 + }); + } + else + { + if (entity.IsInvited) + { + throw new UserFriendlyException("你已填写过邀请码,无法再次填写"); + } + else + { + entity.IsInvited = false; + await _repository.UpdateAsync(entity); + } + } + + + var invitedEntity = await _repository.GetFirstAsync(x => x.UserId == invitedUserId); + + if (entity is null) + { + await _repository.InsertAsync(new InvitationCodeAggregateRoot + { + UserId = invitedUserId, + IsInvited = false, + PointsNumber = 1 + }); + } + else + { + invitedEntity.PointsNumber += 1; + await _repository.UpdateAsync(invitedEntity); + } + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Record/CollectiblesRecordService.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Record/CollectiblesRecordService.cs index cfbe9e32..ea336439 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Record/CollectiblesRecordService.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Record/CollectiblesRecordService.cs @@ -36,7 +36,6 @@ public class CollectiblesRecordService : ApplicationService var output = await _miningPoolRecordRepository._DbQueryable.WhereIF(input.StartTime is not null && input.EndTime is not null, x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) .Where(x => x.UserId == userId) - .OrderByDescending(x => x.CreationTime) .LeftJoin((x, c) => x.CollectiblesId==c.Id) .Select((x, c) => new MiningPoolRecordDto @@ -58,6 +57,7 @@ public class CollectiblesRecordService : ApplicationService } ) + .OrderByDescending(x => x.CreationTime) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); return new PagedResultDto(total,output); @@ -78,7 +78,7 @@ public class CollectiblesRecordService : ApplicationService //交易:是购买和出售,都需要展示 .Where(x => x.SellUserId == userId||x.BuyId ==userId) - .OrderByDescending(x => x.CreationTime) + .LeftJoin((x, c) => x.CollectiblesId==c.Id) .Select((x, c) => new MarketRecordDto @@ -104,6 +104,7 @@ public class CollectiblesRecordService : ApplicationService }, } ) + .OrderByDescending(x => x.CreationTime) .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); foreach (var dto in output) diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Tool/CollectiblesToolService.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Tool/CollectiblesToolService.cs index 5c78d9b3..ce65a1c1 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Tool/CollectiblesToolService.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Services/Tool/CollectiblesToolService.cs @@ -1,6 +1,9 @@ using System.IO.Compression; +using FreeRedis; using Volo.Abp.Application.Services; +using Volo.Abp.Caching; using Yi.Framework.DigitalCollectibles.Domain.Entities; +using Yi.Framework.DigitalCollectibles.Domain.Entities.Record; using Yi.Framework.DigitalCollectibles.Domain.Shared.Consts; using Yi.Framework.SqlSugarCore.Abstractions; @@ -9,10 +12,15 @@ namespace Yi.Framework.DigitalCollectibles.Application.Services.Tool; public class CollectiblesToolService : ApplicationService { private ISqlSugarRepository _repository; + private ISqlSugarRepository _recordRepository; - public CollectiblesToolService(ISqlSugarRepository repository) + private IRedisClient RedisClient => LazyServiceProvider.LazyGetRequiredService(); + + public CollectiblesToolService(ISqlSugarRepository repository, + ISqlSugarRepository recordRepository) { _repository = repository; + _recordRepository = recordRepository; } public async Task DeleteInitAsync() @@ -32,7 +40,7 @@ public class CollectiblesToolService : ApplicationService ZipFile.ExtractToDirectory(dataPath, directoryPath, true); // true 表示覆盖已有文件 - var txtPath = Path.Combine("wwwroot", "dc","data", "data.txt"); + var txtPath = Path.Combine("wwwroot", "dc", "data", "data.txt"); if (!File.Exists(txtPath)) { throw new UserFriendlyException($"{txtPath}路径不存在文本"); @@ -49,16 +57,17 @@ public class CollectiblesToolService : ApplicationService { continue; } + var items = line.Split(",").ToList(); - if (items.Count!=6) + if (items.Count != 6) { errData.Add($"{i}行数据存,数据不对,只能6个数据"); } - + var fileName = items[0]; - var code = Path.GetFileNameWithoutExtension(fileName) ; + var code = Path.GetFileNameWithoutExtension(fileName); var name = items[1]; var value = decimal.Parse(items[2]); var url = $"https://ccnetcore.com/prod-api/wwwroot/dc/data/{fileName}"; @@ -79,19 +88,17 @@ public class CollectiblesToolService : ApplicationService }; entities.Add(entity); - if (!File.Exists(Path.Combine(directoryPath,fileName))) + if (!File.Exists(Path.Combine(directoryPath, fileName))) { - errData.Add($"文件不存在:{Path.Combine(directoryPath,fileName)}"); + errData.Add($"文件不存在:{Path.Combine(directoryPath, fileName)}"); } - - } if (errData.Any()) { return new { ok = false, errData }; } - + var allCode = await _repository._DbQueryable.Select(x => x.Code).ToListAsync(); var existCodes = allCode.Intersect(entities.Select(x => x.Code)).ToList(); @@ -99,9 +106,46 @@ public class CollectiblesToolService : ApplicationService { return new { ok = false, existCodes }; } - + await _repository.InsertRangeAsync(entities); - return new { ok = true,entities }; + return new { ok = true, entities }; + } + + + /// + /// 跑马灯内容 + /// + /// + public async Task> GetNoticeAsync() + { + //获取最新的3条挖矿记录,高级 + var record = await _recordRepository._DbQueryable + .LeftJoin((x, c) => x.CollectiblesId == c.Id) + .Where((x,c)=>c.Rarity>=RarityEnum.Senior) + .OrderByDescending((x, c) => x.CreationTime) + .Select((x, c) => new + { + c.Name, + c.ValueNumber, + c.Rarity + }) + .ToPageListAsync(1, 3); + + var output = new List(); + + var firstNoticeOrNull = await RedisClient.GetAsync("Yi:Notice"); + if (firstNoticeOrNull is not null) + { + output.Add(firstNoticeOrNull); + } + + foreach (var item in record) + { + output.Add($"恭喜神秘用户,挖到【{item.Rarity.GetRarityName()}-{item.Name}】,价值【{(int)(item.ValueNumber)}】"); + } + + + return output; } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Enums/RarityEnum.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Enums/RarityEnum.cs index ccdbf00f..8e1fc6d1 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Enums/RarityEnum.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Enums/RarityEnum.cs @@ -18,6 +18,23 @@ public enum RarityEnum public static class RarityEnumExtensions { + public static string GetRarityName(this RarityEnum enumValue) + { + // 获取枚举类型 + Type type = enumValue.GetType(); + + // 获取当前枚举值的 FieldInfo + FieldInfo fieldInfo = type.GetField(enumValue.ToString()); + + // 获取 Display 特性 + DisplayAttribute displayAttribute = fieldInfo + .GetCustomAttributes(typeof(DisplayAttribute), false) + .FirstOrDefault() as DisplayAttribute; + + // 返回名称,如果没有找到,则返回枚举值的名称 + return displayAttribute?.Name ?? enumValue.ToString(); + } + private static T GetAttribute(RarityEnum rarity) where T : Attribute { var fieldInfo = typeof(RarityEnum).GetField(rarity.ToString()); diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MiningPoolManager.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MiningPoolManager.cs index 0b71d4fe..638106b4 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MiningPoolManager.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/MiningPoolManager.cs @@ -1,5 +1,6 @@ using FreeRedis; using Microsoft.Extensions.Caching.Distributed; +using Microsoft.Extensions.Logging; using Volo.Abp.Caching; using Volo.Abp.Domain.Services; using Volo.Abp.EventBus.Local; @@ -27,6 +28,7 @@ public class MiningPoolManager : DomainService private readonly IDistributedCache _miningPoolCache; private readonly IDistributedCache _userMiningLimitCache; private readonly ISqlSugarRepository _userStoreRepository; + private readonly ILogger _logger; private IRedisClient RedisClient => LazyServiceProvider.LazyGetRequiredService(); private ILocalEventBus LocalEventBus => LazyServiceProvider.LazyGetRequiredService(); @@ -34,7 +36,7 @@ public class MiningPoolManager : DomainService ISqlSugarRepository collectiblesRepository, ISqlSugarRepository onHookRepository, ISqlSugarRepository userStoreRepository, - IDistributedCache userMiningLimitCache) + IDistributedCache userMiningLimitCache, ILogger logger) { _settingProvider = settingProvider; this._miningPoolCache = miningPoolCache; @@ -42,6 +44,7 @@ public class MiningPoolManager : DomainService _onHookRepository = onHookRepository; _userStoreRepository = userStoreRepository; _userMiningLimitCache = userMiningLimitCache; + _logger = logger; } /// @@ -270,7 +273,15 @@ public class MiningPoolManager : DomainService var userOnHookDic = currentOnHook.GroupBy(x => x.UserId).ToDictionary(x => x.Key, y => y.First()); foreach (var onHookItem in userOnHookDic) { - await MiningAsync(onHookItem.Value.UserId); + try + { + await MiningAsync(onHookItem.Value.UserId); + } + catch (UserFriendlyException e) + { + _logger.LogInformation($"自动挖矿-{onHookItem.Value.UserId},{e.Message}"); + } + } }