import { useState, useEffect, useCallback } from 'react'; import { getUserOrderStats, UserOrderStats } from '@/api/user'; import Taro from '@tarojs/taro'; /** * 订单统计Hook * 用于管理用户订单各状态的数量统计 */ export const useOrderStats = () => { const [orderStats, setOrderStats] = useState({ pending: 0, // 待付款 paid: 0, // 待发货 shipped: 0, // 待收货 completed: 0, // 已完成 refund: 0, // 退货/售后 total: 0 // 总订单数 }); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); /** * 获取订单统计数据 */ const fetchOrderStats = useCallback(async (showToast = false) => { try { setLoading(true); setError(null); if(!Taro.getStorageSync('UserId')){ return false; } // 聚合接口:一次请求返回各状态数量(后台按用户做了缓存) const stats = await getUserOrderStats(); setOrderStats({ pending: stats?.pending || 0, paid: stats?.paid || 0, shipped: stats?.shipped || 0, completed: stats?.completed || 0, refund: stats?.refund || 0, total: stats?.total || 0 }) if (showToast) { Taro.showToast({ title: '数据已更新', icon: 'success', duration: 1500 }); } } catch (err: any) { const errorMessage = err.message || '获取订单统计失败'; setError(errorMessage); console.error('获取订单统计失败:', err); if (showToast) { Taro.showToast({ title: errorMessage, icon: 'error', duration: 2000 }); } } finally { setLoading(false); } }, []); /** * 刷新订单统计数据 */ const refreshOrderStats = useCallback(() => { return fetchOrderStats(true); }, [fetchOrderStats]); /** * 获取指定状态的订单数量 */ const getOrderCount = useCallback((status: keyof UserOrderStats) => { return orderStats[status] || 0; }, [orderStats]); /** * 检查是否有待处理的订单 */ const hasPendingOrders = useCallback(() => { return orderStats.pending > 0 || orderStats.paid > 0 || orderStats.shipped > 0; }, [orderStats]); /** * 获取总的待处理订单数量 */ const getTotalPendingCount = useCallback(() => { return orderStats.pending + orderStats.paid + orderStats.shipped; }, [orderStats]); // 组件挂载时自动获取数据 useEffect(() => { fetchOrderStats(); }, [fetchOrderStats]); return { orderStats, loading, error, fetchOrderStats, refreshOrderStats, getOrderCount, hasPendingOrders, getTotalPendingCount }; }; export default useOrderStats;