Sport.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. namespace App\Console\Commands;
  3. use Illuminate\Console\Command;
  4. use App\Models\Sport as SportModel;
  5. use App\Services\SportClientService;
  6. use Carbon\Carbon;
  7. class Sport extends Command
  8. {
  9. /**
  10. * 命令名称和签名
  11. *
  12. * @var string
  13. */
  14. protected $signature = 'sport';
  15. /**
  16. * 命令描述
  17. *
  18. * @var string
  19. */
  20. protected $description = '当天会去更新明天的赛事(23:59:00执行一次)';
  21. /**
  22. * 执行命令
  23. *
  24. * @return int
  25. */
  26. public function handle()
  27. {
  28. $this->info('开始执行统计比赛数据任务...');
  29. $this->fixtures();
  30. $this->info('结束执行统计比赛数据任务');
  31. }
  32. public function sportData()
  33. {
  34. try {
  35. $today = date('Y-m-d');
  36. $host = env('SPORT_HOST');
  37. $url = "{$host}/api/sport";
  38. $url .= "?date={$today}";
  39. $result = file_get_contents($url);
  40. $result = $result ? json_decode($result, true) : [];
  41. foreach ($result as $item) {
  42. $info = SportModel::where('data_id',$item['data_id'])->first();
  43. $data = [
  44. 'home_team_id' => $item['home_team_id'] ?? '',
  45. 'home_team_en' => $item['home_team_en'] ?? '',
  46. 'home_team' => $item['home_team'] ?? '',
  47. 'home_team_logo' => $item['home_team_logo'] ?? '',
  48. 'guest_team_id' => $item['guest_team_id'] ?? '',
  49. 'guest_team_en' => $item['guest_team_en'] ?? '',
  50. 'guest_team' => $item['guest_team'] ?? '',
  51. 'guest_team_logo' => $item['guest_team_logo'] ?? '',
  52. 'half_score' => $item['half_score'] ?? '',
  53. 'rbt' => $item['rbt'] ?? '',
  54. 'is_roll' => $item['is_roll'] ?? 0,
  55. 'score' => $item['score'] ?? '',
  56. 'league_en' => $item['league_en'] ?? '',
  57. 'league' => $item['league'] ?? '',
  58. 'odds' => $item['odds'] ?? '',
  59. 'state' => $item['state'] ?? 0,
  60. 'game_time' => $item['game_time'] ?? 0,
  61. 'status' => $item['status'] ?? 0,
  62. 'handicap_limit' => $item['handicap_limit'] ?? '',
  63. 'over_under_limit' => $item['over_under_limit'] ?? '',
  64. 'duying_limit' => $item['duying_limit'] ?? '',
  65. 'correct_core_limit' => $item['correct_core_limit'] ?? '',
  66. 'odd_even_limit' => $item['odd_even_limit'] ?? '',
  67. 'total_goal_limit' => $item['total_goal_limit'] ?? '',
  68. 'is_handicap' => $item['is_handicap'] ?? 0,
  69. 'is_over_under' => $item['is_over_under'] ?? 0,
  70. 'is_duying' => $item['is_duying'] ?? 0,
  71. 'is_correct_core' => $item['is_correct_core'] ?? 0,
  72. 'is_odd_even' => $item['is_odd_even'] ?? 0,
  73. 'is_total_goal' => $item['is_total_goal'] ?? 0,
  74. 'is_locked' => $item['is_locked'] ?? 0,
  75. ];
  76. if ($info) {
  77. //更新数据
  78. SportModel::where('data_id',$item['data_id'])->update($data);
  79. } else {
  80. $data['data_id'] = $item['data_id'];
  81. SportModel::create($data);
  82. }
  83. }
  84. } catch (\Exception $e) {
  85. $this->error($e->getMessage());
  86. }
  87. return true;
  88. }
  89. /**
  90. * 获取指定日期的所有赛事
  91. *
  92. * @return array
  93. */
  94. public function fixtures()
  95. {
  96. $date = Carbon::tomorrow()->toDateString();
  97. $data = SportClientService::fixtures(['date' => $date]);
  98. $data = $data['response'];
  99. $tableData = [];
  100. $status = ['NS' => 0, '1H' => 1, 'HT' => 1, '2H' => 1, 'ET' => 1, 'BT' => 1, 'P' => 1, 'SUSP' => 1, 'INT' => 1, 'LIVE' => 1, 'FT' => 2, 'AET' => 2, 'PEN' => 2, 'PST' => 3, 'CANC' => 4, 'ABD' => 4,];
  101. foreach ($data as $item) {
  102. $sport_data = [
  103. 'data_id' => $item['fixture']['id'],
  104. 'home_team_id' => $item['teams']['home']['id'],
  105. 'home_team_en' => $item['teams']['home']['name'],
  106. 'home_team' => lang($item['teams']['home']['name']),
  107. 'home_team_logo' => $item['teams']['home']['logo'],
  108. 'guest_team_id' => $item['teams']['away']['id'],
  109. 'guest_team_en' => $item['teams']['away']['name'],
  110. 'guest_team' => lang($item['teams']['away']['name']),
  111. 'guest_team_logo' => $item['teams']['away']['logo'],
  112. 'half_score' => "{$item['score']['halftime']['home']}-{$item['score']['halftime']['away']}",
  113. 'rbt' => $item['fixture']['timestamp'],
  114. 'score' => "{$item['score']['fulltime']['home']}-{$item['goals']['fulltime']['away']}",
  115. 'league' => lang($item['league']['name']),
  116. 'league_en' => $item['league']['name'],
  117. 'state' => $status[$item['fixture']['status']['short']],//比赛状态:0未开始1进行中2已完场3延期4取消
  118. 'game_time' => $item['fixture']['timestamp'],
  119. 'updated_at' => now(),
  120. ];
  121. if (!SportModel::where('data_id', $item['fixture']['id'])->exists()) {
  122. $sport_data['created_at'] = now();
  123. $tableData[] = $sport_data;
  124. } else {
  125. SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
  126. }
  127. }
  128. if ($tableData) {
  129. SportModel::insert($tableData);
  130. }
  131. return $tableData;
  132. }
  133. // 核心响应数据:赛事列表(数组形式,每个元素对应一场赛事)
  134. // "response": [
  135. // {
  136. // // 赛事基础信息
  137. // "fixture": {
  138. // "id": 239625, // 赛事唯一ID
  139. // "referee": null, // 主裁判姓名(null表示暂无数据)
  140. // "timezone": "UTC", // 赛事时间所属时区
  141. // "date": "2020-02-06T14:00:00+00:00", // 赛事开始时间(ISO 8601格式)
  142. // "timestamp": 1580997600, // 赛事开始时间戳(秒级)
  143. // "periods": { // 赛事时段时间戳
  144. // "first": 1580997600, // 上半场开始时间戳
  145. // "second": null // 下半场开始时间戳(null表示尚未开始)
  146. // },
  147. // "venue": { // 赛事场馆信息
  148. // "id": 1887, // 场馆唯一ID
  149. // "name": "Stade Municipal", // 场馆名称
  150. // "city": "Oued Zem" // 场馆所在城市
  151. // },
  152. // "status": { // 赛事当前状态
  153. // "long": "Halftime", // 状态描述(长文本):半场休息
  154. // "short": "HT", // 状态缩写:HT=Halftime(半场)
  155. // "elapsed": 45, // 已进行时长(分钟):45分钟(半场结束)
  156. // "extra": null // 补时/加时时长(null表示无)
  157. // }
  158. // },
  159. // // 联赛信息
  160. // "league": {
  161. // "id": 200, // 联赛唯一ID
  162. // "name": "Botola Pro", // 联赛名称:摩洛哥职业足球甲级联赛
  163. // "country": "Morocco", // 联赛所属国家
  164. // "logo": "https://media.api-sports.io/football/leagues/115.png", // 联赛logo地址
  165. // "flag": "https://media.api-sports.io/flags/ma.svg", // 国家旗帜地址
  166. // "season": 2019, // 赛事赛季:2019/2020赛季(通常取首年)
  167. // "round": "Regular Season - 14" // 联赛轮次:常规赛第14轮
  168. // },
  169. // // 参赛球队信息
  170. // "teams": {
  171. // "home": { // 主队信息
  172. // "id": 967, // 主队ID
  173. // "name": "Rapide Oued ZEM", // 主队名称
  174. // "logo": "https://media.api-sports.io/football/teams/967.png", // 主队logo地址
  175. // "winner": false // 是否获胜:false(半场暂时落后)
  176. // },
  177. // "away": { // 客队信息
  178. // "id": 968, // 客队ID
  179. // "name": "Wydad AC", // 客队名称
  180. // "logo": "https://media.api-sports.io/football/teams/968.png", // 客队logo地址
  181. // "winner": true // 是否获胜:true(半场暂时领先)
  182. // }
  183. // },
  184. // // 进球数(当前已产生的总进球数)
  185. // "goals": {
  186. // "home": 0, // 主队进球数
  187. // "away": 1 // 客队进球数
  188. // },
  189. // // 比分详情(不同时段的比分)
  190. // "score": {
  191. // "halftime": { // 半场比分
  192. // "home": 0, // 主队半场进球
  193. // "away": 1 // 客队半场进球
  194. // },
  195. // "fulltime": { // 全场比分(null表示赛事未结束)
  196. // "home": null,
  197. // "away": null
  198. // },
  199. // "extratime": { // 加时赛比分(null表示无加时/未进行)
  200. // "home": null,
  201. // "away": null
  202. // },
  203. // "penalty": { // 点球大战比分(null表示无点球/未进行)
  204. // "home": null,
  205. // "away": null
  206. // }
  207. // }
  208. }