1. Cron Make File
DATA SPORT
  • DATABASE-SPORT
    • Tổng quan
    • Logic
      • Logic tổng thể
    • Projects
      • Yêu cầu hệ thống
      • Architecture
        • Database
    • Public APi
      • Tổng quan
    • Cron Make File
      • Tổng quan
  • GOLANG-THESPORT
    • Tổng quan
    • Architecture
      • System
      • Database
      • Source Code
    • Development
      • Local
      • Production
  • GOLANG-KSPORT
    • Tổng quan
    • Architecture
      • System
      • Database
      • Source Code
    • Development
      • Production
  • CRONJOB-LARAVEL
    • Tổng quan
    • Logic
      • Logic tổng thể
    • Projects
      • Yêu cầu hệ thống
      • Architecture
        • System
        • Source code
        • Database
      • Development
        • Dev
        • Production
      • Public API
        • Common API
          • League & Cup Profile (Basic)
          • Schedule & Results (Basic)
          • Match Modify Record
          • List of Countries
          • List of Bookmakers
          • Configuration instructions
        • Live animation
          • Configuration instructions
          • Schedule & Results
        • Live Data
          • Livescores for Today
          • Livescores Changes
          • Schedule & Results
          • Schedule Changes
          • Events
          • Stats
          • Corner
          • Lineups
          • Injury
          • Match List of Live Text
          • Live Text
          • Transfer
        • Profile
          • League & Cup Profile
          • Subleague Profile
          • Cup Stage Profile
          • Team Profile
          • Team Profile Copy
          • Team Profile for Search
          • Player Profile
          • Player Profile for Search
          • Referee Profile
          • Teamlist with Player Profile
        • Stats
          • Matches Analysis
          • List of Player Stats (Match)
          • Player Stats (Match)
          • List of Player Stats (League & Cup)
          • Player Stats (League & Cup)
          • League Standing (Get Subleague)
          • League Standing
          • Cup Standing
          • Top Scorer
          • FIFA Ranking
        • Odds (18 bookmakers)
          • Pre-match and In-play Odds (Main)
          • Live Odds Changes (Main)
          • Historical Odds (Main)
          • Future Odds (Main)
          • Pre-match and In-play Odds (All)
          • Live Odds Changes (All)
          • Historical Odds (All)
          • Future Odds (All)
          • European Odds (Halftime)
          • In-play Odds
          • In-play Odds (Halftime)
          • Odd Modify Record
        • European Odds (200+ Bookmakers)
          • European Odds (200+ Bookmakers)
        • Other Odds
          • Outrights
          • First/Last Team To Score (pre-match)
          • Goals Odd/Even (pre-match)
          • Goals Odd/Even (In-play)
          • Number of Goals in Match (pre-match)
          • Number of Goals in Match (In-play)
          • Half Time/Full Time (pre-match)
          • Half Time/Full Time (In-play)
          • Correct Score (pre-match)
          • Correct Score (In-play)
          • Half Time Correct Score (pre-match)
          • Half Time Correct Score (In-play)
          • Handicap Corners (pre-match)
          • Handicap Corners (In-play)
          • Total Corners (pre-match) - Tổng phạt góc trước trận đấu: First Odds
          • Total Corners (In-play) - Tổng số quả phạt góc (Trong trận) - Run Odds
          • Double Chance(pre-match)
          • EuroHandicap(pre-match)
  • GOLANG-WEBSOCKET
    • Tổng Quan
    • Logic
      • Logic tổng thể
    • Projects
      • Yêu cầu hệ thống
      • Architecture
        • System
        • Source code
      • Development
        • Dev
        • Production
      • Public API
        • API
  • ADMIN-BANNER
    • Tổng quan
    • Logic
      • Logic tổng thể
    • Projects
      • Architecture
        • System
        • Source Code
      • Development
        • Develop
        • Production
      • Public API
        • API
      • Database
        • Cấu trúc Database
      • Admin FE
        • HƯỚNG DẪN CÀI ĐẶT MÔI TRƯỜNG DỰ ÁN SPORT ADMIN
        • Hướng dẫn Đăng nhập
        • QUẢN LÝ SITE (SITE MANAGEMENT)
        • QUẢN LÝ GIẢI ĐẤU (LEAGUE MANAGEMENT)
        • QUẢN LÝ NHÀ CUNG CẤP (SUPPLIER MANAGEMENT)
        • TIP & CHUYÊN GIA - TAB QUẢN LÝ TIPS (TIPS MANAGEMENT)
        • WHITELIST
        • QUẢN LÝ MINIGAME (MINIGAME MANAGEMENT)
        • TRAFFIC REPORT
        • TOOLS - RAPID DATA
        • TOOLS - LIVE SITES
        • TOOLS - SUPPLIERS
        • THEME / PLUGIN
        • NGƯỜI DÙNG - PHÂN QUYỀN VÀ HIỂN THỊ (PERMISSION & DISPLAY MANAGEMENT)
        • QUẢN LÝ NGƯỜI DÙNG (USER MANAGEMENT)
        • NGƯỜI DÙNG - QUẢN LÝ NHÓM QUYỀN (ROLE GROUP MANAGEMENT)
  1. Cron Make File

Tổng quan

LIST#

TênCommandThời gian mỗi cronFile Kết quả
1change-enfootball:make-file:change-eMỗi 2 giâyLocal:

/public/gf/data/change_en.xml

S3:

gf/data/change_en.xml
---------------
2Change Conerfootball:make-file:ch-cornerMỗi 1 phútLocal:

/public/gf/data/ch_sbCorner.xml

S3:

gf/data/ch_sbCorner.xml
---------------
3Tổng hợp thông tin gócfootball:make-file:cornersMỗi 5 phútLocal:

public/gf/data/sbCorner.js

S3:

gf/data/sbCorner.js
---------------
4Dữ liệu kèo của những trận đã kết thúcfootball:make-file:finish-oddsMỗi 4 phútLocal: public/gf/data/finish/goal'. $companyID .'.xml

S3: 'gf/data/finish/goal'. $companyID .'.xml'
---------------
5Lịch thi đấufootball:make-file:fixtureMỗi ngày lúc 02:30public/jsdata/fixture/' . $order . '/' . $date . '_' . $lang . '.txt'
---------------
6Lịch thi đấu hôm nayfootball:make-file:fixture-todayMỗi 3 phútpublic/jsdata/fixture/' . $order . '/' . $date . '_' . $lang . '.txt'
---------------
7Tổng hợp toàn bộ odds (full + half) cho tất cả trậnfootball:make-file:home-oddsMỗi 10 giâyFile chính:

gf/data/odds/en/goal{companyId}.xml

File tạm:

gf/data/odds/en/t_goal{companyId}.xml

Local: public/gf/data/odds/en/...

S3: gf/data/odds/en/...
---------------
8Tạo file trận đấu có điều kiệnfootball:make-file:match-conditionMỗi 10 phútgf/data/condition.txt
---------------
9Chi tiết trận đấufootball:make-file:match-detailMỗi 30 giâygf/data/match/detail/{locale}.js
---------------
10Các file thống kê về giải đấufootball:make-file:leaguesMỗi giờ
---------------
11Các file thống kê về giải đấu hotfootball:make-file:hot-leagueMỗi giờ
---------------
12File danh sách trận đấufootball:make-file:match-liveMỗi 1 phútLocal:

public/gf/data/bf*{lang}1_nt.js

public/gf/data/bf*{lang}_nt.js

s3:

gf/data/bf*{lang}1_nt.js

gf/data/bf*{lang}_nt.js
---------------
13Danh sách trận đấu đã kết thúc trong 24hfootball:make-file:match-resultMỗi 4 phútLocal:

public/gf/data/finish/bf*{lang}1_nt.js

public/gf/data/finish/bf*{lang}_nt.js

s3:

gf/data/finish/bf*{lang}1_nt.js

gf/data/finish/bf*{lang}_nt.js
---------------
14Các file liên quan tới đội bóngfootball:make-file:teamMỗi giờ
---------------
15File biến động odds theo thời gian thựcfootball:make-file:run-oddsMỗi 10 giâyFile chính: runOddsData*{companyId}.txt

File tạm: t_runOddsData*{companyId}.txt
---------------
16League seasonfootball:make-file:leaguesMỗi giờjsdata/leagueseason/sea{ScladdID}.js
---------------
17Danh sách trận đấu trong giải đấufootball:make-file:leaguesMỗi giờFile: 'jsdata/matchResult/' . $season . '/s' . $sclass->sclassID . '_' . $locale . '.js';
---------------
18Thống kê kĩ thuật các đội trong giảifootball:make-file:leaguesMỗi giờFile: 'jsdata/count/' . $season . '/teamTech_' . $sclass->sclassID . '_' . $locale . '.js';
---------------
19Thống kê kĩ thuật các cầu thủ trong giảifootball:make-file:leaguesMỗi giờ'jsdata/count/' . $season . '/playertech_' . $sclass->sclassID . '_' . $locale . '.js'
---------------
20Dữ liệu đối đầu trong giảifootball:make-file:leaguesMỗi giờFile: 'jsdata/contrast/' . $season . '/ct_' . $sclass->sclassID . '.js'
---------------
21Thống kê kèo châu Á trong giảifootball:make-file:leaguesMỗi giờFile: 'jsdata/letgoal/' . $currentSeason . '/l' . $sclass->sclassID . '_' . $locale . '.js'
---------------
22Thống kê kèo tài xỉu trong giảifootball:make-file:leaguesMỗi giờFile: 'jsdata/bigsmall/' . $currentSeason . '/bs' . $sclass->sclassID . '_' . $locale . '.js'
---------------
23Thống kê kết quả nửa hiệpfootball:make-file:leaguesMỗi giờFile: 'jsdata/allHalf/' . $season . '/ah' . $sclass->sclassID . '_' . $locale . '.js'
---------------
24Kết quả và bảng xếp hạng cho các giải đấu kiểu Cúpfootball:make-file:leaguesMỗi giờFile: 'jsdata/count/' . $season . '/teamTech_' . $sclass->sclassID . '_' . $locale . '.js';
---------------
25Thống kê tần suất các tỉ sốfootball:make-file:leaguesMỗi giờFile: 'jsdata/boDanDistri/' . $season . '/bd' . $sclass->sclassID . '_' . $locale . '.js'
---------------
26Thống kê thời gian ghi bàn từng đội trong giảifootball:make-file:leaguesMỗi giờFile: 'jsdata/timeDistri/' . $season . '/td' . $sclass->sclassID . '_' . $locale . '.js'
---------------
27Kết quả và BXH của subleaguefootball:make-file:leaguesMỗi giờFile:'jsdata/matchResult/' . $season . '/s' . $sclass->sclassID . '_' . $subSclass->subSclassID . '_' . $locale . '.js'
---------------
28Tổng hợp các file kèo trực tuyếnfootball:odds-save-file-commandMỗi 2sgf/data/odds/en/runOddsData*{companyId}.txt

gf/data/odds/en/t_runOddsData*{companyId}.txt

gf/data/odds/en/chrunOddsData{companyId}.txt

gf/data/odds/en/chodds_new{companyId}.txt

gf/data/odds/en/ch_odds_new_8_31_23.txt
---------------

Danh sách command#

Change en#

- Concept
Tạo file XML change_en.xml chứa danh sách các trận có thay đổi
Dùng để sync dữ liệu thay đổi trận đấu ra ngoài hệ thống
Có flag refresh để báo client có cần reload hay không
- Require (hệ thống, cache, env,..)
Cache:
schedule_changes (danh sách trận thay đổi)
ENV:
DISK (local hoặc s3)
Function phụ:
convertDataChangeEn()
updateS3File()
Laravel:
Cache
File
Log
PHP:
SimpleXMLElement
- Params
$data (optional)
Không sử dụng thực tế (bị override bởi cache)
- Logic
Lấy dữ liệu từ cache schedule_changes
Kiểm tra:
Nếu có trận status = -1 → refresh = 1
Ngược lại → refresh = 0
Khởi tạo XML:
Root: <c refresh="" time="">
Duyệt từng trận:
Convert bằng convertDataChangeEn
Add vào XML node <h>
Ghi file:
Nếu DISK = s3
Upload lên S3 qua updateS3File
Ngược lại:
Tạo folder nếu chưa có
Ghi file local bằng File::put
Return:
true nếu thành công
false nếu lỗi (log error)
- Các file kết quả
Local:
/public/gf/data/change_en.xml
S3:
gf/data/change_en.xml

Change corner#

- Concept
Tạo file XML ch_sbCorner.xml chứa dữ liệu:
Kèo phạt góc (Over/Under)
Số lượng corner trận đấu
Event corner theo thời gian
Dùng cho hệ thống live (inplay) hiển thị corner + odds
- Require (hệ thống, cache, env,..)
Cache:
corners_ou_inplay (kèo OU phạt góc)
football_corner (data corner + event)
ENV:
DISK (local hoặc s3)
Function phụ:
removeAndReverse()
updateS3File()
Laravel:
Cache
File
PHP:
SimpleXMLElement
- Params
Không có params (function static)
- Logic
Lấy dữ liệu từ cache:
corners_ou_inplay
football_corner
Khởi tạo mảng $datas gồm:
a: rỗng (placeholder)
d: kèo OU corner
o: tổng corner trận
e: event corner
Xử lý dữ liệu:
Với corners_ou_inplay:
Format:

matchId ^ over ^ totalCorners ^ under
Đẩy vào d
Với football_corner:
Tổng corner:

matchId ^ homeCorner ^ awayCorner ^ homeHalfCorner ^ awayHalfCorner

→ đẩy vào o
Event:

matchId ^ teamId ^ minute ^ eventId ^ overtime

→ đẩy vào e
Tạo XML:
Root:

<c refresh="1" time="">
Node:
<a>: empty
<d>: danh sách odds
<o>: tổng corner
<e>: event
Ghi file:
Nếu DISK = s3
Upload: gf/data/ch_sbCorner.xml
Ngược lại:
Tạo folder nếu chưa có
Ghi file local
Return:
true
- Các file kết quả
Local:
/public/gf/data/ch_sbCorner.xml
S3:
gf/data/ch_sbCorner.xml

Chi tiết thông tin phạt góc#

- Concept
Sinh dữ liệu corner (phạt góc) realtime cho các trận trong ngày
Bao gồm:
Kèo OU corner
Tổng corner trận (full + half)
Danh sách event corner theo phút
Output dạng JS string (sCornerData) để frontend sử dụng
- Require (hệ thống, cache, env,..)
Database:
bảng schedule (match)
bảng corners OU odds
bảng corner events
Repository:
scheduleRepo
CornersOURepo
CornerEventsRepo
ENV:
DISK (local / s3)
Function:
updateS3File()
matchHomeCorner()
Storage:
local file system hoặc S3
- Params
Không có param input (function nội bộ)
- Logic
Lấy danh sách trận hôm nay (getMatchToday)
Extract danh sách ScheduleID
Query:
OU odds theo CompanyID = 8
Corner events theo ScheduleID
Với mỗi trận:
Lấy OU odds:
First odds
Real odds
Tính:
Tổng corner full time (home / away)
Tổng corner hiệp 1
Duyệt event:
Xác định team (home / away)
Đếm số corner
Lưu danh sách event (teamId, minute, eventId, overtime)
Build string:

sCornerData[matchId] = "hdp^ou^total,totalHalf^eventList"
Ghi file:
Nếu DISK = s3 → upload S3
Ngược lại → lưu local
- Các file kết quả
Local:
public/gf/data/sbCorner.js
S3:
gf/data/sbCorner.js
Format:

sCornerData[12345] = "..., ..., ...";

Chi tiết kèo trận đã kết thúc#

- Concept
Sinh file XML kèo trận đã kết thúc (yesterday matches)
Tổng hợp 3 loại odds:
Handicap (LetGoal)
Over/Under (BigSmall)
1x2 (Standard)
Output theo từng CompanyID
- Require (hệ thống, cache, env,..)
Database:
bảng schedule (match)
bảng MultiLetGoal
bảng MultiTotalScore
bảng Standard
Repository:
scheduleRepo
MultiLetGoalRepo
MultiTotalScoreRepo
StandardRepo
Function:
createXML()
matchFinishOddPath()
updateS3File()
ENV:
DISK (local / s3)
Storage:
local filesystem hoặc S3
- Params
Không có param input (cron/internal function)
- Logic
Lấy danh sách trận hôm qua (getMatchYesterday)
Nếu không có trận → return false
Extract danh sách ScheduleID
Query dữ liệu:
Handicap odds (MultiLetGoal)
Over/Under odds (MultiTotalScore)
1x2 odds (Standard)
Group data:
theo CompanyID + ScheduleID
sort theo Num desc (lấy odds mới nhất)
Lấy danh sách tất cả CompanyID từ 3 nguồn
Với mỗi CompanyID:
Duyệt từng trận:
Lấy odds mới nhất của:
LetGoal
Standard
Over/Under
Nếu có ít nhất 1 loại odds → add vào list
Map dữ liệu thành array chuẩn (matchOdds)
Generate XML:
gọi createXML(matchOdds, matchIds, [])
Ghi file:
Nếu DISK = s3 → upload S3
Ngược lại → lưu local
- Các file kết quả
Format:
XML chứa danh sách odds của các trận đã kết thúc
Storage:
Local: public/gf/data/finish/goal'. $companyID .'.xml
S3: 'gf/data/finish/goal'. $companyID .'.xml'

Lịch thi đấu#

- Concept
Sinh lại dữ liệu fixture (lịch thi đấu) theo nhiều ngôn ngữ
Bao phủ:
7 ngày trước
7 ngày sau
Đồng thời dọn dẹp file cũ (> 7 ngày)
Output dạng file (JS/XML tuỳ hệ thống)
- Require (hệ thống, cache, env,..)
Service:
MatchFixtureService
generate_data(date, type, lang)
Function:
makeFile(date, content, type, lang)
deleteFile(date, type, lang)
ENV:
filesystem (local / s3 tuỳ config trong makeFile)
Không dùng cache trực tiếp
- Params
Không có param input (cron job / batch job)
- Logic
Define:
languages = ['th', 'vn', 'en']
current date
Với mỗi lang:
Loop 7 ngày trước:
Tính date - i
Generate:
league
time
Ghi file qua makeFile()
Loop 7 ngày sau:
Tính date + i
Generate:
league
time
Ghi file qua makeFile()
Xóa dữ liệu cũ:
date - 8 days
Xóa:
league
time
- Các file kết quả
File theo cấu trúc:
{date}_{type}_{lang}
Type:
league
time
Ngôn ngữ:
th, vn, en
Storage:
public/jsdata/fixture/' . $order . '/' . $date . '_' . $lang . '.txt'
Lifecycle:
Tạo mới / ghi đè: ±7 ngày
Xóa: > 7 ngày (ngày thứ 8)

Lịch thi đấu hôm nay#

- Concept
Sinh dữ liệu fixture trong ngày hiện tại (today)
Hỗ trợ đa ngôn ngữ
Generate đồng thời:
league (theo giải đấu)
time (theo thời gian)
Dữ liệu được generate 1 lần (all) rồi tách ra từng loại
- Require (hệ thống, cache, env,..)
Service:
MatchFixtureService
generate_data_all(date, orderBys, lang)
Function:
makeFile(date, content, type, lang)
ENV:
filesystem (local / s3)
Config:
orderBys (league, time)
- Params
Không có param input (cron job / batch job)
- Logic
Lấy ngày hiện tại (date)
Define:
languages = ['th', 'vn', 'en']
orderBys:
league = true
time = true
Với mỗi lang:
Gọi:
generate_data_all(date, orderBys, lang)
Nhận dữ liệu:
league
time
Nếu tồn tại:
league → gọi makeFile()
time → gọi makeFile()
- Các file kết quả
File theo format:
{date}_league_{lang}
{date}_time_{lang}
Ngôn ngữ:
th, vn, en
Storage:
Local hoặc S3 (tuỳ config trong makeFile)
Đặc điểm:
Chỉ xử lý ngày hiện tại
Dữ liệu được generate tổng rồi tách, tối ưu performance

Tổng hợp toàn bộ odds (full + half) cho tất cả trận#

- Concept
Sinh file XML tổng hợp toàn bộ odds (full + half) cho tất cả trận
Gom dữ liệu từ:
Cache nội bộ
API Ksport (/api/odds/main)
Output theo từng CompanyID
Bao gồm các loại kèo:
Handicap (ah)
1x2
Over/Under (ou)
Half odds (ahh, ouh, 1x2h)
- Require (hệ thống, cache, env,..)
Cache:
odds_main
standard_half
API:
getDataOddsChangeKsport()
Function:
createXML()
updateS3File()
removeAndReverse()
ENV:
DISK (local / s3)
Storage:
local filesystem hoặc S3
Logging:
Log::error()
- Params
Không có param input (cron job)
- Logic
Lấy dữ liệu:
odds từ cache (odds_main)
odds half (standard_half)
dữ liệu bổ sung từ Ksport API
Merge dữ liệu:
append Ksport data vào cache (trừ standard_half)
Parse từng loại odds:
handicap → ah
europe → 1x2
over/under → ou
handicap half → ahh
over/under half → ouh
1x2 half → 1x2h
Group dữ liệu:
theo CompanyID
theo matchId
Chuẩn hoá dữ liệu:
map về format chung matchOdds[]
convert matchId qua removeAndReverse()
set flag (active odds)
Với mỗi CompanyID:
build danh sách:
matchOdds
matchIds
Generate XML:
file chính: goal{companyId}.xml
file temp: t_goal{companyId}.xml (empty)
Ghi file:
Nếu DISK = s3 → upload S3
Ngược lại → lưu local
Handle lỗi:
log error + return false
- Các file kết quả
File chính:
gf/data/odds/en/goal{companyId}.xml
File tạm:
gf/data/odds/en/t_goal{companyId}.xml
Format:
XML chứa danh sách odds theo match
Storage:
Local: public/gf/data/odds/en/...
S3: gf/data/odds/en/...

Tạo file trận đấu có điều kiện#

Concept
Sinh file condition (chuỗi điều kiện/streak) cho các trận đấu
Phân loại trận theo chuỗi phong độ (win/loss/...) của đội
Lưu dưới dạng text (format đặc biệt ! và ^)
Require (hệ thống, cache, env,...)
scheduleRepo
getMatchCondition()
getMatchExpired()
getSchedulesCondition()
Function: countStreak()
File system:
File::exists, File::get, File::put
Path:
$this->conditionPath()
Params
Không có params input
Logic
Lấy danh sách trận cần xử lý (getMatchCondition)
Khởi tạo mảng conditionTotal gồm 10 nhóm condition
Nếu file đã tồn tại:
Đọc file → parse theo ! → ^ → ,
Lấy danh sách ScheduleID đã tồn tại
Lọc bỏ các trận đã expired khỏi dữ liệu cũ
Duyệt từng trận mới:
Nếu đã tồn tại trong file → skip
Lấy lịch sử 20 trận gần nhất của home/away
Tính streak bằng countStreak
Merge thành scheduleIndex
Phân loại condition:
Index 0-6:
≥3 → group[0]
≥5 → group[1]
≥7 → group[2]
Index 7-9:
≥60 → group[0]
≥65 → group[1]
≥75 → group[2]
Build lại nội dung file:
join , → join ^ → join !
Ghi lại file
Các file kết quả
File condition:
gf/data/condition.txt

Chi tiết trận đấu đang diễn ra#

Concept
Generate file chi tiết trận đấu đang diễn ra (event + statistics)
Output dạng JS (rq[], tc[])
Hỗ trợ multi-language
Require (hệ thống, cache, env,...)
ScheduleRepo::getSchedulePlaying()
Quan hệ:
detailResults
teamTechStatistics
Model:
TeamTechStatistics::STATISTICS
Helper:
translateData()
ENV:
DISK
Storage:
File, updateS3File
Path:
matchDetailPath(locale)
Params
Không có
Logic
Lấy danh sách trận đang diễn ra:
schedules = getSchedulePlaying()
Loop từng locale:
en, vn, th, thai
Với mỗi locale:
Khởi tạo:
events = ''
statistics = ''
indexEvents = 0
indexStatistics = 0
Duyệt từng trận:
Event (generateDataEvent)
Lấy detailResults → sort theo HappenTime
Map locale:
thai → th
th → en
Loop từng event:
Xác định:
teamIndex (home=1, away=0)
Kind, HappenTime
playerName → translateData
Format:

rq[i] = "scheduleId^teamIndex^kind^time^playerName^^^^0"
Tăng indexEvents
Statistics (generateDataStatistics)
Lấy:
homeTechStats
guestTechStats
Loop TeamTechStatistics::STATISTICS:
Lấy value home/guest
Nếu có data:

index,homeValue,guestValue
Join ; - Format:

tc[i] = "scheduleId^data"
Tăng indexStatistics
Build file content:

var rq = Array(totalEvents);
var tc = Array(totalStats);
+ events
+ statistics
+ timeGen
Lưu file:
Nếu DISK = s3 → upload S3
else:
tạo folder nếu chưa có
File::put
Các file kết quả
Theo từng ngôn ngữ:

gf/data/match/detail/{locale}.js

Các file thống kê/summary theo giải đấu(cả bình thường và hot) (league)#

Concept
Generate toàn bộ file thống kê/summary theo giải đấu (league)
Bao gồm nhiều loại file: result, tech, odds, score, goal time...
Hỗ trợ đa ngôn ngữ
Require (hệ thống, cache, env,...)
scheduleRepo::getMatchLeagueFinishedToday()
leagueRepo::getById()
sclassRepo::getAllSubSclassID()
Helper:
getIDSclassInPageDatabase()
Các service:
fileLeagueSeasonService
fileMatchResultService / fileMatchResultSubLeagueService
fileCupmatchService
fileLetGoalService
fileBigSmallService
fileAllHalfService
fileTeamTechService
filePlayerTechService
fileContrastService
fileScoreService
fileGoalTimeService
Params
id (optional): filter theo leagueID
season (optional): mùa giải
Logic
Nếu có id → set_time_limit(0)
Lấy danh sách trận đã kết thúc hôm nay:
listMatch = getMatchLeagueFinishedToday()
Lấy danh sách league:
sclassIds từ match
Filter theo getIDSclassInPageDatabase()
Nếu có id → chỉ xử lý 1 league
Loop từng leagueID:
Lấy thông tin league:
leagueRepo->getById()
Xác định:
kind (league/cup)
subSclass
matchSeason
Loop từng locale:
vn, en, th
Case 1: Cup (kind == 2)
fileLeagueSeasonService->makeFile
fileCupmatchService->makeFile
fileLetGoalService->makeFile
fileBigSmallService->makeFile
fileAllHalfService->makeFile
Case 2: League (kind != 2)
Always:
fileLeagueSeasonService->makeFile
Nếu có sub league:
Lấy danh sách sub:
getAllSubSclassID
Loop từng sub:
fileMatchResultSubLeagueService->makeFile
Nếu không có sub:
fileMatchResultService->makeFile
Các file còn lại:
fileTeamTechService->makeFile
filePlayerTechService->makeFile
fileContrastService->makeFile
fileLetGoalService->makeFile
fileBigSmallService->makeFile
fileAllHalfService->makeFile
fileScoreService->makeFile
fileGoalTimeService->makeFile
Nếu có id:
echo log success
Các file kết quả
Theo từng league + season + locale:
League season
Match result / sub league result
Cup match (nếu là cup)
Team tech / Player tech
Contrast
Odds:
LetGoal
BigSmall
AllHalf
Score
GoalTime

Danh sách trận đấu trong ngày#

Concept
Tạo file JS hiển thị danh sách trận đấu trong ngày
Hỗ trợ đa ngôn ngữ: en, vn, th, thai
Sắp xếp theo:
thời gian
giải đấu
trạng thái + odds
Output gồm:
Match (A)
League (B)
Country (C)
Require
Repo:
scheduleRepo (match + odds)
leagueRepo
refereeRepo
sclassInfoRepo
Helper:
getDataHotLeagueUrl
getDataPinLeagueUrl
translateData
getLogoTeam
updateFileWithBackup / updateS3File
ENV:
DISK (local | s3)
Params
Không có (cron job)
Logic
Lấy danh sách:
match today
match có odds
Lấy:
league
country
Merge locale từ:
default + hot league
Loop từng locale:
Chuẩn hóa:
thai → th
Generate 3 file:
sort theo time
sort theo league
sort theo odds
Sorting:
Theo Sclass:
top match
pin league
hot league
còn lại
Theo odds/state:
pin live
hot live
live
pin upcoming
hot upcoming
upcoming
finished
other
Generate dữ liệu:
Match:
validate team
translate tên team theo locale
build:
time (UTC)
score
card
corner
referee
logo
League:
translate tên
check loại (cup / league)
build link detail
Country:
translate tên
Build JS:
var A = [...] // match
var B = [...] // league
var C = [...] // country
ShowBf();
Validate:
phải kết thúc bằng ShowBf();
Output
Local:
public/gf/data/bf_{lang}1_nt.js
public/gf/data/bf_{lang}_nt.js
s3:
gf/data/bf_{lang}1_nt.js
gf/data/bf_{lang}_nt.js

Danh sách trận đấu đã kết thúc trong 24h#

Concept
Tạo file JS kết quả trận đấu hôm qua
Hỗ trợ đa ngôn ngữ: th, vn, en, thai
Sắp xếp:
theo thời gian
theo league (ưu tiên hot)
Require
Repo:
scheduleRepo (getMatchYesterday)
leagueRepo
Function:
generateFile
sortMatchesBySclassID
sortHotLeague
Helper:
updateS3File
File (Laravel)
ENV:
DISK (s3 | local)
Params
Không có
Logic
Lấy danh sách match hôm qua
Nếu rỗng → return false
Lấy:
league từ SclassID
country từ league
Loop từng locale:
Generate 2 file:
1. Sort theo Time
sortMatchesBySclassID(listMatch)
generateFile(...)
2. Sort theo League
sortMatchesBySclassID(listMatchSortByLeague)
sortHotLeague(...)
generateFile(...)
Ghi file:
Nếu S3:
updateS3File (2 file)
Nếu local:
tạo folder nếu chưa có
File::put
Output
Local:
public/gf/data/finish/bf_{lang}1_nt.js
public/gf/data/finish/bf_{lang}_nt.js
s3:
gf/data/finish/bf_{lang}1_nt.js
gf/data/finish/bf_{lang}_nt.js

Các file liên quan tới đội bóng#

Concept
Tạo tất cả dữ liệu liên quan đến đội bóng (team)
Áp dụng cho các trận đấu đã kết thúc trong ngày
Mỗi đội sẽ có nhiều loại dữ liệu khác nhau (thông tin, chi tiết, kèo cược)
Require
Dữ liệu trận đấu đã kết thúc trong ngày
Thông tin đội bóng
Thông tin giải đấu (league / sclass)
Các service tạo file:
thông tin đội
chi tiết đội
kèo chấp (let goal)
kèo tài xỉu (big small)
Params
Có thể truyền vào 1 team cụ thể để chỉ tạo file cho team đó
Nếu không truyền → chạy cho tất cả team trong ngày
Logic
Lấy danh sách tất cả trận đấu đã kết thúc trong ngày
Từ danh sách trận:
lấy toàn bộ đội chủ nhà
lấy toàn bộ đội khách
gộp lại thành danh sách team duy nhất (không trùng)
Nếu có truyền team ID:
chỉ xử lý team đó
Với mỗi team:
Kiểm tra team có tồn tại hay không
nếu không → bỏ qua
Xác định mùa giải (season):
nếu team có thông tin giải → lấy season hiện tại
nếu không → dùng mặc định (năm trước - năm nay)
Lặp qua từng ngôn ngữ:
tiếng Anh (en)
tiếng Việt (vn)
tiếng Thái (th)
Với mỗi ngôn ngữ, tạo các file sau:
1. File chi tiết đội (Team Detail)
chứa thông tin chi tiết về các trận của đội
2. File kèo chấp (Let Goal)
chỉ tạo nếu team có thuộc giải đấu
chứa dữ liệu kèo chấp của đội
3. File kèo tài xỉu (Big Small)
chỉ tạo nếu team có thuộc giải đấu
chứa dữ liệu tài xỉu
4. File thông tin đội (Team Info)
chứa thông tin cơ bản của đội (tên, mô tả, …)
Nguyên tắc tạo file
Không phải lúc nào cũng tạo lại file
Chỉ tạo khi:
file chưa tồn tại
hoặc file không phải được tạo trong ngày hôm nay
Output
Mỗi team sẽ có nhiều file tương ứng với từng ngôn ngữ
Bao gồm:
thông tin đội
chi tiết đội
kèo chấp
kèo tài xỉu

File biến động odds theo thời gian thực#

Concept
Tạo file run odds (odds realtime) cho từng nhà cái
Dữ liệu phản ánh biến động odds theo thời gian thực
Có cơ chế so sánh với dữ liệu cũ để:
Giữ giá trị trước đó
Hỗ trợ hiển thị thay đổi trên frontend
Require
Có sẵn dữ liệu odds trong cache
Có API Ksport để bổ sung odds mới
Có thể đọc file odds cũ (local hoặc S3)
Hệ thống lưu trữ:
Local hoặc S3
Param
Không có input trực tiếp (cronjob / auto run)
Dữ liệu sử dụng nội bộ:
odds_main (cache)
standard_half (cache)
Ksport odds API
File run odds cũ
DISK config (local | s3)
Logic
• Gộp dữ liệu odds
Lấy odds từ cache
Merge thêm odds từ API Ksport
Bỏ qua một số loại đặc biệt (xử lý riêng)
• Chuẩn hóa dữ liệu
Parse dữ liệu raw thành dạng cấu trúc
Gom nhóm theo:
Match ID
Company ID
• Đọc dữ liệu cũ
Load file run odds trước đó
Parse thành:
Handicap
1x2
Over/Under
Odds hiệp 1
→ Dùng để so sánh và giữ giá trị cũ
• Build dữ liệu odds
Duyệt theo từng nhà cái
Với mỗi trận:
Nếu có odds:
Ghi giá trị hiện tại
Nếu trạng thái = đang thay đổi:
Lấy thêm giá trị cũ
Nếu không có:
Ghi dữ liệu rỗng
• Lọc dữ liệu
Chỉ giữ trận có ít nhất 1 loại odds hợp lệ
Loại bỏ trận không có dữ liệu
• Tạo chuỗi output
Format:
Trận: $
Nhóm odds: !
Giá trị: ,
• Ghi file
Với mỗi nhà cái:
File chính: runOddsData_{companyId}.txt
File tạm: trunOddsData{companyId}.txt
Nếu DISK = S3:
Upload file
Nếu local:
Tạo folder nếu chưa có
Ghi file
Output
File chính: runOddsData_{companyId}.txt
File tạm: trunOddsData{companyId}.txt

League season#

1. Concept
Hàm dùng để tạo một file JavaScript (.js) chứa dữ liệu của một giải đấu bóng đá.
2. Require
Laravel Framework
File facade để thao tác với file và thư mục
Hai Repository: sclassRepo và scheduleRepo
Hàm leagueSeasonPath() và updateS3File()
Biến $this->disk (có thể là 'local' hoặc 's3')
3. Parameter
$sclass: đối tượng chứa thông tin giải đấu (chủ yếu dùng sclassID)
4. Logic
Hàm chính: makeFile($sclass)
Xác định đường dẫn file và thư mục lưu trữ
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ theo 2 cách:
Nếu disk = 's3': đẩy file lên S3
Nếu lưu local:
Tạo thư mục nếu chưa có
Ghi nội dung vào file
Hàm generateFile($sclass)
Lấy danh sách mùa giải từ database
Lấy thông tin giải đấu (ID, ảnh cờ, tên)
Tạo thời gian cập nhật hiện tại
Ghép thành chuỗi JavaScript với 3 biến: arrSeason, teamLastUpdateTime, infoLeague
Hàm getArrSeason($sclass)
Query database lấy tất cả mùa giải của giải đấu
Trả về mảng các mùa giải đã trim khoảng trắng
5. File Output
File: jsdata/leagueseason/sea{sclassID}.js

Lịch thi đấu trong giải#

Concept
Hàm dùng để tạo một file JavaScript chứa thông tin tất cả các trận đấu trong giải
Require
Laravel Framework
File facade để thao tác file và thư mục
Hai Repository: ScheduleRepo và LeagueRepo (SclassRepo)
Trait: MatchPathTrait (để lấy đường dẫn file)
Model quan hệ: homeTeam, guestTeam, info
Parameter
Không có tham số (hàm makeFile() không nhận tham số)
Logic
Hàm chính: makeFile()
Lấy danh sách tất cả trận đấu hôm nay từ database (MatchState = -1)
Nếu không có trận nào thì dừng lại
Lấy danh sách giải đấu theo các trận đấu
Lấy thông tin quốc gia của các giải đấu
Gọi hàm generateFile() để tạo nội dung JS
Xác định đường dẫn file và thư mục
Tạo thư mục nếu chưa tồn tại
Ghi nội dung vào file
Hàm generateFile($listMatch, $listLeague, $listCountry)
Chuyển dữ liệu thành 3 mảng: arrMatch (A), arrLeague (B), arrCountry (C)
Tạo các biến JavaScript:
A = new Array(...) → chứa thông tin trận đấu
B = new Array(...) → chứa thông tin giải đấu
C = new Array(...) → chứa thông tin quốc gia
matchcount và sclasscount
Duyệt và gán từng phần tử vào mảng A, B, C
Các hàm phụ:
getArrMatch(): Xây dựng mảng trận đấu (rất nhiều trường: ScheduleID, đội nhà, đội khách, tỷ số, thẻ đỏ/vàng, góc, thời gian…)
getArrLeague(): Xây dựng mảng giải đấu (tên, màu, loại, link, hot league…)
getArrCountry(): Xây dựng mảng quốc gia
checkLeagueIsHot(): Xác định giải đấu hot (hiện tại đơn giản là 10 giải đầu tiên)
File Output
File: 'jsdata/matchResult/' . $season . '/s' . $sclass->sclassID . '_' . $locale . '.js';

Thống kê kỹ thuật của tất cả các đội bóng trong một giải đấu theo mùa giải.#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê kỹ thuật của tất cả các đội bóng trong một giải đấu theo mùa giải.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, TeamTechStatisticsRepo, PlayerInTeamRepo, SclassRepo, ScheduleRepo
Hàm hỗ trợ: updateS3File(), translateData()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu không truyền thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ teamTechPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = 's3': đẩy file lên S3
Nếu lưu local:
Tạo thư mục nếu chưa tồn tại
Ghi nội dung vào file
Hàm generateFile($sclass, $season, $locale)
Gọi hàm techCoutTeam() để lấy dữ liệu thống kê
Trả về chuỗi JavaScript: var techCout_Team = { ... };
Hàm techCoutTeam($sclass, $season, $locale)
Lấy danh sách TeamID và tên đội (getTid)
Lấy thống kê tổng thể (getTotal)
Lấy thống kê sân nhà (getHome)
Lấy thống kê sân khách (getGuest)
Ghép thành cấu trúc dữ liệu:
Tid: thông tin đội (ID → tên đội)
Total: thống kê tổng (key + value)
Home: thống kê sân nhà (key + value)
guest: thống kê sân khách (key + value)
Các hàm phụ:
getTid(): Lấy danh sách đội tham gia giải và tên đội (đã dịch)
getTotal(), getHome(), getGuest(): Lấy dữ liệu thống kê kỹ thuật từ repository
keys(): Trả về object định nghĩa thứ tự các chỉ số thống kê (shots, target, yellow, red, corner…)
5. File Output
File: 'jsdata/count/' . $season . '/teamTech_' . $sclass->sclassID . '_' . $locale . '.js';
Thống kê kỹ thuật của các cầu thủ trong một giải
1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê kỹ thuật của các cầu thủ trong một giải đấu theo mùa giải.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, PlayerTechStatisticsRepo, PlayerInTeamRepo, SclassRepo, ScheduleRepo, PlayerTechLeagueCupRepo
Hàm hỗ trợ: updateS3file(), translateData()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ dùng mặc định)
$locale: ngôn ngữ (dùng để dịch tên cầu thủ và đội bóng)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định đường dẫn file và thư mục từ playerTechPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra cách lưu trữ:
Nếu disk = 's3': gọi updateS3file() để đẩy lên S3
Nếu lưu local:
Tạo thư mục nếu chưa tồn tại
Ghi nội dung vào file bằng File::put()
Hàm generateFile($sclass, $season, $locale)
Gọi hàm techCoutPlayer() để lấy toàn bộ dữ liệu
Trả về chuỗi JavaScript: var techCout_Player = { ... };
Hàm techCoutPlayer($sclass, $season, $locale)
Lấy danh sách cầu thủ (Pid) và đội bóng (Tid) từ playerTechLeagueCupRepo
Lấy thống kê tổng thể (Total), sân nhà (Home) và sân khách (guest)
Ghép tất cả thành một mảng lớn với cấu trúc:
Pid: thông tin cầu thủ (ID → tên + đội)
Tid: thông tin đội bóng
Total / Home / guest: chứa key (chỉ số) và value (dữ liệu thống kê)
Các hàm phụ quan trọng:
getPidNew() / getTidNew(): Lấy thông tin cầu thủ và đội (phiên bản mới dùng PlayerTechLeagueCupRepo)
getTotalNew() / getHomeNew() / getGuestNew(): Lấy thống kê cầu thủ theo tổng/sân nhà/sân khách
keys(): Định nghĩa thứ tự các chỉ số thống kê cầu thủ (hơn 50 chỉ số: Goals, Assists, Shots, Pass, Tackle, xG, Rating…)
Lưu ý:
Code đang sử dụng phiên bản New (getXXXNew) thay vì hàm cũ.
Có một số hàm cũ bị comment lại.
5. File Output
File: 'jsdata/count/' . $season . '/playertech_' . $sclass->sclassID . '_' . $locale . '.js'

Dữ liệu đối đầu trong giải#

1. Concept
Hàm dùng để tạo file JavaScript chứa dữ liệu đối đầu và thống kê kèo châu Âu của một giải đấu theo mùa giải.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo, EuropeOddRepo, MultiLetGoalRepo
Hàm hỗ trợ: updateS3file(), translateData(), checkLogoLeague()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại của giải)
4. Logic
Hàm chính: makeFile($sclass, $season = '')
Xác định mùa giải (nếu rỗng thì dùng $sclass->Curr_matchSeason)
Lấy đường dẫn file và thư mục từ contrastPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = 's3': đẩy file lên S3 bằng updateS3file()
Nếu lưu local:
Tạo thư mục nếu chưa tồn tại
Ghi nội dung vào file
Hàm generateFile($sclass, $season)
Lấy 3 mảng dữ liệu: arrLeague, arrTeam, arrData
Tạo thời gian cập nhật cuối (lastUpdateTime)
Ghép thành chuỗi JavaScript với 4 biến:
var arrLeague = [...]
var arrTeam = [...]
var arrData = [...]
var lastUpdateTime = '...'
Các hàm phụ:
getArrLeague(): Trả về thông tin cơ bản của giải đấu (ID, tên đa ngôn ngữ, màu sắc, ảnh cờ, mùa giải)
getArrTeam(): Lấy danh sách tất cả đội bóng trong giải, bao gồm tên đội và ảnh cờ
getArrData(): Xây dựng bảng thống kê đối đầu (12 dòng × 16 cột).
Phân tích tỷ lệ kèo châu Âu (thắng/thua/hòa)
Tính toán theo các mức odds khác nhau (1.25, 1.4, ..., 2.55)
Kết hợp dữ liệu kèo châu Âu (EuropeOddRepo) và kèo chấp (MultiLetGoalRepo)
findPosition(): Tìm vị trí của tỷ lệ odds trong mảng cố định
getTotalPanlu() và getHandicapOdds(): Lấy dữ liệu tỷ lệ kèo từ database
5. File Output
File: 'jsdata/contrast/' . $season . '/ct_' . $sclass->sclassID . '.js'

Thống kê kèo châu Á trong giải#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê kèo chấp (Handicap) của một giải đấu theo mùa giải.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo, MultiLetGoalRepo, MultiLetGoalHalfRepo
Hàm hỗ trợ: updateS3file(), translateData(), checkLogoLeague()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ letGoalPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin giải đấu (arrLeague)
Lấy danh sách đội bóng (arrTeam)
Lấy 6 nhóm thống kê kèo chấp:
TotalPanLu, HomePanLu, GuestPanLu (toàn trận)
TotalHalfPanLu, HomeHalfPanLu, GuestHalfPanLu (hiệp 1)
Tính toán thêm addUp (tổng hợp) và addUpHalf (hiệp 1)
Tạo thời gian cập nhật cuối
Ghép thành nhiều biến JavaScript
Các hàm phụ chính:
getArrLeague(): Thông tin giải đấu (ID, tên đa ngôn ngữ, màu, ảnh cờ, mùa giải)
getArrTeam(): Danh sách đội bóng trong giải (TeamID, tên đội, ảnh cờ)
getTotalPanLu() / getHomePanLu() / getGuestPanLu(): Thống kê kèo chấp toàn trận
getTotalHalfPanLu() / getHomeHalfPanLu() / getGuestHalfPanLu(): Thống kê kèo chấp hiệp 1
countTeamStats(): Hàm cốt lõi đếm số trận thắng/thua/hòa, số lần chấp, không chấp...
getAddUp() / getAddUpHalf(): Tính tổng hợp win/draw/loss và tìm đội có tỷ lệ cao nhất
getTeamMax(): Tìm đội có giá trị cao nhất theo một chỉ số
5. File Output
File: 'jsdata/letgoal/' . $currentSeason . '/l' . $sclass->sclassID . '_' . $locale . '.js'

Thống kê kèo tài xỉu trong giải#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê kèo Tài Xỉu (Over/Under) của một giải đấu theo mùa giải.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo, MultiTotalScoreRepo, MultiTotalScoreHalfRepo
Hàm hỗ trợ: updateS3file(), translateData(), checkLogoLeague()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ bigSmallPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin giải đấu (arrLeague)
Lấy danh sách đội bóng (arrTeam)
Lấy 6 nhóm thống kê kèo Tài Xỉu:
TotalBs, HomeBs, GuestBs (toàn trận)
TotalBsHalf, HomeBsHalf, GuestBsHalf (hiệp 1)
Tính toán thêm addUp (tổng hợp) và addUpHalf (hiệp 1)
Tạo thời gian cập nhật cuối
Ghép thành nhiều biến JavaScript
Các hàm phụ chính:
getArrLeague(): Thông tin giải đấu (ID, tên đa ngôn ngữ, màu, ảnh cờ, mùa giải)
getArrTeam(): Danh sách đội bóng trong giải (TeamID, tên đội, ảnh cờ)
getTotalBs() / getHomeBs() / getGuestBs(): Thống kê kèo Tài Xỉu toàn trận
getTotalBsHalf() / getHomeBsHalf() / getGuestBsHalf(): Thống kê kèo Tài Xỉu hiệp 1
bsTeamStats(): Hàm cốt lõi đếm số trận Over / Draw / Under cho từng đội
getAddUp() / getAddUpHalf(): Tính tổng hợp Over/Draw/Under và tìm đội có tỷ lệ cao nhất
getValueOverAndUnder(): Tìm đội có tỷ lệ Over hoặc Under cao nhất
5. File Output
File: 'jsdata/bigsmall/' . $currentSeason . '/bs' . $sclass->sclassID . '_' . $locale . '.js'

Thống kê kết quả nửa trận#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê kết quả hiệp 1 (All Half) của các đội trong một giải đấu theo mùa giải.
Dữ liệu tập trung vào việc phân tích phong độ theo các tình huống: thắng hiệp 1 & thắng hiệp 2, thắng hiệp 1 & hòa hiệp 2, thua hiệp 1 & thắng hiệp 2… (tổng 9 loại kết hợp).
File này hỗ trợ frontend hiển thị bảng thống kê chi tiết về kết quả các hiệp đấu.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo
Hàm hỗ trợ: updateS3file(), translateData(), checkLogoLeague()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ matchAllHalfPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin giải đấu (arrLeague)
Lấy danh sách đội bóng (arrTeam)
Lấy 3 nhóm dữ liệu:
allData → thống kê tổng (toàn bộ trận)
homeData → thống kê sân nhà
guestData → thống kê sân khách
Tạo thời gian cập nhật cuối
Ghép thành 5 biến JavaScript
Các hàm phụ chính:
getArrLeague(): Thông tin giải đấu (ID, tên đa ngôn ngữ, màu, ảnh cờ, mùa giải)
getArrTeam(): Danh sách đội bóng trong giải (TeamID, tên đội, ảnh cờ)
getAllData(): Lấy thống kê hiệp 1 & hiệp 2 cho tất cả trận
getHomeData(): Lấy thống kê hiệp 1 & hiệp 2 khi đội chơi sân nhà (có bổ sung giá trị mặc định 0 nếu đội không có dữ liệu)
getGuestData(): Lấy thống kê hiệp 1 & hiệp 2 khi đội chơi sân khách (có bổ sung giá trị mặc định 0)
getTeamData(): Lấy thông tin chi tiết các đội
Mỗi dòng dữ liệu trong allData, homeData, guestData gồm 10 giá trị:
TeamID
W_W, W_D, W_L (Thắng hiệp 1 → Thắng/Hòa/Thua hiệp 2)
D_W, D_D, D_L (Hòa hiệp 1 → Thắng/Hòa/Thua hiệp 2)
L_W, L_D, L_L (Thua hiệp 1 → Thắng/Hòa/Thua hiệp 2)
5. File Output
File: 'jsdata/allHalf/' . $season . '/ah' . $sclass->sclassID . '_' . $locale . '.js'

Kết quả và bảng xếp hạng cho các giải đấu kiểu Cúp#

1. Concept
Hàm dùng để tạo file JavaScript chứa kết quả và bảng xếp hạng cho các giải đấu kiểu Cúp (Cup / Tournament), đặc biệt là các giải có phân bảng (group stage) và vòng knock-out.
File này cung cấp dữ liệu cho frontend hiển thị lịch thi đấu theo nhóm, bảng xếp hạng từng bảng, và thông tin trận đấu trong cúp.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, SubSclassRepo, ScheduleRepo, CupMatchGroupingRepo
Thư viện: Carbon (xử lý thời gian)
Hàm hỗ trợ: updateS3file(), translateData(), checkLogoLeague(), getLogoTeam()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League/Cup)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại)
Lấy đường dẫn file và thư mục từ matchResultCupmatchPath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin cúp (arrCup)
Lấy dữ liệu lịch thi đấu và nhóm bảng (jhScheduleData)
Lấy dữ liệu thống kê đội bóng trong bảng (jhTeamData)
Lấy thông tin loại cúp / nhóm (arrCupKind)
Lấy danh sách đội (arrTeam)
Tạo thời gian cập nhật cuối
Ghép tất cả thành chuỗi JavaScript
Các hàm phụ chính:
getArrCup(): Thông tin tổng quát của giải cúp (ID, tên, ảnh cờ, màu sắc, mùa giải…)
getJhScheduleDataa(): Xử lý phức tạp lịch thi đấu theo nhóm (GroupID):
Phân loại theo IsGroup (vòng bảng) và IsZu (vòng đấu knock-out)
Tạo biến jh["G..."] chứa danh sách trận đấu
Tính tổng tỷ số cho các cặp đấu hai lượt (nếu có)
getJhTeamData(): Tính toán bảng xếp hạng cho từng nhóm bảng:
Thống kê số trận, thắng/thua/hòa, bàn thắng/thua, hiệu số, điểm số
Phân biệt thống kê sân nhà & sân khách
Sắp xếp theo điểm → hiệu số
getArrCupKind(): Lấy thông tin các nhóm bảng (GroupID, tên nhóm, thứ tự, có phải bảng chính không…)
getArrTeam(): Danh sách đội tham gia (TeamID, tên đội, logo)
Đặc điểm nổi bật:
Sử dụng biến JavaScript jh[] để lưu dữ liệu theo key (ví dụ: jh["G1A"], jh["S1A"])
Có nhiều giá trị HARDCODE (cố định) trong mảng trận đấu
Xử lý riêng hai loại: vòng bảng (group) và vòng đấu loại trực tiếp (zu)
5. File Output
File: 'jsdata/matchResult/' . $season . '/c' . $sclass->sclassID . '_' . $locale . '.js'

Thống kê tần suất các tỷ số#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê tần suất các tỷ số (Score Frequency) của từng đội bóng trong một giải đấu theo mùa giải.
Dữ liệu cho biết mỗi đội hay thắng/thua/hòa với những tỷ số nào nhiều nhất (ví dụ: thắng 1-0 bao nhiêu trận, thua 0-1 bao nhiêu trận…).
File này hỗ trợ frontend hiển thị bảng thống kê tỷ số phổ biến của các đội.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo
Hàm hỗ trợ: updateS3file(), translateData()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ scorePath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin giải đấu (arrLeague)
Lấy danh sách đội bóng (arrTeam)
Lấy thống kê tỷ số của từng đội (arrData)
Tạo thời gian cập nhật cuối
Ghép thành 4 biến JavaScript
Các hàm phụ chính:
getArrLeague(): Thông tin cơ bản của giải đấu (ID, tên đa ngôn ngữ, màu sắc, ảnh cờ, mùa giải)
getArrTeam(): Danh sách tất cả đội tham gia giải (TeamID, tên đội, ảnh cờ)
getTeamData(): Lấy thông tin đội bóng theo danh sách TeamID
getArrData(): Phần quan trọng nhất
Với mỗi đội, khởi tạo mảng 27 phần tử (chỉ số từ 0 đến 26)
Lấy tất cả trận đấu của đội trong giải + mùa đó
Chuyển tỷ số về dạng HomeScore:GuestScore (hoặc ngược lại nếu đội là khách)
Đếm số lần xuất hiện của từng tỷ số phổ biến (1:0, 2:0, 2:1, 0:0, 1:1, 0:1, 0:2 …)
Tỷ số không nằm trong danh sách sẽ được đếm vào vị trí cuối (Other Score)
5. File Output
File: 'jsdata/boDanDistri/' . $season . '/bd' . $sclass->sclassID . '_' . $locale . '.js'

Thống kê thời gian ghi bàn của từng đội trong giải#

1. Concept
Hàm dùng để tạo file JavaScript chứa thống kê thời gian ghi bàn của từng đội bóng trong một giải đấu theo mùa giải.
Dữ liệu cho biết đội thường ghi bàn vào khung giờ nào nhiều nhất (chia theo từng khoảng 5 phút: 1-5', 6-10', 11-15' … 86-90').
File này hỗ trợ frontend hiển thị biểu đồ hoặc bảng thống kê thời điểm ghi bàn của các đội.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, ScheduleRepo, DetailResultRepo
Hàm hỗ trợ: updateS3file(), translateData()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu (League)
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên đội)
4. Logic
Hàm chính: makeFile($sclass, $season = '', $locale = null)
Xác định mùa giải (nếu rỗng thì dùng mùa hiện tại của giải)
Lấy đường dẫn file và thư mục từ goalTimePath()
Gọi hàm generateFile() để tạo nội dung JS
Kiểm tra lưu trữ:
Nếu disk = "s3": đẩy file lên S3
Nếu lưu local: tạo thư mục nếu chưa có rồi ghi file
Hàm generateFile($sclass, $season, $locale)
Lấy thông tin giải đấu (arrLeague)
Lấy danh sách đội bóng (arrTeam)
Lấy thống kê thời gian ghi bàn của từng đội (arrData)
Tạo thời gian cập nhật cuối
Ghép thành 4 biến JavaScript
Các hàm phụ chính:
getArrLeague(): Thông tin cơ bản của giải đấu (ID, tên đa ngôn ngữ, màu sắc, ảnh, mùa giải)
getArrTeam(): Danh sách tất cả đội tham gia giải (TeamID, tên đội, ảnh cờ)
getTeamData(): Lấy thông tin đội theo danh sách TeamID
getArrData(): Phần quan trọng nhất
Lấy danh sách đội trong giải
Với mỗi đội: lấy tất cả ScheduleID của đội trong giải + mùa đó
Gọi repository lấy thống kê thời gian ghi bàn (getDetailHappenGoalTime)
Nếu đội chưa có dữ liệu → gán tất cả giá trị = 0
Chuyển dữ liệu thành mảng phẳng: [TeamID, goals_1_5, goals_6_10, ..., goals_86_90]
Mỗi đội sẽ có 18 cột thống kê thời gian (từ phút 1-5 đến 86-90).
5. File Output
File: 'jsdata/timeDistri/' . $season . '/td' . $sclass->sclassID . '_' . $locale . '.js'

Kết quả và bảng xếp hạng cho Sub League#

1. Concept
Hàm dùng để tạo file JavaScript chứa kết quả và bảng xếp hạng cho Sub League (giải đấu con / bảng phụ / giải nhánh) trong một giải đấu lớn.
2. Require
Laravel Framework
File facade để thao tác file và thư mục
Trait: LeaguePathTrait (để lấy đường dẫn file)
Các Repository: TeamRepo, SclassRepo, SubSclassRepo, ScheduleRepo, ScoreRepo, SclassQualifyRepo
Thư viện: Carbon (xử lý thời gian)
Hàm hỗ trợ: updateS3File(), translateData(), checkLogoLeague(), getLeagueRuleTranslation()
Biến môi trường: ENV('DISK') (local hoặc s3)
3. Parameter
$sclass: đối tượng giải đấu chính (League)
$subSclass: đối tượng giải đấu con / bảng phụ
$season: mùa giải (nếu không truyền sẽ lấy mùa hiện tại)
$locale: ngôn ngữ (dùng để dịch tên)
4. Logic
Hàm chính: makeFile($sclass, $subSclass, $season = '', $locale = null)
Xác định mùa giải
Lấy đường dẫn file từ matchResultSubLeaguePath($sclass, $subSclass, $season, $locale)
Gọi generateFile() để tạo nội dung
Lưu file vào local hoặc đẩy lên S3
Hàm generateFile($sclass, $subSclass, $season, $locale)
Tạo nhiều biến JavaScript quan trọng:
arrLeague: thông tin giải đấu chính
arrSubLeague: thông tin các sub-league
arrTeam: danh sách đội
jh["R_1"], jh["R_2"], ...: lịch thi đấu theo từng vòng (round)
scoreColor: màu sắc và tên qualification (thăng hạng, xuống hạng, playoff…)
totalScore, homeScore, guestScore: bảng xếp hạng tổng / sân nhà / sân khách
halfScore, homeHalfScore, guestHalfScore: bảng xếp hạng hiệp 1
lastUpdateTime và một số biến khác
Các hàm phụ chính:
getArrLeague(): Thông tin giải chính (có thêm rule, số vòng, vòng hiện tại)
getArrSubLeague(): Danh sách các bảng phụ (subSclass)
getArrTeam(): Danh sách đội tham gia
getRoundData(): Tạo dữ liệu lịch thi đấu theo từng vòng (jh["R_X"])
scoreColor(): Lấy màu và tên cho các vị trí xếp hạng (qualification)
totalScore(): Bảng xếp hạng tổng (có trừ điểm phạt, thêm recent results, sắp xếp theo điểm)
homeScore() / guestScore(): Bảng xếp hạng sân nhà / sân khách
halfScore() / homeHalfScore() / guestHalfScore(): Bảng xếp hạng theo hiệp 1
5. File Output
File:'jsdata/matchResult/' . $season . '/s' . $sclass->sclassID . '_' . $subSclass->subSclassID . '_' . $locale . '.js'

Tổng hợp các file kèo trực tuyến#

1. Concept
Đây là hệ thống xử lý thay đổi tỷ lệ kèo thời gian thực. Khi có dữ liệu odds mới, hệ thống sẽ tạo/cập nhật các file XML hoặc TXT và gửi thông báo qua WebSocket để frontend cập nhật ngay lập tức.
2. Require
Laravel Framework, Cache, File facade, Storage (S3)
Carbon để xử lý thời gian
SimpleXMLElement để tạo file XML
Các Event: AwsSocketEvent và GoSocketEvent
3. Logic
** makeFileChangeOdss($data = [])
Mục đích: Hàm chính xử lý khi có thay đổi odds thời gian thực.
Luồng xử lý:
Gọi đồng thời 5 hàm con để tạo payload (CreateFileChangeOdds, createCHRunOdds, createCHOddEn, createCHOddEnNew, createCHOddEnLive).
Gộp tất cả payload lại thành một mảng duy nhất (allPayload).
Nếu có dữ liệu thì gửi một lần duy nhất qua AwsSocketEvent.
Sau đó gọi hàm updateOdds($data) để cập nhật cache chi tiết theo từng trận đấu.
Cuối cùng lưu dữ liệu thay đổi vào cache tạm với thời hạn 10 giây (key: odds_change_data).
Toàn bộ quá trình được bao trong try-catch để log lỗi.
** makeFileChangeKsport()
Mục đích: Hàm dành riêng cho dữ liệu từ Ksport (thường chạy theo cronjob).
Luồng xử lý:
Lấy dữ liệu từ 2 API: /api/odds/change và /api/odds/main.
Gọi 4 hàm con để tạo payload.
Gộp payload lại.
Kiểm tra config để quyết định gửi socket qua GoSocketEvent, AwsSocketEvent hoặc cả hai.
Không gọi updateOdds() như hàm trên.
** CreateFileChangeOdds($data)
Mục đích: Tạo file XML chứa tỷ lệ kèo cho từng công ty nhà cái.
Luồng xử lý chi tiết:
Khởi tạo mảng để nhóm dữ liệu theo companyId và matchApiId.
Duyệt qua từng loại kèo (handicap, europeOdds, overUnder, handicapHalf, overUnderHalf), tách chuỗi bằng dấu phẩy và lưu vào mảng tương ứng.
Duyệt theo từng companyId:
Xác định 2 đường dẫn file: file chính (ch_goal{companyId}.xml) và file tạm (t_goal{companyId}.xml).
Xử lý từng trận của company đó, chuyển đổi matchApiId sang ScheduleID.
Tạo mảng dữ liệu kèo đầy đủ (gồm handicap, 1x2, over/under… và một số giá trị cố định).
Chuẩn bị dữ liệu gửi socket cho một số company chính.
Đọc file tạm cũ để lấy dữ liệu hiện tại.
So sánh và merge: trận nào đã tồn tại thì thay thế, trận mới thì thêm vào.
Tạo nội dung XML từ dữ liệu đã merge.
Ghi file tạm và file chính (hỗ trợ cả local và S3).
Trả về mảng dữ liệu để gửi socket nếu có.
** makeFileAllOdds()
Mục đích: Tạo file XML chứa toàn bộ tỷ lệ kèo (full odds) cho tất cả công ty.
Luồng xử lý:
Lấy dữ liệu từ cache odds_main và kết hợp thêm dữ liệu từ Ksport.
Xử lý tương tự CreateFileChangeOdds nhưng không dùng cơ chế delta (file tạm).
Tạo file chính goal{companyId}.xml cho từng công ty.
Dùng cho trang hiển thị tất cả tỷ lệ kèo một lần.
** createRunOdds() và createCHRunOdds($data)
Mục đích: Tạo file Run Odds (tỷ lệ kèo đang chạy, thay đổi liên tục).
Luồng xử lý:
Lấy dữ liệu từ cache và Ksport.
Xử lý theo từng công ty.
Đọc file cũ để giữ lại giá trị trước đó nếu kèo mới chưa cập nhật.
Xây dựng chuỗi text với định dạng đặc biệt (phân cách bằng ! và $).
Ghi file .txt cho cả file chính và file tạm.
Hỗ trợ cả local và S3.
** createCHOddEn($data), createCHOddEnKsport($data), createCHOddEnNew($data), createCHOddEnLive($data)
Mục đích: Tạo file XML dạng gọn chứa nhiều loại kèo cùng lúc.
Luồng xử lý chung:
Nhóm dữ liệu theo loại kèo (a = handicap, o = 1x2, d = over/under…).
Tạo XML với cấu trúc nhiều thẻ con.
Một số hàm dùng định dạng mới (JSON-like) hoặc chỉ lấy một số công ty cụ thể (ví dụ: createCHOddEnLive chỉ lấy công ty 8, 31, 23).
4. Tóm tắt luồng tổng thể
Nhận dữ liệu odds thay đổi ($data)
Xử lý tạo file XML/TXT theo từng loại (delta hoặc full)
Gộp payload và gửi socket một lần
Cập nhật cache chi tiết
Frontend đọc file hoặc nhận socket để cập nhật giao diện
5. File output
gf/data/odds/en/runOddsData_{companyId}.txt
gf/data/odds/en/trunOddsData{companyId}.txt
gf/data/odds/en/chrunOddsData{companyId}.txt
gf/data/odds/en/chodds_new{companyId}.txt
gf/data/odds/en/ch_odds_new_8_31_23.txt
Modified at 2026-03-27 09:55:15
Previous
Tổng quan
Next
Tổng quan
Built with