From 54735fc580b816a6eca57a1699230b9157666c26 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 9 Jul 2025 12:04:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8A=E4=BC=A0=E9=9F=B3?= =?UTF-8?q?=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting_upload_service.dart | 43 ++++++++++++++----- .../controllers/meeting_controller.dart | 9 ++-- .../meeting_details_controller.dart | 3 ++ lib/modules/meeting/views/meeting_view.dart | 41 ++++++++++++++++++ 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/lib/data/services/meeting/meeting_upload_service.dart b/lib/data/services/meeting/meeting_upload_service.dart index 9dc4653e5..78cd097eb 100644 --- a/lib/data/services/meeting/meeting_upload_service.dart +++ b/lib/data/services/meeting/meeting_upload_service.dart @@ -1,11 +1,12 @@ import 'package:get/get.dart'; +import '../../../core/utils/logger.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; + RxDouble uploadProgress = 0.6.obs; RxList uploadList = [].obs; bool _isUpload = false; @@ -32,19 +33,39 @@ class MeetingUploadService extends GetxService { while (_handled < uploadList.length) { Map element = uploadList[_handled]; _handled++; - if (element['audiourl'].isNotEmpty) { + if (element['audiourl'].isEmpty) { 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; + try { + final audiourl = await UploadOss.upload( + filepath: element['filepath'], + rootDir: element['rootdir'], + ); + await SqfliteApi.editMeetingTitle( + element['id'], + {'audiourl': audiourl}, + ); + element['audiourl'] = audiourl; + } catch (e) { + Logger.error('Upload failed: $e'); + } } } + meetingId.value = 0; _isUpload = false; } + + void removeUpload(int id, {bool isDeleteTask = false}) { + Map uploadData = uploadList.firstWhere( + (element) => element['id'] == id, + orElse: () => {}, + ); + if (uploadData.isNotEmpty) { + if (isDeleteTask || uploadData['audiourl'].isNotEmpty) { + uploadList.remove(uploadData); + if (uploadList.isEmpty) { + _handled = 0; + } + } + } + } } diff --git a/lib/modules/meeting/controllers/meeting_controller.dart b/lib/modules/meeting/controllers/meeting_controller.dart index ef3eaedd3..363383c13 100644 --- a/lib/modules/meeting/controllers/meeting_controller.dart +++ b/lib/modules/meeting/controllers/meeting_controller.dart @@ -23,7 +23,7 @@ import '../../../data/services/meeting/meeting_upload_service.dart'; import '../../../routes/app_routes.dart'; class MeetingController extends GetxController { - final _meetingUploadService = Get.find(); + final meetingUploadService = Get.find(); final ScrollController listController = ScrollController(); final AudioPlayer _audioPlayer = AudioPlayer(); @@ -245,7 +245,7 @@ class MeetingController extends GetxController { final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { // 上传OSS - _meetingUploadService.addUpload(meetingId, newPath, 'LocalAudio'); + meetingUploadService.addUpload(meetingId, newPath, 'LocalAudio'); // 更新UI数据 dataList.insert(0, { @@ -293,7 +293,7 @@ class MeetingController extends GetxController { }; final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { - _meetingUploadService.addUpload(meetingId, filePath, 'TranslatAudio'); + meetingUploadService.addUpload(meetingId, filePath, 'TranslatAudio'); dataList.insert(0, { 'id': meetingId, @@ -356,7 +356,7 @@ class MeetingController extends GetxController { }; final meetingId = await SqfliteApi.insertMeeting(data); if (meetingId != null) { - _meetingUploadService.addUpload(meetingId, filePath, 'ExternalAudio'); + meetingUploadService.addUpload(meetingId, filePath, 'ExternalAudio'); dataList.insert(0, { 'id': meetingId, @@ -400,6 +400,7 @@ class MeetingController extends GetxController { // 删除数据库中的记录 SqfliteApi.deleteMeeting(id); _deleteFile(filepath); + meetingUploadService.removeUpload(id, isDeleteTask: true); addQuantity--; } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index c97e7ed53..90c08b4d9 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -19,6 +19,7 @@ import '../../../core/utils/upload_oss.dart'; import '../../../data/models/appconfig.dart'; import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/deapsound_ai_service.dart'; +import '../../../data/services/meeting/meeting_upload_service.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; import 'meeting_controller.dart'; @@ -30,6 +31,7 @@ class MeetingDetailsController extends GetxController late AnimationController lottieController; + final _meetingUploadService = Get.find(); final _meetingController = Get.find(); final PlayerController playerController = PlayerController(); @@ -141,6 +143,7 @@ class MeetingDetailsController extends GetxController _meetingController.dataListTask, isAdd: false, ); + _meetingUploadService.removeUpload(id); } void _getAgent() async { diff --git a/lib/modules/meeting/views/meeting_view.dart b/lib/modules/meeting/views/meeting_view.dart index 58573ba89..a45184d51 100644 --- a/lib/modules/meeting/views/meeting_view.dart +++ b/lib/modules/meeting/views/meeting_view.dart @@ -562,6 +562,47 @@ class MeetingView extends GetView { ), ), ), + Obx(() { + Map uploadData = + controller.meetingUploadService.uploadList.firstWhere( + (element) => element['id'] == data.id, + orElse: () => {}, + ); + return uploadData.isNotEmpty + ? Stack( + alignment: Alignment.center, + children: [ + if (uploadData['id'] == + controller.meetingUploadService.meetingId.value) + Obx( + () => SizedBox( + width: 20.w, + height: 20.w, + child: CircularProgressIndicator( + value: controller.meetingUploadService + .uploadProgress.value, + valueColor: + const AlwaysStoppedAnimation( + Colors.red), + strokeWidth: 1.w, + ), + ), + ), + SizedBox( + width: 20.w, + height: 20.w, + child: Icon( + uploadData['audiourl'].isNotEmpty + ? Icons.cloud_done + : Icons.cloud_upload, + color: Colors.blue, + size: 16.w, + ), + ), + ], + ) + : const SizedBox(); + }), if (data.tasktype == 1) Padding( padding: EdgeInsets.only(top: 5.w),