61 行
1.8 KiB
TypeScript
61 行
1.8 KiB
TypeScript
import { apiRequestData } from "./http";
|
|
|
|
export type DashboardQuery = {
|
|
dateFrom?: string;
|
|
dateTo?: string;
|
|
departmentId?: string;
|
|
limit?: number;
|
|
};
|
|
|
|
function toQueryString(query: DashboardQuery = {}) {
|
|
const params = new URLSearchParams();
|
|
if (query.dateFrom) params.set("dateFrom", query.dateFrom);
|
|
if (query.dateTo) params.set("dateTo", query.dateTo);
|
|
if (query.departmentId) params.set("departmentId", query.departmentId);
|
|
if (query.limit != null) params.set("limit", String(query.limit));
|
|
const encoded = params.toString();
|
|
return encoded ? `?${encoded}` : "";
|
|
}
|
|
|
|
export type DashboardExpenseOverview = {
|
|
totalCount: number;
|
|
totalAmount: string;
|
|
paidCount: number;
|
|
paidAmount: string;
|
|
reviewingCount: number;
|
|
};
|
|
|
|
export type DashboardTrendPoint = {
|
|
date: string;
|
|
amount: string;
|
|
count: number;
|
|
};
|
|
|
|
export type DashboardTopCategory = {
|
|
code: string;
|
|
name: string;
|
|
amount: string;
|
|
count: number;
|
|
};
|
|
|
|
export type DashboardApprovalEfficiency = {
|
|
approvedCount: number;
|
|
averageHours: number;
|
|
};
|
|
|
|
export async function fetchDashboardOverview(query: DashboardQuery = {}) {
|
|
return apiRequestData<DashboardExpenseOverview>(`/api/dashboard/expense-overview${toQueryString(query)}`);
|
|
}
|
|
|
|
export async function fetchDashboardTrends(query: DashboardQuery = {}) {
|
|
return apiRequestData<{ points: DashboardTrendPoint[] }>(`/api/dashboard/trends${toQueryString(query)}`);
|
|
}
|
|
|
|
export async function fetchDashboardTopCategories(query: DashboardQuery = {}) {
|
|
return apiRequestData<{ items: DashboardTopCategory[] }>(`/api/dashboard/top-categories${toQueryString(query)}`);
|
|
}
|
|
|
|
export async function fetchDashboardApprovalEfficiency(query: DashboardQuery = {}) {
|
|
return apiRequestData<DashboardApprovalEfficiency>(`/api/dashboard/approval-efficiency${toQueryString(query)}`);
|
|
}
|