diff --git a/lib/core/bindings/initial_binding.dart b/lib/core/bindings/initial_binding.dart index d532f449e..5063065a9 100644 --- a/lib/core/bindings/initial_binding.dart +++ b/lib/core/bindings/initial_binding.dart @@ -2,6 +2,7 @@ import 'package:deep_voice/data/services/location_manager.dart'; import 'package:deep_voice/data/services/music_manager.dart'; import 'package:deep_voice/data/services/navigation_manager.dart'; import 'package:get/get.dart'; +import '../../data/services/meeting/meeting_upload_service.dart'; import '../../data/services/speech_factory.dart'; import '../../data/services/volcano_translation_service.dart'; import '../../data/services/volcano_ai_service.dart'; @@ -50,6 +51,10 @@ class InitialBinding extends Bindings { Get.lazyPut(() => VersionUpdateService(), fenix: true); + // 会议助手音频上传 + Get.lazyPut(() => MeetingUploadService(), + fenix: true); + // 杰理蓝牙服务 // // 语言管理器(需要最先初始化) diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart new file mode 100644 index 000000000..9dc4653e5 --- /dev/null +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -0,0 +1,50 @@ +import 'package:get/get.dart'; + +import '../../../core/utils/upload_oss.dart'; +import '../db/sqflite_api.dart'; + +class MeetingUploadService extends GetxService { + RxInt meetingId = 0.obs; + RxDouble uploadProgress = 0.0.obs; + RxList uploadList = [].obs; + + bool _isUpload = false; + int _handled = 0; + + @override + void onInit() { + super.onInit(); + _getUploadList(); + } + + void _getUploadList() {} + + void addUpload(int id, String filePath, String rootDir) async { + uploadList.add({ + 'id': id, + 'filepath': filePath, + 'rootdir': rootDir, + 'audiourl': '', + }); + if (_isUpload) return; + _isUpload = true; + _handled = 0; + while (_handled < uploadList.length) { + Map element = uploadList[_handled]; + _handled++; + if (element['audiourl'].isNotEmpty) { + meetingId.value = element['id']; + final audiourl = await UploadOss.upload( + filepath: element['filepath'], + rootDir: element['rootdir'], + ); + await SqfliteApi.editMeetingTitle( + element['id'], + {'audiourl': audiourl}, + ); + element['audiourl'] = audiourl; + } + } + _isUpload = false; + } +} diff --git a/lib/modules/meeting/controllers/meeting_connect_controller.dart b/lib/modules/meeting/controllers/meeting_connect_controller.dart index 31a1b47fc..9101c21f4 100644 --- a/lib/modules/meeting/controllers/meeting_connect_controller.dart +++ b/lib/modules/meeting/controllers/meeting_connect_controller.dart @@ -262,7 +262,7 @@ class MeetingConnectController extends GetxController { fileSize.value = size; }, ); - await _meetingController.insertMeetingAudio(entry.name, filePath, ''); + await _meetingController.insertMeetingAudio(entry.name, filePath); } String _decodePassword(List data) { diff --git a/lib/modules/meeting/controllers/meeting_controller.dart b/lib/modules/meeting/controllers/meeting_controller.dart index de9a05a63..ef3eaedd3 100644 --- a/lib/modules/meeting/controllers/meeting_controller.dart +++ b/lib/modules/meeting/controllers/meeting_controller.dart @@ -13,16 +13,18 @@ import 'package:permission_handler/permission_handler.dart'; import '../../../core/utils/logger.dart'; import '../../../core/utils/synchrodata.dart'; -import '../../../core/utils/upload_oss.dart'; import '../../../data/services/ble_manager.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../core/utils/permission_util.dart'; import 'package:share_plus/share_plus.dart'; +import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../routes/app_routes.dart'; class MeetingController extends GetxController { + final _meetingUploadService = Get.find(); + final ScrollController listController = ScrollController(); final AudioPlayer _audioPlayer = AudioPlayer(); @@ -224,10 +226,6 @@ class MeetingController extends GetxController { final fileStat = await file.stat(); final creationTime = fileStat.changed.millisecondsSinceEpoch; - // 上传OSS - final audiourl = - await UploadOss.upload(filepath: filePath, rootDir: 'LocalAudio'); - // 准备新路径 final fileName = filePath.split('/').last; final newPath = "${destDir.path}/$fileName"; @@ -238,7 +236,7 @@ class MeetingController extends GetxController { 'type': 'LOCAL', 'seconds': seconds, 'filepath': newPath, // 存储新路径 - 'audiourl': audiourl, + 'audiourl': '', 'tasktype': 0, 'creationtime': creationTime, }; @@ -246,6 +244,9 @@ class MeetingController extends GetxController { // 插入数据库 final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { + // 上传OSS + _meetingUploadService.addUpload(meetingId, newPath, 'LocalAudio'); + // 更新UI数据 dataList.insert(0, { 'id': meetingId, @@ -279,8 +280,6 @@ class MeetingController extends GetxController { await _audioPlayer.setAudioSource(AudioSource.file(filePath)); final fileStat = await File(filePath).stat(); final creationTime = fileStat.changed.millisecondsSinceEpoch; // 时间戳 - var audiourl = await UploadOss.upload( - filepath: filePath, rootDir: 'TranslatAudio'); int seconds = _audioPlayer.duration?.inSeconds ?? 0; final fileName = filePath.split('/').last; Map data = { @@ -288,12 +287,14 @@ class MeetingController extends GetxController { 'type': 'TRANSLAT', 'seconds': seconds, 'filepath': filePath, - 'audiourl': audiourl, + 'audiourl': '', 'tasktype': 0, 'creationtime': creationTime, }; final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { + _meetingUploadService.addUpload(meetingId, filePath, 'TranslatAudio'); + dataList.insert(0, { 'id': meetingId, 'taskid': '', @@ -330,9 +331,7 @@ class MeetingController extends GetxController { } } - var audiourl = - await UploadOss.upload(filepath: filePath, rootDir: 'ExternalAudio'); - final meetingId = await insertMeetingAudio(fileName, filePath, audiourl); + final meetingId = await insertMeetingAudio(fileName, filePath); if (isParamProvided) { Get.toNamed(Routes.meetingDetails, arguments: { @@ -342,8 +341,7 @@ class MeetingController extends GetxController { EasyLoading.dismiss(); } - Future insertMeetingAudio( - String fileName, String filePath, String audiourl) async { + Future insertMeetingAudio(String fileName, String filePath) async { await _audioPlayer.setAudioSource(AudioSource.file(filePath)); int seconds = _audioPlayer.duration?.inSeconds ?? 0; int creationTime = DateTime.now().millisecondsSinceEpoch; @@ -352,12 +350,14 @@ class MeetingController extends GetxController { 'type': 'IMPORT', 'seconds': seconds, 'filepath': filePath, - 'audiourl': audiourl, + 'audiourl': '', 'tasktype': 0, 'creationtime': creationTime, }; final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { + _meetingUploadService.addUpload(meetingId, filePath, 'ExternalAudio'); + dataList.insert(0, { 'id': meetingId, 'taskid': '',