Ver código fonte

Merge branch 'master' of ssh://git.usgamewin.com:22022/laoma/admin_api

Tree 2 semanas atrás
pai
commit
db06e075a4

+ 42 - 22
app/Http/logic/admin/GlobalLogicController.php

@@ -722,29 +722,49 @@ class GlobalLogicController extends BaseLogicController
             ->where(['user_id' => $UserID, 'pay_status' => 9])
             ->sum('amount');
         $data['refund_total'] = 0;
-        if ($data['refund_flag']) {
-            $samePhoneUids = [];
-            if ($userInfo->phone) {
-                $samePhoneUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountPhone')
-                    ->where('PhoneNum', $userInfo->phone)->pluck('UserID')->toArray();
-            }
-            $awi = DB::table('QPAccountsDB.dbo.AccountWithDrawInfo')
-                ->where(['UserID' => $UserID])
-                ->first();
-            $sameEmailUids = [];
-            if ($awi && $awi->EmailAddress) {
-                $sameEmailUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountWithDrawInfo')
-                    ->where('EmailAddress', $awi->EmailAddress)->pluck('UserID')->toArray();
-            }
+        $samePhoneUids = [];
+        if ($userInfo->phone) {
+            $samePhoneUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountPhone')
+                ->where('PhoneNum', $userInfo->phone)->pluck('UserID')->toArray();
+        }
+        $awi = DB::table('QPAccountsDB.dbo.AccountWithDrawInfo')
+            ->where(['UserID' => $UserID])
+            ->first();
+        $sameEmailUids = [];
+        if ($awi && $awi->EmailAddress) {
+            $sameEmailUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountWithDrawInfo')
+                ->where('EmailAddress', $awi->EmailAddress)->pluck('UserID')->toArray();
+        }
 
-            $uids = array_unique(array_merge($samePhoneUids, $sameEmailUids));
-            $uids[] = $UserID;
-            if (count($uids) > 0) {
-                $data['refund_total'] = DB::table('agent.dbo.order')->lock('WITH(NOLOCK)')
-                    ->whereIn('user_id', $uids)
-                    ->where('pay_status', 9)
-                    ->sum('amount');
-            }
+        $uids = array_unique(array_merge($samePhoneUids, $sameEmailUids));
+        $uids[] = $UserID;
+        if (count($uids) > 0) {
+            $data['refund_total'] = DB::table('agent.dbo.order')->lock('WITH(NOLOCK)')
+                ->whereIn('user_id', $uids)
+                ->where('pay_status', 9)
+                ->sum('amount');
+        }
+        $samePhoneUids = [];
+        if ($userInfo->phone) {
+            $samePhoneUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountPhone')
+                ->where('PhoneNum', $userInfo->phone)->pluck('UserID')->toArray();
+        }
+        $awi = DB::table('QPAccountsDB.dbo.AccountWithDrawInfo')
+            ->where(['UserID' => $UserID])
+            ->first();
+        $sameEmailUids = [];
+        if ($awi && $awi->EmailAddress) {
+            $sameEmailUids = DB::connection('read')->table('QPAccountsDB.dbo.AccountWithDrawInfo')
+                ->where('EmailAddress', $awi->EmailAddress)->pluck('UserID')->toArray();
+        }
+
+        $uids = array_unique(array_merge($samePhoneUids, $sameEmailUids));
+        $uids[] = $UserID;
+        if (count($uids) > 0) {
+            $data['refund_total'] = DB::table('agent.dbo.order')->lock('WITH(NOLOCK)')
+                ->whereIn('user_id', $uids)
+                ->where('pay_status', 9)
+                ->sum('amount');
         }
 
         return compact('data', 'userInfo', 'registerInviteSwitches', 'gameCount', 'userSource', 'OpenPage','platformData');

+ 1 - 0
app/Http/logic/api/AiNewPayCashierLogic.php

@@ -208,6 +208,7 @@ class AiNewPayCashierLogic implements CashierInterFace
 
                     $redis = Redis::connection();
                     $redis->incr('draw_' . date('Ymd') . $UserID);
+                    PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
                     break;
 
                 case 2: // 提现失败

+ 1 - 0
app/Http/logic/api/AiPayCashierLogic.php

@@ -295,6 +295,7 @@ class AiPayCashierLogic implements CashierInterFace
         (new RechargeWithDraw())->withDraw($UserID, $TakeMoney);
         $redis = Redis::connection();
         $redis->incr('draw_' . date('Ymd') . $UserID);
+        PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
 
         StoredProcedure::user_label($UserID, 2, $TakeMoney);
     }

+ 1 - 0
app/Http/logic/api/CoinPayCashierLogic.php

@@ -185,6 +185,7 @@ class CoinPayCashierLogic implements CashierInterFace
         (new RechargeWithDraw())->withDraw($UserID, $TakeMoney);
         $redis = Redis::connection();
         $redis->incr('draw_' . date('Ymd') . $UserID);
+        PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
 
         StoredProcedure::user_label($UserID, 2, $TakeMoney);
     }

+ 1 - 0
app/Http/logic/api/PagYeepPayCashierLogic.php

@@ -266,6 +266,7 @@ class PagYeepPayCashierLogic implements CashierInterFace
 
                     $redis = Redis::connection();
                     $redis->incr('draw_' . date('Ymd') . $UserID);
+                    PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
                     break;
 
                 case 2: // 提现失败

+ 1 - 0
app/Http/logic/api/WDPayCashierLogic.php

@@ -244,6 +244,7 @@ class WDPayCashierLogic implements CashierInterFace
 
                     $redis = Redis::connection();
                     $redis->incr('draw_' . date('Ymd') . $UserID);
+                    PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
                     break;
 
                 case 2: // 提现失败

+ 1 - 0
app/Http/logic/api/WiwiPayCashierLogic.php

@@ -227,6 +227,7 @@ class WiwiPayCashierLogic implements CashierInterFace
 
                     $redis = Redis::connection();
                     $redis->incr('draw_' . date('Ymd') . $UserID);
+                    PrivateMail::successMail($UserID, $OrderId, $TakeMoney);
                     break;
 
                 case 2: // 提现失败

+ 113 - 83
app/Services/SuperballActivityService.php

@@ -5,6 +5,7 @@ namespace App\Services;
 use App\Facade\TableName;
 use App\Game\Services\OuroGameService;
 use App\Http\helper\NumConfig;
+use App\Models\PrivateMail;
 use Carbon\Carbon;
 use Illuminate\Database\QueryException;
 use Illuminate\Support\Facades\DB;
@@ -44,15 +45,18 @@ class SuperballActivityService
 
         $rechargeToday = $this->getUserRechargeForDate($userId, $today);
         $turnoverToday = $this->getUserTotalBetForDate($userId, $today);
-        $turnoverProgress = (int) $turnoverToday;
+        $turnoverProgress = (int)$turnoverToday;
 
         $tierConfig = $userTask ? $this->getTierConfigByTier($userTask->tier) : null;
-        $rechargeRequired = $tierConfig ? (int) $tierConfig->recharge_required : 0;
-        $turnoverRequired = $tierConfig ? (int) $tierConfig->turnover_required : 0;
+        $rechargeRequired = $tierConfig ? (int)$tierConfig->recharge_required : 0;
+        $turnoverRequired = $tierConfig ? (int)$tierConfig->turnover_required : 0;
         $rechargeDisplay = $rechargeToday;
         $turnoverDisplay = $turnoverProgress / NumConfig::NUM_VALUE;
         $taskCompleted = $tierConfig && $rechargeDisplay >= $rechargeRequired && $turnoverDisplay >= $turnoverRequired;
-        $canClaim = $taskCompleted && $userTask && (int) $userTask->status === 0;
+        if ($userTask && $userTask->status == 1) {
+            $taskCompleted = $userTask->complete;
+        }
+        $canClaim = $taskCompleted && $userTask && (int)$userTask->status == 0;
         $canUpgrade = $userTask && $userTask->tier !== self::TIER_MAX && $taskCompleted;
         // 能升级自动升
         if ($canUpgrade && $userTask->status != 1) {
@@ -75,49 +79,63 @@ class SuperballActivityService
             if ($res['success']) {
                 $tierConfig = $this->getTierConfigByTier($res['new_tier']);
                 $userTask = $this->getUserTask($userId, $today);
-                $rechargeRequired = $tierConfig ? (int) $tierConfig->recharge_required : 0;
-                $turnoverRequired = $tierConfig ? (int) $tierConfig->turnover_required : 0;
+                $rechargeRequired = $tierConfig ? (int)$tierConfig->recharge_required : 0;
+                $turnoverRequired = $tierConfig ? (int)$tierConfig->turnover_required : 0;
                 $taskCompleted = $tierConfig && $rechargeDisplay >= $rechargeRequired && $turnoverDisplay >= $turnoverRequired;
-                $canClaim = $taskCompleted && $userTask && (int) $userTask->status === 0;
+                $canClaim = $taskCompleted && $userTask && (int)$userTask->status === 0;
             }
         }
-
+        $rechargeDisplay = min($rechargeDisplay, $tierConfig->recharge_required ?? 0);
+        $turnoverDisplay = min($turnoverDisplay, $tierConfig->turnover_required ?? 0);
 
         $yesterdayBalls = $this->getUserBalls($userId, $yesterday);
-        $yesterdayLucky = (int) ($yesterdayDaily->lucky_number ?? 0);
+        $yesterdayLucky = (int)($yesterdayDaily->lucky_number ?? 0);
         $yesterdayPrizeLog = $this->getUserPrizeLog($userId, $yesterday);
         $yesterdayBasePerBall = 0;
         if ($yesterdayDaily->total_balls > 0 && $yesterdayDaily->pool_amount > 0) {
-            $yesterdayBasePerBall = (int) ($yesterdayDaily->pool_amount / $yesterdayDaily->total_balls);
+            $yesterdayBasePerBall = (int)($yesterdayDaily->pool_amount / $yesterdayDaily->total_balls);
         }
-        $yesterdayMyPrize = $yesterdayPrizeLog ? (int) $yesterdayPrizeLog->total_amount : 0;
-        $yesterdayMultiplier = $yesterdayPrizeLog ? (float) $yesterdayPrizeLog->multiplier : 1.0;
+        $yesterdayMyPrize = $yesterdayPrizeLog ? (int)$yesterdayPrizeLog->total_amount : 0;
+        $yesterdayMultiplier = $yesterdayPrizeLog ? (float)$yesterdayPrizeLog->multiplier : 1.0;
         $canClaimYesterday = false;
         $yesterdayPendingPrize = 0;
         if (!$yesterdayPrizeLog && count($yesterdayBalls) > 0) {
             $canClaimYesterday = true;
             $yesterdayPendingPrize = $this->calculateYesterdayPrizeForUser($userId, $yesterday);
         }
+        if (count($yesterdayBalls) > 0) {
+            $daily = DB::table(TableName::agent() . 'superball_daily')->where('pool_date', $yesterday)->first();
+            $hitCount = $baseAmount = 0;
+            if ($daily) {
+                $basePerBall = (int)($daily->pool_amount / $daily->total_balls);
+                $hitCount = count(array_filter($yesterdayBalls, function ($item) use ($yesterdayLucky) {
+                    return $item->number == $yesterdayLucky;
+                }));
+                $baseAmount = $basePerBall * count($yesterdayBalls);
+            }
+
+            self::sendOpenRewardMailOnce($userId, count($yesterdayBalls), $yesterdayLucky, $yesterdayMultiplier, $hitCount, $baseAmount);
+        }
         // 用户昨日未领取球
         $yesterdayNotClaimedBallCount = $this->getNotClaimBallByUserIdDate($userId, $yesterday);
 
         $todayBasePerBall = 0;
         if ($todayDaily->total_balls > 0 && $todayDaily->pool_amount > 0) {
-            $todayBasePerBall = (int) ($todayDaily->pool_amount / $todayDaily->total_balls);
+            $todayBasePerBall = (int)($todayDaily->pool_amount / $todayDaily->total_balls);
         }
 
         $todayBalls = $this->getUserBalls($userId, $today);
         $todayMyBallsList = array_map(function ($b) {
-            return ['ball_index' => (int) $b->ball_index, 'number' => (int) $b->number];
+            return ['ball_index' => (int)$b->ball_index, 'number' => (int)$b->number];
         }, $todayBalls);
         $todayNumberCounts = [];
         foreach ($todayBalls as $b) {
-            $n = (int) $b->number;
+            $n = (int)$b->number;
             $todayNumberCounts[$n] = ($todayNumberCounts[$n] ?? 0) + 1;
         }
 
         // 0 点到 1 点前,前端展示的今日整体数据全部置为 0(不影响实际统计与任务进度)
-        $hour = (int) Carbon::now()->format('G'); // 0-23
+        $hour = (int)Carbon::now()->format('G'); // 0-23
         if ($hour < 1) {
             $todayDisplayPoolAmount = 0;
             $todayDisplayCompleted = 0;
@@ -126,9 +144,9 @@ class SuperballActivityService
             $todayDisplayMyBalls = $todayMyBallsList;
             $todayDisplayNumberCounts = $todayNumberCounts;
         } else {
-            $todayDisplayPoolAmount = (int) $todayDaily->pool_amount;
-            $todayDisplayCompleted = (int) ($todayDaily->completed_count ?? 0);
-            $todayDisplayTotalBalls = (int) ($todayDaily->total_balls ?? 0);
+            $todayDisplayPoolAmount = (int)$todayDaily->pool_amount;
+            $todayDisplayCompleted = (int)($todayDaily->completed_count ?? 0);
+            $todayDisplayTotalBalls = (int)($todayDaily->total_balls ?? 0);
             $todayDisplayBasePerBall = $todayBasePerBall;
             $todayDisplayMyBalls = $todayMyBallsList;
             $todayDisplayNumberCounts = $todayNumberCounts;
@@ -138,16 +156,16 @@ class SuperballActivityService
 
         $data = [
             'yesterday' => [
-                'pool_amount' => (int) $yesterdayDaily->pool_amount,
-                'pool_amount_display' => (int) $yesterdayDaily->pool_amount / NumConfig::NUM_VALUE,
+                'pool_amount' => (int)$yesterdayDaily->pool_amount,
+                'pool_amount_display' => (int)$yesterdayDaily->pool_amount / NumConfig::NUM_VALUE,
                 'base_reward_per_ball' => $yesterdayBasePerBall,
                 'base_reward_per_ball_display' => $yesterdayBasePerBall / NumConfig::NUM_VALUE,
                 'lucky_number' => $yesterdayLucky,
-                'completed_count' => (int) ($yesterdayDaily->completed_count ?? 0),
-                'total_balls' => (int) ($yesterdayDaily->total_balls ?? 0),
+                'completed_count' => (int)($yesterdayDaily->completed_count ?? 0),
+                'total_balls' => (int)($yesterdayDaily->total_balls ?? 0),
                 'my_balls' => $yesterdayBalls,
                 'my_balls_with_lucky' => array_map(function ($b) use ($yesterdayLucky) {
-                    return ['number' => (int) $b->number, 'is_lucky' => (int) $b->number === $yesterdayLucky];
+                    return ['number' => (int)$b->number, 'is_lucky' => (int)$b->number === $yesterdayLucky];
                 }, $yesterdayBalls),
                 'my_prize' => $yesterdayMyPrize,
                 'my_prize_display' => $yesterdayMyPrize / NumConfig::NUM_VALUE,
@@ -175,14 +193,14 @@ class SuperballActivityService
                 'recharge_progress' => $rechargeDisplay,
                 'turnover_progress' => $turnoverDisplay,
                 'task_completed' => $taskCompleted,
-                'status' => (int) $userTask->status,
+                'status' => (int)$userTask->status,
                 'can_claim' => $canClaim,
                 'can_upgrade' => $canUpgrade,
-                'ball_count' => $tierConfig ? (int) $tierConfig->ball_count : 0,
+                'ball_count' => $tierConfig ? (int)$tierConfig->ball_count : 0,
             ] : null,
             'multiplier' => [
-                'value' => (float) ($multiplierRow->multiplier ?? 1.0),
-                'consecutive_days' => (int) ($multiplierRow->consecutive_days ?? 0),
+                'value' => (float)($multiplierRow->multiplier ?? 1.0),
+                'consecutive_days' => (int)($multiplierRow->consecutive_days ?? 0),
                 'min' => self::MULTIPLIER_MIN,
                 'max' => self::MULTIPLIER_MAX,
                 'step' => self::MULTIPLIER_STEP,
@@ -209,11 +227,11 @@ class SuperballActivityService
         }
 
         // 从 YN_VIPAccount 读取累计充值金额,交由 VipService 计算 VIP 等级
-        $userRecharge = (int) DB::table('QPAccountsDB.dbo.YN_VIPAccount')
+        $userRecharge = (int)DB::table('QPAccountsDB.dbo.YN_VIPAccount')
             ->where('UserID', $userId)
             ->value('Recharge');
 
-        return (int) VipService::calculateVipLevel($userId, $userRecharge);
+        return (int)VipService::calculateVipLevel($userId, $userRecharge);
     }
 
     /**
@@ -256,7 +274,7 @@ class SuperballActivityService
         if (!$task) {
             return ['success' => false, 'message' => ['web.superball.no_task_today', 'No task for today']];
         }
-        if ((int) $task->status === 1) {
+        if ((int)$task->status === 1) {
             return ['success' => false, 'message' => ['web.superball.already_claimed', 'Already claimed']];
         }
 
@@ -270,8 +288,8 @@ class SuperballActivityService
         $rechargeToday = $this->getUserRechargeForDate($userId, $today);
         $turnoverToday = $this->getUserTotalBetForDate($userId, $today);
         $newConfig = $this->getTierConfigByTier($task->tier);
-        $rechargeOk = $rechargeToday >= (int) $newConfig->recharge_required;
-        $turnoverOk = ($turnoverToday / NumConfig::NUM_VALUE) >= (int) $newConfig->turnover_required;
+        $rechargeOk = $rechargeToday >= (int)$newConfig->recharge_required;
+        $turnoverOk = ($turnoverToday / NumConfig::NUM_VALUE) >= (int)$newConfig->turnover_required;
 
 //        var_dump($rechargeToday,$turnoverToday,$newConfig);
         if (!$rechargeOk || !$turnoverOk) {
@@ -282,7 +300,7 @@ class SuperballActivityService
             ->where('user_id', $userId)
             ->where('task_date', $today)
             ->update(['tier' => $newTier, 'updated_at' => now()->format('Y-m-d H:i:s')]);
-        return ['success' => true,'user_id' => $userId, 'new_tier' => $newTier,'task_date'=>$today];
+        return ['success' => true, 'user_id' => $userId, 'new_tier' => $newTier, 'task_date' => $today];
     }
 
     /**
@@ -312,7 +330,7 @@ class SuperballActivityService
                 'message' => 'Claim success, please select numbers for your balls',
             ];
         }
-        if ((int) $task->status === 1) {
+        if ((int)$task->status === 1) {
             return ['success' => false, 'message' => ['web.superball.already_claimed', 'Already claimed']];
         }
 
@@ -322,8 +340,8 @@ class SuperballActivityService
         }
         $rechargeToday = $this->getUserRechargeForDate($userId, $today);
         $turnoverToday = $this->getUserTotalBetForDate($userId, $today);
-        $rechargeOk = ($rechargeToday) >= (int) $tierConfig->recharge_required;
-        $turnoverOk = ($turnoverToday / NumConfig::NUM_VALUE) >= (int) $tierConfig->turnover_required;
+        $rechargeOk = ($rechargeToday) >= (int)$tierConfig->recharge_required;
+        $turnoverOk = ($turnoverToday / NumConfig::NUM_VALUE) >= (int)$tierConfig->turnover_required;
         $complete = 1;
         if (!$rechargeOk || !$turnoverOk) {
             // 本档没完成
@@ -334,7 +352,7 @@ class SuperballActivityService
         if ($complete) {
             $ballCount = $tierConfig->ball_count;
         } else if ($tierConfig->tier !== 'E') { // 没完成获取上一级奖励
-            $idx = $tierConfig->sort_index+1;
+            $idx = $tierConfig->sort_index + 1;
             $configs = $this->getTierConfig();
             foreach ($configs as $config) {
                 if ($config['sort_index'] == $idx) {
@@ -352,7 +370,7 @@ class SuperballActivityService
                 ->where('user_id', $userId)
                 ->where('task_date', $today)
                 ->update(['status' => 1, 'complete' => $complete, 'updated_at' => now()->format('Y-m-d H:i:s')]);
-
+            $this->getOrCreateDaily($today);
             DB::connection('write')->table(TableName::agent() . 'superball_daily')
                 ->where('pool_date', $today)
                 ->update([
@@ -379,6 +397,7 @@ class SuperballActivityService
             return false;
         }
         $today = Carbon::today()->format('Y-m-d');
+        $this->getOrCreateDaily($today);
         DB::connection('write')->table(TableName::agent() . 'superball_daily')
             ->where('pool_date', $today)
             ->update([
@@ -397,7 +416,7 @@ class SuperballActivityService
     public function submitNumbers(int $userId, array $numbers): array
     {
         $key = sprintf('claim_vip_reward_%s_%s', $userId, date('Ymd'));
-        $vipFreeBalls = (int) Redis::get($key);
+        $vipFreeBalls = (int)Redis::get($key);
         $vipLevel = $this->getUserVipLevel($userId);
         $level = VipService::getVipByField('VIP', $vipLevel);
         $vipFreeBalls2 = $level ? ($level->SuperballNum ?? 0) : 0;
@@ -411,7 +430,7 @@ class SuperballActivityService
             if ($task->complete == 1) {
                 $ballCount = $tierConfig->ball_count;
             } else if ($tierConfig->tier !== 'E') { // 没完成获取上一级奖励
-                $idx = $tierConfig->sort_index+1;
+                $idx = $tierConfig->sort_index + 1;
                 $configs = $this->getTierConfig();
                 foreach ($configs as $config) {
                     if ($config['sort_index'] == $idx) {
@@ -441,7 +460,7 @@ class SuperballActivityService
         DB::connection('write')->transaction(function () use ($userId, $today, $numbers) {
             // 写入用户今日所有球号
             foreach ($numbers as $index => $num) {
-                $n = (int) $num;
+                $n = (int)$num;
                 if ($n < 0 || $n > 9) {
                     throw new \RuntimeException('Number must be 0-9');
                 }
@@ -461,10 +480,10 @@ class SuperballActivityService
                 ->first();
 
             if ($daily) {
-                $luckyNumber = (int) $daily->lucky_number;
+                $luckyNumber = (int)$daily->lucky_number;
                 $matched = 0;
                 foreach ($numbers as $num) {
-                    if ((int) $num === $luckyNumber) {
+                    if ((int)$num === $luckyNumber) {
                         $matched++;
                     }
                 }
@@ -494,7 +513,7 @@ class SuperballActivityService
             ->orderBy('ball_index')
             ->get();
         return array_map(function ($r) {
-            return ['ball_index' => (int) $r->ball_index, 'number' => (int) $r->number];
+            return ['ball_index' => (int)$r->ball_index, 'number' => (int)$r->number];
         }, $rows->all());
     }
 
@@ -517,26 +536,26 @@ class SuperballActivityService
         }
 
         $daily = DB::table(TableName::agent() . 'superball_daily')->where('pool_date', $yesterday)->first();
-        if (!$daily || (int) $daily->total_balls <= 0) {
+        if (!$daily || (int)$daily->total_balls <= 0) {
             return ['success' => false, 'message' => ['web.superball.pool_not_ready', 'Yesterday pool not ready']];
         }
 
-        $basePerBall = (int) ($daily->pool_amount / $daily->total_balls);
-        $luckyNumber = (int) $daily->lucky_number;
+        $basePerBall = (int)($daily->pool_amount / $daily->total_balls);
+        $luckyNumber = (int)$daily->lucky_number;
         $multiplierRow = $this->getUserMultiplier($userId);
-        $multiplier = (float) ($multiplierRow->multiplier ?? 1.0);
+        $multiplier = (float)($multiplierRow->multiplier ?? 1.0);
 
         // 选号可重复:每个球单独比对幸运号,中奖球数 = 号码等于幸运号的球个数(同一号码可多球)
         $matched = 0;
         foreach ($balls as $b) {
-            if ((int) $b->number === $luckyNumber) {
+            if ((int)$b->number === $luckyNumber) {
                 $matched++;
             }
         }
         $baseAmount = $basePerBall * count($balls);
         $luckyAmountDisplay = self::LUCKY_REWARD_PER_BALL * $matched;
         $luckyAmountInternal = $luckyAmountDisplay * NumConfig::NUM_VALUE;
-        $totalAmount = (int) round($baseAmount * $multiplier) + $luckyAmountInternal;
+        $totalAmount = (int)round($baseAmount * $multiplier) + $luckyAmountInternal;
 
         DB::connection('write')->table(TableName::agent() . 'superball_prize_log')->insert([
             'user_id' => $userId,
@@ -564,27 +583,27 @@ class SuperballActivityService
     public function calculateYesterdayPrizeForUser(int $userId, string $yesterday): int
     {
         $daily = DB::table(TableName::agent() . 'superball_daily')->where('pool_date', $yesterday)->first();
-        if (!$daily || (int) $daily->total_balls <= 0) {
+        if (!$daily || (int)$daily->total_balls <= 0) {
             return 0;
         }
         $balls = $this->getUserBalls($userId, $yesterday);
         if (count($balls) === 0) {
             return 0;
         }
-        $basePerBall = (int) ($daily->pool_amount / $daily->total_balls);
-        $luckyNumber = (int) $daily->lucky_number;
+        $basePerBall = (int)($daily->pool_amount / $daily->total_balls);
+        $luckyNumber = (int)$daily->lucky_number;
         $multiplierRow = $this->getUserMultiplier($userId);
-        $multiplier = (float) ($multiplierRow->multiplier ?? 1.0);
+        $multiplier = (float)($multiplierRow->multiplier ?? 1.0);
         // 选号可重复:按球逐个比对幸运号,中奖球数 = 号码等于幸运号的球个数
         $matched = 0;
         foreach ($balls as $b) {
-            if ((int) $b->number === $luckyNumber) {
+            if ((int)$b->number === $luckyNumber) {
                 $matched++;
             }
         }
         $baseAmount = $basePerBall * count($balls);
         $luckyAmountInternal = self::LUCKY_REWARD_PER_BALL * $matched * NumConfig::NUM_VALUE;
-        return (int) round($baseAmount * $multiplier) + $luckyAmountInternal;
+        return (int)round($baseAmount * $multiplier) + $luckyAmountInternal;
     }
 
     /**
@@ -641,27 +660,21 @@ class SuperballActivityService
      * @param $date
      * @return int
      */
-    public function getNotClaimBallByUserIdDate($userId, $date) :int
+    public function getNotClaimBallByUserIdDate($userId, $date): int
     {
         $cacheKey = sprintf('superball_yesterday_not_claim_%d_%s', $userId, $date);
         if (Redis::exists($cacheKey)) {
             $ball = Redis::get($cacheKey);
-            return (int) $ball;
+            return (int)$ball;
         }
         $ball = 0;
         $task = $this->getUserTask($userId, $date);
         if ($task && $task->status == 0) {
+            $recharge = $this->getUserRechargeForDate($userId, $date);
+            $turnover = $this->getUserTotalBetForDate($userId, $date);
             $config = $this->getTierConfigByTier($task->tier);
-            if ($task->complete) {
+            if ($recharge >= $config->recharge_required && $turnover / NumConfig::NUM_VALUE >= $config->turnover_required) {
                 $ball = $config->ball_count;
-            } else if ($task->tier != 'E') {
-                $idx = $config->sort_index+1;
-                $configs = $this->getTierConfig();
-                foreach ($configs as $config) {
-                    if ($config['sort_index'] == $idx) {
-                        $ball += $config['ball_count'];
-                    }
-                }
             }
         }
         Redis::set($cacheKey, $ball);
@@ -681,9 +694,9 @@ class SuperballActivityService
             return [
                 'sort_index' => $r->sort_index,
                 'tier' => $r->tier,
-                'recharge_required' => (int) $r->recharge_required,
-                'turnover_required' => (int) $r->turnover_required,
-                'ball_count' => (int) $r->ball_count,
+                'recharge_required' => (int)$r->recharge_required,
+                'turnover_required' => (int)$r->turnover_required,
+                'ball_count' => (int)$r->ball_count,
             ];
         }, $rows->all());
     }
@@ -708,7 +721,7 @@ class SuperballActivityService
             ->where('UserID', $userId)
             ->where('DateID', $dateId)
             ->first();
-        return $row ? (int) $row->Recharge : 0;
+        return $row ? (int)$row->Recharge : 0;
     }
 
     /** 当日流水:从按日统计表取当天 TotalBet(内部单位) */
@@ -719,7 +732,7 @@ class SuperballActivityService
             ->where('UserID', $userId)
             ->where('DateID', $dateId)
             ->first();
-        return $row && isset($row->TotalBet) ? (int) $row->TotalBet : 0;
+        return $row && isset($row->TotalBet) ? (int)$row->TotalBet : 0;
     }
 
     private function getUserTotalBet(int $userId): int
@@ -727,7 +740,7 @@ class SuperballActivityService
         $row = DB::table(TableName::QPRecordDB() . 'RecordUserTotalStatistics')
             ->where('UserID', $userId)
             ->first();
-        return $row ? (int) $row->TotalBet : 0;
+        return $row ? (int)$row->TotalBet : 0;
     }
 
     private function getUserBalls(int $userId, string $date): array
@@ -740,7 +753,7 @@ class SuperballActivityService
             ->all();
     }
 
-    private function    getUserMultiplier(int $userId): ?\stdClass
+    private function getUserMultiplier(int $userId): ?\stdClass
     {
         return DB::table(TableName::agent() . 'superball_user_multiplier')->where('user_id', $userId)->first();
     }
@@ -765,7 +778,7 @@ class SuperballActivityService
             ->get();
         $map = [];
         foreach ($rows as $r) {
-            $map[$r->pool_date] = (int) $r->lucky_number;
+            $map[$r->pool_date] = (int)$r->lucky_number;
         }
         return array_map(function ($d) use ($map) {
             return ['date' => $d, 'lucky_number' => $map[$d] ?? null];
@@ -783,19 +796,19 @@ class SuperballActivityService
         $consecutive = 1;
 
         if ($row) {
-            $last = $row->last_task_date ? (string) $row->last_task_date : null;
+            $last = $row->last_task_date ? (string)$row->last_task_date : null;
             $prev = Carbon::parse($taskDate)->subDay()->format('Y-m-d');
             if ($last === $prev) {
-                $consecutive = (int) $row->consecutive_days + 1;
-                $multiplier = min(self::MULTIPLIER_MAX, (float) $row->multiplier + self::MULTIPLIER_STEP);
+                $consecutive = (int)$row->consecutive_days + 1;
+                $multiplier = min(self::MULTIPLIER_MAX, (float)$row->multiplier + self::MULTIPLIER_STEP);
             } elseif ($last !== null && $last !== $taskDate) {
-                $daysDiff = (int) Carbon::parse($taskDate)->diffInDays(Carbon::parse($last));
+                $daysDiff = (int)Carbon::parse($taskDate)->diffInDays(Carbon::parse($last));
                 if ($daysDiff > 1) {
-                    $multiplier = max(self::MULTIPLIER_MIN, (float) $row->multiplier - self::MULTIPLIER_STEP);
+                    $multiplier = max(self::MULTIPLIER_MIN, (float)$row->multiplier - self::MULTIPLIER_STEP);
                     $consecutive = 1;
                 } else {
-                    $multiplier = (float) $row->multiplier;
-                    $consecutive = (int) $row->consecutive_days + 1;
+                    $multiplier = (float)$row->multiplier;
+                    $consecutive = (int)$row->consecutive_days + 1;
                 }
             }
         }
@@ -810,4 +823,21 @@ class SuperballActivityService
             ]
         );
     }
+
+    private function sendOpenRewardMailOnce($userId, $ballCount, $luckyNumber, $multiplier, $hitCount, $basePrize): void
+    {
+        $existsKey = sprintf('superball_open_%s_%s', $userId, date('Ymd'));
+        if (Redis::exists($existsKey)) {
+            return;
+        }
+        PrivateMail::sendMail(
+            2,
+            $userId,
+            'Your Lucky Ball Results!',
+            "Yesterday you earned {$ballCount} balls and your lucky number was {$luckyNumber}. 
+            You matched {$hitCount} balls, winning a base prize of {$basePrize} with a {$multiplier}x reward multiplier.",
+            '',
+            '');
+        Redis::setex($existsKey, 86400 * 2, 1);
+    }
 }

+ 2 - 2
resources/lang/en/messages.php

@@ -7,7 +7,7 @@ return [
     "mail_type" => [
         "praise" => "Your support for the platform is appreciated!",
         "pay_success" => "The transaction of the coins you purchased has been completed.",
-        "withdraw_success" => "Your amount has been successfully withdrawn.",
+        "withdraw_success" => "Withdrawal Successful.",
         "withdraw_fail" => "Your withdrawal request failed.Please contact customer service!",
         "withdraw_refuse" => "Your withdrawal request was rejected.",
         "withdraw_clear" => "Your withdrawal request has been cleared.",
@@ -15,7 +15,7 @@ return [
     "mail_content" => [
         "praise_text" => "If you are satisfied with our game, you can give us a five-star rating in the Google Play store and provide a screenshot of your review to customer service for a $5 bonus. GOOGLE PLAY store link: https://play.google.com/store/apps/details?id=:package",
         "pay_success_text" => "Acquired props: :favorable_price Coins\nOrder number: :order_sn\nIf you have any questions, please contact customer service.",
-        "withdraw_success_text" => "1. Your withdrawal order: :order_sn.\n2. Amount received: :amount\n3. If you have any questions, please contact customer service.",
+        "withdraw_success_text" => "Your withdrawal of :amount has been processed successfully. Please go to claim your funds.",
         "withdraw_fail_text" => "1. Your withdrawal order: :order_sn failed.\n2. Reasons for failure: Withdrawal error, error code: :msg\n3. Please withdraw the amount as soon as possible.\n4. If you have any questions, please contact customer service.",
         "withdraw_refuse_text" => "1. Your withdrawal order: :order_sn failed.\n2. Reasons for failure: The system administrator rejected your application.\n3. Please withdraw the amount as soon as possible.\n4. If you have any questions, please contact customer service.",
         "withdraw_clear_text" => "Your withdrawal order: :order_sn failed.\nHello, your account has been detected as abnormal, this withdrawal failed and the coins will be refunded.\nIf we find the anomaly again, we may confiscate your coins or even block your account. If you have any questions, you can ask customer service!",

+ 1 - 1
resources/views/admin/global/id_list.blade.php

@@ -78,7 +78,7 @@
                             </tr>
                             <tr>
                                 <td>{{ __('auto.会员') }}ID</td>
-                                <td>{{$userInfo->GameID}} @if($data['refund_flag']) <b style="color:red;">退款({{round($data['refund_flag']/100, 2)}}/{{round($data['refund_total']/100, 2)}})</b> @endif</td>
+                                <td>{{$userInfo->GameID}} @if($data['refund_flag'] || $data['refund_total']) <b style="color:red;">退款({{round($data['refund_flag']/100, 2)}}/{{round($data['refund_total']/100, 2)}})</b> @endif</td>
                             </tr>
 
                             <tr>