import '../../data/models/asset/today_pnl.dart'; /// 解析现货各币种可用余额(对齐 Web `parseSpotAvailableMap`)。 Map parseSpotAvailableMap(Map spotData) { final map = {}; final list = spotData['assetList']; if (list is! List) { return map; } for (final item in list) { if (item is! Map) { continue; } final coin = '${item['symbol'] ?? item['coinId'] ?? item['coin'] ?? ''}' .toUpperCase() .trim(); if (coin.isEmpty) { continue; } final avail = item['available'] ?? item['balance']; map[coin] = '${avail ?? '0'}'; } return map; } /// 现货币种开放列表(对齐 Web `parseOpenCoinSymbols`)。 List parseOpenCoinSymbols(List> coinsRaw) { final set = {}; for (final item in coinsRaw) { final sym = '${item['symbol'] ?? item['coinSymbol'] ?? ''}'.toUpperCase().trim(); if (sym.isNotEmpty) { set.add(sym); } } final list = set.toList() ..sort((a, b) { if (a == 'USDT') { return -1; } if (b == 'USDT') { return 1; } return a.compareTo(b); }); if (list.isEmpty) { return const ['USDT']; } return list; } /// 资金账户各币种可用余额(对齐 Web `parseFundWalletBalances`)。 Map parseFundWalletBalances(dynamic raw) { final map = {}; final arr = raw is List ? raw : raw is Map && raw['data'] is List ? raw['data'] as List : null; if (arr == null) { return map; } for (final item in arr) { if (item is! Map) { continue; } final coin = item['coin']; final unit = '${item['coinUnit'] ?? (coin is Map ? coin['unit'] ?? coin['name'] : null) ?? item['unit'] ?? ''}' .toUpperCase() .trim(); if (unit.isEmpty) { continue; } final bal = item['balance'] ?? item['available'] ?? item['useBalance']; map[unit] = '${bal ?? '0'}'; } return map; } AccountInfo? pickStakingAccount(List list) { for (final row in list) { final name = row.name.trim(); if (name.contains('质押') || name.toLowerCase().contains('staking')) { return row; } } return null; } String stakingOverviewLockedFromAccounts(List list) { final row = pickStakingAccount(list); if (row == null) { return '0'; } return row.frozenBalance.toString(); }