import { useMemo, useState } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; import PageShell from '../../components/PageShell'; import SubPageHeader from '../../components/SubPageHeader'; import { request, toast } from '../../lib/api'; const LAST_REDEEM_RESULT_KEY = 'lastRedeemResult'; type RedeemRecord = { id: string; redeemNo: string; amount: number; storeId: string; storeName: string; createdAt: string; }; function formatMoney(amount: number) { return amount.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } /** 与权益「历史记录」一致:2026-08-03 13:53:03(Asia/Shanghai) */ function formatChinaDateTime(input?: string | null) { const d = input ? new Date(input) : new Date(); if (Number.isNaN(d.getTime())) return '—'; const parts = new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false, }).formatToParts(d); const get = (type: Intl.DateTimeFormatPartTypes) => parts.find((p) => p.type === type)?.value ?? ''; return `${get('year')}-${get('month')}-${get('day')} ${get('hour')}:${get('minute')}:${get('second')}`; } function StarRating({ label, value, onChange, }: { label: string; value: number; onChange: (score: number) => void; }) { return ( {label} {[1, 2, 3, 4, 5].map((score) => ( onChange(score)} > ★ ))} ); } export default function RedeemSuccessPage() { const router = useRouter(); const [serviceScore, setServiceScore] = useState(5); const [envScore, setEnvScore] = useState(5); const [loading, setLoading] = useState(false); const record = useMemo(() => { try { const cached = Taro.getStorageSync(LAST_REDEEM_RESULT_KEY); return cached ? (JSON.parse(String(cached)) as RedeemRecord) : null; } catch { return null; } }, []); const amount = Number(record?.amount ?? router.params.amount ?? 0); const storeName = record?.storeName || '门店'; const redeemNo = record?.redeemNo || '—'; const redeemedAt = formatChinaDateTime(record?.createdAt); function clearCache() { try { Taro.removeStorageSync(LAST_REDEEM_RESULT_KEY); } catch { /* ignore */ } } function goBenefit() { clearCache(); Taro.switchTab({ url: '/pages/benefit/index' }); } function goHome() { clearCache(); Taro.switchTab({ url: '/pages/home/index' }); } async function submitRatingAndFinish() { setLoading(true); try { if (record?.id) { await request('/redeem/ratings', { method: 'POST', data: { redeemRecordId: record.id, serviceScore, envScore, }, }); toast('评价已提交', 'success'); } } catch { /* 评价失败不阻塞返回 */ } finally { setLoading(false); goBenefit(); } } return ( 核销成功 ¥ {formatMoney(amount)} 已在 {storeName} 完成核销 核销门店 {storeName} 核销时间 {redeemedAt} 核销单号 {redeemNo} 为门店服务评分 { if (!loading) void submitRatingAndFinish(); }} > {loading ? '提交中…' : '提交评价并返回'} 回到首页 ); }