소스 검색

[new]增加埋点上报

zk 1 년 전
부모
커밋
3692902871

+ 5 - 5
lib/data/bean/wechat_payment_sign_bean.dart

@@ -6,25 +6,25 @@ part 'wechat_payment_sign_bean.g.dart';
 
 @JsonSerializable()
 class WechatPaymentSignBean {
-  @JsonKey(name: 'appId')
+  @JsonKey(name: 'appid')
   String appId;
 
-  @JsonKey(name: 'nonceStr')
+  @JsonKey(name: 'noncestr')
   String nonceStr;
 
   @JsonKey(name: 'package')
   String package;
 
-  @JsonKey(name: 'partnerId')
+  @JsonKey(name: 'partnerid')
   String partnerId;
 
-  @JsonKey(name: 'prepayId')
+  @JsonKey(name: 'prepayid')
   String prepayId;
 
   @JsonKey(name: 'sign')
   String sign;
 
-  @JsonKey(name: 'timeStamp')
+  @JsonKey(name: 'timestamp')
   String timeStamp;
 
   WechatPaymentSignBean({

+ 1 - 0
lib/data/consts/error_code.dart

@@ -2,6 +2,7 @@ abstract class ErrorCode {
   ErrorCode._();
 
   static const int errorCodeNoLogin = 1006;
+  static const int errorVerificationCode = 2002;
   static const int errorCodeNoProfession = 5003;
   static const int errorCodeNoEnergy = 5004;
 }

+ 75 - 0
lib/data/consts/event_report_id.dart

@@ -0,0 +1,75 @@
+abstract class EventId {
+  static const String id = 'id';
+  static const String id_001 = 'id_001';
+  static const String id_002 = 'id_002';
+  static const String id_003 = 'id_003';
+  static const String id_004 = 'id_004';
+
+  static const String event_100001 =
+      '100001'; //点击“示例谈话”(内部操作不归纳进正常的埋点范围)	100001
+
+  static const String event_100010 =
+      '100010'; //录制页	进入录制页	100010	带ID 首页点击录音进入-------001 快捷图标进入-------002
+  static const String event_100011 = '100011'; //点击录制完成
+
+  //谈话详情页
+  //(101001~102000)
+
+  //通用
+  static const String event_101001 =
+      '101001'; //进入详情页	101001	带ID 录音完成跳转-------001 点击谈话记录跳转-------002
+  static const String event_101002 = '101002'; //详情-“小听分析”	101002
+  static const String event_101003 = '101003'; //详情-点击“AI对话”	101003
+  static const String event_101004 = '101004'; //转发-发送给朋友(微信)	101004
+  static const String event_101005 = '101005'; //转发-发送给朋友(qq)	101005
+  static const String event_101006 = '101006'; //转发-发送原文	101006
+  static const String event_101007 = '101007'; //转发-发送总结	101007
+
+  //谈话总结
+  static const String event_101100 = '101100'; //生成后,谈话总结曝光	101100
+  static const String event_101101 = '101101'; //总结生成失败	101101
+
+  //我的待办
+  static const String event_101200 = '101200'; //生成后,我的待办曝光	101200
+  static const String event_101201 = '101201'; //点击“设为我的”	101201
+  static const String event_101202 = '101202'; //点击“小听思路”	101202
+  static const String event_101203 = '101203'; //待办生成失败	101203
+
+  //谈话原文
+  static const String event_101300 = '101300'; //生成后,谈话原文曝光	101300
+  static const String event_101301 = '101301'; //原文获取失败	101301
+
+  //AI对话
+// (102001~103000)
+
+//行业岗位页面
+  static const String event_102001 =
+      '102001'; //行业岗位页面曝光	102001	带ID 首页-------001 详情页-------002 “小听思路”(首页、待办页)-------003
+
+//对话页面
+  static const String event_102002 =
+      '102002'; //带ID 首页-------001 详情页-------002 “小听思路”(首页、待办页)-------003
+  static const String event_102003 =
+      '102003'; //点击“发送” 102003 带ID 提及文件(含发送和引用文件)-------001 不提及文件-------002
+
+//登录
+// (103001~104000)
+
+  static const String event_103001 =
+      '103001'; //登录页面弹出	103001	带ID 详情-小听分析-------001 首页-立即登录-------002 点击立即购买-------003 AI对话-------004
+  static const String event_103002 = '103002'; //登录-登录成功	103002
+  static const String event_103003 = '103003'; //登录-登录失败	103003
+  static const String event_103004 = '103004'; //登录-验证码报错	103004
+
+  //电量中心
+// (104001~105000)
+
+  static const String event_104001 =
+      '104001'; //充电中心页面弹出	104001	带ID 首页-充电-------001 我的-去充电-------002 小听分析-电量不足-点击充电-------003
+  static const String event_104002 =
+      '104002'; //支付方式ID: 微信支付-------001 支付宝-------003 跳转页面ID 首页-充电-------011 我的-去充电-------012 小听分析-电量不足-点击充电-------013
+
+  static const String event_104003 =
+      '104003'; //充电办理失败 104003 带ID: 微信支付-------001 支付宝-------002
+  static const String event_105001 = '105001'; //点击“检查更新” 105001
+}

+ 14 - 0
lib/handler/event_handler.dart

@@ -0,0 +1,14 @@
+import 'package:electronic_assistant/sdk/gravity/gravity_helper.dart';
+
+class EventHandler {
+  EventHandler._();
+
+  static void report(String eventId, {Map<String, dynamic>? params}) {
+    GravityHelper.report(eventId, params: params);
+  }
+
+  static void reportPay(
+      int priceFen, String orderId, String itemName, int payWay) {
+    GravityHelper.reportPay(priceFen, orderId, itemName, payWay);
+  }
+}

+ 4 - 2
lib/module/agenda/detail/controller.dart

@@ -46,10 +46,12 @@ class AgendaDetailController extends BaseController {
       return;
     }
     if (talkBean.value == null) {
-      ChatPage.startByTalkId(detailBean.value!.talkId,
+      ChatPage.startByTalkId(
+          ChatFromType.fromAnalysisBtn, detailBean.value!.talkId,
           agenda: detailBean.value!);
     } else {
-      ChatPage.startByTalk(talkBean.value!, agenda: detailBean.value!);
+      ChatPage.startByTalk(ChatFromType.fromAnalysisBtn, talkBean.value!,
+          agenda: detailBean.value!);
     }
   }
 

+ 2 - 2
lib/module/agenda/view.dart

@@ -2,7 +2,6 @@ import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/module/agenda/task_item_view.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
-import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -190,7 +189,8 @@ class AgendaPage extends BasePage<AgendaController> {
             controller.agendaComplete(item, true);
           },
           onThinkingClick: () {
-            ChatPage.startByTalkId(item.talkId, agenda: item);
+            ChatPage.startByTalkId(ChatFromType.fromAnalysisBtn, item.talkId,
+                agenda: item);
           },
         ),
       );

+ 55 - 7
lib/module/chat/controller.dart

@@ -6,10 +6,13 @@ import 'package:electronic_assistant/data/bean/chat_item.dart';
 import 'package:electronic_assistant/data/bean/file_chat_item.dart';
 import 'package:electronic_assistant/data/bean/progressing_chat_item.dart';
 import 'package:electronic_assistant/data/bean/reference_chat_item.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/chat_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/chat/start/view.dart';
+import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
@@ -32,11 +35,14 @@ class ChatController extends BaseController {
   final Rxn<TalkBean> talkInfo = Rxn<TalkBean>();
   final Rxn<Agenda> agenda = Rxn<Agenda>();
 
+  ChatFromType? fromType;
+
   @override
   void onInit() {
     super.onInit();
     loadMoreHistory();
     checkArguments();
+    initReport();
   }
 
   @override
@@ -53,15 +59,18 @@ class ChatController extends BaseController {
     if (arguments.isEmpty) {
       return;
     }
-    if (arguments.length > 1 && arguments[1] is Agenda) {
-      agenda.value = arguments[1];
+    if (arguments[0] is ChatFromType) {
+      fromType = arguments[0];
+    }
+    if (arguments.length > 2 && arguments[2] is Agenda) {
+      agenda.value = arguments[2];
     }
-    if (arguments[0] is TalkBean) {
-      talkInfo.value = arguments[0];
+    if (arguments.length > 1 && arguments[1] is TalkBean) {
+      talkInfo.value = arguments[1];
       sendInitialMessage();
-    } else if (arguments[0] is String) {
+    } else if (arguments.length > 1 && arguments[1] is String) {
       talkRepository
-          .talkInfo(arguments[0])
+          .talkInfo(arguments[1])
           .then((response) => talkInfo.value = response.talkInfo)
           .then((_) => sendInitialMessage());
     }
@@ -120,6 +129,19 @@ class ChatController extends BaseController {
 
   void showStartSheet() {
     WidgetsBinding.instance.addPostFrameCallback((_) {
+      if (fromType == ChatFromType.fromMain) {
+        EventHandler.report(EventId.event_102001, params: {
+          EventId.id: EventId.id_001,
+        });
+      } else if (fromType == ChatFromType.fromTalkDetail) {
+        EventHandler.report(EventId.event_102001, params: {
+          EventId.id: EventId.id_002,
+        });
+      } else if (fromType == ChatFromType.fromAnalysisBtn) {
+        EventHandler.report(EventId.event_102001, params: {
+          EventId.id: EventId.id_003,
+        });
+      }
       showModalBottomSheet(
         context: Get.context!,
         isScrollControlled: true,
@@ -129,7 +151,8 @@ class ChatController extends BaseController {
           return const ChatStartPage();
         },
       ).then((result) {
-        if (!accountRepository.isLogin.value) {
+        if (accountRepository.userInfo.value?.profession == null ||
+            accountRepository.userInfo.value?.post == null) {
           Get.back();
         }
       });
@@ -149,6 +172,15 @@ class ChatController extends BaseController {
     chatItems.insert(0, progressingChatItem);
 
     _scrollToBottom();
+    if (talkInfo.value == null) {
+      EventHandler.report(EventId.event_102003, params: {
+        EventId.id: EventId.id_002,
+      });
+    } else {
+      EventHandler.report(EventId.event_102003, params: {
+        EventId.id: EventId.id_001,
+      });
+    }
     chatRepository
         .streamChat(chatContent,
             talkId: talkInfo.value?.id, agendaId: agenda.value?.id)
@@ -243,4 +275,20 @@ class ChatController extends BaseController {
     talkInfo.value = null;
     agenda.value = null;
   }
+
+  void initReport() {
+    if (fromType == ChatFromType.fromMain) {
+      EventHandler.report(EventId.event_102002, params: {
+        EventId.id: EventId.id_001,
+      });
+    } else if (fromType == ChatFromType.fromTalkDetail) {
+      EventHandler.report(EventId.event_102002, params: {
+        EventId.id: EventId.id_002,
+      });
+    } else if (fromType == ChatFromType.fromAnalysisBtn) {
+      EventHandler.report(EventId.event_102002, params: {
+        EventId.id: EventId.id_003,
+      });
+    }
+  }
 }

+ 31 - 24
lib/module/chat/view.dart

@@ -22,19 +22,28 @@ import '../../data/bean/talks.dart';
 import '../../resource/assets.gen.dart';
 import '../../router/app_pages.dart';
 
+enum ChatFromType {
+  fromMain,
+  fromTalkDetail,
+  fromAnalysisBtn,
+  fromTalkExample,
+  unknown
+}
+
 class ChatPage extends BasePage<ChatController> {
   const ChatPage({super.key});
 
-  static start() {
-    Get.toNamed(RoutePath.chat);
+  static start(ChatFromType fromType) {
+    Get.toNamed(RoutePath.chat, arguments: [fromType]);
   }
 
-  static startByTalk(TalkBean talkInfo, {Agenda? agenda}) {
-    Get.toNamed(RoutePath.chat, arguments: [talkInfo, agenda]);
+  static startByTalk(ChatFromType fromType, TalkBean talkInfo,
+      {Agenda? agenda}) {
+    Get.toNamed(RoutePath.chat, arguments: [fromType, talkInfo, agenda]);
   }
 
-  static startByTalkId(String talkId, {Agenda? agenda}) {
-    Get.toNamed(RoutePath.chat, arguments: [talkId, agenda]);
+  static startByTalkId(ChatFromType fromType, String talkId, {Agenda? agenda}) {
+    Get.toNamed(RoutePath.chat, arguments: [fromType, talkId, agenda]);
   }
 
   @override
@@ -287,24 +296,22 @@ class ChatPage extends BasePage<ChatController> {
                     BrowserPage.start(url);
                     return true;
                   },
-                  md.markdownToHtml(content,
-                      inlineSyntaxes: [
-                        md.InlineHtmlSyntax(),
-                        md.StrikethroughSyntax(),
-                        md.EmojiSyntax(),
-                        md.ColorSwatchSyntax(),
-                        md.AutolinkExtensionSyntax(),
-                        md.ImageSyntax()
-                      ],
-                      blockSyntaxes: [
-                        const md.FencedCodeBlockSyntax(),
-                        const md.HeaderWithIdSyntax(),
-                        const md.SetextHeaderWithIdSyntax(),
-                        const md.UnorderedListWithCheckboxSyntax(),
-                        const md.OrderedListWithCheckboxSyntax(),
-                        const md.FootnoteDefSyntax(),
-                        const md.AlertBlockSyntax(),
-                      ]),
+                  md.markdownToHtml(content, inlineSyntaxes: [
+                    md.InlineHtmlSyntax(),
+                    md.StrikethroughSyntax(),
+                    md.EmojiSyntax(),
+                    md.ColorSwatchSyntax(),
+                    md.AutolinkExtensionSyntax(),
+                    md.ImageSyntax()
+                  ], blockSyntaxes: [
+                    const md.FencedCodeBlockSyntax(),
+                    const md.HeaderWithIdSyntax(),
+                    const md.SetextHeaderWithIdSyntax(),
+                    const md.UnorderedListWithCheckboxSyntax(),
+                    const md.OrderedListWithCheckboxSyntax(),
+                    const md.FootnoteDefSyntax(),
+                    const md.AlertBlockSyntax(),
+                  ]),
                   textStyle: TextStyle(
                       fontSize: 14.w, color: ColorName.primaryTextColor),
                 ),

+ 20 - 0
lib/module/home/controller.dart

@@ -2,9 +2,12 @@ import 'dart:io';
 
 import 'package:electronic_assistant/base/base_controller.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/agenda_repository.dart';
 import 'package:electronic_assistant/data/repositories/config_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
+import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
 import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
@@ -203,6 +206,23 @@ class HomePageController extends BaseController {
     }
     Get.toNamed(RoutePath.task);
   }
+
+  void onTalkItemClick(TalkBean item) {
+    if (item.isExample == true) {
+      EventHandler.report(EventId.event_100001);
+    }
+    TalkPage.start(item);
+  }
+
+  void onRecordClick() {
+    EventHandler.report(EventId.event_100010,
+        params: {EventId.id: EventId.id_001});
+    Get.toNamed(RoutePath.record);
+  }
+
+  void onLoginClick() {
+    LoginPage.start(fromType: LoginFromType.mainLogin);
+  }
 }
 
 Future<Directory> _getChoiceUploadDir(String talkId) async {

+ 7 - 5
lib/module/home/view.dart

@@ -4,6 +4,7 @@ import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/dialog/rename_dialog.dart';
 import 'package:electronic_assistant/dialog/talk_delete_dialog.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
+import 'package:electronic_assistant/module/store/view.dart';
 import 'package:electronic_assistant/popup/talk_popup.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
@@ -110,7 +111,7 @@ class HomePage extends BasePage<HomePageController> {
                 "#1763F9".toColor(),
                 "#28B2FF".toColor(),
               ], onTap: () {
-                Get.toNamed(RoutePath.record);
+                controller.onRecordClick();
               }),
             ),
             SizedBox(width: 8.w),
@@ -293,7 +294,7 @@ class HomePage extends BasePage<HomePageController> {
         onTap: () {
           // accountRepository.logout();
           // ToastUtil.showToast('GoStore');
-          Get.toNamed(RoutePath.store);
+          StorePage.start(fromType: StoreFromType.home);
         });
   }
 
@@ -304,7 +305,7 @@ class HomePage extends BasePage<HomePageController> {
           if (controller.isLogin) {
             controller.showLoginDrawer();
           } else {
-            Get.toNamed(RoutePath.login);
+            controller.onLoginClick();
           }
         },
         child: Row(
@@ -373,7 +374,7 @@ class HomePage extends BasePage<HomePageController> {
           showDeleteTalkDialog(item);
         });
       }, onItemClick: () {
-        TalkPage.start(item);
+        controller.onTalkItemClick(item);
       });
     });
   }
@@ -388,7 +389,8 @@ class HomePage extends BasePage<HomePageController> {
         child: taskItemView(
           item,
           onThinkingClick: () {
-            ChatPage.startByTalkId(item.talkId, agenda: item);
+            ChatPage.startByTalkId(ChatFromType.fromAnalysisBtn, item.talkId,
+                agenda: item);
           },
           onCheckClick: () {
             controller.agendaComplete(item);

+ 40 - 1
lib/module/login/controller.dart

@@ -1,10 +1,15 @@
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/constants.dart';
+import 'package:electronic_assistant/data/consts/error_code.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/dialog/alert_dialog.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/browser/view.dart';
+import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/expand.dart';
+import 'package:electronic_assistant/utils/http_handler.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
@@ -16,10 +21,32 @@ class LoginController extends BaseController {
 
   final FocusNode phoneFocusNode = FocusNode();
 
+  LoginFromType? fromType;
+
   @override
   void onReady() {
     super.onReady();
     phoneFocusNode.requestFocus();
+    _initArguments();
+  }
+
+  void _initArguments() {
+    fromType = parameters?['showEvent'];
+    if (fromType != null) {
+      if (fromType == LoginFromType.talkDetail) {
+        EventHandler.report(EventId.event_103001,
+            params: {EventId.id: EventId.id_001});
+      } else if (fromType == LoginFromType.mainLogin) {
+        EventHandler.report(EventId.event_103001,
+            params: {EventId.id: EventId.id_002});
+      } else if (fromType == LoginFromType.store) {
+        EventHandler.report(EventId.event_103001,
+            params: {EventId.id: EventId.id_003});
+      } else if (fromType == LoginFromType.aiChat) {
+        EventHandler.report(EventId.event_103001,
+            params: {EventId.id: EventId.id_004});
+      }
+    }
   }
 
   void getUserCode() {
@@ -128,9 +155,21 @@ class LoginController extends BaseController {
     }
     accountRepository.login(phone.value, code.value).then((data) {
       ToastUtil.showToast("登录成功");
+      EventHandler.report(EventId.event_103002);
       Get.back(result: true);
     }).catchError((error) {
-      ErrorHandler.toastError(error);
+      if (error is ServerErrorException) {
+        if (error.code == ErrorCode.errorVerificationCode) {
+          EventHandler.report(EventId.event_103004);
+          ToastUtil.showToast("验证码错误");
+        } else {
+          EventHandler.report(EventId.event_103003);
+          ErrorHandler.toastError(error);
+        }
+      } else {
+        EventHandler.report(EventId.event_103003);
+        ErrorHandler.toastError(error);
+      }
     });
   }
 

+ 7 - 0
lib/module/login/view.dart

@@ -11,11 +11,18 @@ import 'package:flutter/services.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 
+import '../../router/app_pages.dart';
 import 'controller.dart';
 
+enum LoginFromType { talkDetail, mainLogin, store, aiChat }
+
 class LoginPage extends BasePage<LoginController> {
   const LoginPage({super.key});
 
+  static start({LoginFromType? fromType}) {
+    Get.toNamed(RoutePath.login, arguments: {"fromType": fromType});
+  }
+
   @override
   bool immersive() {
     return true;

+ 4 - 2
lib/module/main/controller.dart

@@ -2,6 +2,7 @@ import 'dart:ui';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
+import 'package:electronic_assistant/module/chat/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';
@@ -11,6 +12,7 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 
 import '../../router/app_pages.dart';
+import '../login/view.dart';
 
 class MainController extends BaseController {
   final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
@@ -62,9 +64,9 @@ class MainController extends BaseController {
 
   void onChatClick() {
     if (accountRepository.isLogin.value) {
-      Get.toNamed(RoutePath.chat);
+      ChatPage.start(ChatFromType.fromMain);
     } else {
-      Get.toNamed(RoutePath.login);
+      LoginPage.start(fromType: LoginFromType.aiChat);
     }
   }
 }

+ 7 - 0
lib/module/main/drawer/controller.dart

@@ -1,4 +1,6 @@
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
@@ -44,4 +46,9 @@ class MainDrawerController extends BaseController {
           });
         });
   }
+
+  void onCheckUpdate() {
+    EventHandler.report(EventId.event_105001);
+    ToastUtil.showToast(StringName.versionLatest.tr);
+  }
 }

+ 5 - 2
lib/module/main/drawer/view.dart

@@ -1,6 +1,9 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/consts/Constants.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/browser/view.dart';
+import 'package:electronic_assistant/module/store/view.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
@@ -29,7 +32,7 @@ class MainDrawerView extends BasePage<MainDrawerController> {
             SizedBox(height: 12.h),
             GestureDetector(
               onTap: () {
-                Get.toNamed(RoutePath.store);
+                StorePage.start(fromType: StoreFromType.mine);
               },
               child: Container(
                 height: 72.w,
@@ -165,7 +168,7 @@ class MainDrawerView extends BasePage<MainDrawerController> {
             Assets.images.iconDrawerCheckUpdates.image(),
             StringName.mainDrawerCheckUpdates.tr,
             () {
-              ToastUtil.showToast(StringName.versionLatest.tr);
+              controller.onCheckUpdate();
             },
             rightView: Text(
               controller.versionName,

+ 4 - 1
lib/module/record/controller.dart

@@ -3,8 +3,10 @@ import 'dart:typed_data';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/error_code.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/dialog/alert_dialog.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/record/constants.dart';
 import 'package:electronic_assistant/module/record/record_task.dart';
 import 'package:electronic_assistant/module/talk/view.dart';
@@ -154,6 +156,7 @@ class RecordController extends BaseController {
     if (currentStatus.value == RecordStatus.pending) {
       return;
     }
+    EventHandler.report(EventId.event_100011);
     _saveCurrentRecord();
   }
 
@@ -248,7 +251,7 @@ class RecordController extends BaseController {
         pcmFile.delete();
         KVUtil.putString(keyLastRecordId, "");
         Get.back();
-        TalkPage.start(talkInfo);
+        TalkPage.start(talkInfo, eventTag: EventId.id_001);
       } else {
         throw Exception("pcm file not found");
       }

+ 54 - 3
lib/module/store/controller.dart

@@ -1,9 +1,12 @@
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/payment_way.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/store_repository.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
+import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/module/store/payment_status_manager.dart';
+import 'package:electronic_assistant/module/store/view.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
-import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/sdk/pay/agile_pay.dart';
 import 'package:electronic_assistant/sdk/pay/alipay/ali_pay_info.dart';
 import 'package:electronic_assistant/sdk/pay/applepay/apple_pay_info.dart';
@@ -11,7 +14,6 @@ import 'package:electronic_assistant/sdk/pay/code/agile_pay_code.dart';
 import 'package:electronic_assistant/utils/http_handler.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:get/get.dart';
-
 import '../../data/api/response/order_pay_response.dart';
 import '../../data/api/response/user_info_response.dart';
 import '../../data/bean/store_item.dart';
@@ -40,12 +42,31 @@ class StoreController extends BaseController implements PaymentStatusCallback {
 
   UserInfoResponse? get userInfo => _userInfo.value;
 
+  StoreFromType? fromType;
+
   @override
   void onInit() {
     super.onInit();
     initStoreIndexData();
   }
 
+  @override
+  void onReady() {
+    super.onReady();
+    _initArgs();
+  }
+
+  void _initArgs() {
+    fromType = Get.arguments?['fromType'];
+    if (fromType == StoreFromType.home) {
+      EventHandler.report(EventId.event_104001, params: {'id': '001'});
+    } else if (fromType == StoreFromType.mine) {
+      EventHandler.report(EventId.event_104001, params: {'id': '002'});
+    } else if (fromType == StoreFromType.analyse) {
+      EventHandler.report(EventId.event_104001, params: {'id': '003'});
+    }
+  }
+
   void initStoreIndexData() {
     storeRepository.storeIndex().then((indexData) {
       storeItems.clear();
@@ -111,6 +132,9 @@ class StoreController extends BaseController implements PaymentStatusCallback {
                 : ProductType.consumable,
             response.appAccountToken);
       }
+      Future.delayed(const Duration(seconds: 30), () {
+        LoadingDialog.hide();
+      });
       AgilePay.startPay(payInfo, success: (String? result) {
         LoadingDialog.show(StringName.storeQueryPayState.tr);
         checkPaymentStatus(outTradeNo, paymentWay, storeItem,
@@ -120,6 +144,7 @@ class StoreController extends BaseController implements PaymentStatusCallback {
         });
       }, payError: (int error, String? errorMessage) {
         errorPayToast(error);
+        errorEventReport(payMethod);
         LoadingDialog.hide();
       }, error: (int errno, String? error) {
         errorPayToast(errno);
@@ -130,13 +155,23 @@ class StoreController extends BaseController implements PaymentStatusCallback {
       if (error is ServerErrorException &&
           error.code == ErrorCode.errorCodeNoLogin) {
         ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
-        Get.toNamed(RoutePath.login);
+        LoginPage.start(fromType: LoginFromType.store);
       } else {
         ToastUtil.showToast(StringName.storePayError.tr);
       }
     }
   }
 
+  void errorEventReport(int payMethod) {
+    if (payMethod == PayMethod.wechat) {
+      EventHandler.report(EventId.event_104003, params: {'id': '001'});
+    } else if (payMethod == PayMethod.alipay) {
+      EventHandler.report(EventId.event_104003, params: {'id': '002'});
+    } else if (payMethod == PayMethod.apple) {
+      EventHandler.report(EventId.event_104003, params: {'id': '003'});
+    }
+  }
+
   void errorPayToast(int errno) {
     if (errno == AgilePayCode.payCodeNotSupport) {
       ToastUtil.showToast(StringName.storePayNotSupport.tr);
@@ -171,6 +206,22 @@ class StoreController extends BaseController implements PaymentStatusCallback {
       String orderNo, PaymentWay paymentWay, StoreItem storeItemBean) {
     LoadingDialog.hide();
     ToastUtil.showToast(StringName.storePaySuccess.tr);
+    Map<String, dynamic> params = {};
+    if (paymentWay.payMethod == PayMethod.wechat) {
+      params['id'] = '001';
+    } else if (paymentWay.payMethod == PayMethod.alipay) {
+      params['id'] = '002';
+    } else if (paymentWay.payMethod == PayMethod.apple) {
+      params['id'] = '003';
+    }
+    if (fromType == StoreFromType.home) {
+      params['from_id'] = '011';
+    } else if (fromType == StoreFromType.mine) {
+      params['from_id'] = '012';
+    } else if (fromType == StoreFromType.analyse) {
+      params['from_id'] = '013';
+    }
+    EventHandler.report(EventId.event_104002, params: params);
     Get.back();
   }
 }

+ 7 - 0
lib/module/store/view.dart

@@ -2,6 +2,7 @@ import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/data/bean/payment_way.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
+import 'package:electronic_assistant/router/app_pages.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -11,9 +12,15 @@ import '../../data/bean/store_item.dart';
 import '../../data/consts/Constants.dart';
 import 'controller.dart';
 
+enum StoreFromType { home, mine, analyse }
+
 class StorePage extends BasePage<StoreController> {
   const StorePage({super.key});
 
+  static start({StoreFromType? fromType}) {
+    Get.toNamed(RoutePath.store, arguments: {'fromType': fromType});
+  }
+
   @override
   Color backgroundColor() {
     return "#071935".color;

+ 35 - 4
lib/module/talk/controller.dart

@@ -3,9 +3,14 @@ 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';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/task_repository.dart';
+import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/home/controller.dart';
+import 'package:electronic_assistant/module/login/view.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';
@@ -37,6 +42,9 @@ import '../record/controller.dart';
 import 'original/view.dart';
 
 class TalkController extends BaseController {
+  static const String argumentItem = 'argument_item';
+  static const String argumentEventTag = 'argument_event_tag';
+
   final String uploadNoPrompts = "UPLOAD_NO_PROMPTS";
 
   final Rxn<TalkBean> talkBean = Rxn();
@@ -98,12 +106,23 @@ class TalkController extends BaseController {
     return _agendaNameController!;
   }
 
+  String? eventTag;
+
   @override
   void onReady() {
     super.onReady();
+
     _initAudioPlayer();
     _initListener();
     _getArguments();
+    eventReport(EventId.event_101001, params: {EventId.id: eventTag});
+  }
+
+  void eventReport(String eventId, {Map<String, dynamic>? params}) {
+    if (talkBean.value == null || talkBean.value?.isExample == true) {
+      return;
+    }
+    EventHandler.report(eventId, params: params);
   }
 
   void _initAudioPlayer() {
@@ -182,9 +201,11 @@ class TalkController extends BaseController {
   }
 
   void _getArguments() {
-    if (Get.arguments is TalkBean) {
-      talkBean.value = Get.arguments as TalkBean;
+    TalkBean? bean = parameters?[argumentItem];
+    if (bean != null) {
+      talkBean.value = bean;
     }
+    eventTag = parameters?[argumentEventTag];
   }
 
   void updateProgress(double value) {
@@ -305,6 +326,7 @@ class TalkController extends BaseController {
     if (id == null || duration == null) {
       return;
     }
+    eventReport(EventId.event_101002);
     talkRepository.checkElectric(duration).then((data) {
       if (data.enough) {
         //检查网络以及文件大小
@@ -353,13 +375,22 @@ class TalkController extends BaseController {
   }
 
   void clickAIAnalysis() {
+    if (!accountRepository.isLogin.value) {
+      LoginPage.start(fromType: LoginFromType.talkDetail);
+      return;
+    }
     if (talkBean.value != null) {
-      ChatPage.startByTalk(talkBean.value!);
+      eventReport(EventId.event_101003);
+      ChatPage.startByTalk(
+          talkBean.value!.isExample == true
+              ? ChatFromType.fromTalkExample
+              : ChatFromType.fromTalkDetail,
+          talkBean.value!);
     }
   }
 
   void onGoElectricStore() {
-    Get.toNamed(RoutePath.store);
+    StorePage.start(fromType: StoreFromType.analyse);
     Future.delayed(const Duration(milliseconds: 250), () {
       isShowElectricLow.value = false;
     });

+ 12 - 0
lib/module/talk/original/controller.dart

@@ -1,6 +1,7 @@
 import 'dart:async';
 
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:get/get.dart';
 
@@ -27,7 +28,18 @@ class OriginalController extends BaseController {
     requestOriginal();
   }
 
+  void eventReport(String eventId, {Map<String, dynamic>? params}) {
+    talkController.eventReport(eventId, params: params);
+  }
+
   void requestOriginal() {
+    if (talkController.talkBean.value?.status.value ==
+        TalkStatus.analysisSuccess) {
+      eventReport(EventId.event_101300);
+    } else if (talkController.talkBean.value?.status.value ==
+        TalkStatus.analysisFail) {
+      eventReport(EventId.event_101301);
+    }
     if (originalList.isNotEmpty) {
       return;
     }

+ 10 - 0
lib/module/talk/summary/controller.dart

@@ -3,6 +3,7 @@ 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:flutter/cupertino.dart';
 import 'package:get/get.dart';
@@ -43,10 +44,19 @@ class SummaryController extends BaseController {
     }
     talkRepository.talkInfo(id).then((data) {
       summaryBean.value = data.talkInfo;
+      if (data.talkInfo?.status.value == TalkStatus.analysisSuccess) {
+        eventReport(EventId.event_101100);
+      } else if (data.talkInfo?.status.value == TalkStatus.analysisFail) {
+        eventReport(EventId.event_101101);
+      }
     });
     talkController.refreshAgendaAllData();
   }
 
+  void eventReport(String eventId, {Map<String, dynamic>? params}) {
+    talkController.eventReport(eventId, params: params);
+  }
+
   void removeTalkAgenda(List<Agenda>? list, Agenda agenda) {
     talkController.removeTalkAgenda(list, agenda);
   }

+ 0 - 3
lib/module/talk/summary/view.dart

@@ -1,5 +1,4 @@
 import 'package:electronic_assistant/base/base_page.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';
 import 'package:electronic_assistant/utils/expand.dart';
@@ -8,9 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
 import 'package:get/get.dart';
 import 'package:markdown/markdown.dart' as md;
-
 import '../../../data/bean/talks.dart';
-import '../../../dialog/add_agenda_dialog.dart';
 import '../../browser/view.dart';
 import '../../home/view.dart';
 import '../common_view.dart';

+ 23 - 2
lib/module/talk/todo/controller.dart

@@ -2,6 +2,7 @@ import 'dart:async';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/agenda.dart';
+import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/agenda_repository.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
@@ -9,7 +10,9 @@ 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/repositories/account_repository.dart';
 import '../../../utils/event_bus.dart';
+import '../../login/view.dart';
 import '../controller.dart';
 
 class TodoController extends BaseController {
@@ -49,9 +52,16 @@ class TodoController extends BaseController {
     if (bean?.status.value == TalkStatus.analysisSuccess) {
       _talkController.refreshAgendaAllData();
       requestMineTodoData();
+      eventReport(EventId.event_101200);
+    } else if (bean?.status.value == TalkStatus.analysisFail) {
+      eventReport(EventId.event_101203);
     }
   }
 
+  void eventReport(String eventId, {Map<String, dynamic>? params}) {
+    _talkController.eventReport(eventId, params: params);
+  }
+
   void requestMineTodoData() {
     String? id = _talkController.talkBean.value?.id;
     if (id == null) {
@@ -66,6 +76,9 @@ class TodoController extends BaseController {
     if (agenda == null) {
       return;
     }
+    if (!agenda.todo.value) {
+      eventReport(EventId.event_101201);
+    }
     bool isSetTodo = !agenda.todo.value;
     agendaRepository.agendaTodo(agenda.id, isSetTodo).then((value) {
       agenda.todo.value = isSetTodo;
@@ -76,11 +89,19 @@ class TodoController extends BaseController {
   }
 
   void onClickThinking(Agenda agenda) {
+    if (!accountRepository.isLogin.value) {
+      LoginPage.start(fromType: LoginFromType.talkDetail);
+      return;
+    }
     TalkBean? bean = talkBean.value;
+    eventReport(EventId.event_101202);
+    ChatFromType fromType = talkBean.value!.isExample == true
+        ? ChatFromType.fromTalkExample
+        : ChatFromType.fromTalkDetail;
     if (bean != null) {
-      ChatPage.startByTalk(bean, agenda: agenda);
+      ChatPage.startByTalk(fromType, bean, agenda: agenda);
     } else {
-      ChatPage.start();
+      ChatPage.start(fromType);
     }
   }
 

+ 6 - 2
lib/module/talk/view.dart

@@ -8,6 +8,7 @@ import 'package:flutter/services.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import '../../data/bean/talks.dart';
+import '../../data/consts/event_report_id.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/string.gen.dart';
 import '../../router/app_pages.dart';
@@ -17,8 +18,11 @@ import 'common_view.dart';
 class TalkPage extends BasePage<TalkController> {
   const TalkPage({super.key});
 
-  static void start(TalkBean item) {
-    Get.toNamed(RoutePath.talkDetail, arguments: item);
+  static void start(TalkBean item, {String eventTag = EventId.id_002}) {
+    Get.toNamed(RoutePath.talkDetail, arguments: {
+      TalkController.argumentItem: item,
+      TalkController.argumentEventTag: eventTag,
+    });
   }
 
   @override

+ 2 - 2
lib/sdk/pay/wxpay/wechat_pay.dart

@@ -40,10 +40,10 @@ class WechatPay extends AgilePayStateInfo implements IAgilePay {
   void pay() async {
     sendPayBefore();
     try {
+      await WechatKitPlatform.instance.registerApp(
+          appId: _payInfo.appId, universalLink: _payInfo.universalLink);
       if (await check()) {
         if (await isInstalled()) {
-          await WechatKitPlatform.instance.registerApp(
-              appId: _payInfo.appId, universalLink: _payInfo.universalLink);
           try {
             WechatKitPlatform.instance.pay(
                 appId: _payInfo.appId,

+ 10 - 10
pubspec.lock

@@ -1260,18 +1260,18 @@ packages:
     dependency: transitive
     description:
       name: sqflite
-      sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d
+      sha256: ff5a2436ef8ebdfda748fbfe957f9981524cb5ff11e7bafa8c42771840e8a788
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.3+1"
+    version: "2.3.3+2"
   sqflite_common:
     dependency: transitive
     description:
       name: sqflite_common
-      sha256: "4058172e418eb7e7f2058dcb7657d451a8fc264afa0dea4dbd0f304a57131611"
+      sha256: "2d8e607db72e9cb7748c9c6e739e2c9618320a5517de693d5a24609c4671b1a4"
       url: "https://pub.dev"
     source: hosted
-    version: "2.5.4+3"
+    version: "2.5.4+4"
   stack_trace:
     dependency: transitive
     description:
@@ -1308,10 +1308,10 @@ packages:
     dependency: "direct main"
     description:
       name: synchronized
-      sha256: "51b08572b9f091f8c3eb4d9d4be253f196ff0075d5ec9b10a884026d5b55d7bc"
+      sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225"
       url: "https://pub.dev"
     source: hosted
-    version: "3.3.0+2"
+    version: "3.3.0+3"
   term_glyph:
     dependency: transitive
     description:
@@ -1428,10 +1428,10 @@ packages:
     dependency: "direct main"
     description:
       name: uuid
-      sha256: f33d6bb662f0e4f79dcd7ada2e6170f3b3a2530c28fc41f49a411ddedd576a77
+      sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
       url: "https://pub.dev"
     source: hosted
-    version: "4.5.0"
+    version: "4.5.1"
   vector_graphics:
     dependency: transitive
     description:
@@ -1476,10 +1476,10 @@ packages:
     dependency: transitive
     description:
       name: video_player_android
-      sha256: "38d8fe136c427abdce68b5e8c3c08ea29d7a794b453c7a51b12ecfad4aad9437"
+      sha256: "45d21bbba3d10b7182aa08ade5d4c68ed3367016d40f29732bb04a799b26842d"
       url: "https://pub.dev"
     source: hosted
-    version: "2.7.3"
+    version: "2.7.5"
   video_player_avfoundation:
     dependency: transitive
     description:

+ 0 - 4
pubspec.yaml

@@ -111,10 +111,6 @@ dependencies:
   #屏幕常亮
   wakelock_plus: ^1.2.8
 
-wechat_kit:
-  app_id: "your_wechat_app_id"
-  universal_link: "https://your_applinks_domain/universal_link/your_app/wechat/"
-
 
 dev_dependencies:
   flutter_test: