asset_service.dart 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. import 'package:dio/dio.dart';
  2. import '../models/asset/asset_statement.dart';
  3. import '../models/asset/deposit_wallet.dart';
  4. import '../models/asset/today_pnl.dart';
  5. import '../models/asset/recharge_record.dart';
  6. import '../models/asset/transfer_record.dart';
  7. import '../models/asset/wallet_overview.dart';
  8. /// 资产 API 服务(无状态)
  9. class AssetService {
  10. const AssetService(this._dio);
  11. final Dio _dio;
  12. /// 获取钱包地址列表(充值页面核心接口)
  13. Future<List<DepositWallet>> getWalletAddresses() async {
  14. // 钱包地址必须始终从服务器获取,不能使用缓存,确保用户收到最新的充值地址
  15. final response = await _dio.post<Map<String, dynamic>>(
  16. 'uc/asset/wallet/address',
  17. options: Options(extra: {'noCache': true}),
  18. );
  19. final data = response.data?['data'];
  20. if (data is List) {
  21. return data
  22. .whereType<Map<String, dynamic>>()
  23. .map((e) => DepositWallet.fromJson(e))
  24. .toList();
  25. }
  26. return [];
  27. }
  28. /// 获取充值记录列表
  29. Future<List<RechargeRecord>> getRechargeList({
  30. int pageNo = 1,
  31. int pageSize = 10,
  32. }) async {
  33. final response = await _dio.get<Map<String, dynamic>>(
  34. 'uc/asset/recharge-list',
  35. queryParameters: {'pageNo': pageNo, 'pageSize': pageSize},
  36. );
  37. final data = response.data?['data'];
  38. if (data is Map<String, dynamic>) {
  39. final content = data['content'];
  40. if (content is List) {
  41. return content
  42. .whereType<Map<String, dynamic>>()
  43. .map((e) => RechargeRecord.fromJson(e))
  44. .toList();
  45. }
  46. }
  47. return [];
  48. }
  49. /// 执行划转
  50. Future<void> transfer({
  51. required String amount,
  52. required String from,
  53. required String to,
  54. }) async {
  55. await _dio.post(
  56. 'uc/asset/transfer',
  57. data: {'amount': amount, 'from': from, 'to': to},
  58. options: Options(contentType: Headers.formUrlEncodedContentType),
  59. );
  60. }
  61. /// 获取划转记录列表
  62. Future<List<TransferRecord>> getTransferList({
  63. int pageNo = 1,
  64. int pageSize = 10,
  65. }) async {
  66. final response = await _dio.post<Map<String, dynamic>>(
  67. 'uc/asset/transfer/list',
  68. data: {'pageNo': pageNo, 'pageSize': pageSize},
  69. options: Options(contentType: Headers.formUrlEncodedContentType),
  70. );
  71. final data = response.data?['data'];
  72. if (data is Map<String, dynamic>) {
  73. final content = data['content'];
  74. if (content is List) {
  75. return content
  76. .whereType<Map<String, dynamic>>()
  77. .map((e) => TransferRecord.fromJson(e))
  78. .toList();
  79. }
  80. }
  81. return [];
  82. }
  83. /// 获取流水币种列表(筛选用)
  84. Future<List<StatementCoin>> getStatementCoins() async {
  85. final response = await _dio.get<Map<String, dynamic>>(
  86. 'uc/asset/transaction/coin',
  87. );
  88. final data = response.data?['data'];
  89. if (data is List) {
  90. final list = data
  91. .whereType<Map<String, dynamic>>()
  92. .map((e) => StatementCoin.fromJson(e))
  93. .toList();
  94. list.sort((a, b) => a.sort.compareTo(b.sort));
  95. return list;
  96. }
  97. return [];
  98. }
  99. /// 获取流水类型列表(筛选用)
  100. Future<List<StatementType>> getStatementTypes() async {
  101. final response = await _dio.get<Map<String, dynamic>>(
  102. 'uc/asset/transaction/type',
  103. );
  104. final data = response.data?['data'];
  105. if (data is List) {
  106. return data
  107. .whereType<Map<String, dynamic>>()
  108. .map((e) => StatementType.fromJson(e))
  109. .toList();
  110. }
  111. return [];
  112. }
  113. /// 查询流水记录
  114. Future<List<AssetStatement>> getStatementList({
  115. String type = '',
  116. String symbol = '',
  117. String startTime = '',
  118. String endTime = '',
  119. int pageNo = 1,
  120. int pageSize = 10,
  121. }) async {
  122. final response = await _dio.post<Map<String, dynamic>>(
  123. 'uc/asset/transaction/all',
  124. data: {
  125. 'type': type,
  126. 'symbol': symbol,
  127. 'startTime': startTime,
  128. 'endTime': endTime,
  129. 'pageNo': pageNo,
  130. 'pageSize': pageSize,
  131. },
  132. options: Options(contentType: Headers.formUrlEncodedContentType),
  133. );
  134. final data = response.data?['data'];
  135. if (data is Map<String, dynamic>) {
  136. final content = data['content'];
  137. if (content is List) {
  138. return content
  139. .whereType<Map<String, dynamic>>()
  140. .map((e) => AssetStatement.fromJson(e))
  141. .toList();
  142. }
  143. }
  144. return [];
  145. }
  146. /// 获取今日盈亏(从合约资产接口提取)
  147. Future<TodayPnl> getTodayPnl() async {
  148. // 资产数据必须始终从服务器获取,不能使用缓存
  149. final response = await _dio.get<Map<String, dynamic>>(
  150. 'swap/wallet-new/get'
  151. );
  152. final data = response.data?['data'];
  153. if (data is Map<String, dynamic>) {
  154. return TodayPnl.fromJson(data);
  155. }
  156. return TodayPnl();
  157. }
  158. /// 获取可提现账户资产列表(对齐 Web: /swap/wallet-new/account/asset/list?hideZero=)
  159. Future<Map<String, dynamic>> getFundAssets({bool? hideZero}) async {
  160. final query = <String, dynamic>{};
  161. if (hideZero != null) {
  162. query['hideZero'] = hideZero;
  163. }
  164. final response = await _dio.get<Map<String, dynamic>>(
  165. 'swap/wallet-new/account/asset/list',
  166. queryParameters: query.isEmpty ? null : query,
  167. );
  168. final data = response.data?['data'];
  169. if (data is Map<String, dynamic>) {
  170. return data;
  171. }
  172. return {};
  173. }
  174. /// 获取账户总览(各钱包余额汇总)
  175. Future<List<WalletOverview>> getWalletOverview() async {
  176. // 账户余额必须始终从服务器获取,不能使用缓存
  177. final response = await _dio.get<Map<String, dynamic>>(
  178. 'uc/asset/wallets',
  179. options: Options(extra: {'noCache': true}),
  180. );
  181. final data = response.data?['data'];
  182. if (data is List) {
  183. return data
  184. .whereType<Map<String, dynamic>>()
  185. .map((e) => WalletOverview.fromJson(e))
  186. .toList();
  187. }
  188. return [];
  189. }
  190. }