From 84a5fb43f5d9b7c4fa702c4d978582a821d4c04a Mon Sep 17 00:00:00 2001 From: hajimi Date: Fri, 10 Jul 2026 00:46:43 +0800 Subject: [PATCH] deploy: auto commit server changes 2026-07-10 00:46:43 --- .../controller/match/MatchOddsController.php | 14 ++ .../adminapi/lists/match/MatchOddsLists.php | 218 ++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 server/app/adminapi/controller/match/MatchOddsController.php create mode 100644 server/app/adminapi/lists/match/MatchOddsLists.php diff --git a/server/app/adminapi/controller/match/MatchOddsController.php b/server/app/adminapi/controller/match/MatchOddsController.php new file mode 100644 index 0000000..d83eca8 --- /dev/null +++ b/server/app/adminapi/controller/match/MatchOddsController.php @@ -0,0 +1,14 @@ +dataLists(new MatchOddsLists()); + } +} diff --git a/server/app/adminapi/lists/match/MatchOddsLists.php b/server/app/adminapi/lists/match/MatchOddsLists.php new file mode 100644 index 0000000..3452104 --- /dev/null +++ b/server/app/adminapi/lists/match/MatchOddsLists.php @@ -0,0 +1,218 @@ +buildQuery() + ->field('id,source_site,source_url,source_match_id,source_parent_id,source_league_id,source_event_id,sport_type,show_type,odds_type,league_name,match_time_text,home_team,away_team,strong_side,more_count,is_running,handicap_line,handicap_home_odds,handicap_away_odds,total_line,total_over_odds,total_under_odds,home_win_odds,draw_odds,away_win_odds,half_handicap_line,half_home_win_odds,half_draw_odds,half_away_win_odds,create_time,update_time') + ->limit($this->limitOffset, $this->limitLength) + ->order('update_time', 'desc') + ->order('id', 'desc') + ->select() + ->toArray(); + + foreach ($lists as &$item) { + $item['source_site_text'] = self::formatSourceSite((string) ($item['source_site'] ?? '')); + $item['show_type_text'] = self::formatShowType((string) ($item['show_type'] ?? '')); + $item['sport_type_text'] = self::formatSportType((string) ($item['sport_type'] ?? '')); + $item['create_time_text'] = self::formatTime((int) ($item['create_time'] ?? 0)); + $item['update_time_text'] = self::formatTime((int) ($item['update_time'] ?? 0)); + $item['has_odds'] = self::hasOdds($item) ? 1 : 0; + $item['market_count'] = self::marketCount($item); + } + unset($item); + + return $lists; + } + + public function count(): int + { + return $this->buildQuery()->count(); + } + + public function extend(): array + { + $sourceSites = MatchOdds::where('source_site', '<>', '') + ->distinct(true) + ->column('source_site'); + + $sourceOptions = []; + foreach ($sourceSites as $sourceSite) { + $sourceSite = (string) $sourceSite; + $sourceOptions[] = [ + 'label' => self::formatSourceSite($sourceSite), + 'value' => $sourceSite, + ]; + } + + return [ + 'source_options' => $sourceOptions, + ]; + } + + protected function buildQuery() + { + $query = MatchOdds::query(); + + $sourceSite = $this->normalizeScalarParam('source_site'); + if ($sourceSite !== '') { + $query->where('source_site', $sourceSite); + } + + $showType = $this->normalizeScalarParam('show_type'); + if ($showType !== '') { + $query->where('show_type', $showType); + } + + $sportType = $this->normalizeScalarParam('sport_type'); + if ($sportType !== '') { + $query->where('sport_type', $sportType); + } + + $leagueName = $this->normalizeScalarParam('league_name'); + if ($leagueName !== '') { + $query->where('league_name', 'like', '%' . addcslashes($leagueName, '\\%_') . '%'); + } + + $keyword = $this->normalizeScalarParam('keyword'); + if ($keyword !== '') { + $likeKeyword = '%' . addcslashes($keyword, '\\%_') . '%'; + $query->where(function ($query) use ($likeKeyword) { + $query->where('league_name', 'like', $likeKeyword) + ->whereOr('home_team', 'like', $likeKeyword) + ->whereOr('away_team', 'like', $likeKeyword) + ->whereOr('source_match_id', 'like', $likeKeyword) + ->whereOr('match_time_text', 'like', $likeKeyword); + }); + } + + $hasOdds = $this->params['has_odds'] ?? '1'; + if ((string) $hasOdds === '1') { + $this->applyHasOddsWhere($query); + } + + return $query; + } + + protected function normalizeScalarParam(string $name): string + { + $value = $this->params[$name] ?? ''; + if (!is_scalar($value)) { + return ''; + } + return trim((string) $value); + } + + protected function applyHasOddsWhere($query): void + { + $query->where(function ($query) { + foreach (self::oddsFields() as $index => $field) { + if ($index === 0) { + $query->where($field, '<>', ''); + continue; + } + $query->whereOr($field, '<>', ''); + } + }); + } + + protected static function hasOdds(array $item): bool + { + foreach (self::oddsFields() as $field) { + if (trim((string) ($item[$field] ?? '')) !== '') { + return true; + } + } + return false; + } + + protected static function marketCount(array $item): int + { + $count = 0; + if ( + trim((string) ($item['home_win_odds'] ?? '')) !== '' + || trim((string) ($item['draw_odds'] ?? '')) !== '' + || trim((string) ($item['away_win_odds'] ?? '')) !== '' + ) { + $count++; + } + if ( + trim((string) ($item['handicap_home_odds'] ?? '')) !== '' + || trim((string) ($item['handicap_away_odds'] ?? '')) !== '' + ) { + $count++; + } + if ( + trim((string) ($item['total_over_odds'] ?? '')) !== '' + || trim((string) ($item['total_under_odds'] ?? '')) !== '' + ) { + $count++; + } + if ( + trim((string) ($item['half_home_win_odds'] ?? '')) !== '' + || trim((string) ($item['half_draw_odds'] ?? '')) !== '' + || trim((string) ($item['half_away_win_odds'] ?? '')) !== '' + ) { + $count++; + } + return $count; + } + + protected static function oddsFields(): array + { + return [ + 'home_win_odds', + 'draw_odds', + 'away_win_odds', + 'handicap_home_odds', + 'handicap_away_odds', + 'total_over_odds', + 'total_under_odds', + 'half_home_win_odds', + 'half_draw_odds', + 'half_away_win_odds', + ]; + } + + public static function formatSourceSite(string $sourceSite): string + { + $map = [ + 'hg' => '滚球', + ]; + return $map[$sourceSite] ?? ($sourceSite !== '' ? strtoupper($sourceSite) : '未知平台'); + } + + public static function formatShowType(string $showType): string + { + $map = [ + 'live' => '滚球盘', + 'today' => '今日盘', + 'early' => '早盘', + ]; + return $map[$showType] ?? ($showType !== '' ? $showType : '未知盘口'); + } + + public static function formatSportType(string $sportType): string + { + $map = [ + 'FT' => '足球', + 'BK' => '篮球', + ]; + return $map[$sportType] ?? ($sportType !== '' ? $sportType : '未知'); + } + + protected static function formatTime(int $timestamp): string + { + if ($timestamp <= 0) { + return ''; + } + return date('Y-m-d H:i:s', $timestamp); + } +}