Browse Source

优化会议助手

weicu
tanlongsheng 1 year ago
parent
commit
f037c9de30
  1. 111
      lib/data/services/meeting/meeting_task_service.dart
  2. 2
      lib/modules/meeting/controllers/meeting_details_controller.dart
  3. 47
      lib/modules/meeting/views/meeting_view.dart

111
lib/data/services/meeting/meeting_task_service.dart

@ -16,10 +16,10 @@ class MeetingTaskService extends GetxService {
MeetingUploadService get _uploadService => Get.find<MeetingUploadService>(); MeetingUploadService get _uploadService => Get.find<MeetingUploadService>();
RxList taskList = [].obs; List _taskList = [];
RxList taskFinishList = [].obs;
bool _isTask = false; bool _isTask = false;
int _handled = 0;
String _systemPrompt = ''; String _systemPrompt = '';
String _userId = ''; String _userId = '';
@ -30,8 +30,12 @@ class MeetingTaskService extends GetxService {
final String _serviceUrl = 'https://openspeech.bytedance.com/api/v1/auc'; final String _serviceUrl = 'https://openspeech.bytedance.com/api/v1/auc';
Map<String, String> _headers = {}; Map<String, String> _headers = {};
RxList textList = [].obs; int meetingId = 0;
RxInt tasktype = 1.obs;
List textList = [];
String allText = ''; String allText = '';
String summary = '';
String overview = '';
@override @override
void onInit() { void onInit() {
@ -51,7 +55,8 @@ class MeetingTaskService extends GetxService {
} }
void _getTaskList() { void _getTaskList() {
taskList.value = _storage.read("meeting_task_list") ?? []; _taskList = _storage.read("meeting_task_list") ?? [];
taskFinishList.value = _storage.read("meeting_task_finish_list") ?? [];
_executeTask(); _executeTask();
} }
@ -78,49 +83,48 @@ class MeetingTaskService extends GetxService {
taskId = await _submitTask(audiourl); taskId = await _submitTask(audiourl);
} }
await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId}); await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId});
taskList.add({ _taskList.add({
'id': id, 'id': id,
'taskid': taskId, 'taskid': taskId,
'tasktype': 1, 'tasktype': 1,
}); });
_storage.write("meeting_task_list", taskList); taskFinishList.add({
'id': id,
'tasktype': 1,
});
_storage.write("meeting_task_list", _taskList);
_storage.write("meeting_task_finish_list", taskFinishList);
_executeTask(); _executeTask();
} }
void _executeTask() async { void _executeTask() async {
if (_isTask) return; if (_isTask) return;
_isTask = true; _isTask = true;
_handled = 0; while (_taskList.isNotEmpty) {
while (_handled < taskList.length) {
await Future.delayed(const Duration(seconds: 2)); await Future.delayed(const Duration(seconds: 2));
int completed = 0; for (var element in List.from(_taskList)) {
for (var element in taskList) { await _fileRecognize(element);
if (element['tasktype'] == 1) {
await _fileRecognize(element);
} else {
completed++;
}
} }
_handled = completed;
} }
_isTask = false; _isTask = false;
} }
void removeTask(int id, {bool isDeleteTask = false}) { void removeTask(int id, {bool isDeleteTask = false}) {
Map taskData = taskList.firstWhere( Map taskFinishData = taskFinishList.firstWhere(
(element) => element['id'] == id, (element) => element['id'] == id,
orElse: () => {}, orElse: () => {},
); );
if (taskData.isNotEmpty) { if (taskFinishData.isNotEmpty) {
if (isDeleteTask || taskData['tasktype'] >= 3) { if (isDeleteTask || taskFinishData['tasktype'] >= 3) {
taskList.remove(taskData); taskFinishList.remove(taskFinishData);
_storage.write("meeting_task_list", taskList); _storage.write("meeting_task_finish_list", taskFinishList);
if (taskList.isEmpty) {
_handled = 0;
}
} }
} }
if (isDeleteTask) {
_taskList.removeWhere((element) => element['id'] == id);
_storage.write("meeting_task_list", _taskList);
}
} }
Future<String> _submitTask(String audiourl) async { Future<String> _submitTask(String audiourl) async {
@ -203,7 +207,7 @@ class MeetingTaskService extends GetxService {
var code = respDic['resp']['code'] as int; var code = respDic['resp']['code'] as int;
if (code == 1000) { if (code == 1000) {
await _addTextList(item, respDic['resp']['utterances']); await _addTextList(item['id'], respDic['resp']['utterances']);
return; return;
} else if (code < 2000) { } else if (code < 2000) {
Logger.debug("FileRecognize failed"); Logger.debug("FileRecognize failed");
@ -214,7 +218,7 @@ class MeetingTaskService extends GetxService {
} }
} }
Future<void> _addTextList(Map item, List utterances) async { Future<void> _addTextList(int id, List utterances) async {
String text = ''; String text = '';
String personnel = ''; String personnel = '';
List<Map<String, Object?>> list = []; List<Map<String, Object?>> list = [];
@ -228,7 +232,7 @@ class MeetingTaskService extends GetxService {
} }
} }
list.add({ list.add({
'meetingid': item['id'], 'meetingid': id,
'content': element['text'], 'content': element['text'],
'starttime': element['start_time'], 'starttime': element['start_time'],
'endtime': element['end_time'], 'endtime': element['end_time'],
@ -239,22 +243,36 @@ class MeetingTaskService extends GetxService {
var result = await SqfliteApi.insertMeetingSpeaker(list); var result = await SqfliteApi.insertMeetingSpeaker(list);
if (result != null) { if (result != null) {
await SqfliteApi.editMeeting( await SqfliteApi.editMeeting(
item['id'], id,
{'tasktype': 2, 'personnel': personnel}, {'tasktype': 2, 'personnel': personnel},
); );
List speakerList = await SqfliteApi.getMeetingSpeaker(item['id']); List speakerList = await SqfliteApi.getMeetingSpeaker(id);
textList.value = List.from(speakerList); List newSpeakerList = List.from(speakerList);
Synchrodata.saveOperationRecord('update', { Synchrodata.saveOperationRecord('update', {
'original': jsonEncode(textList), 'original': jsonEncode(newSpeakerList),
'id': item['id'], 'id': id,
}); });
item['tasktype'] = 2; if (id == meetingId) {
textList = newSpeakerList;
tasktype.value = 2;
}
_taskList.removeWhere((element) => element['id'] == id);
Map taskFinishData = taskFinishList.firstWhere(
(element) => element['id'] == id,
orElse: () => {},
);
if (taskFinishData.isNotEmpty) {
taskFinishData['tasktype'] = 2;
taskFinishList.refresh();
}
_storage.write("meeting_task_list", _taskList);
_storage.write("meeting_task_finish_list", taskFinishList);
} }
allText = text; allText = text;
_aiServiceMessage(item); _aiServiceMessage(id);
} }
void _aiServiceMessage(Map item) { void _aiServiceMessage(int id) {
int awaitQuantity = 0; int awaitQuantity = 0;
String summaryText = ''; String summaryText = '';
String overviewText = ''; String overviewText = '';
@ -271,7 +289,7 @@ class MeetingTaskService extends GetxService {
awaitQuantity++; awaitQuantity++;
summaryText = value; summaryText = value;
if (awaitQuantity >= 2) { if (awaitQuantity >= 2) {
_aiServiceValue(item, summaryText, overviewText); _aiServiceValue(id, summaryText, overviewText);
} }
}); });
DeapsoundAIService().sendMessage( DeapsoundAIService().sendMessage(
@ -286,17 +304,30 @@ class MeetingTaskService extends GetxService {
awaitQuantity++; awaitQuantity++;
overviewText = value; overviewText = value;
if (awaitQuantity >= 2) { if (awaitQuantity >= 2) {
_aiServiceValue(item, summaryText, overviewText); _aiServiceValue(id, summaryText, overviewText);
} }
}); });
} }
void _aiServiceValue(Map item, String summaryText, String overviewText) { void _aiServiceValue(int id, String summaryText, String overviewText) {
SqfliteApi.editMeeting(item['id'], { SqfliteApi.editMeeting(id, {
'tasktype': 3, 'tasktype': 3,
'summary': summaryText, 'summary': summaryText,
'overview': overviewText, 'overview': overviewText,
}); });
item['tasktype'] = 3; 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);
} }
} }

2
lib/modules/meeting/controllers/meeting_details_controller.dart

@ -78,6 +78,7 @@ class MeetingDetailsController extends GetxController
..duration = const Duration(seconds: 2); ..duration = const Duration(seconds: 2);
final Map<String, dynamic> args = Get.arguments ?? {}; final Map<String, dynamic> args = Get.arguments ?? {};
id = args['id']; id = args['id'];
_meetingTaskService.meetingId = id;
_getDataDetails(); _getDataDetails();
_loadJS(); _loadJS();
} }
@ -95,6 +96,7 @@ class MeetingDetailsController extends GetxController
void popInvokedWithResult(didPop, result) async { void popInvokedWithResult(didPop, result) async {
_meetingUploadService.removeUpload(id); _meetingUploadService.removeUpload(id);
_meetingTaskService.removeTask(id); _meetingTaskService.removeTask(id);
_meetingTaskService.meetingId = 0;
} }
void _getDataDetails() async { void _getDataDetails() async {

47
lib/modules/meeting/views/meeting_view.dart

@ -544,7 +544,6 @@ class MeetingView extends GetView<MeetingController> {
), ),
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Container( Container(
padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 2.w), padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 2.w),
@ -561,6 +560,7 @@ class MeetingView extends GetView<MeetingController> {
), ),
), ),
), ),
const Spacer(),
Obx(() { Obx(() {
Map uploadData = Map uploadData =
controller.meetingUploadService.uploadList.firstWhere( controller.meetingUploadService.uploadList.firstWhere(
@ -602,28 +602,29 @@ class MeetingView extends GetView<MeetingController> {
) )
: const SizedBox(); : const SizedBox();
}), }),
if (data.tasktype == 1) Obx(() {
Padding( Map taskData =
padding: EdgeInsets.only(top: 5.w), controller.meetingTaskService.taskFinishList.firstWhere(
child: Text( (element) => element['id'] == data.id,
'正在生成...', orElse: () => {},
style: TextStyle( );
color: Colors.blue, return taskData.isNotEmpty
fontSize: 10.sp, ? Padding(
), padding: EdgeInsets.only(top: 5.w),
), child: Text(
), taskData['tasktype'] == 1
if (data.tasktype == 2) ? '正在转写...'
Padding( : taskData['tasktype'] == 2
padding: EdgeInsets.only(top: 5.w), ? '正在总结...'
child: Text( : '总结完成',
'已生成', style: TextStyle(
style: TextStyle( color: Colors.blue,
color: Colors.blue, fontSize: 10.sp,
fontSize: 10.sp, ),
), ),
), )
), : const SizedBox();
}),
], ],
), ),
], ],

Loading…
Cancel
Save