修复:百色中学排行榜统计金额和仪表盘的统计数不一致的问题

This commit is contained in:
2025-07-31 12:49:17 +08:00
parent 6f4ff3f8fb
commit 20f7c99fed
11 changed files with 1430 additions and 28 deletions

View File

@@ -0,0 +1,141 @@
/**
* 百色中学统计数据 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<BszxStatisticsState>) {
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;
}
}
}
});