import 'package:get/get.dart'; import '../../../data/services/usage_stats_service.dart'; import '../../../data/models/meeting_usage_stats.dart'; import '../../../core/utils/logger.dart'; class MeetingStatsController extends GetxController { final UsageStatsService _usageService = Get.find(); final isLoading = false.obs; final selectedTabIndex = 0.obs; final selectedTimeRange = '今日'.obs; final Rx todayStats = MeetingAsrHistoryStats( userId: '', allAsrCalls: 0, allAudioSeconds: 0, allAudioFileBytes: 0, allTranscriptBytes: 0, ).obs; final Rx weekStats = MeetingAsrHistoryStats( userId: '', allAsrCalls: 0, allAudioSeconds: 0, allAudioFileBytes: 0, allTranscriptBytes: 0, ).obs; final Rx monthStats = MeetingAsrHistoryStats( userId: '', allAsrCalls: 0, allAudioSeconds: 0, allAudioFileBytes: 0, allTranscriptBytes: 0, ).obs; final RxList historyDaily = [].obs; @override void onInit() { super.onInit(); loadAllStats(); } Future loadAllStats() async { isLoading.value = true; try { final now = DateTime.now(); final todayList = await _usageService.getMeetingHistoryStats( startDate: DateTime(now.year, now.month, now.day), endDate: DateTime(now.year, now.month, now.day), ); todayStats.value = _usageService.aggregateMeetingStats(todayList); final weekStart = now.subtract(Duration(days: now.weekday - 1)); final weekEnd = weekStart.add(const Duration(days: 6)); final weekList = await _usageService.getMeetingHistoryStats( startDate: DateTime(weekStart.year, weekStart.month, weekStart.day), endDate: DateTime(weekEnd.year, weekEnd.month, weekEnd.day), ); weekStats.value = _usageService.aggregateMeetingStats(weekList); final monthStart = DateTime(now.year, now.month, 1); final monthEnd = DateTime(now.year, now.month + 1, 0); final monthList = await _usageService.getMeetingHistoryStats( startDate: monthStart, endDate: monthEnd, ); monthStats.value = _usageService.aggregateMeetingStats(monthList); final historyStart = now.subtract(const Duration(days: 7)); historyDaily.value = await _usageService.getMeetingHistoryStats( startDate: DateTime(historyStart.year, historyStart.month, historyStart.day), endDate: DateTime(now.year, now.month, now.day), ); Logger.info('会议统计数据加载完成'); } catch (e) { Logger.error('加载会议统计数据失败: $e'); } finally { isLoading.value = false; } } void switchTimeRange(int index) { selectedTabIndex.value = index; switch (index) { case 0: selectedTimeRange.value = '今日'; break; case 1: selectedTimeRange.value = '本周'; break; case 2: selectedTimeRange.value = '本月'; break; case 3: selectedTimeRange.value = '历史'; break; } } MeetingAsrHistoryStats get currentStats { switch (selectedTabIndex.value) { case 0: return todayStats.value; case 1: return weekStats.value; case 2: return monthStats.value; default: return todayStats.value; } } String formatDuration(int seconds) { if (seconds < 60) { return '$seconds秒'; } else if (seconds < 3600) { final minutes = seconds ~/ 60; final remainingSeconds = seconds % 60; return '$minutes分$remainingSeconds秒'; } else { final hours = seconds ~/ 3600; final minutes = (seconds % 3600) ~/ 60; return '$hours小时$minutes分'; } } String formatBytes(int bytes) { if (bytes < 1024) return '$bytes B'; final kb = bytes / 1024; if (kb < 1024) return '${kb.toStringAsFixed(1)} KB'; final mb = kb / 1024; if (mb < 1024) return '${mb.toStringAsFixed(1)} MB'; final gb = mb / 1024; return '${gb.toStringAsFixed(1)} GB'; } String formatNumber(int number) { if (number < 1000) return number.toString(); if (number < 1000000) return '${(number / 1000).toStringAsFixed(1)}K'; return '${(number / 1000000).toStringAsFixed(1)}M'; } Future refreshData() async { await loadAllStats(); } }