修复:百色中学排行榜统计金额和仪表盘的统计数不一致的问题
This commit is contained in:
141
src/store/modules/bszx-statistics.ts
Normal file
141
src/store/modules/bszx-statistics.ts
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user