feat: 支持围度数据图表

This commit is contained in:
richarjiang
2025-09-24 18:04:12 +08:00
parent 028ef56caf
commit 6303795870
9 changed files with 1180 additions and 359 deletions

View File

@@ -0,0 +1,87 @@
import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';
import { CircumferenceAnalysisData, CircumferencePeriod, getCircumferenceAnalysis } from '@/services/circumferenceAnalysis';
export type CircumferenceState = {
data: Record<CircumferencePeriod, CircumferenceAnalysisData[]>;
loading: Record<CircumferencePeriod, boolean>;
error: string | null;
lastFetch: Record<CircumferencePeriod, number>;
};
const initialState: CircumferenceState = {
data: {
week: [],
month: [],
year: [],
},
loading: {
week: false,
month: false,
year: false,
},
error: null,
lastFetch: {
week: 0,
month: 0,
year: 0,
},
};
// 获取围度分析数据
export const fetchCircumferenceAnalysis = createAsyncThunk(
'circumference/fetchAnalysis',
async (period: CircumferencePeriod, { rejectWithValue }) => {
try {
const data = await getCircumferenceAnalysis(period);
return { period, data };
} catch (error: any) {
return rejectWithValue(error?.message || '获取围度分析数据失败');
}
}
);
const circumferenceSlice = createSlice({
name: 'circumference',
initialState,
reducers: {
clearError: (state) => {
state.error = null;
},
},
extraReducers: (builder) => {
builder
.addCase(fetchCircumferenceAnalysis.pending, (state, action) => {
const period = action.meta.arg;
state.loading[period] = true;
state.error = null;
})
.addCase(fetchCircumferenceAnalysis.fulfilled, (state, action) => {
const { period, data } = action.payload;
state.loading[period] = false;
state.data[period] = data;
state.lastFetch[period] = Date.now();
})
.addCase(fetchCircumferenceAnalysis.rejected, (state, action) => {
const period = action.meta.arg;
state.loading[period] = false;
state.error = action.payload as string;
});
},
});
export const { clearError } = circumferenceSlice.actions;
// Selectors
export const selectCircumferenceData = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) =>
state.circumference.data[period];
export const selectCircumferenceLoading = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) =>
state.circumference.loading[period];
export const selectCircumferenceError = (state: { circumference: CircumferenceState }) =>
state.circumference.error;
export const selectLastFetch = (state: { circumference: CircumferenceState }, period: CircumferencePeriod) =>
state.circumference.lastFetch[period];
export default circumferenceSlice.reducer;