import 'package:get/get.dart'; import 'package:intl/intl.dart'; import '../controllers/translation_controller.dart'; import 'dart:async'; // 添加异步支持 class TranslationHistoryController extends GetxController { // 引用主翻译控制器,以访问历史记录数据 final TranslationController translationController = Get.find(); // 按日期分组的历史记录 final Rx>> groupedHistory = Rx>>({}); // 排序后的日期列表 final RxList sortedDates = [].obs; // 会话映射表,用于存储每个会话的所有项目 final Rx>> sessionMap = Rx>>({}); // 加载状态 final isLoading = true.obs; @override void onInit() { super.onInit(); // 确保所有翻译操作都已停止 translationController.stopAll(); // 异步加载数据,避免阻塞主线程 loadHistoryData(); } // 异步加载历史数据 Future loadHistoryData() async { isLoading.value = true; // 使用 compute 或 Future.microtask 在后台处理数据 await Future.microtask(() { _groupHistoryByDate(); _groupHistoryBySession(); }); isLoading.value = false; } // 按日期对历史记录进行分组 void _groupHistoryByDate() { final Map> newGroupedHistory = {}; // 筛选出每个会话的第一条记录 final List firstItemsOfSessions = translationController.translationHistory .where((item) => item.isFirstInSession) .toList(); for (var item in firstItemsOfSessions) { final DateTime date = item.timestamp; String key; final now = DateTime.now(); final today = DateTime(now.year, now.month, now.day); final itemDate = DateTime(date.year, date.month, date.day); if (itemDate == today) { key = 'TODAY'; } else { key = DateFormat('yyyy-MM-dd').format(date); } if (!newGroupedHistory.containsKey(key)) { newGroupedHistory[key] = []; } newGroupedHistory[key]!.add(item); } // 对每个日期组内的项目按时间倒序排序 newGroupedHistory.forEach((key, items) { items.sort((a, b) => b.timestamp.compareTo(a.timestamp)); }); // 更新分组后的历史记录 groupedHistory.value = newGroupedHistory; // 按日期排序 final List dates = newGroupedHistory.keys.toList() ..sort((a, b) { if (a == 'TODAY') return -1; if (b == 'TODAY') return 1; if (a == '1 DAY AGO') return -1; if (b == '1 DAY AGO') return 1; if (a == '2 DAYS AGO') return -1; if (b == '2 DAYS AGO') return 1; return b.compareTo(a); // 降序排列其他日期 }); sortedDates.value = dates; } // 按会话ID对历史记录进行分组 void _groupHistoryBySession() { final Map> newSessionMap = {}; for (var item in translationController.translationHistory) { if (!newSessionMap.containsKey(item.sessionId)) { newSessionMap[item.sessionId] = []; } newSessionMap[item.sessionId]!.add(item); } // 对每个会话内的项目按时间升序排序 newSessionMap.forEach((key, items) { items.sort((a, b) => a.timestamp.compareTo(b.timestamp)); }); // 更新会话映射表 sessionMap.value = newSessionMap; } // 获取指定会话的所有翻译项 List getSessionItems(String sessionId) { return sessionMap.value[sessionId] ?? []; } // 播放翻译项 void playTranslationItem(TranslationItem item) { translationController.playTranslationItem(item); } // 播放指定文本 void playText(String text) { translationController.playTranslatedText(text); } // 检查是否有历史记录 bool get hasHistory => translationController.translationHistory.isNotEmpty; }