فهرست منبع

Merge branch 'v1.0.1' of git.atmob.com:Atmob-Flutter/ElectronicAssistant into v1.0.1

Destiny 1 سال پیش
والد
کامیت
209efe5ba5

+ 83 - 0
lib/data/api/atmob_file_api.c.dart

@@ -0,0 +1,83 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'atmob_file_api.dart';
+
+// **************************************************************************
+// RetrofitGenerator
+// **************************************************************************
+
+// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers
+
+class _AtmobFileApi implements AtmobFileApi {
+  _AtmobFileApi(
+    this._dio, {
+    this.baseUrl,
+  });
+
+  final Dio _dio;
+
+  String? baseUrl;
+
+  @override
+  Future<BaseResponse<TalkGenerateResponse>> uploadTalkFile(
+      Map<String, dynamic> body,
+      {ProgressCallback? onSendProgress}) async {
+    const _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = FormData.fromMap(body);
+    final _result = await _dio.fetch<Map<String, dynamic>>(
+        _setStreamType<BaseResponse<TalkGenerateResponse>>(Options(
+      method: 'POST',
+      headers: _headers,
+      extra: _extra,
+      contentType: 'multipart/form-data',
+    )
+            .compose(
+              _dio.options,
+              '/project/secretary/v1/talk/generate',
+              queryParameters: queryParameters,
+              data: _data,
+            )
+            .copyWith(
+                baseUrl: _combineBaseUrls(
+              _dio.options.baseUrl,
+              baseUrl,
+            ))));
+    final value = BaseResponse<TalkGenerateResponse>.fromJson(
+      _result.data!,
+      (json) => TalkGenerateResponse.fromJson(json as Map<String, dynamic>),
+    );
+    return value;
+  }
+
+  RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
+    if (T != dynamic &&
+        !(requestOptions.responseType == ResponseType.bytes ||
+            requestOptions.responseType == ResponseType.stream)) {
+      if (T == String) {
+        requestOptions.responseType = ResponseType.plain;
+      } else {
+        requestOptions.responseType = ResponseType.json;
+      }
+    }
+    return requestOptions;
+  }
+
+  String _combineBaseUrls(
+    String dioBaseUrl,
+    String? baseUrl,
+  ) {
+    if (baseUrl == null || baseUrl.trim().isEmpty) {
+      return dioBaseUrl;
+    }
+
+    final url = Uri.parse(baseUrl);
+
+    if (url.isAbsolute) {
+      return url.toString();
+    }
+
+    return Uri.parse(dioBaseUrl).resolveUri(url).toString();
+  }
+}

+ 3 - 2
lib/data/api/atmob_file_api.dart

@@ -6,7 +6,7 @@ import '../../base/base_response.dart';
 import '../consts/Constants.dart';
 import 'network_module.dart';
 
-part 'atmob_file_api.g.dart';
+part 'atmob_file_api.c.dart';
 
 @RestApi()
 abstract class AtmobFileApi {
@@ -15,7 +15,8 @@ abstract class AtmobFileApi {
   @MultiPart()
   @POST("/project/secretary/v1/talk/generate")
   Future<BaseResponse<TalkGenerateResponse>> uploadTalkFile(
-      @Part() Map<String, dynamic> body);
+      @Part() Map<String, dynamic> body,
+      {ProgressCallback? onSendProgress});
 }
 
 final atmobFileApi = AtmobFileApi(fileDio, baseUrl: Constants.baseUrl);

+ 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
+}

+ 25 - 7
lib/data/repositories/talk_repository.dart

@@ -6,6 +6,7 @@ import 'package:electronic_assistant/data/api/request/talk_create_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_delete_request.dart';
 import 'package:electronic_assistant/data/api/request/talk_file_request.dart';
 import 'package:get/get.dart';
+
 import '../../utils/http_handler.dart';
 import '../api/request/talk_generate_request.dart';
 import '../api/request/talk_paginate_request.dart';
@@ -23,6 +24,8 @@ class TalkRepository {
 
   final Set<String> _uploadingTalkIds = {};
 
+  final Map<String, RxDouble> _uploadingTalkProgress = {};
+
   final _talkList = RxList<TalkBean>();
 
   RxList<TalkBean> get talkList => _talkList;
@@ -142,15 +145,30 @@ class TalkRepository {
   Future<String> uploadTalkFile(String talkId, double duration, File file) {
     _uploadingTalkIds.add(talkId);
     return atmobFileApi
-        .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson())
+        .uploadTalkFile(TalkFileRequest(talkId, duration, file: file).toJson(),
+            onSendProgress: (count, total) {
+          if (_uploadingTalkProgress[talkId] == null) {
+            _uploadingTalkProgress[talkId] = RxDouble(0);
+          } else {
+            _uploadingTalkProgress[talkId]!.value = count / total;
+          }
+        })
         .then(HttpHandler.handle(true))
         .then((response) {
-      _uploadingTalkIds.remove(talkId);
-      return response.taskId;
-    }).catchError((error) {
-      _uploadingTalkIds.remove(talkId);
-      throw error;
-    });
+          _uploadingTalkIds.remove(talkId);
+          return response.taskId;
+        })
+        .catchError((error) {
+          _uploadingTalkIds.remove(talkId);
+          throw error;
+        });
+  }
+
+  RxDouble getUploadProgress(String talkId) {
+    if (_uploadingTalkProgress[talkId] == null) {
+      _uploadingTalkProgress[talkId] = RxDouble(0);
+    }
+    return _uploadingTalkProgress[talkId]!;
   }
 }
 

+ 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,

+ 18 - 2
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';
@@ -19,6 +21,7 @@ import 'package:get/get.dart';
 import 'package:path_provider/path_provider.dart';
 import 'package:record/record.dart';
 import 'package:uuid/uuid.dart';
+import 'package:wakelock_plus/wakelock_plus.dart';
 
 import '../../utils/pcm_wav_converter.dart';
 import '../../widget/frame_animation_view.dart';
@@ -153,6 +156,7 @@ class RecordController extends BaseController {
     if (currentStatus.value == RecordStatus.pending) {
       return;
     }
+    EventHandler.report(EventId.event_100011);
     _saveCurrentRecord();
   }
 
@@ -169,6 +173,7 @@ class RecordController extends BaseController {
 
     File targetFile = await _getCurrentRecordFile();
     Stream<Uint8List> recordStream = await _record.startStream(_recordConfig);
+    _setWakeLock();
     _startForegroundService();
     recordStream.listen((data) async {
       if (data.isEmpty) {
@@ -188,9 +193,12 @@ class RecordController extends BaseController {
     });
   }
 
-  _onRecordPermissionDenied() {}
+  _onRecordPermissionDenied() {
+    ToastUtil.showToast("需要授予录音权限才能使用录音功能");
+  }
 
   Future<void> _stopRecord() {
+    _releaseWakeLock();
     return _record
         .pause()
         .then((_) => _changeRecordStatus(RecordStatus.paused))
@@ -243,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");
       }
@@ -296,6 +304,14 @@ class RecordController extends BaseController {
     }
   }
 
+  void _setWakeLock() {
+    WakelockPlus.enable();
+  }
+
+  void _releaseWakeLock() {
+    WakelockPlus.disable();
+  }
+
   /// 获取录音文件地址
   static Future<File> getRecordFile(String talkId) async {
     Directory documentDir = await getApplicationDocumentsDirectory();

+ 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;

+ 41 - 7
lib/module/talk/controller.dart

@@ -1,10 +1,16 @@
 import 'dart:async';
 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';
@@ -18,7 +24,9 @@ import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:connectivity_plus/connectivity_plus.dart';
+import 'package:just_audio/just_audio.dart';
+import 'package:wakelock_plus/wakelock_plus.dart';
+
 import '../../data/api/request/agenda_update_bean.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/bean/agenda_list_all_bean.dart';
@@ -32,9 +40,11 @@ import '../../utils/event_bus.dart';
 import '../../utils/toast_util.dart';
 import '../record/controller.dart';
 import 'original/view.dart';
-import 'package:just_audio/just_audio.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();
@@ -96,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() {
@@ -180,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) {
@@ -303,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) {
         //检查网络以及文件大小
@@ -324,13 +348,14 @@ class TalkController extends BaseController {
       return;
     }
     isUploading.value = true;
+    WakelockPlus.enable();
     talkRepository.uploadTalkFile(talkId, duration, file).then((taskId) {
       isUploadedFile = true;
       taskRepository.addTask(taskId);
     }).catchError((error) {
       isUploading.value = false;
       ErrorHandler.toastError(error);
-    });
+    }).whenComplete(() => WakelockPlus.disable());
   }
 
   void refreshAgendaAllData({bool isForceRefresh = false}) {
@@ -350,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,

+ 11 - 11
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:
@@ -1513,7 +1513,7 @@ packages:
     source: hosted
     version: "14.2.4"
   wakelock_plus:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: wakelock_plus
       sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484

+ 2 - 5
pubspec.yaml

@@ -108,11 +108,8 @@ dependencies:
   #并发
   synchronized: ^3.3.0+2
 
-
-
-wechat_kit:
-  app_id: "your_wechat_app_id"
-  universal_link: "https://your_applinks_domain/universal_link/your_app/wechat/"
+  #屏幕常亮
+  wakelock_plus: ^1.2.8
 
 
 dev_dependencies: