using HoneyBox.Core.Interfaces; using HoneyBox.Model.Data; using HoneyBox.Model.Entities; using HoneyBox.Model.Models.Vip; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; namespace HoneyBox.Core.Services; /// /// VIP服务实现 /// public class VipService : IVipService { private readonly HoneyBoxDbContext _dbContext; private readonly ILogger _logger; public VipService(HoneyBoxDbContext dbContext, ILogger logger) { _dbContext = dbContext; _logger = logger; } /// public async Task GetVipInfoAsync(int userId) { // 获取用户信息 var user = await _dbContext.Users .Where(u => u.Id == userId) .Select(u => new { u.Id, u.Nickname, u.HeadImg, u.Vip }) .FirstOrDefaultAsync(); if (user == null) { throw new InvalidOperationException("用户不存在"); } // 计算并更新VIP等级 var currentVip = await CalculateVipLevelAsync(userId, user.Vip); // 获取所有VIP等级列表 var vipLevels = await _dbContext.VipLevels .Where(v => v.DeletedAt == null) .OrderBy(v => v.Level) .ToListAsync(); // 获取最大VIP等级 var maxVipLevel = vipLevels.Any() ? vipLevels.Max(v => v.Level) : 0; // 构建用户VIP信息 var userInfo = new VipUserInfoDto { Nickname = user.Nickname, Headimg = user.HeadImg, Vip = currentVip, UpgradeMoney = "0", LastVip = 0, JinDu = 0, Notice = string.Empty }; // 如果未达到最高等级,计算升级进度 if (currentVip < maxVipLevel) { // 计算累计消费 var totalOrder = await GetTotalOrderConsumptionAsync(userId); // 获取下一个VIP等级的条件 var nextLevel = vipLevels .Where(v => v.Level > currentVip) .OrderBy(v => v.Level) .FirstOrDefault(); if (nextLevel != null) { var upgradeMoney = nextLevel.Number - totalOrder; userInfo.UpgradeMoney = upgradeMoney > 0 ? upgradeMoney.ToString("F2") : "0"; userInfo.LastVip = nextLevel.Level; // 计算进度百分比 if (totalOrder >= nextLevel.Number) { userInfo.JinDu = 100; } else if (nextLevel.Number > 0) { userInfo.JinDu = Math.Round((decimal)totalOrder / nextLevel.Number * 100, 2); } } } else { userInfo.UpgradeMoney = "0"; userInfo.LastVip = 0; userInfo.JinDu = 100; } // 获取当前等级的提示信息 var currentLevelInfo = vipLevels.FirstOrDefault(v => v.Level == currentVip); if (currentLevelInfo != null) { userInfo.Notice = currentLevelInfo.Title; // 使用标题作为提示信息 } // 构建VIP等级列表DTO var vipLevelDtos = vipLevels.Select(v => new VipLevelDto { Id = v.Id, Level = v.Level, Title = v.Title, Imgurl = string.Empty, // SQL Server表中没有imgurl字段 Condition = v.Number, Discount = 0, // SQL Server表中没有discount字段 Notice = v.Title }).ToList(); return new VipInfoResponse { Userinfo = userInfo, Data = vipLevelDtos }; } /// public async Task CalculateVipLevelAsync(int userId, int currentVip) { // 计算累计消费 var totalOrder = await GetTotalOrderConsumptionAsync(userId); // 查找符合升级条件的最高等级 // 条件:等级 > 当前等级 且 升级条件 <= 累计消费 var newVipLevel = await _dbContext.VipLevels .Where(v => v.DeletedAt == null) .Where(v => v.Level > currentVip) .Where(v => v.Number <= totalOrder) .OrderByDescending(v => v.Level) .FirstOrDefaultAsync(); if (newVipLevel != null) { // 更新用户VIP等级 var user = await _dbContext.Users.FindAsync(userId); if (user != null) { user.Vip = (byte)newVipLevel.Level; await _dbContext.SaveChangesAsync(); _logger.LogInformation("用户 {UserId} VIP等级从 {OldVip} 升级到 {NewVip}", userId, currentVip, newVipLevel.Level); } return newVipLevel.Level; } return currentVip; } /// public async Task> GetVipLevelsAsync() { var vipLevels = await _dbContext.VipLevels .Where(v => v.DeletedAt == null) .OrderBy(v => v.Level) .ToListAsync(); return vipLevels.Select(v => new VipLevelDto { Id = v.Id, Level = v.Level, Title = v.Title, Imgurl = string.Empty, Condition = v.Number, Discount = 0, Notice = v.Title }).ToList(); } /// /// 获取用户累计订单消费金额 /// /// 用户ID /// 累计消费金额 private async Task GetTotalOrderConsumptionAsync(int userId) { // 计算累计消费:status=1(已支付)且 order_type<5 var totalOrder = await _dbContext.Orders .Where(o => o.UserId == userId) .Where(o => o.Status == 1) .Where(o => o.OrderType < 5) .SumAsync(o => o.OrderTotal); return totalOrder; } }