Files
monisuo/flutter_monisuo/lib/data/models/account_models.dart
2026-04-07 01:05:05 +08:00

181 lines
4.9 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/// 資產總覽模型
class AssetOverview {
final String totalAsset;
final String fundBalance;
final String tradeBalance;
final String totalProfit;
AssetOverview({
required this.totalAsset,
required this.fundBalance,
required this.tradeBalance,
required this.totalProfit,
});
factory AssetOverview.fromJson(Map<String, dynamic> json) {
return AssetOverview(
totalAsset: json['totalAsset']?.toString() ?? '0.00',
fundBalance: json['fundBalance']?.toString() ?? '0.00',
tradeBalance: json['tradeBalance']?.toString() ?? '0.00',
totalProfit: json['totalProfit']?.toString() ?? '0.00',
);
}
}
/// 資金賬戶模型
class AccountFund {
final int id;
final int userId;
final String balance;
final String frozenBalance;
final DateTime? updateTime;
AccountFund({
required this.id,
required this.userId,
required this.balance,
required this.frozenBalance,
this.updateTime,
});
factory AccountFund.fromJson(Map<String, dynamic> json) {
return AccountFund(
id: json['id'] as int? ?? 0,
userId: json['userId'] as int? ?? 0,
balance: json['balance']?.toString() ?? '0.00',
frozenBalance: json['frozenBalance']?.toString() ?? '0.00',
updateTime: json['updateTime'] != null
? DateTime.tryParse(json['updateTime'])
: null,
);
}
}
/// 交易賬戶模型(持倉)
class AccountTrade {
final int id;
final int userId;
final String coinCode;
final String quantity;
final String avgPrice;
final String totalCost;
final String currentValue;
final String profit;
final double profitRate;
final DateTime? updateTime;
AccountTrade({
required this.id,
required this.userId,
required this.coinCode,
required this.quantity,
required this.avgPrice,
required this.totalCost,
required this.currentValue,
required this.profit,
required this.profitRate,
this.updateTime,
});
factory AccountTrade.fromJson(Map<String, dynamic> json) {
// 後端返回 value當前價值前端用 currentValue
final quantityNum =
double.tryParse(json['quantity']?.toString() ?? '0') ?? 0;
final avgPriceNum =
double.tryParse(json['avgPrice']?.toString() ?? '0') ?? 0;
final currentValueNum =
double.tryParse(json['value']?.toString() ?? '0') ??
double.tryParse(json['currentValue']?.toString() ?? '0') ??
0;
final totalCostNum = quantityNum * avgPriceNum;
final profitNum = currentValueNum - totalCostNum;
final double profitRateNum =
totalCostNum > 0 ? (profitNum / totalCostNum) * 100.0 : 0.0;
return AccountTrade(
id: json['id'] as int? ?? 0,
userId: json['userId'] as int? ?? 0,
coinCode: json['coinCode'] as String? ?? '',
quantity: json['quantity']?.toString() ?? '0',
avgPrice: json['avgPrice']?.toString() ?? '0.00',
totalCost: totalCostNum.toStringAsFixed(2),
currentValue: currentValueNum.toStringAsFixed(2),
profit: profitNum.toStringAsFixed(2),
profitRate: profitRateNum,
updateTime: json['updateTime'] != null
? DateTime.tryParse(json['updateTime'])
: null,
);
}
/// 格式化盈虧率
String get formattedProfitRate {
final prefix = profitRate >= 0 ? '+' : '';
return '$prefix${profitRate.toStringAsFixed(2)}%';
}
/// 是否盈利
bool get isProfit => profitRate >= 0;
}
/// 資金流水模型
class AccountFlow {
final int id;
final int userId;
final String flowType;
final String amount;
final String balanceBefore;
final String balanceAfter;
final String remark;
final DateTime? createTime;
AccountFlow({
required this.id,
required this.userId,
required this.flowType,
required this.amount,
required this.balanceBefore,
required this.balanceAfter,
required this.remark,
this.createTime,
});
factory AccountFlow.fromJson(Map<String, dynamic> json) {
return AccountFlow(
id: json['id'] as int? ?? 0,
userId: json['userId'] as int? ?? 0,
flowType: json['flowType']?.toString() ?? '',
amount: json['amount']?.toString() ?? '0.00',
balanceBefore: json['balanceBefore']?.toString() ?? '0.00',
balanceAfter: json['balanceAfter']?.toString() ?? '0.00',
remark: json['remark']?.toString() ?? '',
createTime: json['createTime'] != null
? DateTime.tryParse(json['createTime'])
: null,
);
}
/// 流水類型文字
String get flowTypeText {
switch (flowType) {
case '1':
return '充值';
case '2':
return '提現';
case '3':
return '轉入交易賬戶';
case '4':
return '從交易賬戶轉出';
case '5':
return '賣出收入';
case '6':
return '買入支出';
default:
return '未知';
}
}
/// 是否為收入
bool get isIncome => ['1', '3', '5'].contains(flowType);
}