You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.5 KiB

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<UsageStatsService>();
final isLoading = false.obs;
final selectedTabIndex = 0.obs;
final selectedTimeRange = 'today'.tr.obs; // 今日
final Rx<MeetingAsrHistoryStats> todayStats = MeetingAsrHistoryStats(
userId: '',
allAsrCalls: 0,
allAudioSeconds: 0,
allAudioFileBytes: 0,
allTranscriptBytes: 0,
).obs;
final Rx<MeetingAsrHistoryStats> weekStats = MeetingAsrHistoryStats(
userId: '',
allAsrCalls: 0,
allAudioSeconds: 0,
allAudioFileBytes: 0,
allTranscriptBytes: 0,
).obs;
final Rx<MeetingAsrHistoryStats> monthStats = MeetingAsrHistoryStats(
userId: '',
allAsrCalls: 0,
allAudioSeconds: 0,
allAudioFileBytes: 0,
allTranscriptBytes: 0,
).obs;
final RxList<MeetingAsrDailyStats> historyDaily =
<MeetingAsrDailyStats>[].obs;
@override
void onInit() {
super.onInit();
loadAllStats();
}
Future<void> 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 = 'today'.tr; // 今日
break;
case 1:
selectedTimeRange.value = 'thisWeek'.tr; // 本周
break;
case 2:
selectedTimeRange.value = 'thisMonth'.tr; // 本月
break;
case 3:
selectedTimeRange.value = 'history'.tr; // 历史
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${'seconds'.tr}'; // 秒
} else if (seconds < 3600) {
final minutes = seconds ~/ 60;
final remainingSeconds = seconds % 60;
return '$minutes${'minutes'.tr}$remainingSeconds${'seconds'.tr}'; // 分钟秒
} else {
final hours = seconds ~/ 3600;
final minutes = (seconds % 3600) ~/ 60;
return '$hours${'hours'.tr}$minutes${'minutes'.tr}'; // 小时分钟
}
}
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<void> refreshData() async {
await loadAllStats();
}
}