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($"失败,矿池已经被掏空了,请等矿池刷新后再来"); }