From 3415543175b31916b291942d40d075e0cca300e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A9=99=E5=AD=90?= <454313500@qq.com> Date: Sun, 24 Nov 2024 19:07:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E4=BB=B7=E5=80=BC=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Jobs/AutoUpdateCollectiblesValueJob.cs | 25 ++++++++++++++ .../Attributes/ProbabilityAttribute.cs | 16 +++++++-- .../Enums/RarityEnum.cs | 20 +++++++---- .../Managers/CollectiblesManager.cs | 33 +++++++++++++++++++ .../Managers/MiningPoolManager.cs | 2 +- 5 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoUpdateCollectiblesValueJob.cs diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoUpdateCollectiblesValueJob.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoUpdateCollectiblesValueJob.cs new file mode 100644 index 00000000..936a1d90 --- /dev/null +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Application/Jobs/AutoUpdateCollectiblesValueJob.cs @@ -0,0 +1,25 @@ +using Volo.Abp.BackgroundWorkers.Hangfire; +using Yi.Framework.DigitalCollectibles.Domain.Managers; + +namespace Yi.Framework.DigitalCollectibles.Application.Jobs; + +/// +/// 自动更新藏品价值 +/// +public class AutoUpdateCollectiblesValueJob : HangfireBackgroundWorkerBase +{ + private readonly CollectiblesManager _collectiblesManager; + + public AutoUpdateCollectiblesValueJob(CollectiblesManager collectiblesManager) + { + _collectiblesManager = collectiblesManager; + RecurringJobId = "更新藏品价值"; + //每天早上9点执行一次 + CronExpression = "0 0 9 * * ?"; + } + + public override async Task DoWorkAsync(CancellationToken cancellationToken = new CancellationToken()) + { + await _collectiblesManager.UpdateAllValueAsync(); + } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Attributes/ProbabilityAttribute.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Attributes/ProbabilityAttribute.cs index 6dee35df..f07df658 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Attributes/ProbabilityAttribute.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain.Shared/Attributes/ProbabilityAttribute.cs @@ -4,13 +4,23 @@ using Yi.Framework.DigitalCollectibles.Domain.Shared.Consts; namespace Yi.Framework.DigitalCollectibles.Domain.Shared.Attributes; + public class ProbabilityAttribute : Attribute { - public double Value { get; set; } + /// + /// 概率 + /// + public double Probability { get; set; } - public ProbabilityAttribute(double value) + /// + /// 默认价值 + /// + public double DefaultValue { get; set; } + + public ProbabilityAttribute(double probability,double defaultValue) { - this.Value = value; + this.Probability = probability; + this.DefaultValue = defaultValue; } } 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 8e1fc6d1..5738580d 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 @@ -9,11 +9,11 @@ namespace Yi.Framework.DigitalCollectibles.Domain.Shared.Consts; /// public enum RarityEnum { - [Display(Name = "普通")][Probability(0.6f)] Ordinary = 0, - [Display(Name = "高级")][Probability(0.25f)] Senior = 1, - [Display(Name = "稀有")][Probability(0.1f)] Rare = 2, - [Display(Name = "珍品")][Probability(0.04f)] Gem = 3, - [Display(Name = "传说")][Probability(0.01f)] Legend = 4 + [Display(Name = "普通")][Probability(0.6f,100f)] Ordinary = 0, + [Display(Name = "高级")][Probability(0.25f,200f)] Senior = 1, + [Display(Name = "稀有")][Probability(0.1f,300f)] Rare = 2, + [Display(Name = "珍品")][Probability(0.04f,400f)] Gem = 3, + [Display(Name = "传说")][Probability(0.01f,600f)] Legend = 4 } public static class RarityEnumExtensions @@ -45,9 +45,15 @@ public static class RarityEnumExtensions public static decimal GetProbabilityValue(this RarityEnum rarity) { var attribute = GetAttribute(rarity); - return attribute.Value.To(); + return attribute.Probability.To(); } + public static double GetDefaultValue(this RarityEnum rarity) + { + var attribute = GetAttribute(rarity); + return attribute.DefaultValue.To(); + } + public static string GetDisplayValue(this RarityEnum rarity) { var display = GetAttribute(rarity); @@ -65,7 +71,7 @@ public static class RarityEnumExtensions if (attribute != null) { // 将特性值添加到列表 - probabilityList.Add(attribute.Value.To()); + probabilityList.Add(attribute.Probability.To()); } } diff --git a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/CollectiblesManager.cs b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/CollectiblesManager.cs index 406b486f..55547101 100644 --- a/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/CollectiblesManager.cs +++ b/Yi.Abp.Net8/module/digital-collectibles/Yi.Framework.DigitalCollectibles.Domain/Managers/CollectiblesManager.cs @@ -4,6 +4,7 @@ using Volo.Abp.Domain.Services; using Volo.Abp.Users; using Yi.Framework.DigitalCollectibles.Domain.Entities; using Yi.Framework.DigitalCollectibles.Domain.Shared.Caches; +using Yi.Framework.DigitalCollectibles.Domain.Shared.Consts; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.DigitalCollectibles.Domain.Managers; @@ -111,4 +112,36 @@ public class CollectiblesManager:DomainService return output; } + + + /// + /// 全量更新藏品价值 + /// + /// + public async Task UpdateAllValueAsync() + { + //全部藏品 + var collectibles = await _collectiblesRepository.GetListAsync(); + foreach (var item in collectibles) + { + var defaultValue= item.Rarity.GetDefaultValue(); + //计算实际的百分比 + var realValueRate= CalculateValue(item.FindTotal); + + var realValue = Math.Round(defaultValue * realValueRate); + item.ValueNumber = realValue.To(); + } + + await _collectiblesRepository.UpdateRangeAsync(collectibles); + } + + /// + /// 价值计算公式 + /// + /// + /// + private double CalculateValue(double x) + { + return 0.1 + 0.9 * Math.Exp(-0.00824 * (x - 1)); + } } \ No newline at end of file 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 51ae86e2..0eb08714 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 @@ -176,7 +176,7 @@ public class MiningPoolManager : DomainService //如果概率是挖到了矿,再从矿物中随机选择一个稀有度,再在当前稀有度中的矿物列表,随机选择一个具体的矿物 var pool = await GetMiningPoolContentAsync(); - if (pool is null|| pool.TotalNumber == 0) + if (pool is null || pool.TotalNumber == 0) { throw new UserFriendlyException($"失败,矿池已经被掏空了,请等矿池刷新后再来"); }