Merge remote-tracking branch 'origin/digital-collectibles' into digital-collectibles

This commit is contained in:
chenchun
2024-11-29 15:01:10 +08:00
5 changed files with 85 additions and 11 deletions

View File

@@ -0,0 +1,25 @@
using Volo.Abp.BackgroundWorkers.Hangfire;
using Yi.Framework.DigitalCollectibles.Domain.Managers;
namespace Yi.Framework.DigitalCollectibles.Application.Jobs;
/// <summary>
/// 自动更新藏品价值
/// </summary>
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();
}
}

View File

@@ -4,13 +4,23 @@ using Yi.Framework.DigitalCollectibles.Domain.Shared.Consts;
namespace Yi.Framework.DigitalCollectibles.Domain.Shared.Attributes; namespace Yi.Framework.DigitalCollectibles.Domain.Shared.Attributes;
public class ProbabilityAttribute : Attribute public class ProbabilityAttribute : Attribute
{ {
public double Value { get; set; } /// <summary>
/// 概率
/// </summary>
public double Probability { get; set; }
public ProbabilityAttribute(double value) /// <summary>
/// 默认价值
/// </summary>
public double DefaultValue { get; set; }
public ProbabilityAttribute(double probability,double defaultValue)
{ {
this.Value = value; this.Probability = probability;
this.DefaultValue = defaultValue;
} }
} }

View File

@@ -9,11 +9,11 @@ namespace Yi.Framework.DigitalCollectibles.Domain.Shared.Consts;
/// </summary> /// </summary>
public enum RarityEnum public enum RarityEnum
{ {
[Display(Name = "普通")][Probability(0.6f)] Ordinary = 0, [Display(Name = "普通")][Probability(0.6f,100f)] Ordinary = 0,
[Display(Name = "高级")][Probability(0.25f)] Senior = 1, [Display(Name = "高级")][Probability(0.25f,200f)] Senior = 1,
[Display(Name = "稀有")][Probability(0.1f)] Rare = 2, [Display(Name = "稀有")][Probability(0.1f,300f)] Rare = 2,
[Display(Name = "珍品")][Probability(0.04f)] Gem = 3, [Display(Name = "珍品")][Probability(0.04f,400f)] Gem = 3,
[Display(Name = "传说")][Probability(0.01f)] Legend = 4 [Display(Name = "传说")][Probability(0.01f,600f)] Legend = 4
} }
public static class RarityEnumExtensions public static class RarityEnumExtensions
@@ -45,9 +45,15 @@ public static class RarityEnumExtensions
public static decimal GetProbabilityValue(this RarityEnum rarity) public static decimal GetProbabilityValue(this RarityEnum rarity)
{ {
var attribute = GetAttribute<ProbabilityAttribute>(rarity); var attribute = GetAttribute<ProbabilityAttribute>(rarity);
return attribute.Value.To<decimal>(); return attribute.Probability.To<decimal>();
} }
public static double GetDefaultValue(this RarityEnum rarity)
{
var attribute = GetAttribute<ProbabilityAttribute>(rarity);
return attribute.DefaultValue.To<double>();
}
public static string GetDisplayValue(this RarityEnum rarity) public static string GetDisplayValue(this RarityEnum rarity)
{ {
var display = GetAttribute<DisplayAttribute>(rarity); var display = GetAttribute<DisplayAttribute>(rarity);
@@ -65,7 +71,7 @@ public static class RarityEnumExtensions
if (attribute != null) if (attribute != null)
{ {
// 将特性值添加到列表 // 将特性值添加到列表
probabilityList.Add(attribute.Value.To<decimal>()); probabilityList.Add(attribute.Probability.To<decimal>());
} }
} }

View File

@@ -4,6 +4,7 @@ using Volo.Abp.Domain.Services;
using Volo.Abp.Users; using Volo.Abp.Users;
using Yi.Framework.DigitalCollectibles.Domain.Entities; using Yi.Framework.DigitalCollectibles.Domain.Entities;
using Yi.Framework.DigitalCollectibles.Domain.Shared.Caches; using Yi.Framework.DigitalCollectibles.Domain.Shared.Caches;
using Yi.Framework.DigitalCollectibles.Domain.Shared.Consts;
using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.DigitalCollectibles.Domain.Managers; namespace Yi.Framework.DigitalCollectibles.Domain.Managers;
@@ -111,4 +112,36 @@ public class CollectiblesManager:DomainService
return output; return output;
} }
/// <summary>
/// 全量更新藏品价值
/// </summary>
/// <returns></returns>
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<decimal>();
}
await _collectiblesRepository.UpdateRangeAsync(collectibles);
}
/// <summary>
/// 价值计算公式
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
private double CalculateValue(double x)
{
return 0.1 + 0.9 * Math.Exp(-0.00824 * (x - 1));
}
} }

View File

@@ -176,7 +176,7 @@ public class MiningPoolManager : DomainService
//如果概率是挖到了矿,再从矿物中随机选择一个稀有度,再在当前稀有度中的矿物列表,随机选择一个具体的矿物 //如果概率是挖到了矿,再从矿物中随机选择一个稀有度,再在当前稀有度中的矿物列表,随机选择一个具体的矿物
var pool = await GetMiningPoolContentAsync(); var pool = await GetMiningPoolContentAsync();
if (pool is null|| pool.TotalNumber == 0) if (pool is null || pool.TotalNumber == 0)
{ {
throw new UserFriendlyException($"失败,矿池已经被掏空了,请等矿池刷新后再来"); throw new UserFriendlyException($"失败,矿池已经被掏空了,请等矿池刷新后再来");
} }