This commit is contained in:
gpu 2026-02-04 21:43:58 +08:00
parent 3f24b57e8c
commit 8b5a404042

View File

@ -141,7 +141,7 @@ public class UserService : BaseService<User, int>, IUserService
var mobileIs = string.IsNullOrWhiteSpace(user.Mobile) ? 0 : 1; var mobileIs = string.IsNullOrWhiteSpace(user.Mobile) ? 0 : 1;
// 计算权益等级信息 // 计算权益等级信息
var quanYiLevel = await CalculateQuanYiLevelAsync(user.Score); var quanYiLevel = await CalculateQuanYiLevelAsync(user.OuQi ?? 0, user.OuQiLevel ?? 0);
return new UserInfoDto return new UserInfoDto
{ {
@ -166,76 +166,52 @@ public class UserService : BaseService<User, int>, IUserService
/// <summary> /// <summary>
/// 计算用户权益等级信息 /// 计算用户权益等级信息
/// </summary> /// </summary>
/// <param name="score">用户欧气值</param> /// <param name="ouQi">用户欧气值</param>
/// <param name="ouQiLevel">用户欧气等级</param>
/// <returns>权益等级DTO</returns> /// <returns>权益等级DTO</returns>
private async Task<QuanYiLevelDto> CalculateQuanYiLevelAsync(decimal score) private Task<QuanYiLevelDto> CalculateQuanYiLevelAsync(int ouQi, int ouQiLevel)
{ {
var userScore = (int)score; // 等级阈值配置
var levelThresholds = new Dictionary<int, int>
{
{ 0, 0 },
{ 1, 100 },
{ 2, 500 },
{ 3, 1000 },
{ 4, 3000 },
{ 5, 6000 },
{ 6, 10000 },
{ 7, 20000 }
};
// 获取所有权益等级使用VipLevels表按所需积分升序排列 var nextLevel = ouQiLevel + 1;
var levels = await _dbContext.VipLevels var currentLevelOuQi = levelThresholds.GetValueOrDefault(ouQiLevel, 0);
.Where(e => e.DeletedAt == null && e.Level > 0) var nextOuQi = levelThresholds.GetValueOrDefault(nextLevel, 99999);
.OrderBy(e => e.Number)
.ToListAsync();
if (!levels.Any())
{
return new QuanYiLevelDto { Level = 0, Cha = -1, Jindu = 0 };
}
// 找到当前等级和下一等级
int currentLevel = 0;
int currentLevelPoints = 0;
int nextLevelPoints = 0;
bool isMaxLevel = false;
for (int i = 0; i < levels.Count; i++)
{
if (userScore >= levels[i].Number)
{
currentLevel = levels[i].Level;
currentLevelPoints = levels[i].Number;
if (i + 1 < levels.Count)
{
nextLevelPoints = levels[i + 1].Number;
}
else
{
isMaxLevel = true;
}
}
else
{
if (currentLevel == 0)
{
// 用户还没达到第一级
nextLevelPoints = levels[i].Number;
}
break;
}
}
// 计算差值和进度 // 计算差值和进度
int cha = isMaxLevel ? -1 : nextLevelPoints - userScore; int cha;
int jindu = 0; int jindu;
if (nextLevel > 7)
if (isMaxLevel)
{ {
// 已满级
cha = -1;
jindu = 100; jindu = 100;
} }
else if (nextLevelPoints > currentLevelPoints) else
{ {
var progress = (userScore - currentLevelPoints) * 100 / (nextLevelPoints - currentLevelPoints); cha = Math.Max(0, nextOuQi - ouQi);
jindu = Math.Max(0, Math.Min(100, progress)); // 计算当前等级内的进度
var levelRange = nextOuQi - currentLevelOuQi;
var progress = ouQi - currentLevelOuQi;
jindu = levelRange > 0 ? Math.Min(100, Math.Max(0, progress * 100 / levelRange)) : 0;
} }
return new QuanYiLevelDto return Task.FromResult(new QuanYiLevelDto
{ {
Level = currentLevel, Level = ouQiLevel,
Cha = cha, Cha = cha,
Jindu = jindu Jindu = jindu
}; });
} }
/// <inheritdoc/> /// <inheritdoc/>