refactor(web): unify bills as UIBill, remove BillRecord

This commit is contained in:
clz
2026-01-18 21:14:54 +08:00
parent c61691249f
commit 65ea2fa477
13 changed files with 484 additions and 613 deletions

View File

@@ -1,11 +1,11 @@
import type { BillRecord } from '$lib/api';
import type { UIBill } from '$lib/models/bill';
import type { CategoryStat, MonthlyStat, DailyExpenseData, TotalStats, PieChartDataItem } from '$lib/types/analysis';
import { pieColors } from '$lib/constants/chart';
/**
* 计算分类统计
*/
export function calculateCategoryStats(records: BillRecord[]): CategoryStat[] {
export function calculateCategoryStats(records: UIBill[]): CategoryStat[] {
const stats = new Map<string, { expense: number; income: number; count: number }>();
for (const r of records) {
@@ -14,8 +14,8 @@ export function calculateCategoryStats(records: BillRecord[]): CategoryStat[] {
}
const s = stats.get(r.category)!;
s.count++;
const amount = parseFloat(r.amount || '0');
if (r.income_expense === '支出') {
const amount = r.amount || 0;
if (r.incomeExpense === '支出') {
s.expense += amount;
} else {
s.income += amount;
@@ -30,7 +30,7 @@ export function calculateCategoryStats(records: BillRecord[]): CategoryStat[] {
/**
* 计算月度统计
*/
export function calculateMonthlyStats(records: BillRecord[]): MonthlyStat[] {
export function calculateMonthlyStats(records: UIBill[]): MonthlyStat[] {
const stats = new Map<string, { expense: number; income: number }>();
for (const r of records) {
@@ -39,8 +39,8 @@ export function calculateMonthlyStats(records: BillRecord[]): MonthlyStat[] {
stats.set(month, { expense: 0, income: 0 });
}
const s = stats.get(month)!;
const amount = parseFloat(r.amount || '0');
if (r.income_expense === '支出') {
const amount = r.amount || 0;
if (r.incomeExpense === '支出') {
s.expense += amount;
} else {
s.income += amount;
@@ -55,13 +55,13 @@ export function calculateMonthlyStats(records: BillRecord[]): MonthlyStat[] {
/**
* 计算每日支出数据(用于面积图)
*/
export function calculateDailyExpenseData(records: BillRecord[]): DailyExpenseData[] {
export function calculateDailyExpenseData(records: UIBill[]): DailyExpenseData[] {
const stats = new Map<string, number>();
for (const r of records) {
if (r.income_expense !== '支出') continue;
if (r.incomeExpense !== '支出') continue;
const date = r.time.substring(0, 10); // YYYY-MM-DD
const amount = parseFloat(r.amount || '0');
const amount = r.amount || 0;
stats.set(date, (stats.get(date) || 0) + amount);
}
@@ -73,14 +73,14 @@ export function calculateDailyExpenseData(records: BillRecord[]): DailyExpenseDa
/**
* 计算总计统计
*/
export function calculateTotalStats(records: BillRecord[]): TotalStats {
export function calculateTotalStats(records: UIBill[]): TotalStats {
return {
expense: records
.filter(r => r.income_expense === '支出')
.reduce((sum, r) => sum + parseFloat(r.amount || '0'), 0),
.filter(r => r.incomeExpense === '支出')
.reduce((sum, r) => sum + (r.amount || 0), 0),
income: records
.filter(r => r.income_expense === '收入')
.reduce((sum, r) => sum + parseFloat(r.amount || '0'), 0),
.filter(r => r.incomeExpense === '收入')
.reduce((sum, r) => sum + (r.amount || 0), 0),
count: records.length,
};
}
@@ -112,18 +112,18 @@ export function calculatePieChartData(
/**
* 获取 Top N 支出记录
*/
export function getTopExpenses(records: BillRecord[], n: number = 10): BillRecord[] {
export function getTopExpenses(records: UIBill[], n: number = 10): UIBill[] {
return records
.filter(r => r.income_expense === '支出')
.sort((a, b) => parseFloat(b.amount) - parseFloat(a.amount))
.filter(r => r.incomeExpense === '支出')
.sort((a, b) => (b.amount || 0) - (a.amount || 0))
.slice(0, n);
}
/**
* 统计支出/收入笔数
*/
export function countByType(records: BillRecord[], type: '支出' | '收入'): number {
return records.filter(r => r.income_expense === type).length;
export function countByType(records: UIBill[], type: '支出' | '收入'): number {
return records.filter(r => r.incomeExpense === type).length;
}