Sfoglia il codice sorgente

[new]分享增加思维导图

zk 1 anno fa
parent
commit
eac4b0fbea

BIN
assets/images/icon_talk_mind_map.webp


+ 1 - 0
assets/string/base/string.xml

@@ -145,4 +145,5 @@
     <string name="chat_item_ai_tag">内容由AI生成</string>
     <string name="model_explain_name">百度智能云千帆大模型</string>
     <string name="model_explain_record_number">网信算备110108645502801230043号</string>
+    <string name="talk_mind_map">思维导图</string>
 </resources>

+ 17 - 2
lib/dialog/talk_share_dialog.dart

@@ -18,6 +18,13 @@ void showTalkShareDialog(String? title, TalkShareCallback callback) {
   Rx<ShareTalkType> shareType = ShareTalkType.summary.obs;
 
   String getFileName() {
+    if (shareType.value == ShareTalkType.summary) {
+      return '[${StringName.talkTabSummary.tr}] $title.txt';
+    } else if (shareType.value == ShareTalkType.mindMap) {
+      return '[${StringName.talkMindMap.tr}] $title.png';
+    } else {
+      return '[${StringName.talkTabOriginal.tr}] $title.txt';
+    }
     return '${shareType.value == ShareTalkType.summary ? '[谈话总结]' : '[谈话原文]'} $title.txt';
   }
 
@@ -71,7 +78,15 @@ void showTalkShareDialog(String? title, TalkShareCallback callback) {
                                 shareType.value == ShareTalkType.summary, () {
                           shareType.value = ShareTalkType.summary;
                         })),
-                        SizedBox(width: 12.w),
+                        SizedBox(width: 8.w),
+                        Expanded(
+                            child: _buildShareTypeItem(
+                                StringName.talkMindMap.tr,
+                                Assets.images.iconTalkMindMap.provider(),
+                                shareType.value == ShareTalkType.mindMap, () {
+                          shareType.value = ShareTalkType.mindMap;
+                        })),
+                        SizedBox(width: 8.w),
                         Expanded(
                             child: _buildShareTypeItem(
                                 StringName.talkTabOriginal.tr,
@@ -194,6 +209,6 @@ Widget _buildShareItem(
   );
 }
 
-enum ShareTalkType { summary, original }
+enum ShareTalkType { summary, mindMap, original }
 
 enum ShareTo { wechat, qq, ios }

+ 49 - 30
lib/module/talk/controller.dart

@@ -1,7 +1,5 @@
 import 'dart:async';
-import 'dart:developer';
 import 'dart:io';
-
 import 'package:connectivity_plus/connectivity_plus.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
@@ -12,10 +10,7 @@ import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/module/record/record_handler.dart';
 import 'package:electronic_assistant/module/store/view.dart';
-import 'package:electronic_assistant/module/talk/summary/view.dart';
 import 'package:electronic_assistant/module/talk/todo/controller.dart';
-import 'package:electronic_assistant/module/talk/todo/view.dart';
-import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
@@ -123,6 +118,7 @@ class TalkController extends BaseController {
   bool isLocalFileHas = false;
 
   final Rxn<Duration> playingDuration = Rxn();
+  final Rxn<TalkBean> summaryBean = Rxn();
 
   @override
   void onReady() {
@@ -231,6 +227,7 @@ class TalkController extends BaseController {
     TalkBean? bean = parameters?[argumentItem];
     if (bean != null) {
       talkBean.value = bean;
+      debugPrint('talkBean == ${bean.summary}');
       _dealTalk(bean);
     } else {
       paramId = parameters?[argumentTalkId];
@@ -597,24 +594,53 @@ class TalkController extends BaseController {
     eventReport(EventId.event_101004);
     showTalkShareDialog(talkBean.value?.title.value,
         (type, shareTo, fileName, tag) {
-      talkRepository
-          .talkExport(talkBean.value!.id, fileName, type)
-          .then((file) async {
-        if (shareTo == ShareTo.ios) {
-          await Share.shareXFiles([XFile(file.path)], subject: fileName);
-        } else if (shareTo == ShareTo.wechat) {
-          await SystemShareUtil.shareWechatFile(file.path);
-        } else {
-          await SystemShareUtil.shareQQFile(file.path);
-        }
-        SmartDialog.dismiss(tag: tag);
-      }).catchError((error) {
-        if (error is SystemShareException) {
-          ToastUtil.showToast(error.message);
-        } else {
-          ErrorHandler.toastError(error);
-        }
-      });
+      if (type == ShareTalkType.summary || type == ShareTalkType.original) {
+        _shareSummaryOrOriginal(
+            talkBean.value!.id, fileName, type, shareTo, tag);
+      } else if (type == ShareTalkType.mindMap) {
+        //TODO 生成思维导图
+        _shareMindMap();
+      }
+    });
+  }
+
+  void _shareMindMap() {}
+
+  void _shareSummaryOrOriginal(String id, String fileName, ShareTalkType type,
+      ShareTo shareTo, String tag) async {
+    talkRepository.talkExport(id, fileName, type).then((file) async {
+      if (shareTo == ShareTo.ios) {
+        await Share.shareXFiles([XFile(file.path)], subject: fileName);
+      } else if (shareTo == ShareTo.wechat) {
+        await SystemShareUtil.shareWechatFile(file.path);
+      } else if (shareTo == ShareTo.qq) {
+        await SystemShareUtil.shareQQFile(file.path);
+      }
+      SmartDialog.dismiss(tag: tag);
+    }).catchError((error) {
+      if (error is SystemShareException) {
+        ToastUtil.showToast(error.message);
+      } else {
+        ErrorHandler.toastError(error);
+      }
+    });
+  }
+
+  void seekTo(int? startMs) {
+    if (startMs == null) {
+      return;
+    }
+    _audioPlayer.seek(Duration(milliseconds: startMs));
+  }
+
+  Future<TalkBean?> refreshSummaryData() async {
+    String? id = talkBean.value?.id;
+    if (id == null) {
+      return null;
+    }
+    return talkRepository.talkInfo(id).then((data) {
+      summaryBean.value = data.talkInfo;
+      return data.talkInfo;
     });
   }
 
@@ -627,11 +653,4 @@ class TalkController extends BaseController {
     _agendaContentController?.dispose();
     _agendaNameController?.dispose();
   }
-
-  void seekTo(int? startMs) {
-    if (startMs == null) {
-      return;
-    }
-    _audioPlayer.seek(Duration(milliseconds: startMs));
-  }
 }

+ 27 - 5
lib/module/talk/mindview/controller.dart

@@ -1,8 +1,12 @@
+import 'dart:io';
+import 'dart:typed_data';
+
 import 'package:dsbridge_flutter/dsbridge_flutter.dart';
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/module/talk/mindview/js_api.dart';
 import 'package:webview_flutter/webview_flutter.dart';
 import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
+import 'package:path_provider/path_provider.dart';
 
 class MindViewController extends BaseController {
   late final DWebViewController webViewController;
@@ -24,14 +28,32 @@ class MindViewController extends BaseController {
     webViewController.enableZoom(false);
     webViewController.loadRequest(Uri.parse('http://192.168.10.144:9528'));
 
-    webViewController.addJavaScriptObject(JsMindApi());
-    // webViewController.callHandler(JsMindApi.functionUpdateMind, args: []);
-    Future.delayed(const Duration(seconds: 1), () {
-      webViewController
-          .callHandler(JsMindApi.functionExport, args: ['test.svg']);
+    Future.delayed(const Duration(seconds: 3), () {
+      webViewController.callHandler(JsMindApi.functionToJsExport,
+          args: ['test'], handler: (value) {
+        saveToFile(value);
+      });
     });
   }
 
+  Future<void> saveToFile(dynamic data) async {
+    Uint8List? bytes = convertMapToUint8List(data);
+    if (bytes == null) {
+      return;
+    }
+    final directory = await getApplicationDocumentsDirectory();
+    final file = File('${directory.path}/output_file.png');
+    await file.writeAsBytes(bytes);
+  }
+
+  Uint8List? convertMapToUint8List(dynamic map) {
+    if (map is Map) {
+      final value = map.values.toList().cast<int>();
+      return Uint8List.fromList(value);
+    }
+    return null;
+  }
+
   @override
   void onReady() {
     super.onReady();

+ 3 - 10
lib/module/talk/mindview/js_api.dart

@@ -1,16 +1,9 @@
-import 'dart:io';
-
 import 'package:dsbridge_flutter/dsbridge_flutter.dart';
 
 class JsMindApi extends JavaScriptNamespaceInterface {
-  static const String functionUpdateMind = "updateValue";
-  static const String functionExport = "export";
+  static const String functionToJsUpdateMind = "updateValue";
+  static const String functionToJsExport = "export";
 
   @override
-  void register() {
-    registerFunction((dynamic msg) {}, functionName: functionUpdateMind);
-    registerFunction(export, functionName: functionExport);
-  }
-
-  void export(dynamic exportSvg) {}
+  void register() {}
 }

+ 8 - 18
lib/module/talk/summary/controller.dart

@@ -2,17 +2,14 @@ import 'dart:async';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/agenda.dart';
-import 'package:electronic_assistant/data/bean/talks.dart';
-import 'package:electronic_assistant/data/consts/event_report_id.dart';
-import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/module/talk/controller.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
-
 import '../../../data/bean/agenda_list_all_bean.dart';
+import '../../../data/bean/talks.dart';
+import '../../../data/consts/event_report_id.dart';
 
 class SummaryController extends BaseController {
-  final Rxn<TalkBean> summaryBean = Rxn();
   final String? talkId;
 
   StreamSubscription? _talkStatusListener;
@@ -20,7 +17,7 @@ class SummaryController extends BaseController {
 
   SummaryController(this.talkId);
 
-  get talkController => Get.find<TalkController>(tag: talkId);
+  TalkController get talkController => Get.find<TalkController>(tag: talkId);
 
   RxList<AgendaListAllBean> get agendaAllList => talkController.agendaAllList;
 
@@ -28,6 +25,8 @@ class SummaryController extends BaseController {
 
   bool get isEditModel => _isEditModel.value;
 
+  Rxn<TalkBean> get summaryBean => talkController.summaryBean;
+
   @override
   void onReady() {
     super.onReady();
@@ -42,19 +41,10 @@ class SummaryController extends BaseController {
   }
 
   void _dealTalkUpdate() {
-    refreshSummaryData();
-  }
-
-  void refreshSummaryData() {
-    String? id = talkController.talkBean.value?.id;
-    if (id == null) {
-      return;
-    }
-    talkRepository.talkInfo(id).then((data) {
-      summaryBean.value = data.talkInfo;
-      if (data.talkInfo?.status.value == TalkStatus.analysisSuccess) {
+    talkController.refreshSummaryData().then((data) {
+      if (data?.status.value == TalkStatus.analysisSuccess) {
         eventReport(EventId.event_101100);
-      } else if (data.talkInfo?.status.value == TalkStatus.analysisFail) {
+      } else if (data?.status.value == TalkStatus.analysisFail) {
         eventReport(EventId.event_101101);
       }
     });