feat(admin,api,player): 结算预览分页、统计图表与返水限额

完善结算计算与预览 API(含后端分页),加强管理端结算/返水/权限,并优化玩家端投注单与队徽展示。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-05 13:54:33 +08:00
parent 6264b8806c
commit efff7c27e6
40 changed files with 3560 additions and 578 deletions

View File

@@ -172,6 +172,9 @@ export const adminPagesMs: Record<string, string> = {
'bet.col.player': 'Pemain',
'bet.col.agent': 'Ejen',
'bet.col.selection': 'Pilihan',
'bet.col.content': 'Kandungan taruhan',
'bet.col.match': 'Perlawanan',
'bet.legs_more': '+{n} lagi…',
'bet.col.selection_count': 'Bil. pilihan',
'bet.col.stake': 'Stake',
'bet.col.odds': 'Odds',
@@ -210,7 +213,25 @@ export const adminPagesMs: Record<string, string> = {
'cashback.preview_title': 'Pratonton rebat',
'cashback.stat.players': 'Pemain',
'cashback.stat.total': 'Jumlah rebat',
'cashback.stat.lines': 'Baris butiran',
'cashback.batch_no': 'No. kelompok',
'cashback.table_title': 'Butiran rebat pemain',
'cashback.table_total': 'Jumlah',
'cashback.empty_items': 'Tiada rebat layak dalam tempoh ini',
'cashback.col.index': '#',
'cashback.col.player': 'Pemain',
'cashback.col.agent': 'Ejen',
'cashback.col.effective_stake': 'Stake berkesan',
'cashback.col.rate': 'Kadar',
'cashback.col.amount': 'Rebat',
'cashback.confirm_issue': 'Sahkan bayaran',
'cashback.rules_title': 'Peraturan rebat',
'cashback.rule_period': 'Pilih julat tarikh. Taruhan dikira mengikut masa penyelesaian dalam tempoh tersebut.',
'cashback.rule_eligible': 'Termasuk: taruhan selesai WON/LOST (tunggal ikut stake; parlay sekali ikut stake parlay). Tidak termasuk: belum selesai, dibatalkan, batal, push, dan kadar 0.',
'cashback.rule_formula': 'Setiap taruhan: stake × kadar rebat. Jumlah diagregat mengikut pemain.',
'cashback.rule_rate': 'Keutamaan kadar: pemain > ejen > global > kadar lalai ejen (cth. 0.01 = 1%).',
'cashback.rule_flow': 'Aliran: pratonton → semak jumlah → sahkan bayaran (kredit dompet, entri CASHBACK).',
'cashback.rule_note_zero': 'Jika 0, semak taruhan WON/LOST dalam tempoh dan kadar rebat > 0.',
'user.field.player_id': 'ID pemain',
'user.field.bet_count': 'Bilangan pertaruhan',
@@ -313,8 +334,12 @@ export const adminPagesMs: Record<string, string> = {
'settlement.stats_parlay': 'Parlay',
'settlement.stats_total_stake': 'Jumlah stake',
'settlement.stats_potential': 'Menang maksimum',
'settlement.chart.bet_type': 'Tunggal vs parlay',
'settlement.chart.status': 'Taburan status pertaruhan',
'settlement.chart.stake_by_selection': 'TOP6 pilihan mengikut taruhan tunggal',
'settlement.stats_by_market': 'Ikut pasaran / pilihan',
'settlement.bet_list': 'Semua pertaruhan',
'settlement.bet_list': 'Pertaruhan berkaitan',
'settlement.bet_list_hint': 'Dikumpulkan mengikut pertaruhan; parlay sama perlawanan tunjuk ×kaki',
'settlement.no_bets': 'Tiada pertaruhan untuk perlawanan ini',
'settlement.col.market': 'Pasaran',
'settlement.col.selection': 'Pilihan',
@@ -324,7 +349,10 @@ export const adminPagesMs: Record<string, string> = {
'settlement.ht_score': 'Skor separuh masa',
'settlement.ft_score': 'Skor penuh masa',
'settlement.record_score': 'Simpan skor',
'settlement.preview_hint': 'Skor di atas disimpan secara automatik sebelum pratonton',
'settlement.preview_btn': 'Pratonton penyelesaian',
'settlement.preview_failed': 'Gagal menjana pratonton penyelesaian',
'settlement.err_score_not_recorded': 'Sila masukkan skor separuh masa dan penuh masa sebelum penyelesaian',
'settlement.preview_title': 'Pratonton penyelesaian',
'settlement.single_count': 'Pertaruhan tunggal',
'settlement.est_payout': 'Anggaran bayaran',