diff --git a/flutter_monisuo/lib/ui/pages/asset/asset_page.dart b/flutter_monisuo/lib/ui/pages/asset/asset_page.dart index b48914d..e12311d 100644 --- a/flutter_monisuo/lib/ui/pages/asset/asset_page.dart +++ b/flutter_monisuo/lib/ui/pages/asset/asset_page.dart @@ -5,7 +5,6 @@ import '../../../core/theme/app_spacing.dart'; import '../../../core/theme/app_theme.dart'; import '../../../core/event/app_event_bus.dart'; import '../../../providers/asset_provider.dart'; -import 'components/account_tab_switcher.dart'; import 'components/action_buttons_row.dart'; import 'components/asset_dialogs.dart'; import 'components/balance_card.dart'; @@ -23,7 +22,6 @@ class AssetPage extends StatefulWidget { } class _AssetPageState extends State with AutomaticKeepAliveClientMixin { - int _activeTab = 0; StreamSubscription? _eventSub; @override @@ -76,7 +74,7 @@ class _AssetPageState extends State with AutomaticKeepAliveClientMixi child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Page title: "资产" 22px bold — matching .pen titleFrame padding [16,0,8,0] + // Page title Padding( padding: const EdgeInsets.only(top: 16, bottom: 8), child: Text( @@ -85,16 +83,25 @@ class _AssetPageState extends State with AutomaticKeepAliveClientMixi ), ), const SizedBox(height: AppSpacing.sm), - // Account tab switcher — pill-style matching .pen UE6xC - AccountTabSwitcher( - selectedIndex: _activeTab, - onChanged: (index) => setState(() => _activeTab = index), - ), - const SizedBox(height: AppSpacing.md), - // Balance card — matching .pen 59637 (cornerRadius lg, stroke, padding 20, gap 12) - BalanceCard( - provider: provider, - activeTab: _activeTab, + // 资金账户 + 交易账户 左右并排 + Row( + children: [ + Expanded( + child: BalanceCard( + provider: provider, + label: '资金账户', + balance: provider.fundAccount?.balance ?? provider.overview?.fundBalance ?? '0.00', + ), + ), + const SizedBox(width: AppSpacing.sm), + Expanded( + child: BalanceCard( + provider: provider, + label: '交易账户', + balance: _calculateTradeTotal(provider), + ), + ), + ], ), const SizedBox(height: AppSpacing.md), // Action buttons row — matching .pen pIpHe (gap 12) @@ -112,8 +119,8 @@ class _AssetPageState extends State with AutomaticKeepAliveClientMixi ), ), const SizedBox(height: AppSpacing.md), - // Holdings section — matching .pen th9BG + 6X6tC - HoldingsSection(holdings: _activeTab == 1 ? provider.holdings : []), + // Holdings section + HoldingsSection(holdings: provider.holdings), ], ), ), @@ -123,6 +130,14 @@ class _AssetPageState extends State with AutomaticKeepAliveClientMixi ); } + String _calculateTradeTotal(AssetProvider provider) { + double total = 0; + for (var h in provider.holdings) { + total += double.tryParse(h.currentValue?.toString() ?? '0') ?? 0; + } + return total.toStringAsFixed(2); + } + void _navigateToTransfer(BuildContext context) async { final result = await Navigator.push( context, diff --git a/flutter_monisuo/lib/ui/pages/asset/components/asset_dialogs.dart b/flutter_monisuo/lib/ui/pages/asset/components/asset_dialogs.dart index fcf0eae..98863b1 100644 --- a/flutter_monisuo/lib/ui/pages/asset/components/asset_dialogs.dart +++ b/flutter_monisuo/lib/ui/pages/asset/components/asset_dialogs.dart @@ -360,177 +360,268 @@ void showWithdrawDialog(BuildContext context, String? balance) { final addressController = TextEditingController(); final contactController = TextEditingController(); final formKey = GlobalKey(); + final feeNotifier = ValueNotifier('提现将扣除10%手续费'); + final networksNotifier = ValueNotifier>([]); + final selectedNetworkNotifier = ValueNotifier(null); final colorScheme = Theme.of(context).colorScheme; final isDark = Theme.of(context).brightness == Brightness.dark; + amountController.addListener(() { + final amount = double.tryParse(amountController.text) ?? 0; + if (amount > 0) { + final fee = amount * 0.1; + final receivable = amount - fee; + feeNotifier.value = '手续费(10%): -${fee.toStringAsFixed(2)} USDT | 应收款: ${receivable.toStringAsFixed(2)} USDT'; + } else { + feeNotifier.value = '提现将扣除10%手续费'; + } + }); + + // 获取网络列表 + context.read().getWalletNetworks().then((list) { + networksNotifier.value = list; + if (list.isNotEmpty) { + selectedNetworkNotifier.value = list.first; + } + }); + showShadDialog( context: context, - builder: (ctx) => Dialog( - backgroundColor: const Color(0x00000000), - child: GlassPanel( - borderRadius: BorderRadius.circular(AppRadius.lg), - padding: const EdgeInsets.all(AppSpacing.lg), - child: SingleChildScrollView( - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Container( - padding: const EdgeInsets.all(AppSpacing.sm), - decoration: BoxDecoration( - color: colorScheme.primary.withValues(alpha: 0.1), - borderRadius: BorderRadius.circular(AppRadius.md), + builder: (ctx) => StatefulBuilder( + builder: (ctx, setState) => Dialog( + backgroundColor: const Color(0x00000000), + child: GlassPanel( + borderRadius: BorderRadius.circular(AppRadius.lg), + padding: const EdgeInsets.all(AppSpacing.lg), + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Container( + padding: const EdgeInsets.all(AppSpacing.sm), + decoration: BoxDecoration( + color: colorScheme.primary.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(AppRadius.md), + ), + child: Icon( + LucideIcons.wallet, + color: colorScheme.primary, + ), ), - child: Icon( - LucideIcons.wallet, - color: colorScheme.primary, + const SizedBox(width: AppSpacing.sm), + Text( + '提现', + style: AppTextStyles.headlineLarge(context).copyWith( + fontWeight: FontWeight.w700, + ), ), + ], + ), + const SizedBox(height: AppSpacing.xs), + Text( + '安全地将您的资产转移到外部钱包地址', + style: AppTextStyles.bodyMedium(context).copyWith( + color: colorScheme.onSurfaceVariant, ), - const SizedBox(width: AppSpacing.sm), - Text( - '提现', - style: AppTextStyles.headlineLarge(context).copyWith( - fontWeight: FontWeight.w700, + ), + if (balance != null) ...[ + const SizedBox(height: AppSpacing.md), + Container( + padding: const EdgeInsets.symmetric( + horizontal: AppSpacing.md, + vertical: AppSpacing.sm, + ), + decoration: BoxDecoration( + color: AppColorScheme.getUpBackgroundColor(isDark), + borderRadius: BorderRadius.circular(AppRadius.full), + border: Border.all( + color: AppColorScheme.getUpColor(isDark).withValues(alpha: 0.2), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '可用余额: ', + style: AppTextStyles.bodySmall(context).copyWith( + color: colorScheme.onSurfaceVariant, + ), + ), + Text( + '$balance USDT', + style: AppTextStyles.labelLarge(context).copyWith( + fontWeight: FontWeight.bold, + color: AppColorScheme.getUpColor(isDark), + ), + ), + ], ), ), ], - ), - const SizedBox(height: AppSpacing.xs), - Text( - '安全地将您的资产转移到外部钱包地址', - style: AppTextStyles.bodyMedium(context).copyWith( - color: colorScheme.onSurfaceVariant, - ), - ), - if (balance != null) ...[ - const SizedBox(height: AppSpacing.md), - Container( - padding: const EdgeInsets.symmetric( - horizontal: AppSpacing.md, - vertical: AppSpacing.sm, - ), - decoration: BoxDecoration( - color: AppColorScheme.getUpBackgroundColor(isDark), - borderRadius: BorderRadius.circular(AppRadius.full), - border: Border.all( - color: AppColorScheme.getUpColor(isDark).withValues(alpha: 0.2), - ), - ), - child: Row( - mainAxisSize: MainAxisSize.min, + const SizedBox(height: AppSpacing.lg), + ShadForm( + key: formKey, + child: Column( children: [ - Text( - '可用余额: ', - style: AppTextStyles.bodySmall(context).copyWith( - color: colorScheme.onSurfaceVariant, + ShadInputFormField( + id: 'amount', + controller: amountController, + label: const Text('提现金额'), + placeholder: const Text('请输入提现金额(USDT)'), + keyboardType: const TextInputType.numberWithOptions(decimal: true), + validator: Validators.amount, + ), + const SizedBox(height: AppSpacing.xs), + // 手续费提示 + Container( + padding: const EdgeInsets.symmetric( + horizontal: AppSpacing.md, + vertical: AppSpacing.sm, + ), + decoration: BoxDecoration( + color: Colors.orange.withValues(alpha: 0.1), + borderRadius: BorderRadius.circular(AppRadius.md), + border: Border.all(color: Colors.orange.withValues(alpha: 0.3)), + ), + child: Row( + children: [ + Icon(Icons.info_outline, size: 14, color: Colors.orange), + const SizedBox(width: AppSpacing.xs), + Expanded( + child: ValueListenableBuilder( + valueListenable: feeNotifier, + builder: (_, text, __) => Text( + text, + style: TextStyle(fontSize: 11, color: Colors.orange.shade800), + ), + ), + ), + ], ), ), - Text( - '$balance USDT', - style: AppTextStyles.labelLarge(context).copyWith( - fontWeight: FontWeight.bold, - color: AppColorScheme.getUpColor(isDark), - ), + const SizedBox(height: AppSpacing.md), + // 提现网络选择 + ValueListenableBuilder>( + valueListenable: networksNotifier, + builder: (_, networks, __) { + if (networks.isEmpty) return const SizedBox.shrink(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + '提现网络', + style: AppTextStyles.bodySmall(context).copyWith( + color: colorScheme.onSurfaceVariant, + ), + ), + const SizedBox(height: 4), + SizedBox( + width: double.infinity, + child: ValueListenableBuilder( + valueListenable: selectedNetworkNotifier, + builder: (_, selected, __) => ShadSelect( + initialValue: selected ?? networks.first, + placeholder: const Text('选择提现网络'), + onChanged: (value) { + selectedNetworkNotifier.value = value; + }, + selectedOptionBuilder: (context, value) => Text(value), + options: networks.map((network) => ShadOption( + value: network, + child: Text(network), + )), + ), + ), + ), + ], + ); + }, + ), + const SizedBox(height: AppSpacing.md), + ShadInputFormField( + id: 'address', + controller: addressController, + label: const Text('目标地址'), + placeholder: const Text('请输入提现地址'), + validator: (v) => Validators.required(v, '提现地址'), + ), + const SizedBox(height: AppSpacing.md), + ShadInputFormField( + id: 'contact', + controller: contactController, + label: const Text('联系方式(可选)'), + placeholder: const Text('联系方式'), ), ], ), ), - ], - const SizedBox(height: AppSpacing.lg), - ShadForm( - key: formKey, - child: Column( + const SizedBox(height: AppSpacing.lg), + Row( children: [ - ShadInputFormField( - id: 'amount', - controller: amountController, - label: const Text('提现金额'), - placeholder: const Text('请输入提现金额(USDT)'), - keyboardType: const TextInputType.numberWithOptions(decimal: true), - validator: Validators.amount, + Expanded( + child: NeonButton( + text: '取消', + type: NeonButtonType.outline, + onPressed: () => Navigator.of(ctx).pop(), + height: 44, + showGlow: false, + ), ), - const SizedBox(height: AppSpacing.md), - ShadInputFormField( - id: 'address', - controller: addressController, - label: const Text('目标地址'), - placeholder: const Text('请输入提现地址'), - validator: (v) => Validators.required(v, '提现地址'), - ), - const SizedBox(height: AppSpacing.md), - ShadInputFormField( - id: 'contact', - controller: contactController, - label: const Text('联系方式(可选)'), - placeholder: const Text('联系方式'), + const SizedBox(width: AppSpacing.sm), + Expanded( + child: NeonButton( + text: '提交', + type: NeonButtonType.primary, + onPressed: () async { + if (formKey.currentState!.saveAndValidate()) { + Navigator.of(ctx).pop(); + final response = await context.read().withdraw( + amount: amountController.text, + withdrawAddress: addressController.text, + network: selectedNetworkNotifier.value, + withdrawContact: contactController.text.isNotEmpty + ? contactController.text + : null, + ); + if (context.mounted) { + showResultDialog( + context, + response.success ? '申请成功' : '申请失败', + response.success ? '请等待管理员审批' : response.message, + ); + } + } + }, + height: 44, + showGlow: true, + ), ), ], ), - ), - const SizedBox(height: AppSpacing.lg), - Row( - children: [ - Expanded( - child: NeonButton( - text: '取消', - type: NeonButtonType.outline, - onPressed: () => Navigator.of(ctx).pop(), - height: 44, - showGlow: false, - ), - ), - const SizedBox(width: AppSpacing.sm), - Expanded( - child: NeonButton( - text: '提交', - type: NeonButtonType.primary, - onPressed: () async { - if (formKey.currentState!.saveAndValidate()) { - Navigator.of(ctx).pop(); - final response = await context.read().withdraw( - amount: amountController.text, - withdrawAddress: addressController.text, - withdrawContact: contactController.text.isNotEmpty - ? contactController.text - : null, - ); - if (context.mounted) { - showResultDialog( - context, - response.success ? '申请成功' : '申请失败', - response.success ? '请等待管理员审批' : response.message, - ); - } - } - }, - height: 44, - showGlow: true, - ), - ), - ], - ), - const SizedBox(height: AppSpacing.md), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon( - Icons.verified_user, - size: 12, - color: colorScheme.onSurfaceVariant.withValues(alpha: 0.5), - ), - const SizedBox(width: AppSpacing.xs), - Text( - 'End-to-End Encrypted Transaction', - style: AppTextStyles.bodySmall(context).copyWith( - fontSize: 10, + const SizedBox(height: AppSpacing.md), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.verified_user, + size: 12, color: colorScheme.onSurfaceVariant.withValues(alpha: 0.5), ), - ), - ], - ), - ], + const SizedBox(width: AppSpacing.xs), + Text( + 'End-to-End Encrypted Transaction', + style: AppTextStyles.bodySmall(context).copyWith( + fontSize: 10, + color: colorScheme.onSurfaceVariant.withValues(alpha: 0.5), + ), + ), + ], + ), + ], + ), ), ), ), diff --git a/flutter_monisuo/lib/ui/pages/asset/components/balance_card.dart b/flutter_monisuo/lib/ui/pages/asset/components/balance_card.dart index 397d1d0..56dfc42 100644 --- a/flutter_monisuo/lib/ui/pages/asset/components/balance_card.dart +++ b/flutter_monisuo/lib/ui/pages/asset/components/balance_card.dart @@ -5,19 +5,17 @@ import '../../../../core/theme/app_spacing.dart'; import '../../../../providers/asset_provider.dart'; import '../../../components/glass_panel.dart'; -/// 余额卡片 — .pen node 59637 -/// cornerRadius: lg, fill: $surface-card, padding: 20, stroke: $border-default 1px, gap: 12 -/// balLabel: "USDT 余额" 12px normal $text-secondary -/// balAmount: "25,680.50" 28px w700 $text-primary -/// balSubRow: "≈ $25,680.50 USD" 12px normal $text-muted +/// 余额卡片 — 显示单个账户的 USDT 余额 class BalanceCard extends StatelessWidget { final AssetProvider provider; - final int activeTab; + final String label; + final String balance; const BalanceCard({ super.key, required this.provider, - required this.activeTab, + required this.label, + required this.balance, }); @override @@ -25,9 +23,7 @@ class BalanceCard extends StatelessWidget { final colorScheme = Theme.of(context).colorScheme; final isDark = Theme.of(context).brightness == Brightness.dark; - final displayBalance = activeTab == 0 - ? (provider.fundAccount?.balance ?? provider.overview?.fundBalance ?? '0.00') - : _calculateTradeTotal(); + final displayBalance = balance; return GlassPanel( padding: const EdgeInsets.all(20), @@ -36,7 +32,7 @@ class BalanceCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'USDT 余额', + label, style: AppTextStyles.bodyMedium(context).copyWith( color: colorScheme.onSurfaceVariant, fontWeight: FontWeight.w400, @@ -60,14 +56,6 @@ class BalanceCard extends StatelessWidget { ); } - String _calculateTradeTotal() { - double total = 0; - for (var h in provider.holdings) { - total += double.tryParse(h.currentValue?.toString() ?? '0') ?? 0; - } - return total.toStringAsFixed(2); - } - String _formatBalance(String balance) { final d = double.tryParse(balance) ?? 0; return d.toStringAsFixed(2).replaceAllMapped( diff --git a/flutter_monisuo/lib/ui/pages/asset/components/holdings_section.dart b/flutter_monisuo/lib/ui/pages/asset/components/holdings_section.dart index 47d3f47..0030a55 100644 --- a/flutter_monisuo/lib/ui/pages/asset/components/holdings_section.dart +++ b/flutter_monisuo/lib/ui/pages/asset/components/holdings_section.dart @@ -5,8 +5,8 @@ import '../../../../core/theme/app_spacing.dart'; import '../../../../data/models/account_models.dart'; import '../../../components/glass_panel.dart'; -/// 持仓区域 — .pen nodes th9BG (header) + 6X6tC (card) -/// Holdings Header: "交易账户持仓" 16px w600 $text-primary | "查看全部 >" 12px normal $text-secondary +/// 持仓区域 +/// Header: "我的资产" + "查看全部 >" /// Holdings Card: cornerRadius lg, fill $surface-card, stroke $border-default 1px class HoldingsSection extends StatelessWidget { final List holdings; @@ -19,14 +19,14 @@ class HoldingsSection extends StatelessWidget { return Column( children: [ - // Header row: "交易账户持仓" + "查看全部 >" + // Header row: "我的资产" + "查看全部 >" Padding( padding: const EdgeInsets.only(bottom: AppSpacing.sm), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '交易账户持仓', + '我的资产', style: AppTextStyles.headlineLarge(context), ), Text( diff --git a/flutter_monisuo/lib/ui/pages/asset/components/records_link_row.dart b/flutter_monisuo/lib/ui/pages/asset/components/records_link_row.dart index c1bcee8..e22b23b 100644 --- a/flutter_monisuo/lib/ui/pages/asset/components/records_link_row.dart +++ b/flutter_monisuo/lib/ui/pages/asset/components/records_link_row.dart @@ -5,10 +5,8 @@ import '../../../../core/theme/app_color_scheme.dart'; import '../../../../core/theme/app_spacing.dart'; import '../../../components/glass_panel.dart'; -/// 充提记录链接行 — .pen node fLHtq +/// 订单记录链接行 /// cornerRadius: lg, fill: $surface-card, padding: [14, 16], stroke: $border-default 1px -/// recordsText: "充提记录" 14px w500 $text-primary -/// recordsChevron: lucide chevron-right 16px $text-muted class RecordsLinkRow extends StatelessWidget { final VoidCallback onTap; @@ -29,7 +27,7 @@ class RecordsLinkRow extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '充提记录', + '订单记录', style: AppTextStyles.headlineMedium(context).copyWith( fontWeight: FontWeight.w500, ), diff --git a/flutter_monisuo/lib/ui/pages/home/home_page.dart b/flutter_monisuo/lib/ui/pages/home/home_page.dart index 7dd8c29..c91f563 100644 --- a/flutter_monisuo/lib/ui/pages/home/home_page.dart +++ b/flutter_monisuo/lib/ui/pages/home/home_page.dart @@ -17,8 +17,13 @@ import '../../../providers/auth_provider.dart'; import '../../components/glass_panel.dart'; import '../../components/neon_glow.dart'; import '../main/main_page.dart'; +import '../asset/transfer_page.dart'; +import '../asset/components/asset_dialogs.dart'; +import '../asset/transfer_page.dart'; import '../mine/welfare_center_page.dart'; import 'header_bar.dart'; +import 'profit_analysis_page.dart'; +import 'bills_page.dart'; import 'quick_actions_row.dart'; import 'hot_coins_section.dart'; @@ -111,16 +116,16 @@ class _HomePageState extends State // 资产卡片(含总盈利 + 可折叠盈亏日历) _AssetCard( overview: provider.overview, - onDeposit: _showDeposit, + onDeposit: () => showDepositDialog(context), ), SizedBox(height: AppSpacing.md), // 快捷操作栏 QuickActionsRow( - onDeposit: _showDeposit, - onWithdraw: () => _navigateToAssetPage(), - onTransfer: () => _navigateToAssetPage(), - onProfit: () {}, - onBills: () => _navigateToAssetPage(), + onDeposit: () => showDepositDialog(context), + onWithdraw: () => showWithdrawDialog(context, provider.fundAccount?.balance), + onTransfer: () => _navigateToTransfer(context), + onProfit: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const ProfitAnalysisPage())), + onBills: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const BillsPage())), ), SizedBox(height: AppSpacing.md), // 福利中心入口卡片 @@ -146,285 +151,19 @@ class _HomePageState extends State ); } - void _showDeposit() { - final amountController = TextEditingController(); - final formKey = GlobalKey(); - final colorScheme = Theme.of(context).colorScheme; - - showShadDialog( - context: context, - builder: (ctx) => Dialog( - backgroundColor: Colors.transparent, - child: GlassPanel( - borderRadius: BorderRadius.circular(AppRadius.xxl), - padding: EdgeInsets.all(AppSpacing.lg), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - '充值', - style: AppTextStyles.headlineLarge(context).copyWith( - fontWeight: FontWeight.bold, - ), - ), - SizedBox(height: AppSpacing.xs), - Text( - '资产: USDT', - style: AppTextStyles.bodyMedium(context), - ), - ], - ), - Container( - padding: EdgeInsets.all(AppSpacing.sm), - decoration: BoxDecoration( - color: colorScheme.surfaceContainerHigh, - borderRadius: BorderRadius.circular(AppRadius.md), - ), - child: Icon(LucideIcons.wallet, color: colorScheme.secondary), - ), - ], - ), - SizedBox(height: AppSpacing.lg), - ShadForm( - key: formKey, - child: ShadInputFormField( - id: 'amount', - controller: amountController, - label: const Text('充值金额'), - placeholder: const Text('0.00'), - keyboardType: const TextInputType.numberWithOptions(decimal: true), - validator: (v) { - if (v == null || v.isEmpty) return '请输入金额'; - final n = double.tryParse(v); - if (n == null || n <= 0) return '请输入有效金额'; - return null; - }, - ), - ), - SizedBox(height: AppSpacing.lg), - Row( - children: [ - Expanded( - child: NeonButton( - text: '取消', - type: NeonButtonType.outline, - onPressed: () => Navigator.of(ctx).pop(), - height: 48, - showGlow: false, - ), - ), - SizedBox(width: AppSpacing.sm), - Expanded( - child: NeonButton( - text: '下一步', - type: NeonButtonType.primary, - onPressed: () async { - if (formKey.currentState!.saveAndValidate()) { - Navigator.of(ctx).pop(); - final response = await context - .read() - .deposit(amount: amountController.text); - if (mounted) { - if (response.success && response.data != null) { - _showDepositResultDialog(context, response.data!); - } else { - _showResultDialog( - '申请失败', - response.message ?? '请稍后重试', - ); - } - } - } - }, - height: 48, - showGlow: true, - ), - ), - ], - ), - ], - ), - ), - ), - ); - } - - void _showDepositResultDialog(BuildContext context, Map data) { - final orderNo = data['orderNo'] as String? ?? ''; - final amount = data['amount']?.toString() ?? '0.00'; - final walletAddress = data['walletAddress'] as String? ?? ''; - final walletNetwork = data['walletNetwork'] as String? ?? 'TRC20'; - final colorScheme = Theme.of(context).colorScheme; - - showShadDialog( - context: context, - builder: (ctx) => Dialog( - backgroundColor: Colors.transparent, - child: GlassPanel( - borderRadius: BorderRadius.circular(AppRadius.xxl), - padding: EdgeInsets.all(AppSpacing.lg), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - NeonIcon( - icon: Icons.check_circle, - color: AppColorScheme.up, - size: 24, - ), - SizedBox(width: AppSpacing.sm), - Text( - '充值申请成功', - style: AppTextStyles.headlineLarge(context).copyWith( - fontWeight: FontWeight.bold, - ), - ), - ], - ), - SizedBox(height: AppSpacing.lg), - _InfoRow(label: '订单号', value: orderNo), - SizedBox(height: AppSpacing.sm), - _InfoRow(label: '充值金额', value: '$amount USDT', isBold: true), - SizedBox(height: AppSpacing.lg), - Text( - '请向以下地址转账:', - style: AppTextStyles.bodyMedium(context), - ), - SizedBox(height: AppSpacing.sm), - _WalletAddressCard(address: walletAddress, network: walletNetwork), - SizedBox(height: AppSpacing.md), - Container( - padding: EdgeInsets.all(AppSpacing.sm), - decoration: BoxDecoration( - color: AppColorScheme.warning.withOpacity(0.1), - borderRadius: BorderRadius.circular(AppRadius.md), - border: Border.all(color: AppColorScheme.warning.withOpacity(0.2)), - ), - child: Row( - children: [ - Icon(Icons.info_outline, size: 16, color: AppColorScheme.warning), - SizedBox(width: AppSpacing.sm), - Expanded( - child: Text( - '转账完成后请点击"已打款"按钮确认', - style: AppTextStyles.bodyMedium(context).copyWith( - color: AppColorScheme.warning, - ), - ), - ), - ], - ), - ), - SizedBox(height: AppSpacing.lg), - Row( - children: [ - Expanded( - child: NeonButton( - text: '稍后确认', - type: NeonButtonType.outline, - onPressed: () { - Navigator.of(ctx).pop(); - _navigateToAssetPage(); - }, - height: 44, - showGlow: false, - ), - ), - SizedBox(width: AppSpacing.sm), - Expanded( - child: NeonButton( - text: '已打款', - type: NeonButtonType.primary, - onPressed: () async { - Navigator.of(ctx).pop(); - final response = await context - .read() - .confirmPay(orderNo); - if (context.mounted) { - _showResultDialog( - response.success ? '确认成功' : '确认失败', - response.success ? '请等待管理员审核' : response.message, - ); - _navigateToAssetPage(); - } - }, - height: 44, - showGlow: true, - ), - ), - ], - ), - ], - ), - ), - ), - ); - } - - void _showResultDialog(String title, String? message) { - final colorScheme = Theme.of(context).colorScheme; - showShadDialog( - context: context, - builder: (ctx) => Dialog( - backgroundColor: Colors.transparent, - child: GlassPanel( - borderRadius: BorderRadius.circular(AppRadius.xxl), - padding: EdgeInsets.all(AppSpacing.lg), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text(title, - style: AppTextStyles.headlineLarge(context).copyWith( - fontWeight: FontWeight.bold, - )), - if (message != null) ...[ - SizedBox(height: AppSpacing.sm), - Text(message, - style: AppTextStyles.bodyMedium(context), - textAlign: TextAlign.center), - ], - SizedBox(height: AppSpacing.lg), - SizedBox( - width: double.infinity, - child: NeonButton( - text: '确定', - type: NeonButtonType.primary, - onPressed: () => Navigator.of(ctx).pop(), - height: 44, - showGlow: false, - ), - ), - ], - ), - ), - ), - ); - } - - /// 跳转到资产页面 - void _navigateToAssetPage() { - final mainState = context.findAncestorStateOfType(); - mainState?.switchToTab(3); - } - - void _navigateToWelfareCenter() { - Navigator.push( + /// 跳转到划转页面 + void _navigateToTransfer(BuildContext context) async { + final result = await Navigator.push( context, - MaterialPageRoute(builder: (_) => const WelfareCenterPage()), + MaterialPageRoute(builder: (_) => const TransferPage()), ); + if (result == true && context.mounted) { + context.read().refreshAll(force: true); + } } } -/// Header 栏:品牌名 + 搜索/通知/头像 +/// 资产卡片(含总盈利 + 可折叠盈亏日历) /// 资产卡片(含总盈利 + 可折叠盈亏日历) class _AssetCard extends StatefulWidget { final AssetOverview? overview; @@ -596,7 +335,7 @@ class _AssetCardState extends State<_AssetCard> { // 今日盈亏卡片 Expanded( child: _ProfitStatCard( - label: '今日盈亏', + label: '预估今日盈亏', value: _todayProfit, upColor: upColor, downColor: downColor, @@ -606,7 +345,7 @@ class _AssetCardState extends State<_AssetCard> { // 总盈亏卡片 Expanded( child: _ProfitStatCard( - label: '总盈亏', + label: '预估总盈亏', value: _totalProfit, upColor: upColor, downColor: downColor, @@ -1196,92 +935,6 @@ class _HoldingItem extends StatelessWidget { } } -/// 信息行组件 -class _InfoRow extends StatelessWidget { - final String label; - final String value; - final bool isBold; - - const _InfoRow({required this.label, required this.value, this.isBold = false}); - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - - return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(label, - style: AppTextStyles.bodyMedium(context)), - Text(value, - style: AppTextStyles.bodyMedium(context).copyWith( - fontWeight: isBold ? FontWeight.bold : FontWeight.normal, - fontFeatures: isBold ? const [FontFeature.tabularFigures()] : null, - )), - ], - ); - } -} - -/// 钱包地址卡片 -class _WalletAddressCard extends StatelessWidget { - final String address; - final String network; - - const _WalletAddressCard({required this.address, required this.network}); - - @override - Widget build(BuildContext context) { - final colorScheme = Theme.of(context).colorScheme; - - return Container( - padding: EdgeInsets.all(AppSpacing.md), - decoration: BoxDecoration( - color: colorScheme.surfaceContainerHigh, - borderRadius: BorderRadius.circular(AppRadius.md), - border: Border.all(color: colorScheme.outlineVariant.withOpacity(0.3)), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - address, - style: AppTextStyles.bodyMedium(context).copyWith( - fontFamily: 'monospace', - ), - ), - ), - GestureDetector( - onTap: () { - Clipboard.setData(ClipboardData(text: address)); - ToastUtils.show('地址已复制到剪贴板'); - }, - child: Container( - padding: EdgeInsets.all(AppSpacing.xs), - decoration: BoxDecoration( - color: colorScheme.primary.withOpacity(0.1), - borderRadius: BorderRadius.circular(AppRadius.sm), - ), - child: Icon(LucideIcons.copy, - size: 16, color: colorScheme.primary), - ), - ), - ], - ), - SizedBox(height: AppSpacing.sm), - Text( - '网络: $network', - style: AppTextStyles.bodySmall(context), - ), - ], - ), - ); - } -} - /// 盈亏统计小卡片 class _ProfitStatCard extends StatelessWidget { final String label; diff --git a/flutter_monisuo/lib/ui/pages/orders/fund_order_card.dart b/flutter_monisuo/lib/ui/pages/orders/fund_order_card.dart index 0015f88..997cba7 100644 --- a/flutter_monisuo/lib/ui/pages/orders/fund_order_card.dart +++ b/flutter_monisuo/lib/ui/pages/orders/fund_order_card.dart @@ -127,7 +127,7 @@ class _FundOrderCard extends StatelessWidget { SizedBox(height: AppSpacing.xs), Row( children: [ - Text('应付款: ', style: AppTextStyles.bodyMedium(context).copyWith(color: theme.colorScheme.mutedForeground)), + Text('应收款: ', style: AppTextStyles.bodyMedium(context).copyWith(color: theme.colorScheme.mutedForeground)), Text('${order.receivableAmount ?? "0"} USDT', style: AppTextStyles.bodyMedium(context).copyWith(fontWeight: FontWeight.w700)), ], ), diff --git a/monisuo-admin/src/pages/monisuo/finance-orders.vue b/monisuo-admin/src/pages/monisuo/finance-orders.vue index 7b4ef14..f7e7d88 100644 --- a/monisuo-admin/src/pages/monisuo/finance-orders.vue +++ b/monisuo-admin/src/pages/monisuo/finance-orders.vue @@ -104,7 +104,7 @@ function copyToClipboard(text: string) { 手续费 - 到账金额 + 应出款 审批人