import '../../models/share_account_model.dart'; import '../../models/mining_record_model.dart'; import '../../models/global_state_model.dart'; import '../../models/planting_record_model.dart'; import '../../../core/network/api_client.dart'; import '../../../core/network/api_endpoints.dart'; import '../../../core/error/exceptions.dart'; import '../../../domain/repositories/mining_repository.dart'; abstract class MiningRemoteDataSource { Future getShareAccount(String accountSequence); Future getMiningRecords( String accountSequence, { int page = 1, int pageSize = 20, }); Future getGlobalState(); Future getPlantingLedger( String accountSequence, { int page = 1, int pageSize = 10, }); } class MiningRemoteDataSourceImpl implements MiningRemoteDataSource { final ApiClient client; MiningRemoteDataSourceImpl({required this.client}); @override Future getShareAccount(String accountSequence) async { try { final response = await client.get(ApiEndpoints.shareAccount(accountSequence)); return ShareAccountModel.fromJson(response.data); } catch (e) { throw ServerException(e.toString()); } } @override Future getMiningRecords( String accountSequence, { int page = 1, int pageSize = 20, }) async { try { final response = await client.get( ApiEndpoints.miningRecords(accountSequence), queryParameters: {'page': page, 'pageSize': pageSize}, ); final data = response.data; // mining-service 返回格式: { data: [...], total: ... } final rawItems = data['data'] as List? ?? data['items'] as List? ?? data['records'] as List? ?? []; final items = rawItems.map((json) => MiningRecordModel.fromJson({ 'id': json['id']?.toString() ?? '', 'accountSequence': accountSequence, 'distributionMinute': json['miningMinute']?.toString() ?? json['distributionMinute'] ?? '', 'contributionRatio': json['contributionRatio']?.toString() ?? '0', 'shareAmount': json['minedAmount']?.toString() ?? json['shareAmount'] ?? '0', 'priceSnapshot': json['secondDistribution']?.toString() ?? json['priceSnapshot'] ?? '0', 'createdAt': json['createdAt'], })).toList(); final total = data['total'] ?? items.length; return MiningRecordsPage( items: items, total: total, page: page, pageSize: pageSize, totalPages: (total / pageSize).ceil(), ); } catch (e) { throw ServerException(e.toString()); } } @override Future getGlobalState() async { try { final response = await client.get(ApiEndpoints.globalState); return GlobalStateModel.fromJson(response.data); } catch (e) { throw ServerException(e.toString()); } } @override Future getPlantingLedger( String accountSequence, { int page = 1, int pageSize = 10, }) async { try { final response = await client.get( ApiEndpoints.plantingLedger(accountSequence), queryParameters: {'page': page, 'pageSize': pageSize}, ); return PlantingLedgerPageModel.fromJson(response.data); } catch (e) { throw ServerException(e.toString()); } } }