diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index 38f439e9d..e25234505 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -1,3 +1,4 @@ +import '../../data/services/meeting/summary_task_service.dart'; import '/data/services/pay_service.dart'; import '/data/services/qq_music.dart'; @@ -70,6 +71,9 @@ class InitialBinding extends Bindings { // 会议助手任务服务 Get.lazyPut(() => MeetingTaskService(), fenix: true); + // 会议助手总结任务服务 + Get.lazyPut(() => SummaryTaskService(), fenix: true); + // 会议助手音频上传 Get.lazyPut(() => MeetingUploadService(), fenix: true); diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index c13f135fe..7b5014a6e 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -7,15 +7,16 @@ import 'package:http/http.dart' as http; import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; import '../db/sqflite_api.dart'; -import '../deapsound_ai_service.dart'; import 'meeting_upload_service.dart'; import '../../../data/models/appconfig.dart'; +import 'summary_task_service.dart'; ///会议任务服务类,负责管理会议音频的转写任务处理流程,包括任务提交、状态轮询、结果处理和AI分析等功能。 class MeetingTaskService extends GetxService { final GetStorage _storage = GetStorage(); MeetingUploadService get _uploadService => Get.find(); + SummaryTaskService get _summaryTaskService => Get.find(); List _taskList = []; //待处理的会议任务列表 RxList taskFinishList = [].obs; //已处理的会议任务列表 @@ -45,8 +46,6 @@ class MeetingTaskService extends GetxService { int meetingId = 0; RxInt tasktype = 1.obs; //任务类型,1-转写中,2-总结中,3-完成 List textList = []; //转写结果列表 - String summary = ''; //AI总结内容 - String overview = ''; //AI概览内容 @override void onInit() { @@ -64,6 +63,7 @@ class MeetingTaskService extends GetxService { _storage.remove("meeting_task_list"); _storage.remove("meeting_task_finish_list"); _uploadService.cancelUpload(); + _summaryTaskService.cancelTask(); } Future _initialize() async { @@ -205,6 +205,7 @@ class MeetingTaskService extends GetxService { if (isDeleteTask) { _taskList.removeWhere((element) => element['id'] == id); _storage.write("meeting_task_list", _taskList); + _summaryTaskService.removeTask(id); } } @@ -420,75 +421,6 @@ class MeetingTaskService extends GetxService { } // 触发AI分析,分别请求总结和概览 - aiServiceMessage(id, text, prompt, outline); - } - - ///触发AI分析,分别请求总结和概览 - ///[id] 会议ID - ///[text] 语音转文字结果 - ///[prompt] AI总结提示词 - ///[outline] AI概览提示词 - void aiServiceMessage(int id, String text, String prompt, String outline) { - int awaitQuantity = 0; - String summaryText = ''; - String overviewText = ''; - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': prompt, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - summaryText = value; - Logger.info("lxm---大模型asr总结结果$summaryText"); - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - DeapsoundAIService().sendMessage( - messages: [ - { - 'role': 'system', - 'content': outline, - }, - {'role': 'user', 'content': text}, - ], - ).then((value) { - awaitQuantity++; - overviewText = value; - Logger.info("lxm---大模型asr概览结果$overviewText"); - if (awaitQuantity >= 2) { - _aiServiceValue(id, summaryText, overviewText); - } - }); - } - - ///处理AI分析完成后的结果,包括数据库存储和状态更新 - ///[id] 会议ID - ///[summaryText] 总结结果 - ///[overviewText] 概览结果 - void _aiServiceValue(int id, String summaryText, String overviewText) { - SqfliteApi.editMeeting(id, { - 'tasktype': 3, - 'summary': summaryText, - 'overview': overviewText, - }); - if (id == meetingId) { - summary = summaryText; - overview = overviewText; - tasktype.value = 3; - } - Map taskFinishData = taskFinishList.firstWhere( - (element) => element['id'] == id, - orElse: () => {}, - ); - if (taskFinishData.isNotEmpty) { - taskFinishData['tasktype'] = 3; - taskFinishList.refresh(); - } - _storage.write("meeting_task_finish_list", taskFinishList); + _summaryTaskService.addTaskList(id, text, prompt, outline); } } diff --git a/lib/data/services/meeting/summary_task_service.dart b/lib/data/services/meeting/summary_task_service.dart new file mode 100644 index 000000000..0887b068c --- /dev/null +++ b/lib/data/services/meeting/summary_task_service.dart @@ -0,0 +1,132 @@ +import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; + +import '../../../core/utils/logger.dart'; +import '../db/sqflite_api.dart'; +import '../deapsound_ai_service.dart'; +import 'meeting_task_service.dart'; + +class SummaryTaskService extends GetxService { + final _taskService = Get.find(); + + final GetStorage _storage = GetStorage(); + + List _taskList = []; + + bool _isTask = false; + + String summary = ''; //AI总结内容 + String overview = ''; //AI概览内容 + + @override + void onInit() { + super.onInit(); + _getTaskList(); + } + + void cancelTask() { + _taskList.clear(); + _storage.remove("summary_task_list"); + } + + void _getTaskList() { + _taskList = _storage.read("summary_task_list") ?? []; + _executeTask(); + } + + Future addTaskList( + int id, String text, String prompt, String outline) async { + Logger.debug("添加总结任务列表"); + _taskList.add({ + 'id': id, + 'text': text, + 'prompt': prompt, + 'outline': outline, + }); + _storage.write("summary_task_list", _taskList); + _executeTask(); + } + + void _executeTask() async { + if (_taskList.isEmpty) return; + if (_isTask) return; + _isTask = true; + var task = _taskList.first; + _aiServiceMessage( + task['id'], + task['text'], + task['prompt'], + task['outline'], + ); + Logger.debug("执行总结任务列表"); + } + + void removeTask(int id) { + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("summary_task_list", _taskList); + } + + void _aiServiceMessage(int id, String text, String prompt, String outline) { + int awaitQuantity = 0; + String summaryText = ''; + String overviewText = ''; + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': prompt, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + summaryText = value; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + DeapsoundAIService().sendMessage( + messages: [ + { + 'role': 'system', + 'content': outline, + }, + {'role': 'user', 'content': text}, + ], + ).then((value) { + awaitQuantity++; + overviewText = value; + if (awaitQuantity >= 2) { + _aiServiceValue(id, summaryText, overviewText); + } + }); + } + + void _aiServiceValue(int id, String summaryText, String overviewText) { + if (!_taskList.any((item) => item['id'] == id)) return; + SqfliteApi.editMeeting(id, { + 'tasktype': 3, + 'summary': summaryText, + 'overview': overviewText, + }); + if (id == _taskService.meetingId) { + summary = summaryText; + overview = overviewText; + _taskService.tasktype.value = 3; + } + Map taskFinishData = _taskService.taskFinishList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (taskFinishData.isNotEmpty) { + taskFinishData['tasktype'] = 3; + _taskService.taskFinishList.refresh(); + } + _storage.write("meeting_task_finish_list", _taskService.taskFinishList); + _taskList.removeWhere((element) => element['id'] == id); + _storage.write("summary_task_list", _taskList); + _isTask = false; + _executeTask(); + Logger.debug("总结任务完成"); + } +} diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 7b908e0d7..a65074b23 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -15,6 +15,7 @@ import '../../../core/utils/synchrodata.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; +import '../../../data/services/meeting/summary_task_service.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; @@ -30,6 +31,7 @@ class MeetingDetailsController extends GetxController final _meetingUploadService = Get.find(); final _meetingTaskService = Get.find(); + final _summaryTaskService = Get.find(); final PlayerController playerController = PlayerController(); @@ -97,8 +99,8 @@ class MeetingDetailsController extends GetxController if (value == 2) { textList.value = _meetingTaskService.textList; } else if (value == 3) { - meetingDetails.value.summary = _meetingTaskService.summary; - meetingDetails.value.overview = _meetingTaskService.overview; + meetingDetails.value.summary = _summaryTaskService.summary; + meetingDetails.value.overview = _summaryTaskService.overview; summaryNumberModifications.value++; } } @@ -275,6 +277,6 @@ class MeetingDetailsController extends GetxController _everType = 3; await SqfliteApi.editMeeting(id, {'tasktype': 2}); _meetingTaskService.tasktype.value = 2; - _meetingTaskService.aiServiceMessage(id, text, prompt, outline); + _summaryTaskService.addTaskList(id, text, prompt, outline); } } diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 28317cfbd..db2ae56cc 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -20,6 +20,7 @@ import 'package:share_plus/share_plus.dart'; import '../../../data/services/meeting/meeting_task_service.dart'; import '../../../data/services/meeting/meeting_upload_service.dart'; +import '../../../data/services/meeting/summary_task_service.dart'; import '../../../routes/app_routes.dart'; import 'meeting_controller.dart'; @@ -28,6 +29,7 @@ class MeetingHomeController extends GetxController { final meetingController = Get.find(); final meetingUploadService = Get.find(); final meetingTaskService = Get.find(); + final summaryTaskService = Get.find(); final AudioPlayer _audioPlayer = AudioPlayer();