Browse Source

添加会议记录总结任务列表

weicu
tanlongsheng 11 months ago
parent
commit
de255cf48d
  1. 4
      lib/core/bindings/initial_binding.dart
  2. 78
      lib/data/services/meeting/meeting_task_service.dart
  3. 132
      lib/data/services/meeting/summary_task_service.dart
  4. 8
      lib/modules/meeting/controllers/meeting_details_controller.dart
  5. 2
      lib/modules/meeting/controllers/meeting_home_controller.dart

4
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>(() => MeetingTaskService(), fenix: true);
// 会议助手总结任务服务
Get.lazyPut<SummaryTaskService>(() => SummaryTaskService(), fenix: true);
// 会议助手音频上传
Get.lazyPut<MeetingUploadService>(() => MeetingUploadService(),
fenix: true);

78
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<MeetingUploadService>();
SummaryTaskService get _summaryTaskService => Get.find<SummaryTaskService>();
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<bool> _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);
}
}

132
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<MeetingTaskService>();
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<void> 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("总结任务完成");
}
}

8
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<MeetingUploadService>();
final _meetingTaskService = Get.find<MeetingTaskService>();
final _summaryTaskService = Get.find<SummaryTaskService>();
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);
}
}

2
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<MeetingController>();
final meetingUploadService = Get.find<MeetingUploadService>();
final meetingTaskService = Get.find<MeetingTaskService>();
final summaryTaskService = Get.find<SummaryTaskService>();
final AudioPlayer _audioPlayer = AudioPlayer();

Loading…
Cancel
Save