|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
}
|