diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/UserService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/UserService.cs index 666341b8..b1c053e2 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/UserService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/UserService.cs @@ -141,7 +141,7 @@ public class UserService : BaseService, IUserService 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 { @@ -166,76 +166,52 @@ public class UserService : BaseService, IUserService /// /// 计算用户权益等级信息 /// - /// 用户欧气值 + /// 用户欧气值 + /// 用户欧气等级 /// 权益等级DTO - private async Task CalculateQuanYiLevelAsync(decimal score) + private Task CalculateQuanYiLevelAsync(int ouQi, int ouQiLevel) { - var userScore = (int)score; - - // 获取所有权益等级(使用VipLevels表),按所需积分升序排列 - var levels = await _dbContext.VipLevels - .Where(e => e.DeletedAt == null && e.Level > 0) - .OrderBy(e => e.Number) - .ToListAsync(); - - if (!levels.Any()) + // 等级阈值配置 + var levelThresholds = new Dictionary { - return new QuanYiLevelDto { Level = 0, Cha = -1, Jindu = 0 }; - } + { 0, 0 }, + { 1, 100 }, + { 2, 500 }, + { 3, 1000 }, + { 4, 3000 }, + { 5, 6000 }, + { 6, 10000 }, + { 7, 20000 } + }; - // 找到当前等级和下一等级 - 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; - } - } + var nextLevel = ouQiLevel + 1; + var currentLevelOuQi = levelThresholds.GetValueOrDefault(ouQiLevel, 0); + var nextOuQi = levelThresholds.GetValueOrDefault(nextLevel, 99999); // 计算差值和进度 - int cha = isMaxLevel ? -1 : nextLevelPoints - userScore; - int jindu = 0; - - if (isMaxLevel) + int cha; + int jindu; + if (nextLevel > 7) { + // 已满级 + cha = -1; jindu = 100; } - else if (nextLevelPoints > currentLevelPoints) + else { - var progress = (userScore - currentLevelPoints) * 100 / (nextLevelPoints - currentLevelPoints); - jindu = Math.Max(0, Math.Min(100, progress)); + cha = Math.Max(0, nextOuQi - ouQi); + // 计算当前等级内的进度 + 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, Jindu = jindu - }; + }); } ///