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
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();
|
|
}
|
|
}
|
|
|