lip před 1 týdnem
rodič
revize
f440412654
2 změnil soubory, kde provedl 151 přidání a 10 odebrání
  1. 24 0
      app/Models/UserLogin.php
  2. 127 10
      app/Services/BalanceLogService.php

+ 24 - 0
app/Models/UserLogin.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Models;
+
+class UserLogin extends BaseModel
+{
+    protected $table = 'user_login';
+    protected $fillable = ['user_id', 'login_ip'];
+
+    // 获取用户未登录天数(最后第二次未登录的天数)
+    public static function getNotLoginDays($memberId)
+    {
+        $list = self::where('user_id', $memberId)->orderByDesc('id')->limit(2)->get()->toArray();
+        if (count($list) < 2) {
+            return 0;
+        }
+        if (date('Y-m-d', strtotime($list[0]['created_at'])) != date('Y-m-d')) {
+            return 0;
+        }
+        $diff = strtotime($list[1]['created_at']) - strtotime($list[0]['created_at']);
+        $days = ceil($diff / 86400);
+        return $days;
+    }
+}

+ 127 - 10
app/Services/BalanceLogService.php

@@ -7,6 +7,9 @@ use App\Models\BalanceLog;
 use App\Models\User;
 use App\Models\Config;
 use App\Models\WalletBonus;
+use App\Models\Wallet;
+use App\Models\Level;
+use App\Models\UserLogin;
 
 // 余额额变动记录
 class BalanceLogService extends BaseService
@@ -141,13 +144,23 @@ class BalanceLogService extends BaseService
 
         //充值返现活动
         if ($change_type == '充值' || $change_type == '三方充值') {
+            $user = User::where('member_id', $memberId)->first();
+            //充值更新用户等级
+            $total_recharge = self::getTotalRecharge($memberId);
+            $total_recharge = bcadd($total_recharge, $amount, 2);
+            $level = self::calculateLevel($total_recharge);
+            if ($level > $user->level) {
+                $user->level = $level;
+                $user->save();
+            }
+
             //返现比例(给邀请人返现)
             $rate = Config::where('field', 'recharge_rate')->first()->val ?? 0;
             $add_amount = bcmul($amount, $rate, 10);
             $add_amount = bcmul($add_amount, 100, 2);
             if ($add_amount > 0) {
                 //被邀请人每次充值,都给邀请人返现,直接可用余额
-                $agent_user_code = User::where('member_id', $memberId)->first()->agent_user_code;
+                $agent_user_code = $user->agent_user_code;
                 if (!empty($agent_user_code)) {
                     $agent_member_id = User::where('agent_user_code', $agent_user_code)->first()->member_id;
                     if (!empty($agent_member_id)) {
@@ -156,6 +169,39 @@ class BalanceLogService extends BaseService
                     }
                 }
             }
+
+            //即充即送-返彩活动
+            $bonusAmount = self::calculateRechargeBonus($amount,$memberId, $related_id);
+            if ($bonusAmount > 0) {
+                $walletInfo = Wallet::where('member_id', $memberId)->first();
+                
+                return static::$MODEL::create([
+                    'type' => 2,
+                    'member_id' => $memberId,
+                    'amount' => $bonusAmount,
+                    'before_balance' => $walletInfo->frozen_balance,
+                    'after_balance' => bcadd($walletInfo->frozen_balance, $bonusAmount, 2),
+                    'change_type' => '即充即送',
+                    'related_id' => $related_id,
+                    'remark' => '充值金额为:'.$amount,
+                ]);
+            }
+
+            //老用户回归-返彩活动
+            $bonusAmount = self::calculateUserReturnRechargeBonus($amount,$memberId, $level, $related_id);
+            if ($bonusAmount > 0) {
+                $walletInfo = Wallet::where('member_id', $memberId)->first();
+                return static::$MODEL::create([
+                    'type' => 2,
+                    'member_id' => $memberId,
+                    'amount' => $bonusAmount,
+                    'before_balance' => $walletInfo->frozen_balance,
+                    'after_balance' => bcadd($walletInfo->frozen_balance, $bonusAmount, 2),
+                    'change_type' => '老用户回归',
+                    'related_id' => $related_id,
+                    'remark' => '充值金额为:'.$amount,
+                ]);
+            }
         }
 
         $data = [];
@@ -170,6 +216,30 @@ class BalanceLogService extends BaseService
         return static::$MODEL::create($data);
     }
 
+    /**
+     * 获取用户累计充值金额
+     */
+    public static function getTotalRecharge($memberId): float
+    {
+        return static::$MODEL::where('member_id', $memberId)->where('type',1)->whereIn('change_type', ['人工充值', '三方充值'])->sum('amount');
+    }
+
+    /**
+     * 根据历史累计充值金额计算等级
+     * @param float $totalAmount 历史累计充值金额
+     * @return int 等级(1-5)
+     */
+    public function calculateLevel(float $totalAmount): int
+    {
+        $levelList = Level::orderBy('recharge', 'desc')->select()->toArray();
+        foreach ($levelList as $item) {
+            if ($totalAmount >= $item['recharge']) {
+                return $item['level'];
+            }
+        }
+        return 0; 
+    }
+
     /**
      * @description: 获取今日流水
      * @param int $memberId
@@ -286,17 +356,17 @@ class BalanceLogService extends BaseService
             return false;
         }
         $params = $activity->params ? json_decode($activity->params, true) : [];
-        if (!$params || !empty($params['rate'])) {
+        if (!$params || !empty($params['reward_ratio'])) {
             return false;
         }
 
-        // 规则1:单笔金额必须≥3000元
-        if (isset($params['min_amount']) && $amount < $params['min_amount']) {
+        // 规则1:单笔最低金额
+        if (isset($params['min_recharge_amount']) && $amount < $params['min_recharge_amount']) {
             return false;
         }
 
-        // 规则2:必须是每日前5笔充值
-        if (!empty($params['limit'])) {
+        // 规则2:必须是每日前笔充值
+        if (!empty($params['reward_limit_count'])) {
             //今日已充值数
             $dailyOrder = static::model()::where('member_id', $memberId)
                 ->whereBetween('created_at', [date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')])
@@ -307,13 +377,14 @@ class BalanceLogService extends BaseService
             }
         }
 
-        // 规则3:按0.5%计算返现,不超过单笔最高10000元
-        $rate = bcdiv($params['rate'], 100, 6); // 0.5%
-        $maxBonus = $params['max_bonus'] ?? 10000;
+        // 规则3:返彩比例,不超过单笔最高10000元
+        $rate = bcdiv($params['reward_ratio'], 100, 6); // 0.5%
+        $maxBonus = $params['max_reward_amount'] ?? 10000;  // 单笔最高上限
         $calculatedBonus = bcmul($amount, $rate, 2); // 保留两位小数
         $bonusAmount = min($calculatedBonus, $maxBonus);
 
-        $need_flow = !empty($params['need_flow']) ? bcmul($bonusAmount, $params['need_flow'], 2) : $bonusAmount;
+        //倍率流水
+        $need_flow = !empty($params['reward_turnover_ratio']) ? bcmul($bonusAmount, $params['reward_turnover_ratio'], 2) : $bonusAmount;
         
         //返彩流水
         WalletBonus::addData($memberId, 1, $bonusAmount, $activity->id, $related_id, $need_flow);
@@ -321,4 +392,50 @@ class BalanceLogService extends BaseService
         return $bonusAmount;
     }
 
+    /**
+     * 计算老用户回归当日的充值返现金额
+     * @param float $amount 充值金额(人民币)
+     */
+    public static function calculateUserReturnRechargeBonus($amount,$memberId, $level, $related_id = null)
+    {
+        $activity = ActivityReward::where('lang','zh')->where('type',4)->where('status',1)->where('start_time', '<', time())->where('end_time', '>', time())->first();
+        if (!$activity) {
+            return false;
+        }
+        $params = $activity->params ? json_decode($activity->params, true) : [];
+        if (!$params || !empty($params['no_login_days']) || !empty($params['reward_rules'])) {
+            return false;
+        }
+
+        // 规则1:单笔最低金额
+        if (isset($params['min_amount']) && $amount < $params['min_amount']) {
+            return false;
+        }
+
+        // 规则2:多少天未登录
+        $noLoginDays = UserLogin::getNotLoginDays($memberId);
+        if ($noLoginDays < $params['no_login_days']) {
+            return false;
+        }
+        
+        foreach($params['reward_rules'] as $rule) {
+            if (isset($rule['start_level']) && isset($rule['end_level'])) {
+                if ($level >= $rule['start_level'] && $level <= $rule['end_level']) {
+                    $bonusAmount = $rule['bonus'];
+                    //倍率流水
+                    $need_flow = !empty($rule['turnover_rate']) ? bcmul($bonusAmount, $rule['turnover_rate'], 2) : $bonusAmount;
+                    break;
+                }
+            }
+        }
+        if (!isset($bonusAmount)) {
+            return false;
+        }
+        
+        //返彩流水
+        WalletBonus::addData($memberId, 3, $bonusAmount, $activity->id, $related_id, $need_flow);
+
+        return $bonusAmount;
+    }
+
 }