Files
video/app/lib/services/wallet_service.dart
2026-10-15 20:36:59 +08:00

142 lines
4.0 KiB
Dart

import '../core/network/api_client.dart';
import '../core/network/endpoints.dart';
/// 钱包信息(《03-接口文档》4.4)
class WalletInfo {
const WalletInfo({
this.points = 0,
this.totalRecharge = 0,
this.totalEarned = 0,
this.totalConsumed = 0,
this.rewardProgress = const CommentRewardProgress(),
});
final int points;
final int totalRecharge;
final int totalEarned;
final int totalConsumed;
final CommentRewardProgress rewardProgress;
factory WalletInfo.fromJson(Map<String, dynamic> json) => WalletInfo(
points: (json['points'] as num?)?.toInt() ?? 0,
totalRecharge: (json['total_recharge'] as num?)?.toInt() ?? 0,
totalEarned: (json['total_earned'] as num?)?.toInt() ?? 0,
totalConsumed: (json['total_consumed'] as num?)?.toInt() ?? 0,
rewardProgress: CommentRewardProgress.fromJson(
(json['comment_reward_progress'] as Map<String, dynamic>?) ??
const {},
),
);
}
/// 评论奖励进度
class CommentRewardProgress {
const CommentRewardProgress({
this.current = 0,
this.target = 10,
this.todayRewarded = 0,
this.dailyLimit = 5,
});
final int current;
final int target;
final int todayRewarded;
final int dailyLimit;
factory CommentRewardProgress.fromJson(Map<String, dynamic> json) =>
CommentRewardProgress(
current: (json['current'] as num?)?.toInt() ?? 0,
target: (json['target'] as num?)?.toInt() ?? 10,
todayRewarded: (json['today_rewarded'] as num?)?.toInt() ?? 0,
dailyLimit: (json['daily_limit'] as num?)?.toInt() ?? 5,
);
}
/// 积分明细记录(《03-接口文档》4.5)
class PointsRecord {
const PointsRecord({
required this.id,
required this.changeAmount,
required this.balanceAfter,
required this.bizType,
this.remark = '',
this.createdAt = '',
});
final int id;
/// 正=获得,负=消耗
final int changeAmount;
final int balanceAfter;
/// 1充值 2观看 3评论奖励 4会员 5赠送 6调整 7扣回
final int bizType;
final String remark;
final String createdAt;
static const Map<int, String> bizTypeLabels = {
1: '充值',
2: '观看',
3: '评论奖励',
4: '会员',
5: '赠送',
6: '调整',
7: '扣回',
};
String get bizTypeLabel => bizTypeLabels[bizType] ?? '其他';
bool get isExpense => changeAmount < 0;
factory PointsRecord.fromJson(Map<String, dynamic> json) => PointsRecord(
id: (json['id'] as num).toInt(),
changeAmount: (json['change_amount'] as num).toInt(),
balanceAfter: (json['balance_after'] as num).toInt(),
bizType: (json['biz_type'] as num).toInt(),
remark: (json['remark'] as String?) ?? '',
createdAt: (json['created_at'] as String?) ?? '',
);
}
/// 积分明细分页
class PointsRecordsPage {
const PointsRecordsPage({required this.total, required this.items});
final int total;
final List<PointsRecord> items;
factory PointsRecordsPage.fromJson(Map<String, dynamic> json) =>
PointsRecordsPage(
total: (json['total'] as num?)?.toInt() ?? 0,
items: ((json['list'] as List?) ?? const [])
.whereType<Map<String, dynamic>>()
.map(PointsRecord.fromJson)
.toList(),
);
}
/// 钱包服务(《03-接口文档》4.4/4.5)
class WalletService {
WalletService._();
/// 4.4 钱包信息(需登录)
static Future<WalletInfo> fetchWallet() async {
final data = await ApiClient.get<Map<String, dynamic>>(Endpoints.meWallet);
return WalletInfo.fromJson(data);
}
/// 4.5 积分明细(需登录)
static Future<PointsRecordsPage> fetchPointsRecords({
int page = 1,
int pageSize = 20,
int? bizType,
}) async {
final query = <String, dynamic>{'page': page, 'page_size': pageSize};
if (bizType != null) query['biz_type'] = bizType;
final data = await ApiClient.get<Map<String, dynamic>>(
Endpoints.mePointsRecords,
queryParameters: query,
);
return PointsRecordsPage.fromJson(data);
}
}