lip пре 16 часа
родитељ
комит
c4a0c746f3

+ 420 - 0
app/Console/Commands/Basketball.php

@@ -0,0 +1,420 @@
+<?php
+
+namespace App\Console\Commands;
+
+use Illuminate\Console\Command;
+use App\Models\Sport as SportModel;
+use App\Models\SportTeam;
+use App\Models\SportLeague;
+use App\Models\SportStatistics;
+use App\Services\SportClientService;
+use Carbon\Carbon;
+use Illuminate\Support\Facades\DB;
+use App\Models\SportEvent;
+use App\Models\Config;
+
+class Basketball extends Command
+{
+    /**
+     * 命令名称和签名
+     *
+     * @var string
+     */
+    protected $signature = 'basketball {is_live=0}';
+    protected $is_live = 0;
+
+    protected  $short_status = [
+            'TBD' => 0,
+            'LIVE' => 1,
+        ];
+    protected $long_status = [
+        'Time To Be Defined' => 0,
+        'Not Started' => 0,
+        'First Half' => 1,
+    ];        
+    
+    protected $fixture_status = [
+        'First Half' => 1,
+        'First Half, Kick Off' => 1,
+        'Halftime' => 1,
+        'Second Half' => 1,
+        'Second Half, 2nd Half Started' => 1,
+        'Extra Time' => 1,
+        'Break Time' => 1,
+        'Penalty In Progress' => 1,
+    ];     
+   
+
+    /**
+     * 命令描述
+     *
+     * @var string
+     */
+    protected $description = '当天会去更新明天的赛事(23:59:00执行一次)';
+    /**
+     * 执行命令
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        // $date = '2026-05-21';
+        // // $data = SportClientService::basketballGames(['date' => $date]);
+        // // file_put_contents('basketballGames-21.json', json_encode($data));
+
+        // $data_id = 499637;
+        // $data = SportClientService::basketballOdds(['game' => $data_id]);
+        // file_put_contents('basketballOdds-499637.json', json_encode($data));
+        // print_r($data);
+        // die;
+        // $this->info('开始执行统计比赛数据任务...');
+        $this->is_live = $this->argument('is_live');
+        if ($this->is_live == 0) {
+            //未开始的赛事拉取
+            $this->fixtures();
+
+            //世界杯赛事拉取
+            $this->leagueFixtures();
+        } elseif ($this->is_live == 1) {
+            //进行中的赛事,定时更新
+            $this->liveFixtures();
+        } elseif ($this->is_live == 2){
+            $this->checkLiveFixtures();
+        } elseif ($this->is_live == 3) {
+            $this->checkOvertimeFixtures();
+        } else {
+            $this->initOdds();
+        }
+    }
+
+    public function leagueFixtures()
+    { 
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
+        //查询世界杯的赛事 
+        $data = SportClientService::fixtures(['league' => 1, 'season' => 2026]);
+        $this->updateOrCreateSport($data, $sport_locked);
+        return true;
+    }
+
+    //到了比赛开始时间,但是状态还是未开始,检查比赛
+    public function checkOvertimeFixtures()
+    { 
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
+        
+        // 比赛开始后,状态还是未开始的数据检测
+        $ids = SportModel::where('state', 0)->where('game_time', '<=', time())->pluck('data_id')->toArray();
+        if ($ids) {
+            $chunks = array_chunk($ids, 10);
+            foreach ($chunks as $chunk) {
+                $ids = implode('-', $chunk);
+                $data = SportClientService::fixtures(['ids' => $ids]);
+                $this->updateOrCreateSport($data, $sport_locked, 1);
+            }
+        }
+        return true;
+    }
+
+    //进行中超过3分钟没有更新数据的赛事,检查比赛是否结束
+    public function checkLiveFixtures()
+    { 
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
+
+        //1. 统一锁盘时间(比赛开始前1分钟)
+        SportModel::where(['is_locked' => 0, 'is_roll' => 0])->where('game_time', '<=', time() + 90)->update(['is_locked' => 1]);
+
+        //2. 比赛进行中,超过3分钟未更新的数据检测
+        $end_time = date("Y-m-d H:i:s", time() - 180);
+        $ids = SportModel::where('state', 1)->where('updated_at', '<=', $end_time)->pluck('data_id')->toArray();
+        if ($ids) {
+            $chunks = array_chunk($ids, 10);
+            foreach ($chunks as $chunk) {
+                $ids = implode('-', $chunk);
+                $data = SportClientService::fixtures(['ids' => $ids]);
+                $this->updateOrCreateSport($data, $sport_locked, 1);
+            }
+        }
+        return true;
+    }
+    
+    //更新进行中的赛事
+    public function liveFixtures()
+    {
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
+        $data = SportClientService::fixtures(['live' => 'all']);
+        file_put_contents("fixturesLive.json", json_encode($data));
+        $this->updateOrCreateSport($data, $sport_locked);
+        return true;
+    }
+
+    private function updateOrCreateSport($data, $sport_locked, $is_check = 0) {
+        $data = $data['response'];
+        $tableData = [];
+        $status = $this->short_status;
+        foreach ($data as $item) {
+            $home_statistics = !empty($item['statistics']) ? $item['statistics'][0]['statistics'] : '';
+            $away_statistics = !empty($item['statistics']) ? $item['statistics'][1]['statistics'] : '';
+
+            $sport_data = [
+                'data_id' => $item['fixture']['id'],
+                'home_team_id' => $item['teams']['home']['id'],
+                'home_team_en' => $item['teams']['home']['name'],
+                'home_team_logo' => $item['teams']['home']['logo'],
+                'guest_team_id' => $item['teams']['away']['id'],
+                'guest_team_en' => $item['teams']['away']['name'],
+                'guest_team_logo' => $item['teams']['away']['logo'],
+                'half_score' => "{$item['score']['halftime']['home']}-{$item['score']['halftime']['away']}",
+                'rbt' => $item['fixture']['timestamp'],
+                'score' => isset($item['goals']) ? "{$item['goals']['home']}-{$item['goals']['away']}":'-',
+                'extra_score' => isset($item['score']['extratime']) ? "{$item['score']['extratime']['home']}-{$item['score']['extratime']['away']}" : "",//加时赛比分
+                'league_id' => $item['league']['id'],
+                'league_en' => $item['league']['name'],
+                'league_data' => json_encode($item['league']),
+                'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
+                'game_time' => $item['fixture']['timestamp'],
+                'updated_at' => date('Y-m-d H:i:s'),
+                'home_statistics' => json_encode($home_statistics),
+                'away_statistics' => json_encode($away_statistics),
+                'is_send' => 0,
+            ];
+            
+            
+            $info = SportModel::where('data_id', $item['fixture']['id'])->first();
+            
+            $fixture_status = null;
+            if (isset($item['fixture']['status']['long']) ) {
+                $long = $item['fixture']['status']['long'];
+                if (isset($this->fixture_status[$long])) {
+                    $fixture_status = json_encode($item['fixture']['status']);
+                    $sport_data['fixture_status'] = $fixture_status;
+                } 
+                if (isset($this->long_status[$long])) {
+                    $sport_data['state'] = $this->long_status[$long];
+                }
+            }
+            //提前锁盘(比赛进行时长,分钟)
+            if (isset($item['fixture']['status']['elapsed'])) {
+                $elapsed = $item['fixture']['status']['elapsed'];
+                if ((int)$elapsed >= 90 - $sport_locked ) {
+                   $sport_data['is_locked'] = 1;
+                }
+            }
+            
+            $sport_data['score'] = $sport_data['score'] == '-' ? '' : $sport_data['score'];
+            $sport_data['half_score'] = $sport_data['half_score'] == '-' ? '' : $sport_data['half_score'];
+            $sport_data['extra_score'] = $sport_data['extra_score'] == '-' ? '' : $sport_data['extra_score'];
+            
+            //锁盘
+            if (isset($item['fixture']['status']['blocked']) && $item['fixture']['status']['blocked']) {
+                $sport_data['is_locked'] = 1;
+            }
+            //已结束
+            if (isset($item['fixture']['status']['finished']) && $item['fixture']['status']['finished']) {
+                $sport_data['state'] = 2;
+            }
+
+            //如果赛事取消、延期等,标记需要退款
+            if ($sport_data['state'] > 2) {
+                $sport_data['refund_status'] = 1;
+            }
+            
+            if (!$info) {
+                $sport_data['created_at'] = date('Y-m-d H:i:s');
+                $sport_data['status'] = 1;
+                $sport_data['home_team'] = SportTeam::getTeamName($sport_data['home_team_id']);
+                $sport_data['guest_team'] = SportTeam::getTeamName($sport_data['guest_team_id']);
+                $sport_data['league'] = SportLeague::getLeagueName($sport_data['league_id']);
+                $tableData[] = $sport_data;
+            } else {
+                if (empty($info['league'])) {
+                    $sport_data['league'] = SportLeague::getLeagueName($sport_data['league_id']);
+                }
+                if (empty($info['home_team'])) {
+                    $sport_data['home_team'] = SportTeam::getTeamName($sport_data['home_team_id']);
+                }
+                if (empty($info['guest_team'])) {
+                    $sport_data['guest_team'] = SportTeam::getTeamName($sport_data['guest_team_id']);
+                }
+                SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
+            }
+
+            if ($sport_data['state'] == 2) {
+                $data_id = $item['fixture']['id'];
+                //比赛结束,插入比赛事件
+                if (!empty($item['events'])) {
+                    $this->insertSportEvents($data_id, $item['events']);
+                }
+                //比赛结束,插入比赛统计数据
+                $data = SportClientService::statistics(['fixture' => $data_id,'half' => 'true']);
+                // file_put_contents("fixturesStatistics.json", json_encode($data));
+                $statistics_data = empty($data['response']) ? [] : $data['response'];
+                foreach($statistics_data as $item) {
+                    $team_id = $item['team']['id'];
+                    //上半场的数据
+                    if(!empty($item['statistics_1h'])) {
+                        $statistics_1h = $item['statistics_1h'];
+                        $this->insertSportStatistics($data_id, $team_id, $statistics_1h, 1); 
+                    }
+                    //下半场的数据
+                    if(!empty($item['statistics_2h'])) {
+                        $statistics_2h = $item['statistics_2h'];
+                        $this->insertSportStatistics($data_id, $team_id, $statistics_2h, 2); 
+                    }
+                }
+                
+            }
+        }
+        if ($tableData) {
+            SportModel::insert($tableData);
+        }
+        return true;
+    }
+    
+    /**
+     * 获取指定日期的所有赛事
+     *
+     * @return array
+     */
+    public function fixtures()
+    {
+        //根据配置拉取多少天的赛事信息
+        $days = Config::where('field', 'sport_days')->first()->val ?? 1;
+        for($i=0;$i<$days;$i++) {
+            $date = Carbon::today()->addDay($i)->toDateString();
+            $data = SportClientService::basketballGames(['date' => $date]);
+    
+            $data = $data['response'];
+            $tableData = [];
+            $status = $this->short_status;
+            foreach ($data as $item) {
+                $data_id = $item['id'];
+                $sport_data = [
+                    'data_id' => $item['id'],
+                    'type' => 2,
+                    'home_team_id' => $item['teams']['home']['id'],
+                    'home_team_en' => $item['teams']['home']['name'],
+                    'home_team_logo' => $item['teams']['home']['logo'],
+                    'guest_team_id' => $item['teams']['away']['id'],
+                    'guest_team_en' => $item['teams']['away']['name'],
+                    'guest_team_logo' => $item['teams']['away']['logo'],
+                    'half_score' => "",
+                    'rbt' => $item['timestamp'],
+                    'score' => isset($item['scores']['home']) && isset($item['scores']['away']) ? "{$item['scores']['home']['total']}-{$item['scores']['away']['total']}":'-',
+                    'extra_score' => isset($item['scores']['home']) && isset($item['scores']['away']) ? "{$item['scores']['home']['over_time']}-{$item['scores']['away']['over_time']}":'-',
+                    'league_id' => $item['league']['id'],
+                    'league_en' => $item['league']['name'],
+                    'league_data' => json_encode($item['league']),
+                    'scores' => json_encode($item['scores']),
+                    // 'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
+                    'game_time' => $item['timestamp'],
+                    'updated_at' => now(),
+                    'is_send' => 0,
+                ];
+                $status_short = strtoupper($item['fixture']['status']['short']);
+                if (isset($status[$status_short])) {
+                    $sport_data['state'] = $status[$status_short];
+                }
+                $sport_data['score'] = $sport_data['score'] == '-' ? '' : $sport_data['score'];
+                $sport_data['extra_score'] = $sport_data['extra_score'] == '-' ? '' : $sport_data['extra_score'];
+    
+                if (!SportModel::where('data_id', $data_id)->exists()) {
+                    $sport_data['created_at'] = now();
+                    
+                    $sport_data['home_team'] = SportTeam::getTeamName($sport_data['home_team_id']);
+                    $sport_data['guest_team'] = SportTeam::getTeamName($sport_data['guest_team_id']);
+                    $sport_data['league'] = SportLeague::getLeagueName($sport_data['league_id']);
+                    $tableData[] = $sport_data;
+                } else {
+                    
+                    $sport_data['home_team'] = SportTeam::getTeamName($sport_data['home_team_id']);
+                    $sport_data['guest_team'] = SportTeam::getTeamName($sport_data['guest_team_id']);
+                    $sport_data['league'] = SportLeague::getLeagueName($sport_data['league_id']);
+                    SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
+                }
+
+                //更新或创建球队和联赛信息
+                SportModel::addSportTeam($sport_data);
+                SportModel::addSportLeague($item['league']);
+
+                //比赛结束,插入比赛事件
+                if (isset($sport_data['state']) && $sport_data['state'] == 2 ) {
+                    
+                    $data_id = $item['fixture']['id'];
+                    if (!empty($item['events'])) {
+                        $this->insertSportEvents($data_id, $item['events']);
+                    }
+                    
+                    //比赛结束,插入比赛事件
+                    $data = SportClientService::statistics(['fixture' => $data_id,'half' => 'true']);
+                    // file_put_contents("fixturesStatistics.json", json_encode($data));
+                    $statistics_data = empty($data['response']) ? [] : $data['response'];
+                    foreach($statistics_data as $item) {
+                        $team_id = $item['team']['id'];
+                        //上半场的数据
+                        if(!empty($item['statistics_1h'])) {
+                            $statistics_1h = $item['statistics_1h'];
+                            $this->insertSportStatistics($data_id, $team_id, $statistics_1h, 1); 
+                        }
+                        //下半场的数据
+                        if(!empty($item['statistics_2h'])) {
+                            $statistics_2h = $item['statistics_2h'];
+                            $this->insertSportStatistics($data_id, $team_id, $statistics_2h, 2); 
+                        }
+                    }
+                }
+            }
+            if ($tableData) {
+                SportModel::insert($tableData);
+            }
+        }
+        
+        return true;
+    }
+    public function initOdds(){
+        $page = 1;
+        $limit = 10;
+        while (true) { 
+            $list = SportModel::where('odds','<>', null)->forPage($page, $limit)->get()->toArray();
+            if (empty($list)) {
+                break;
+            }
+            echo $page.PHP_EOL;
+            foreach($list as $item) {
+                $odds = json_decode($item['odds'], true);
+                foreach($odds as $odd) {
+                    $odd_id = $odd['id'];
+                    $odd_name = $odd['name'];
+                    $info = DB::table('sport_odds')->where('odd_id',$odd_id)->where('odd_name_en',$odd_name)->first();
+                    if ($info && (!$info->odd_name || $odd_name != $info->odd_name_en)) {
+                        DB::table('sport_odds')->where('id', $info->id)->update([
+                            'odd_name_en' => $odd_name,
+                        ]);
+                    } elseif (!$info) {
+                        DB::table('sport_odds')->insert([
+                            'odd_id' => $odd_id,
+                            'odd_name_en' => $odd_name,
+                            'created_at' => date('Y-m-d H:i:s'),
+                            'updated_at' => date('Y-m-d H:i:s'),
+                        ]);
+                    }
+                }
+            }
+
+            $page++;
+        }
+    }
+
+    //比赛开始后,超过3个小时,并且更新时间超过10分钟,还是进行中的数据,更新成已完成
+    public function updateOvertimeFixtures()
+    { 
+        // 比赛开始后,状态还是未开始的数据检测
+        $end_time = date("Y-m-d H:i:s", time() - 600);
+        SportModel::where('status', 1)->where('state', 1)->where('game_time', '<=', time() - 60*60*3)->where('updated_at', '<=', $end_time)->update(['state' =>2]);
+        return true;
+    }
+
+    
+}

+ 33 - 1
app/Http/Controllers/admin/LhcLottery.php

@@ -19,6 +19,7 @@ class LhcLottery extends Controller
                 'page' => ['nullable', 'integer', 'min:1'],
                 'limit' => ['nullable', 'integer', 'min:1'],
                 'type' => ['nullable', 'integer', 'min:1'],
+                'status' => ['nullable', 'integer', 'min:1'],
                 'is_settlement' => ['nullable', 'integer'],
                 'issue' => ['nullable', 'string'],
                 'open_code' => ['nullable', 'string'],
@@ -32,6 +33,9 @@ class LhcLottery extends Controller
             if (!empty($params['type'])) {
                 $query = $query->where('type', $params['type']);
             }
+            if (!empty($params['status'])) {
+                $query = $query->where('status', $params['status']);
+            }
             if (isset($params['is_settlement'])) {
                 $query = $query->where('is_settlement', $params['is_settlement']);
             }
@@ -50,7 +54,7 @@ class LhcLottery extends Controller
             $count = $query->count();
             $list = $query
                 ->forPage($page, $limit)
-                ->orderByDesc('open_time')
+                ->orderByDesc('id')
                 ->get();
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
@@ -58,5 +62,33 @@ class LhcLottery extends Controller
         return $this->success(['total' => $count, 'data' => $list]);
 
     }
+    
+    //设置预开奖号码
+    public function setAdvanceCode()
+    {
+        try {
+            $params = request()->validate([
+                'id' => ['required','integer'],
+                'advance_code' => ['required','array'],
+            ]);
+            $id = $params['id'];
+            if (count($params['advance_code']) != 7) {
+                throw new Exception('开奖号码必须是7个数');
+            }
+            $info = LhcLotteryModel::where('id', $id)->first();
+            if (!$info) throw new Exception('数据不存在');
+            if (!empty($info->open_code)) {
+                throw new Exception('已开奖');
+            }
+            if (!empty($info->advance_code)) {
+                throw new Exception('已设置');
+            }
+            $info->advance_code = implode(",",$params['advance_code']);
+            $info->save();
+            return $this->success();
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+    }
 
 }

+ 2 - 1
app/Http/Controllers/admin/LhcOrder.php

@@ -127,7 +127,8 @@ class LhcOrder extends Controller
                 $walletInfo->available_balance = $after;
                 $walletInfo->save();
                 
-                $remark = $order->type == 1 ? '澳门六合彩' : '香港六合彩';
+                
+                $remark = LhcOrderModel::getRemark($order->type);
                 FundsRecord::addData([
                     'change_type' => $remark.'退款',
                     'amount' => $order->amount,

+ 14 - 0
app/Models/LhcOrder.php

@@ -15,5 +15,19 @@ class LhcOrder extends BaseModel
         return $this->belongsTo(LhcLottery::class, 'issue', 'issue')
             ->select('issue', 'type', 'open_code', 'open_time', 'is_settlement');
     }
+
+    public static function getRemark($type)
+    {
+        if ($type == 1) {
+            return '新澳门六合彩';
+        } elseif ($type == 2) {
+            return '香港六合彩';
+        } elseif ($type == 3) {
+            return '澳门六合彩';
+        } elseif ($type == 4) {
+            return '极速六合彩';
+        } 
+        return '';
+    }
  
 }

+ 3 - 1
app/Services/BalanceLogService.php

@@ -24,8 +24,10 @@ class BalanceLogService extends BaseService
         '充值', '人工充值', '三方充值', '注册赠送', '优惠活动',
         '提现', '人工扣款', '三方提现', 
         '体彩投注','体彩退款','体彩和局退款','体彩中奖','体彩输半退款',
-        '澳门六合彩投注','澳门六合彩退款','澳门六合彩和局退款','澳门六合彩中奖',
+        '澳门六合彩投注','澳门六合彩退款','澳门六合彩和局退款','澳门六合彩中奖',
         '香港六合彩投注','香港六合彩退款','香港六合彩和局退款','香港六合彩中奖','加拿大28投注','极速28投注',
+        '澳门六合彩投注','澳门六合彩退款','澳门六合彩和局退款','澳门六合彩中奖',
+        '急速六合彩投注','急速六合彩退款','急速六合彩和局退款','急速六合彩中奖',
         '投注','中奖', '资产转移', '比比返', '返水', '回水', '笔笔返', '投注退分','充值返现','即充即送','老用户回归','余额宝转入','转出至余额宝','余额宝利息','流水解冻'
     ];
 

+ 65 - 20
app/Services/SportClientService.php

@@ -9,13 +9,22 @@ class SportClientService
 {
 
     //
-    public static function get($endpoint, $params = [])
+    public static function get($type, $endpoint, $params = [])
     {
+        if ($type == 1) {
+            $host = env('API_FOOTBALL_HOST');
+            $key = env('API_FOOTBALL_KEY');
+        } elseif ($type == 2) {
+            $host = env('API_BASKETBALL_HOST');
+            $key = env('API_BASKETBALL_KEY');
+        } else {
+            throw new \Exception("Invalid sport type");
+        }
         $response = Http::withHeaders([
-            'x-apisports-key' => env('API_FOOTBALL_KEY'),
+            'x-apisports-key' => $key,
         ])
             ->withoutVerifying()  // 临时跳过 SSL 验证
-            ->get(env('API_FOOTBALL_HOST') . '/' . $endpoint, $params);
+            ->get($host . '/' . $endpoint, $params);
 
         if ($response->successful()) {
             return $response->json();
@@ -25,11 +34,20 @@ class SportClientService
         throw new \Exception("API request failed: " . $response->body());
     }
 
-    public static function post($endpoint, $data = [])
+    public static function post($type, $endpoint, $data = [])
     {
+        if ($type == 1) {
+            $host = env('API_FOOTBALL_HOST');
+            $key = env('API_FOOTBALL_KEY');
+        } elseif ($type == 2) {
+            $host = env('API_BASKETBALL_HOST');
+            $key = env('API_BASKETBALL_KEY');
+        } else {
+            throw new \Exception("Invalid sport type");
+        }
         $response = Http::withHeaders([
-            'x-apisports-key' => config('services.api_football.key'),
-        ])->post(config('services.api_football.host') . '/' . $endpoint, $data);
+            'x-apisports-key' => $key,
+        ])->post($host . '/' . $endpoint, $data);
 
         if ($response->successful()) {
             return $response->json();
@@ -42,57 +60,84 @@ class SportClientService
     // 时区
     public static function timezone()
     {
-        return self::get('timezone');
+        return self::get(1, 'timezone');
     }
 
     // 国家/地区
     public static function countries($params = [])
     {
-        return self::get('countries', $params);
+        return self::get(1, 'countries', $params);
     }
 
-    //  联赛  获取可用的联赛和杯赛名单。
+    //足球 -  联赛  获取可用的联赛和杯赛名单。
     public static function leagues($params = [])
     {
-        return static::get('leagues', $params);
+        return static::get(1, 'leagues', $params);
     }
 
-    // 联赛赛季  获取特定联赛的赛季列表。
+    //足球 - 联赛赛季  获取特定联赛的赛季列表。
     public static function leaguesSeasons($params = [])
     {
-        return static::get('leagues/seasons', $params);
+        return static::get(1, 'leagues/seasons', $params);
     }
 
 
     //  This endpoint returns in-play odds for fixtures in progress.
     //  此端点会返回正在进行的比赛的实时赔率。
     //  Update Frequency : This endpoint is updated every 5 seconds.
-    //  更新频率:此端点每 5 秒钟更新一次。
+    // 足球 -  更新频率:此端点每 5 秒钟更新一次。
     public static function oddsLive($params = [])
     {
-        return static::get('odds/live', $params);
+        return static::get(1, 'odds/live', $params);
     }
 
+    //足球 - 赛事赔率
     public static function odds($params = [])
     {
-        return static::get('odds', $params);
+        return static::get(1, 'odds', $params);
     }
 
     public static function fixturesRounds($params = [])
     {
-        return static::get('fixtures/rounds', $params);
+        return static::get(1, 'fixtures/rounds', $params);
     }
 
 
-    // 赛程
+    //足球 -  赛程
     public static function fixtures($params = [])
     {
-        return self::get('fixtures', $params);
+        return self::get(1, 'fixtures', $params);
     }
 
-    //赛事统计数据
+    //足球 - 赛事统计数据
     public static function statistics($params = [])
     {
-        return self::get('fixtures/statistics', $params);
+        return self::get(1, 'fixtures/statistics', $params);
+    }
+
+
+    /**********篮球**************** */
+    //篮球 - 赛事
+    public static function basketballGames($params = [])
+    {
+        return self::get(2, 'games', $params);
+    }
+
+    //篮球 - 球队统计数据
+    public static function basketballStatisticsTeams($params = [])
+    {
+        return self::get(2, 'games/statistics/teams', $params);
+    }
+
+    //篮球 - 获取比赛或联赛的赔率
+    public static function basketballOdds($params = [])
+    {
+        return self::get(2, 'odds', $params);
+    }
+
+    //篮球 - 获取可参加的联赛和杯赛列表
+    public static function basketballLeagues($params = [])
+    {
+        return self::get(2, 'leagues', $params);
     }
 }

+ 4 - 0
example.env

@@ -21,6 +21,10 @@ PLAYNOW_PROXY_PASSWORD=
 API_FOOTBALL_KEY=b60ecb5e998be566e592068b3f6d98b1
 API_FOOTBALL_HOST=https://v3.football.api-sports.io
 
+# 蓝球数据API平台的秘钥和地址
+API_BASKETBALL_KEY=b60ecb5e998be566e592068b3f6d98b1
+API_BASKETBALL_HOST=https://v1.basketball.api-sports.io
+
 # 是否发送电报
 SEND_TELEGRAM = true
 

+ 1 - 0
routes/admin.php

@@ -265,6 +265,7 @@ Route::middleware(['admin.jwt'])->group(function () {
         });
         Route::prefix('/lhcLottery')->group(function () {
             Route::get('/list', [LhcLottery::class, 'list']);
+            Route::post('/setAdvanceCode', [LhcLottery::class, 'setAdvanceCode']);
         });