fix(player-desktop): 修复桌面端注单详情页时间 Invalid Date 及投注选项不显示的 Schema 绑定 bug

This commit is contained in:
2026-06-30 17:55:15 +08:00
parent c589d97191
commit e906831103
2 changed files with 43 additions and 17 deletions

View File

@@ -93,7 +93,7 @@ watch(
</div> </div>
<div class="desktop-layout-betting"> <div class="desktop-layout-betting">
<aside class="desktop-betting-left"> <aside class="desktop-betting-left">
<LeagueSidebar v-if="!isMatchDetail" /> <LeagueSidebar v-if="!isBettingDetail" />
<MatchSidebar v-else /> <MatchSidebar v-else />
</aside> </aside>
<main class="desktop-betting-center" :class="{ 'is-betting-detail': isBettingDetail }"> <main class="desktop-betting-center" :class="{ 'is-betting-detail': isBettingDetail }">

View File

@@ -5,7 +5,7 @@ import { useRoute, useRouter, RouterLink } from 'vue-router';
import api from '../../api'; import api from '../../api';
import GoldSpinner from '../../components/GoldSpinner.vue'; import GoldSpinner from '../../components/GoldSpinner.vue';
const { t } = useI18n(); const { t, locale } = useI18n();
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
@@ -20,17 +20,16 @@ function goBack() {
type BetDetail = { type BetDetail = {
betNo: string; betNo: string;
stake: string; stake: string;
potentialPayout?: string; potentialReturn?: string;
status: string; status: string;
createdAt: string; placedAt: string;
selections: Array<{ legs: Array<{
matchName?: string; matchTitle?: string;
marketLabel?: string;
selectionName?: string; selectionName?: string;
odds?: number; odds?: number;
market?: string; resultStatus?: string;
homeScore?: number; score?: { ht: string | null; ft: string | null } | null;
awayScore?: number;
matchStatus?: string;
[key: string]: any; [key: string]: any;
}>; }>;
[key: string]: any; [key: string]: any;
@@ -71,6 +70,32 @@ function statusLabel(status: string) {
}; };
return map[status?.toUpperCase()] ?? status; return map[status?.toUpperCase()] ?? status;
} }
const SEL_TRANS: Record<string, Record<string, string>> = {
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
'主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
'客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
'大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
'小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
'单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
'双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
};
function translateSel(name: string): string {
if (locale.value === 'zh-CN') return name;
const exact = SEL_TRANS[name];
if (exact) return exact[locale.value] ?? exact['en-US'] ?? name;
const sp = name.indexOf(' ');
if (sp > 0) {
const head = name.slice(0, sp);
const m = SEL_TRANS[head];
if (m) return (m[locale.value] ?? m['en-US'] ?? head) + name.slice(sp);
}
return name;
}
</script> </script>
<template> <template>
@@ -104,11 +129,11 @@ function statusLabel(status: string) {
</div> </div>
<div class="amount-item"> <div class="amount-item">
<span class="amount-label">{{ t('bet.potential_payout') || '预计派彩' }}</span> <span class="amount-label">{{ t('bet.potential_payout') || '预计派彩' }}</span>
<span class="amount-val gold">{{ detail.potentialPayout || '-' }}</span> <span class="amount-val gold">{{ detail.potentialReturn || '-' }}</span>
</div> </div>
<div class="amount-item"> <div class="amount-item">
<span class="amount-label">{{ t('bet.placed_at') || '下注时间' }}</span> <span class="amount-label">{{ t('bet.placed_at') || '下注时间' }}</span>
<span class="amount-val date">{{ new Date(detail.createdAt).toLocaleString() }}</span> <span class="amount-val date">{{ detail.placedAt ? new Date(detail.placedAt).toLocaleString() : '-' }}</span>
</div> </div>
</div> </div>
</div> </div>
@@ -116,12 +141,13 @@ function statusLabel(status: string) {
<!-- Selections --> <!-- Selections -->
<div class="detail-card"> <div class="detail-card">
<div class="card-title">{{ t('bet.selections') || '投注选项' }}</div> <div class="card-title">{{ t('bet.selections') || '投注选项' }}</div>
<div v-for="(sel, idx) in detail.selections" :key="idx" class="sel-row"> <div v-for="(leg, idx) in detail.legs" :key="idx" class="sel-row">
<div class="sel-match">{{ sel.matchName || t('bet.match') }}</div> <div class="sel-match">{{ leg.matchTitle || t('bet.match') }}</div>
<div class="sel-meta"> <div class="sel-meta">
<span class="sel-market">{{ sel.market || sel.marketName || '' }}</span> <span class="sel-market">{{ leg.marketLabel || '' }}</span>
<span class="sel-name">{{ sel.selectionName || '' }}</span> <span class="sel-name">{{ translateSel(leg.selectionName || '') }}</span>
<span class="sel-odds">@{{ sel.odds }}</span> <span class="sel-odds">@{{ leg.odds }}</span>
<span v-if="leg.score?.ft" class="sel-score">({{ t('history.ft') }}: {{ leg.score.ft }})</span>
</div> </div>
</div> </div>
</div> </div>