/** * 百色中学统计数据 store */ import { defineStore } from 'pinia'; import { bszxOrderTotal } from '@/api/bszx/bszxOrder'; import { safeNumber } from '@/utils/type-guards'; export interface BszxStatisticsState { // 总营业额 totalPrice: number; // 加载状态 loading: boolean; // 最后更新时间 lastUpdateTime: number | null; // 缓存有效期(毫秒)- 5分钟缓存 cacheExpiry: number; // 自动刷新定时器 refreshTimer: number | null; } export const useBszxStatisticsStore = defineStore({ id: 'bszx-statistics', state: (): BszxStatisticsState => ({ totalPrice: 0, loading: false, lastUpdateTime: null, // 默认缓存5分钟 cacheExpiry: 5 * 60 * 1000, refreshTimer: null }), getters: { /** * 获取总营业额 */ bszxTotalPrice: (state): number => { return safeNumber(state.totalPrice); }, /** * 检查缓存是否有效 */ isCacheValid: (state): boolean => { if (!state.lastUpdateTime) return false; const now = Date.now(); return (now - state.lastUpdateTime) < state.cacheExpiry; } }, actions: { /** * 获取百色中学统计数据 * @param forceRefresh 是否强制刷新 */ async fetchBszxStatistics(forceRefresh = false) { // 如果缓存有效且不强制刷新,直接返回缓存数据 if (!forceRefresh && this.isCacheValid && this.totalPrice > 0) { return this.totalPrice; } this.loading = true; try { const result = await bszxOrderTotal(); // 处理返回的数据 - bszxOrderTotal 返回 ShopOrder[] 数组 let totalPrice = 0; if (Array.isArray(result)) { // 累加所有订单的金额 result.forEach((order: any) => { if (order.payPrice) { totalPrice += safeNumber(order.payPrice); } else if (order.totalPrice) { totalPrice += safeNumber(order.totalPrice); } }); } else if (typeof result === 'number') { totalPrice = result; } else if (typeof result === 'string') { totalPrice = safeNumber(result); } else if (result && typeof result === 'object' && 'totalPrice' in result) { totalPrice = safeNumber((result as any).totalPrice); } this.totalPrice = totalPrice; this.lastUpdateTime = Date.now(); return totalPrice; } catch (error) { console.error('获取百色中学统计数据失败:', error); // 发生错误时不重置现有数据,只记录错误 throw error; } finally { this.loading = false; } }, /** * 更新统计数据 */ updateStatistics(data: Partial) { Object.assign(this, data); this.lastUpdateTime = Date.now(); }, /** * 清除缓存 */ clearCache() { this.totalPrice = 0; this.lastUpdateTime = null; }, /** * 设置缓存有效期 */ setCacheExpiry(expiry: number) { this.cacheExpiry = expiry; }, /** * 开始自动刷新 * @param interval 刷新间隔(毫秒),默认5分钟 */ startAutoRefresh(interval = 5 * 60 * 1000) { this.stopAutoRefresh(); this.refreshTimer = window.setInterval(() => { this.fetchBszxStatistics(true).catch(console.error); }, interval); }, /** * 停止自动刷新 */ stopAutoRefresh() { if (this.refreshTimer) { clearInterval(this.refreshTimer); this.refreshTimer = null; } } } });