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