From c7f6161ef77a9e2011f6fb7169613d6c06dc8f02 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 23 Jun 2025 13:03:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=9A=E8=AE=AE=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E6=9B=B4=E5=A4=9A=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/utils/synchrodata.dart | 33 +++--- .../meeting/views/generate_bottom_sheet.dart | 101 ++++++++++-------- .../meeting/views/meeting_details_view.dart | 14 ++- .../meeting/views/more_bottom_sheet.dart | 92 ++++++++++++++++ 4 files changed, 179 insertions(+), 61 deletions(-) create mode 100644 lib/modules/meeting/views/more_bottom_sheet.dart diff --git a/lib/core/utils/synchrodata.dart b/lib/core/utils/synchrodata.dart index 4d8d2e3af..3e3148829 100644 --- a/lib/core/utils/synchrodata.dart +++ b/lib/core/utils/synchrodata.dart @@ -8,7 +8,11 @@ import '../../data/services/network/api.dart'; class Synchrodata { static final GetStorage _storage = GetStorage(); - static List _records = _storage.read("operation_records") ?? []; + static List> _records = + (_storage.read("operation_records") as List?) + ?.map((e) => Map.from(e as Map)) + .toList() ?? + []; static List _delids = _storage.read("operation_delids") ?? []; static bool _isSynchro = false; @@ -30,7 +34,7 @@ class Synchrodata { switch (method) { case 'insert': _records.add({ - ...params, + ...Map.from(params), 'id': id, 'number': params['id'], 'uid': userId, @@ -38,19 +42,19 @@ class Synchrodata { _storage.write("operation_records", _records); break; case 'update': - Map? foundElement = _records.firstWhere( + Map? foundElement = _records.firstWhere( (element) => element['id'] == id, - orElse: () => null, + orElse: () => {}, ); - if (foundElement != null) { + if (foundElement.isNotEmpty) { foundElement.addAll({ - ...params, + ...Map.from(params), 'id': id, 'number': params['id'], }); } else { _records.add({ - ...params, + ...Map.from(params), 'id': id, 'number': params['id'], 'uid': userId, @@ -75,15 +79,18 @@ class Synchrodata { // 获取需要修改的全部数据 List putRecords = []; for (var element in _records) { - final result = await SqfliteApi.getMeetingDetails(element['number']); - final speakerList = - await SqfliteApi.getMeetingSpeaker(element['number']); + Map result = {'details': {}}; + List speakerList = []; + if (!_delids.contains(element['id'])) { + result = await SqfliteApi.getMeetingDetails(element['number']); + speakerList = await SqfliteApi.getMeetingSpeaker(element['number']); + } putRecords.add({ - ...result, - ...result['details'], + ...Map.from(result), + ...Map.from(result['details']), 'rtype': result['type'], 'original': jsonEncode(speakerList), - ...element, + ...Map.from(element), }); } var result = await Api.putOperationRecord({ diff --git a/lib/modules/meeting/views/generate_bottom_sheet.dart b/lib/modules/meeting/views/generate_bottom_sheet.dart index 3343357b2..1e2c8568c 100644 --- a/lib/modules/meeting/views/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/generate_bottom_sheet.dart @@ -9,7 +9,9 @@ import 'record_language_bottom_sheet.dart'; import 'template_view.dart'; class GenerateBottomSheet extends StatefulWidget { - const GenerateBottomSheet({super.key}); + final bool isSummarizeAgain; + + const GenerateBottomSheet({super.key, this.isSummarizeAgain = false}); @override State createState() => _GenerateBottomSheetState(); @@ -214,56 +216,57 @@ class _GenerateBottomSheetState extends State { }, ), ), - Container( - margin: EdgeInsets.symmetric(horizontal: 12.w), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8.r), - ), - child: Column( - children: [ - _row( - '区分说话人', - widget: Transform.scale( - scale: 0.8, - alignment: Alignment.centerRight, - child: Switch( - value: _isSpeaker, - onChanged: (bool value) { - setState(() { - _isSpeaker = value; - }); - }, + if (!widget.isSummarizeAgain) + Container( + margin: EdgeInsets.symmetric(horizontal: 12.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8.r), + ), + child: Column( + children: [ + _row( + '区分说话人', + widget: Transform.scale( + scale: 0.8, + alignment: Alignment.centerRight, + child: Switch( + value: _isSpeaker, + onChanged: (bool value) { + setState(() { + _isSpeaker = value; + }); + }, + ), ), ), - ), - _row( - '录音语言', - value: _languageText, - isBorder: false, - onTap: () { - Get.bottomSheet( - RecordLanguageBottomSheet(_language), - isScrollControlled: true, - backgroundColor: Colors.grey[100], - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(12.r), + _row( + '录音语言', + value: _languageText, + isBorder: false, + onTap: () { + Get.bottomSheet( + RecordLanguageBottomSheet(_language), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), ), - ), - ).then((value) { - if (value != null) { - setState(() { - _languageText = value['name']; - _language = value['value']; - }); - } - }); - }, - ), - ], + ).then((value) { + if (value != null) { + setState(() { + _languageText = value['name']; + _language = value['value']; + }); + } + }); + }, + ), + ], + ), ), - ), Padding( padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), child: GestureDetector( @@ -279,6 +282,10 @@ class _GenerateBottomSheetState extends State { _storage.write("meeting_last_template_Data", _templateData); _storage.write("meeting_template_list", _templateList); Get.back(); + if (widget.isSummarizeAgain) { + _controller.meetingDetails.value.tasktype = 2; + _controller.meetingDetails.refresh(); + } _controller.summaryCreate(); }, child: Container( diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index de44350a7..1ab644bc3 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -10,6 +10,7 @@ import 'package:lottie/lottie.dart'; import '../../../core/theme/app_colors.dart'; import '../controllers/meeting_details_controller.dart'; import 'mind_map_tab.dart'; +import 'more_bottom_sheet.dart'; import 'overview_tab.dart'; import 'share_bottom_sheet.dart'; import 'speech_tab.dart'; @@ -189,7 +190,18 @@ class MeetingDetailsView extends GetView { size: 16.sp, ), ), - onPressed: () {}, + onPressed: () { + Get.bottomSheet( + const MoreBottomSheet(), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ); + }, ), ], ); diff --git a/lib/modules/meeting/views/more_bottom_sheet.dart b/lib/modules/meeting/views/more_bottom_sheet.dart new file mode 100644 index 000000000..38e96f967 --- /dev/null +++ b/lib/modules/meeting/views/more_bottom_sheet.dart @@ -0,0 +1,92 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../controllers/meeting_controller.dart'; +import '../controllers/meeting_details_controller.dart'; +import 'generate_bottom_sheet.dart'; + +class MoreBottomSheet extends StatefulWidget { + const MoreBottomSheet({super.key}); + + @override + State createState() => _MoreBottomSheetState(); +} + +class _MoreBottomSheetState extends State { + final _controller = Get.find(); + final _detailsController = Get.find(); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.w), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox(height: 10.w), + if (_detailsController.meetingDetails.value.tasktype == 3) + _shareItem(Icons.refresh, '重新总结', onTap: () { + Get.back(); + Get.bottomSheet( + const GenerateBottomSheet( + isSummarizeAgain: true, + ), + isScrollControlled: true, + backgroundColor: Colors.grey[100], + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(12.r), + ), + ), + ); + }), + _shareItem(Icons.delete_outline, '删除', onTap: () async { + _controller.deleteMeeting( + _detailsController.meetingData.value.id, + _detailsController.meetingData.value.filepath, + ); + Get.back(); + Get.back(); + }), + ], + ), + ); + } + + Widget _shareItem( + IconData icon, + String title, { + VoidCallback? onTap, + }) { + return InkWell( + onTap: onTap, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 15.w), + margin: EdgeInsets.only(bottom: 10.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(12.r), + ), + child: Row( + children: [ + Icon( + icon, + color: Colors.black87, + ), + 10.horizontalSpace, + Expanded( + child: Text( + title, + style: TextStyle( + fontSize: 14.sp, + color: Colors.black87, + ), + ), + ), + ], + ), + ), + ); + } +}