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