46 lines
1.2 KiB
Dart
46 lines
1.2 KiB
Dart
import '../models/bill.dart';
|
|
|
|
/// 按日期分组的账单
|
|
class BillDayGroup {
|
|
final String date; // yyyy-MM-dd
|
|
final List<Bill> bills;
|
|
final double expenseTotal; // type==1 的合计
|
|
final double incomeTotal; // type==2 的合计
|
|
|
|
const BillDayGroup({
|
|
required this.date,
|
|
required this.bills,
|
|
required this.expenseTotal,
|
|
required this.incomeTotal,
|
|
});
|
|
}
|
|
|
|
/// 按 billDate 分组,并分别累计当日支出/收入。
|
|
///
|
|
/// 后端已按 `billDate DESC, createTime DESC` 排序,Dart 的 Map 保持插入顺序,
|
|
/// 因此直接顺序遍历累积即可,不要再次排序(否则会打乱同日内的时间顺序)。
|
|
List<BillDayGroup> groupBillsByDate(List<Bill> bills) {
|
|
final grouped = <String, List<Bill>>{};
|
|
for (final bill in bills) {
|
|
grouped.putIfAbsent(bill.billDate, () => []).add(bill);
|
|
}
|
|
|
|
return grouped.entries.map((entry) {
|
|
var expense = 0.0;
|
|
var income = 0.0;
|
|
for (final bill in entry.value) {
|
|
if (bill.isExpense) {
|
|
expense += bill.absAmount;
|
|
} else {
|
|
income += bill.absAmount;
|
|
}
|
|
}
|
|
return BillDayGroup(
|
|
date: entry.key,
|
|
bills: entry.value,
|
|
expenseTotal: expense,
|
|
incomeTotal: income,
|
|
);
|
|
}).toList();
|
|
}
|