diff --git a/src/api/glt/gltUserTicket/index.ts b/src/api/glt/gltUserTicket/index.ts index 8ac9b2e..9232a79 100644 --- a/src/api/glt/gltUserTicket/index.ts +++ b/src/api/glt/gltUserTicket/index.ts @@ -1,6 +1,30 @@ import request from '@/utils/request'; import type { ApiResult, PageResult } from '@/api'; import type { GltUserTicket, GltUserTicketParam } from './model'; +import { SERVER_API_URL } from '@/utils/server' + +function normalizeTotal(input: unknown): number { + if (typeof input === 'number' && Number.isFinite(input)) return input; + if (typeof input === 'string') { + const n = Number(input); + if (Number.isFinite(n)) return n; + } + if (input && typeof input === 'object') { + const obj: any = input; + // Common shapes from different backends. + for (const key of ['total', 'count', 'value', 'num', 'ticketTotal', 'totalQty']) { + const v = obj?.[key]; + const n = normalizeTotal(v); + if (n) return n; + } + // Sometimes nested: { data: { total: ... } } / { data: 12 } + if ('data' in obj) { + const n = normalizeTotal(obj.data); + if (n) return n; + } + } + return 0; +} /** * 分页查询我的水票 @@ -8,9 +32,7 @@ import type { GltUserTicket, GltUserTicketParam } from './model'; export async function pageGltUserTicket(params: GltUserTicketParam) { const res = await request.get>>( '/glt/glt-user-ticket/page', - { - params - } + params ); if (res.code === 0 && res.data) { return res.data; @@ -24,9 +46,7 @@ export async function pageGltUserTicket(params: GltUserTicketParam) { export async function listGltUserTicket(params?: GltUserTicketParam) { const res = await request.get>( '/glt/glt-user-ticket', - { - params - } + params ); if (res.code === 0 && res.data) { return res.data; @@ -107,15 +127,46 @@ export async function getGltUserTicket(id: number) { /** * 获取我的水票总数 */ -export async function getMyGltUserTicketTotal() { - const res = await request.get>( - '/glt/glt-user-ticket/my-total' - ); - if (res.code === 0) { - const data: any = res.data; - if (typeof data === 'number') return data; - if (data && typeof data.total === 'number') return data.total; - return 0; +export async function getMyGltUserTicketTotal(userId?: number) { + const params = userId ? { userId } : undefined + + const extract = (res: any) => { + // Some backends may return a raw number instead of ApiResult. + if (typeof res === 'number' || typeof res === 'string') return normalizeTotal(res) + if (res && typeof res === 'object' && 'code' in res) { + const apiRes = res as ApiResult + if (apiRes.code === 0) return normalizeTotal(apiRes.data) + throw new Error(apiRes.message) + } + return normalizeTotal(res) } - return Promise.reject(new Error(res.message)); + + // Try both the configured BaseUrl host and the auth-server host. + // If the first one returns 0, keep trying; some tenants deploy GLT on a different host. + const urls = [ + '/glt/glt-user-ticket/my-total', + `${SERVER_API_URL}/glt/glt-user-ticket/my-total`, + ] + + let lastError: unknown + let firstTotal: number | undefined + for (const url of urls) { + try { + const res = await request.get(url, params) + if (process.env.NODE_ENV === 'development') { + console.log('[getMyGltUserTicketTotal] response:', { url, res }) + } + const total = extract(res) + if (firstTotal === undefined) firstTotal = total + if (total) return total + } catch (e) { + if (process.env.NODE_ENV === 'development') { + console.warn('[getMyGltUserTicketTotal] failed:', { url, error: e }) + } + lastError = e + } + } + + if (firstTotal !== undefined) return firstTotal + return Promise.reject(lastError instanceof Error ? lastError : new Error('获取水票总数失败')) } diff --git a/src/api/glt/gltUserTicketLog/index.ts b/src/api/glt/gltUserTicketLog/index.ts index 9541f23..87b74d8 100644 --- a/src/api/glt/gltUserTicketLog/index.ts +++ b/src/api/glt/gltUserTicketLog/index.ts @@ -8,9 +8,7 @@ import type { GltUserTicketLog, GltUserTicketLogParam } from './model'; export async function pageGltUserTicketLog(params: GltUserTicketLogParam) { const res = await request.get>>( '/glt/glt-user-ticket-log/page', - { - params - } + params ); if (res.code === 0) { return res.data; @@ -24,9 +22,7 @@ export async function pageGltUserTicketLog(params: GltUserTicketLogParam) { export async function listGltUserTicketLog(params?: GltUserTicketLogParam) { const res = await request.get>( '/glt/glt-user-ticket-log', - { - params - } + params ); if (res.code === 0 && res.data) { return res.data; diff --git a/src/api/glt/gltUserTicketLog/model/index.ts b/src/api/glt/gltUserTicketLog/model/index.ts index e41e9ea..b974f5b 100644 --- a/src/api/glt/gltUserTicketLog/model/index.ts +++ b/src/api/glt/gltUserTicketLog/model/index.ts @@ -50,4 +50,5 @@ export interface GltUserTicketLog { export interface GltUserTicketLogParam extends PageParam { id?: number; keywords?: string; + userId?: number; } diff --git a/src/pages/index/index.tsx b/src/pages/index/index.tsx index 98a3403..2b37b5e 100644 --- a/src/pages/index/index.tsx +++ b/src/pages/index/index.tsx @@ -90,11 +90,14 @@ function Home() { const reload = () => { const token = Taro.getStorageSync('access_token') - if (!token) { + const userIdRaw = Taro.getStorageSync('UserId') + const userId = Number(userIdRaw) + const hasUserId = Number.isFinite(userId) && userId > 0 + if (!token && !hasUserId) { setTicketTotal(0) return } - getMyGltUserTicketTotal() + getMyGltUserTicketTotal(hasUserId ? userId : undefined) .then((total) => setTicketTotal(typeof total === 'number' ? total : 0)) .catch((err) => { console.error('首页水票总数加载失败:', err) diff --git a/src/pages/user/components/UserCard.tsx b/src/pages/user/components/UserCard.tsx index 6389fa7..cf88eac 100644 --- a/src/pages/user/components/UserCard.tsx +++ b/src/pages/user/components/UserCard.tsx @@ -29,18 +29,21 @@ const UserCard = forwardRef((_, ref) => { } // 下拉刷新 - const handleRefresh = async () => { + const reloadStats = async (showToast = false) => { await refresh() reloadTicketTotal() - Taro.showToast({ - title: '刷新成功', - icon: 'success' - }) + if (showToast) { + Taro.showToast({ + title: '刷新成功', + icon: 'success' + }) + } } // 暴露方法给父组件 useImperativeHandle(ref, () => ({ - handleRefresh + handleRefresh: () => reloadStats(true), + reloadStats })) useEffect(() => { @@ -65,11 +68,14 @@ const UserCard = forwardRef((_, ref) => { const reloadTicketTotal = () => { const token = Taro.getStorageSync('access_token') - if (!token) { + const userIdRaw = Taro.getStorageSync('UserId') + const userId = Number(userIdRaw) + const hasUserId = Number.isFinite(userId) && userId > 0 + if (!token && !hasUserId) { setTicketTotal(0) return } - getMyGltUserTicketTotal() + getMyGltUserTicketTotal(hasUserId ? userId : undefined) .then((total) => setTicketTotal(typeof total === 'number' ? total : 0)) .catch((err) => { console.error('个人中心水票总数加载失败:', err) @@ -302,7 +308,7 @@ const UserCard = forwardRef((_, ref) => { {data?.coupons || 0} navTo('/user/gift/index', true)}> + onClick={() => navTo('/user/ticket/index', true)}> 水票 {ticketTotal} diff --git a/src/pages/user/user.tsx b/src/pages/user/user.tsx index 70b97aa..06b78ba 100644 --- a/src/pages/user/user.tsx +++ b/src/pages/user/user.tsx @@ -8,6 +8,7 @@ import './user.scss' import IsDealer from "./components/IsDealer"; import {useThemeStyles} from "@/hooks/useTheme"; import UserGrid from "@/pages/user/components/UserGrid"; +import { useDidShow } from '@tarojs/taro' function User() { @@ -24,6 +25,11 @@ function User() { useEffect(() => { }, []); + // 每次进入/切回个人中心都刷新一次统计(包含水票数量) + useDidShow(() => { + userCardRef.current?.reloadStats?.() + }) + return ( { const reloadLogs = async (isRefresh = true, keywords?: string) => { if (logLoading) return; + const userId = getUserId(); + if (!userId) { + setLogList([]); + setLogTotal(0); + setLogHasMore(false); + return; + } + if (isRefresh) { setLogPage(1); setLogList([]); @@ -168,6 +176,7 @@ const UserTicketList = () => { const res = await pageGltUserTicketLog({ page: currentPage, limit: PAGE_SIZE, + userId, keywords: (keywords ?? searchValue) || undefined }); @@ -285,11 +294,11 @@ const UserTicketList = () => { {/* 列表 */} - + {activeTab === 'ticket' && ticketList.length === 0 && !ticketLoading ? ( { ) : activeTab === 'log' && logList.length === 0 && !logLoading ? ( diff --git a/src/utils/request.ts b/src/utils/request.ts index 58b5ac9..44d19df 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -182,10 +182,10 @@ const handleAuthError = () => { icon: 'none', duration: 2000 }); - - setTimeout(() => { - Taro.reLaunch({ url: '/passport/login' }); - }, 2000); + // + // setTimeout(() => { + // Taro.reLaunch({ url: '/passport/login' }); + // }, 2000); }; // 错误处理