Browse Source

修改赛事

lip 6 days ago
parent
commit
0a4767f91b
3 changed files with 221 additions and 84 deletions
  1. 87 69
      app/Console/Commands/Sport.php
  2. 29 15
      app/Console/Commands/SportOdds.php
  3. 105 0
      app/Http/Controllers/admin/Sport.php

+ 87 - 69
app/Console/Commands/Sport.php

@@ -8,6 +8,7 @@ use App\Services\SportClientService;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\DB;
 use App\Models\SportEvent;
+use App\Models\Config;
 
 class Sport extends Command
 {
@@ -55,6 +56,11 @@ class Sport extends Command
      */
     public function handle()
     {
+        // $data = SportClientService::odds([
+        //     'fixture' => 1530487,
+        // ]);
+        // print_r($data);
+        
         
         $this->info('开始执行统计比赛数据任务...');
         
@@ -74,6 +80,7 @@ class Sport extends Command
     public function liveFixtures()
     {
         $data = SportClientService::fixtures(['live' => 'all']);
+        file_put_contents("fixturesLive.json", json_encode($data));
         $data = $data['response'];
         $tableData = [];
         $status = $this->short_status;
@@ -94,20 +101,31 @@ class Sport extends Command
                 'half_score' => "{$item['score']['halftime']['home']}-{$item['score']['halftime']['away']}",
                 'rbt' => $item['fixture']['timestamp'],
                 'score' => isset($item['score']['fulltime']) ? "{$item['score']['fulltime']['home']}-{$item['score']['fulltime']['away']}":'-',
+                'extra_score' => isset($item['score']['extratime']) ? "{$item['score']['extratime']['home']}-{$item['score']['extratime']['away']}" : "",//加时赛比分
                 'league' => lang($item['league']['name']),
                 'league_en' => $item['league']['name'],
                 'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
                 'game_time' => $item['fixture']['timestamp'],
-                'status' => 1,
                 'updated_at' => now(),
                 'home_statistics' => $home_statistics,
                 'away_statistics' => $away_statistics,
             ];
             $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 (!SportModel::where('data_id', $item['fixture']['id'])->exists()) {
                 $sport_data['created_at'] = now();
+                $sport_data['status'] = 1;
                 $tableData[] = $sport_data;
             } else {
                 SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
@@ -143,78 +161,78 @@ class Sport extends Command
      */
     public function fixtures()
     {
-        $date = Carbon::tomorrow()->toDateString();
-        // $date = '2026-03-28';
-  
-        // $data = SportClientService::odds([
-        //     'fixture' => 1461571,
-        // ]);
-        // file_put_contents("1461571-fixtures.json",json_encode($data));
-        // $data = SportClientService::fixtures(['live' => 'all']);
-
-        $data = SportClientService::fixtures(['date' => $date]);
+        //根据配置拉取多少天的赛事信息
+        $days = Config::where('field', 'sport_days')->first()->val ?? 1;
+        for($i=0;$i<$days;$i++) {
+            $date = Carbon::tomorrow()->addDay($i)->toDateString();
+            $count = SportModel::where('game_time','>=', strtotime($date))->where('game_time','<=', strtotime($date." 23:59:59"))->count();
+            if (!$count) {
+                $data = SportClientService::fixtures(['date' => $date]);
         
-        $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' => lang($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' => lang($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['score']['fulltime']) ? "{$item['score']['fulltime']['home']}-{$item['score']['fulltime']['away']}":'-',
-                'league' => lang($item['league']['name']),
-                'league_en' => $item['league']['name'],
-                'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
-                'game_time' => $item['fixture']['timestamp'],
-                'status' => 1,
-                'updated_at' => now(),
-                'home_statistics' => $home_statistics,
-                'away_statistics' => $away_statistics,
-                'is_send' => 0,
-            ];
-            $sport_data['score'] = $sport_data['score'] == '-' ? '' : $sport_data['score'];
-            $sport_data['half_score'] = $sport_data['half_score'] == '-' ? '' : $sport_data['half_score'];
-
-            if (!SportModel::where('data_id', $item['fixture']['id'])->exists()) {
-                $sport_data['created_at'] = now();
-                $tableData[] = $sport_data;
-            } else {
-                SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
-            }
-            //比赛结束,插入比赛事件
-            if ($sport_data['state'] == 2 && !empty($item['events'])) {
-                foreach($item['events'] as $event) {
-                    SportEvent::create([
+                $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'],
-                        'type' => $event['type'],
-                        'time_elapsed' => $event['time']['elapsed'],
-                        'time' => json_encode($event['time']),
-                        'detail' => $event['detail'],
-                        'player' => $event['player'] ? json_encode($event['player']) : $event['player'],
-                        'team_id' => $event['team']['id'],
-                        'comments' => $event['comments'],
-                        'assist' => $event['assist'] ? json_encode($event['assist']) : $event['assist'],
-                    ]);
+                        'home_team_id' => $item['teams']['home']['id'],
+                        'home_team_en' => $item['teams']['home']['name'],
+                        'home_team' => lang($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' => lang($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['score']['fulltime']) ? "{$item['score']['fulltime']['home']}-{$item['score']['fulltime']['away']}":'-',
+                        'league' => lang($item['league']['name']),
+                        'league_en' => $item['league']['name'],
+                        'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
+                        'game_time' => $item['fixture']['timestamp'],
+                        'status' => 1,
+                        'updated_at' => now(),
+                        'home_statistics' => $home_statistics,
+                        'away_statistics' => $away_statistics,
+                        'is_send' => 0,
+                    ];
+                    $sport_data['score'] = $sport_data['score'] == '-' ? '' : $sport_data['score'];
+                    $sport_data['half_score'] = $sport_data['half_score'] == '-' ? '' : $sport_data['half_score'];
+        
+                    if (!SportModel::where('data_id', $item['fixture']['id'])->exists()) {
+                        $sport_data['created_at'] = now();
+                        $tableData[] = $sport_data;
+                    } else {
+                        SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
+                    }
+                    //比赛结束,插入比赛事件
+                    if ($sport_data['state'] == 2 && !empty($item['events'])) {
+                        foreach($item['events'] as $event) {
+                            SportEvent::create([
+                                'data_id' => $item['fixture']['id'],
+                                'type' => $event['type'],
+                                'time_elapsed' => $event['time']['elapsed'],
+                                'time' => json_encode($event['time']),
+                                'detail' => $event['detail'],
+                                'player' => $event['player'] ? json_encode($event['player']) : $event['player'],
+                                'team_id' => $event['team']['id'],
+                                'comments' => $event['comments'],
+                                'assist' => $event['assist'] ? json_encode($event['assist']) : $event['assist'],
+                            ]);
+                        }
+        
+                    }
+                }
+                if ($tableData) {
+                    SportModel::insert($tableData);
                 }
-
             }
         }
-        if ($tableData) {
-            SportModel::insert($tableData);
-        }
-        return $tableData;
+        
+        return true;
     }
     
     

+ 29 - 15
app/Console/Commands/SportOdds.php

@@ -85,23 +85,28 @@ class SportOdds extends Command
             //直播赔率(获取正在直播的所有赛事的赔率)
             if ($is_live == 1) {
                 $data = SportClientService::oddsLive([]);
-                
-                // file_put_contents("oddsLive.json",json_encode($data));
+                // $data = SportClientService::oddsLive(['fixture' => '1537245']);
+                // $data = SportClientService::odds(['fixture' => '1537245']);
+                // die;
+                    
+                file_put_contents("oddsLive.json",json_encode($data));
                 $this->updateOddsLive($data);
             } else {
                 //按照日期获取赔率
                 // $data = SportClientService::odds([
                 //     'date' => date('Y-m-d'),
                 // ]);
-
-
+                // die;
+                
                 //普通球赛是开赛前购买,更新数据
                 $where['state'] = 0;  //比赛状态:0未开始1进行中2已完场3延期4取消
                 $list = SportModel::where($where)->where('odds',null)->limit($limit)->get()->toArray();
+                // $list = SportModel::whereIn('data_id', [1512757, 1525674])->get()->toArray();
                 foreach($list as $item) {
                     $data = SportClientService::odds([
                         'fixture' => $item['data_id'],
                     ]);
+                // file_put_contents("oddsToday.json",json_encode($data));
                     $this->updateOdds($item['data_id'],$data);
                 }
             }
@@ -117,22 +122,31 @@ class SportOdds extends Command
             $data = $data['response'];
             foreach($data as $item) {
                 $data_id = $item['fixture']['id'];
-                $long_status = $item['fixture']['status']['long']; 
-                $state = isset($this->long_status[$long_status]) ? $this->long_status[$long_status] : null;
-                $odds = $item['odds'];
+                $odds = json_encode($item['odds']);
                 
-                $fixture_status = null;
-                if (isset($item['fixture']['status']['long']) && isset($this->$fixture_status[$item['fixture']['status']['long']])) {
-                    $fixture_status = json_encode($item['fixture']['status']);
-                }
                 $update_data = [
-                    'state' => $state,
                     'odds' => $odds,
-                    'fixture_status' => $fixture_status,
-                    'score' => isset($item['teams']['home']['goals']) ? "{$item['teams']['home']['goals']}-{$item['teams']['away']['goals']}":'-',
                     'is_send' => 0,
                 ];
-                
+                $fixture_status = null;
+                if (isset($item['fixture']['status']['long']) && isset($this->$fixture_status[$item['fixture']['status']['long']])) {
+                    $fixture_status = json_encode($item['fixture']['status']);
+                    $update_data['fixture_status'] = $fixture_status;
+                    if (isset($this->long_status[$item['fixture']['status']['long']])) {
+                        $update_data['state'] = $this->long_status[$item['fixture']['status']['long']];
+                    }
+                }
+                if (isset($item['teams']['home']['goals'])) {
+                    $update_data['score'] = $item['teams']['home']['goals'] ."-". $item['teams']['away']['goals'];
+                }
+                //锁盘
+                if (isset($item['fixture']['status']['blocked']) && $item['fixture']['status']['blocked']) {
+                    $update_data['is_locked'] = 1;
+                }
+                //已结束
+                if (isset($item['fixture']['status']['finished']) && $item['fixture']['status']['finished']) {
+                    $update_data['state'] = 2;
+                }
                 SportModel::where('data_id',$data_id)->update($update_data);
                 echo $data_id.": 更新成功\r\n";
             }

+ 105 - 0
app/Http/Controllers/admin/Sport.php

@@ -0,0 +1,105 @@
+<?php
+
+namespace App\Http\Controllers\admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\Sport as SportModel;
+use Exception;
+use App\Constants\HttpStatus;
+
+class Sport extends Controller
+{
+    /**
+     * 列表
+     */
+    public function list()
+    {
+        try {
+            $params = request()->validate([
+                'page' => ['nullable', 'integer', 'min:1'],
+                'limit' => ['nullable', 'integer', 'min:1'],
+                'data_id' => ['nullable', 'string'],
+                'home_team' => ['nullable', 'string'],
+                'guest_team' => ['nullable', 'integer'],
+                'league' => ['nullable', 'string'],
+                'state' => ['nullable', 'integer'],
+                'status' => ['nullable', 'integer'],
+                'is_locked' => ['nullable', 'integer'],
+                'start_time' => ['nullable', 'string'],
+                'end_time' => ['nullable', 'string'],
+            ]);
+            $page = request()->input('page', 1);
+            $limit = request()->input('limit', 15);
+
+            $query = new SportModel();
+            if (!empty($params['data_id'])) {
+                $query = $query->where('data_id', $params['data_id']);
+            }
+            if (!empty($params['home_team'])) {
+                $query = $query->where('home_team', $params['home_team']);
+            }
+            if (!empty($params['guest_team'])) {
+                $query = $query->where('guest_team', $params['guest_team']);
+            }
+            if (isset($params['league']) && $params['league'] !== null) {
+                $query = $query->where('league', $params['league']);
+            }
+            if (isset($params['state']) && $params['state'] !== null) {
+                $query = $query->where('state', $params['state']);
+            }
+            if (isset($params['status']) && $params['status'] !== null) {
+                $query = $query->where('status', $params['status']);
+            }
+            if (isset($params['is_locked']) && $params['is_locked'] !== null) {
+                $query = $query->where('is_locked', $params['is_locked']);
+            }
+            if (!empty($params['start_time'])) {
+                $query = $query->where('game_time', '>=', strtotime($params['start_time'].' 00:00:00'));
+            }
+            if (!empty($params['end_time'])) {
+                $query = $query->where('game_time', '<', strtotime($params['end_time'].' 23:59:59'));
+            }
+            $count = $query->count();
+            $list = $query
+                ->forPage($page, $limit)
+                ->orderBy('game_time','asc')
+                ->get();
+            foreach($list as $item) {
+                $item['game_time'] = date('Y-m-d H:i:s', $item['game_time']);
+                $item['rbt'] = date('Y-m-d H:i:s', $item['rbt']);
+                $item['fixture_status'] = json_decode($item['fixture_status'], true);
+            }
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success(['total' => $count, 'data' => $list]);
+
+    }
+
+    //详情
+    function info()
+    {
+        try {
+            request()->validate([
+                'id' => ['required', 'integer'],
+            ]);
+            $id = request()->input('id');
+            $info = SportModel::where('id', $id)->first();
+            if (!$info) throw new Exception('赛事不存在');
+            $info = $info->toArray();
+            $info['game_time'] = date('Y-m-d H:i:s', $info['game_time']);
+            $info['rbt'] = date('Y-m-d H:i:s', $info['rbt']);
+            $info['fixture_status'] = json_decode($info['fixture_status'], true);
+
+            
+            $info['date'] = date('Y-m-d',$info['game_time']);
+            $info['time'] = date('H:i',$info['game_time']);
+            $info['odds'] = $info['odds'] ? json_decode($info['odds'], true) : null;
+
+        } catch (Exception $e) {
+            return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
+        }
+        return $this->success($info);
+    }
+
+}