From 62e9d22c22f5bc9f9b7eb72477b26e08258bfe60 Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 4 Feb 2026 15:50:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(meeting):=20=E4=B8=BA=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E5=BD=95=E9=9F=B3=E6=B7=BB=E5=8A=A0=E6=9A=82=E5=AD=98=E6=A0=87?= =?UTF-8?q?=E9=A2=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在保存录音时,不再直接重命名文件,而是将新标题暂存到存储中。当导入本地录音时,会优先使用暂存的标题作为显示名称,避免因文件重命名导致的导入失败问题。 --- .../meeting/meeting_task_service.dart | 25 +++++++++++++++++ .../controllers/meeting_home_controller.dart | 9 +++++-- .../meeting_record_controller.dart | 27 +++++-------------- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/lib/data/services/meeting/meeting_task_service.dart b/lib/data/services/meeting/meeting_task_service.dart index 94b995b45..13ad8a1e8 100644 --- a/lib/data/services/meeting/meeting_task_service.dart +++ b/lib/data/services/meeting/meeting_task_service.dart @@ -11,6 +11,10 @@ import 'meeting_upload_service.dart'; class MeetingTaskService extends GetxService { MeetingUploadService get _uploadService => Get.find(); + final GetStorage _storage = GetStorage(); + static const String _pendingLocalRecordingTitleStorageKey = + 'meeting_pending_local_recording_titles'; + List _taskList = []; //待处理的会议任务列表 bool _isTask = false; //是否有正在处理的任务 @@ -24,6 +28,27 @@ class MeetingTaskService extends GetxService { String summary = ''; String overview = ''; + void setPendingLocalRecordingTitle(String wavFileName, String displayTitle) { + if (wavFileName.isEmpty) return; + final data = _storage.read(_pendingLocalRecordingTitleStorageKey); + final map = (data is Map) + ? Map.from(data) + : {}; + map[wavFileName] = displayTitle; + _storage.write(_pendingLocalRecordingTitleStorageKey, map); + } + + String? takePendingLocalRecordingTitle(String wavFileName) { + if (wavFileName.isEmpty) return null; + final data = _storage.read(_pendingLocalRecordingTitleStorageKey); + if (data is! Map) return null; + final map = Map.from(data); + final v = map.remove(wavFileName); + if (v == null) return null; + _storage.write(_pendingLocalRecordingTitleStorageKey, map); + return v.toString(); + } + void requestLocalImport() { localImportState.value++; } diff --git a/lib/modules/meeting/controllers/meeting_home_controller.dart b/lib/modules/meeting/controllers/meeting_home_controller.dart index 0d988cd88..0417fa05f 100644 --- a/lib/modules/meeting/controllers/meeting_home_controller.dart +++ b/lib/modules/meeting/controllers/meeting_home_controller.dart @@ -259,8 +259,13 @@ class MeetingHomeController extends GetxController { final creationTime = fileStat.changed.millisecondsSinceEpoch; + final originalFileName = entityName; + final pendingTitle = meetingTaskService + .takePendingLocalRecordingTitle(originalFileName); + final displayTitle = pendingTitle ?? originalFileName; + // 准备新路径 - String fileName = filePath.split('/').last; //获取文件名(包含扩展名) + String fileName = originalFileName; //获取文件名(包含扩展名) String newPath = "${destDir.path}/$fileName"; //构建新路径,保持原文件名 if (await File(newPath).exists()) { final ext = path.extension(fileName); @@ -272,7 +277,7 @@ class MeetingHomeController extends GetxController { // 构建要存入数据库的音频文件抽象对象 Map data = { - 'title': fileName, + 'title': displayTitle, 'type': 'LOCAL', 'seconds': seconds, 'filepath': newPath, // 存储新路径 diff --git a/lib/modules/meeting/controllers/meeting_record_controller.dart b/lib/modules/meeting/controllers/meeting_record_controller.dart index 88cbc1fc1..ef5d7f58b 100644 --- a/lib/modules/meeting/controllers/meeting_record_controller.dart +++ b/lib/modules/meeting/controllers/meeting_record_controller.dart @@ -476,7 +476,6 @@ class MeetingRecordController extends GetxController if (isEditingTitle.value) { newName.value = titleEditingController.text; isEditingTitle.value = false; - // Actual file renaming happens during saveRecording() } } @@ -800,28 +799,14 @@ class MeetingRecordController extends GetxController Future _applyTitleChangeAfterSave() async { if (fileName.value == newName.value) return; - final appDir = await appDocDir; - final dir = Directory("${appDir.path}/MeetingAudio/"); - if (!await dir.exists()) await dir.create(recursive: true); + if (!Get.isRegistered()) return; - if (isMarked.value) { - final newDir = Directory("${appDir.path}/DestAudio/"); - if (!await newDir.exists()) await newDir.create(recursive: true); - await _asrService - .moveFile( - "${dir.path}${fileName.value}.wav", - "${newDir.path}${fileName.value}.wav", - ) - .timeout(_fileOpTimeout); - return; - } + final raw = newName.value.trim(); + if (raw.isEmpty) return; - await _asrService - .renameFile( - "${dir.path}${fileName.value}.wav", - newName.value, - ) - .timeout(_fileOpTimeout); + final nextTitle = raw.toLowerCase().endsWith('.wav') ? raw : '$raw.wav'; + Get.find() + .setPendingLocalRecordingTitle('${fileName.value}.wav', nextTitle); } /// 将控制器重置到初始状态