import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../controllers/translation_stats_controller.dart'; import '../../../core/theme/app_colors.dart'; import '../../../data/models/user_Info.dart'; class TranslationStatsView extends GetView { const TranslationStatsView({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; return Scaffold( backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.grey[50], appBar: _buildAppBar(isDarkMode), body: Obx(() => controller.isLoading.value ? _buildLoadingWidget() : _buildBody(isDarkMode)), ); } PreferredSizeWidget _buildAppBar(bool isDarkMode) { return AppBar( leading: IconButton( icon: Icon( Icons.arrow_back_ios, color: isDarkMode ? Colors.white : Colors.black, size: 20.sp, ), onPressed: () => Get.back(), ), backgroundColor: isDarkMode ? AppColors.darkBackground : Colors.white, elevation: 0.5, title: GestureDetector( onTap: controller.onTitleTap, child: Text( 'translationStats'.tr, // style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ), centerTitle: true, actions: [ IconButton( icon: Icon( Icons.refresh, color: isDarkMode ? Colors.white : Colors.black, ), onPressed: controller.refreshData, ), // PopupMenuButton( // icon: Icon( // Icons.more_vert, // color: isDarkMode ? Colors.white : Colors.black, // ), // onSelected: (value) { // switch (value) { // case 'cleanup': // controller.cleanupOldData(); // break; // // case 'export': // // controller.exportStats(); // // break; // } // }, // itemBuilder: (context) => const [ // PopupMenuItem( // value: 'cleanup', // child: Text('清理过期数据'), // ), // // PopupMenuItem( // // value: 'export', // // child: Text('导出数据'), // // ), // ], // ), ], ); } Widget _buildLoadingWidget() { return const Center( child: CircularProgressIndicator(), ); } Widget _buildBody(bool isDarkMode) { return Column( children: [ _buildIntegralRow(isDarkMode), _buildTimeRangeSelector(isDarkMode), Expanded( child: SingleChildScrollView( padding: EdgeInsets.all(16.w), child: Column( children: [ // _buildIntegralCard(isDarkMode), // SizedBox(height: 16.h), if (controller.selectedTabIndex.value == 0) _buildRealtimeStatsCard(isDarkMode), SizedBox(height: 16.h), _buildOverviewCard(isDarkMode), SizedBox(height: 16.h), _buildApiCallsCard(isDarkMode), SizedBox(height: 16.h), _buildDataVolumeCard(isDarkMode), SizedBox(height: 16.h), _buildUsageBehaviorCard(isDarkMode), ], ), ), ), ], ); } Widget _buildIntegralRow(bool isDarkMode) { return Obx(() { final _ = User.refreshTick.value; final u = User.instance; return Padding( padding: EdgeInsets.all(16.w), child: Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2)), ], ), child: Row( children: [ Icon(Icons.translate, color: AppColors.primary, size: 20.sp), SizedBox(width: 8.w), Expanded( child: Text( 'remainingQuota'.tr, style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), ), ), Text( '${u.tradeintegral}/${u.tradetotalintegral}', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black), ), ], ), ), ); }); } Widget _buildTimeRangeSelector(bool isDarkMode) { return Container( margin: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Obx(() => Row( children: [ _buildTimeRangeTab('today'.tr, 0, isDarkMode), // 今日 _buildTimeRangeTab('thisWeek'.tr, 1, isDarkMode), // 本周 _buildTimeRangeTab('thisMonth'.tr, 2, isDarkMode), // 本月 _buildTimeRangeTab('history'.tr, 3, isDarkMode), // 历史 ], )), ); } Widget _buildTimeRangeTab(String title, int index, bool isDarkMode) { final isSelected = controller.selectedTabIndex.value == index; return Expanded( child: GestureDetector( onTap: () => controller.switchTimeRange(index), child: Container( padding: EdgeInsets.symmetric(vertical: 12.h), decoration: BoxDecoration( color: isSelected ? (isDarkMode ? AppColors.primary : AppColors.primary) : Colors.transparent, borderRadius: BorderRadius.circular(12.r), ), child: Text( title, textAlign: TextAlign.center, style: TextStyle( fontSize: 14.sp, fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, color: isSelected ? Colors.white : (isDarkMode ? Colors.white70 : Colors.black54), ), ), ), ), ); } Widget _buildRealtimeStatsCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.access_time, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Text( 'currentSessionStats'.tr, // 当前会话统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ), SizedBox(height: 16.h), Obx(() => Row( children: [ Expanded( child: _buildStatItem( 'translationCount'.tr, // 翻译次数 controller.realtimeStats.translationCount.toString(), Icons.translate, isDarkMode, ), ), Expanded( child: _buildStatItem( 'sessionDuration'.tr, // 会话时长 '${controller.realtimeStats.sessionDurationMinutes}${'minutes'.tr}', Icons.timer, isDarkMode, ), ), ], )), SizedBox(height: 12.h), Obx(() => Row( children: [ Expanded( child: _buildStatItem( 'characters'.tr, // 字符数 controller.formatNumber( controller.realtimeStats.sourceCharacters + controller.realtimeStats.targetCharacters, ), Icons.text_fields, isDarkMode, ), ), Expanded( child: _buildStatItem( 'recordingDuration'.tr, // 录音时长 controller.formatDuration( controller.realtimeStats.recordingDuration), Icons.mic, isDarkMode, ), ), ], )), ], ), ); } Widget _buildOverviewCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.dashboard, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Obx(() => Text( '${controller.selectedTimeRange.value}${'overview'.tr}', style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), )), ], ), SizedBox(height: 16.h), Obx(() => Row( children: [ Expanded( child: _buildStatItem( 'totalApiCalls'.tr, // 总调用次数 controller .formatNumber(controller.currentStats.totalApiCalls), Icons.api, isDarkMode, ), ), ], )), SizedBox(height: 12.h), Obx(() => Row( children: [ Expanded( child: _buildStatItem( 'sessionCount'.tr, // 会话数量 controller.currentStats.sessionCount.toString(), Icons.chat, isDarkMode, ), ), Expanded( child: _buildStatItem( 'totalCharacters'.tr, // 总字符数 controller.formatNumber( controller.currentStats.totalCharacterCount), Icons.text_snippet, isDarkMode, ), ), ], )), ], ), ); } Widget _buildStatItem( String label, String value, IconData icon, bool isDarkMode) { return Column( children: [ Icon( icon, color: AppColors.primary, size: 24.sp, ), SizedBox(height: 8.h), Text( value, style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.bold, color: isDarkMode ? Colors.white : Colors.black, ), ), SizedBox(height: 4.h), Text( label, style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ); } Widget _buildApiCallsCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.api, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Text( 'apiCallStats'.tr, // API调用统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ), SizedBox(height: 16.h), Obx(() => Column( children: [ _buildApiCallRow( 'translationApi'.tr, // 翻译API controller.currentStats.translationApiCalls, Icons.translate, isDarkMode), SizedBox(height: 12.h), _buildApiCallRow( 'asr'.tr, controller.currentStats.asrApiCalls, Icons.mic, isDarkMode), SizedBox(height: 12.h), _buildApiCallRow( 'tts'.tr, controller.currentStats.ttsApiCalls, Icons.volume_up, isDarkMode), SizedBox(height: 12.h), _buildApiCallRow( 'aiSummary'.tr, // AI总结 controller.currentStats.aiSummaryApiCalls, Icons.summarize, isDarkMode), ], )), ], ), ); } Widget _buildApiCallRow( String label, int count, IconData icon, bool isDarkMode) { return Row( children: [ Icon( icon, color: AppColors.primary, size: 18.sp, ), SizedBox(width: 12.w), Expanded( child: Text( label, style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white : Colors.black, ), ), ), Text( controller.formatNumber(count), style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ); } Widget _buildDataVolumeCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.data_usage, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Text( 'dataVolumeStats'.tr, // 数据量统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ), SizedBox(height: 16.h), Obx(() => Column( children: [ Row( children: [ Expanded( child: _buildStatItem( 'sourceTextCharacters'.tr, // 源文本字符 controller.formatNumber( controller.currentStats.sourceTextCharacters), Icons.text_fields, isDarkMode, ), ), Expanded( child: _buildStatItem( 'ttsTextCharacters'.tr, // TTS文本字符 controller.formatNumber( controller.currentStats.ttsTextCharacters), Icons.translate, isDarkMode, ), ), ], ), SizedBox(height: 16.h), Row( children: [ Expanded( child: _buildStatItem( 'effectiveAudioDuration'.tr, // 有效音频时长 controller.formatDuration( controller.currentStats.effectiveAudioDuration), Icons.mic, isDarkMode, ), ), Expanded( child: _buildStatItem( 'totalSessionDuration'.tr, // 总会话时长 controller.formatDuration( controller.currentStats.totalSessionDuration), Icons.volume_up, isDarkMode, ), ), ], ), ], )), ], ), ); } Widget _buildCostCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.attach_money, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Text( 'costStats'.tr, // 成本统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ), SizedBox(height: 16.h), Obx(() => Column( children: [ Container( padding: EdgeInsets.all(12.w), decoration: BoxDecoration( color: AppColors.primary.withValues(alpha: 0.1), borderRadius: BorderRadius.circular(8.r), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( '${controller.selectedTimeRange.value}${'estimatedCost'.tr}', style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w500, color: isDarkMode ? Colors.white : Colors.black, ), ), Text( controller.formatCost( controller.currentStats.estimatedCost), style: TextStyle( fontSize: 18.sp, fontWeight: FontWeight.bold, color: AppColors.primary, ), ), ], ), ), SizedBox(height: 12.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'dailyCostThreshold'.tr, // 日成本预警阈值 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), Text( controller .formatCost(controller.dailyCostThreshold.value), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ), SizedBox(height: 4.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( 'monthlyCostThreshold'.tr, // 月成本预警阈值 style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), Text( controller .formatCost(controller.monthlyCostThreshold.value), style: TextStyle( fontSize: 12.sp, color: isDarkMode ? Colors.white70 : Colors.black54, ), ), ], ), ], )), ], ), ); } Widget _buildUsageBehaviorCard(bool isDarkMode) { return Container( padding: EdgeInsets.all(16.w), decoration: BoxDecoration( color: isDarkMode ? AppColors.cardBackground : Colors.white, borderRadius: BorderRadius.circular(12.r), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.05), blurRadius: 10, offset: const Offset(0, 2), ), ], ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Icon( Icons.analytics, color: AppColors.primary, size: 20.sp, ), SizedBox(width: 8.w), Text( 'usageBehaviorStats'.tr, // 使用行为统计 style: TextStyle( fontSize: 16.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ), SizedBox(height: 16.h), Obx(() => Column( children: [ _buildUsageBehaviorRow( 'mostUsedLanguagePair'.tr, // 最常用语言对 controller.currentStats.mostUsedLanguagePair, Icons.language, isDarkMode, ), SizedBox(height: 12.h), _buildUsageBehaviorRow( 'mostUsedMode'.tr, // 最常用模式 controller.currentStats.mostUsedMode, Icons.settings, isDarkMode, ), ], )), ], ), ); } Widget _buildUsageBehaviorRow( String label, String value, IconData icon, bool isDarkMode) { return Row( children: [ Icon( icon, color: AppColors.primary, size: 18.sp, ), SizedBox(width: 12.w), Expanded( child: Text( label, style: TextStyle( fontSize: 14.sp, color: isDarkMode ? Colors.white : Colors.black, ), ), ), Text( value, style: TextStyle( fontSize: 14.sp, fontWeight: FontWeight.w600, color: isDarkMode ? Colors.white : Colors.black, ), ), ], ); } }