VipService.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace App\Services;
  3. use Illuminate\Support\Facades\DB;
  4. use Illuminate\Support\Facades\Redis;
  5. use Illuminate\Support\Facades\Log;
  6. class VipService
  7. {
  8. /**
  9. * 计算用户VIP等级
  10. *
  11. * @param int $userId 用户ID
  12. * @return int VIP等级
  13. */
  14. public static function calculateVipLevel($userId)
  15. {
  16. if (!$userId) {
  17. return 0;
  18. }
  19. try {
  20. // 获取用户累计充值金额(从 YN_VIPAccount 表)
  21. $userRecharge = DB::table('QPAccountsDB.dbo.YN_VIPAccount')
  22. ->where('UserID', $userId)
  23. ->value('Recharge') ?? 0;
  24. // 如果没有充值记录,返回VIP 0
  25. if ($userRecharge <= 0) {
  26. return 0;
  27. }
  28. // 获取VIP等级配置(从 ProtectLevel 表)
  29. $vipLevels = self::getVipLevelConfig();
  30. // 根据充值金额查找对应的VIP等级
  31. // 规则:找到 MinRecharge <= userRecharge < Recharge 的等级
  32. $vipLevel = 0;
  33. foreach ($vipLevels as $level) {
  34. if ($userRecharge >= $level->MinRecharge && $userRecharge < $level->Recharge) {
  35. $vipLevel = $level->VIP;
  36. break; // 因为已按MinRecharge升序排列,可以提前退出
  37. }
  38. }
  39. return intval($vipLevel);
  40. } catch (\Exception $e) {
  41. Log::error('VIP等级计算失败', [
  42. 'user_id' => $userId,
  43. 'error' => $e->getMessage()
  44. ]);
  45. return 0;
  46. }
  47. }
  48. /**
  49. * 获取VIP等级配置(带缓存)
  50. *
  51. * @return \Illuminate\Support\Collection
  52. */
  53. public static function getVipLevelConfig()
  54. {
  55. $cacheKey = 'vip_level_config';
  56. // 尝试从Redis获取
  57. if (Redis::exists($cacheKey)) {
  58. $data = Redis::get($cacheKey);
  59. return collect(json_decode($data));
  60. }
  61. // 从数据库查询(按MinRecharge升序排列)
  62. $levels = DB::table('QPAccountsDB.dbo.ProtectLevel')
  63. ->orderBy('MinRecharge', 'asc')
  64. ->select('ID', 'VIP', 'MinRecharge', 'Recharge', 'WithdrawLimit', 'DailyWithdraws', 'GrantNum', 'LevelUpBonus')
  65. ->get();
  66. // 缓存10分钟
  67. Redis::setex($cacheKey, 600, json_encode($levels));
  68. return $levels;
  69. }
  70. }