Explorar o código

[new]增加示例谈话

zk hai 1 ano
pai
achega
273ae22c84

+ 5 - 0
lib/data/api/atmob_api.dart

@@ -24,6 +24,7 @@ import 'package:electronic_assistant/data/api/response/agenda_list_all_response.
 import 'package:electronic_assistant/data/api/response/agenda_list_mine_response.dart';
 import 'package:electronic_assistant/data/api/response/agenda_response.dart';
 import 'package:electronic_assistant/data/api/response/chat_history_response.dart';
+import 'package:electronic_assistant/data/api/response/example_info_response.dart';
 import 'package:electronic_assistant/data/api/response/home_info_response.dart';
 import 'package:electronic_assistant/data/api/response/login_response.dart';
 import 'package:electronic_assistant/data/api/response/talk_check_electric_response.dart';
@@ -123,6 +124,10 @@ abstract class AtmobApi {
   Future<BaseResponse<TalkPaginateResponse>> talkPagePaginate(
       @Body() TalkPaginateRequest request);
 
+  @POST("/project/secretary/v1/example/info")
+  Future<BaseResponse<ExampleInfoResponse>> exampleInfo(
+      @Body() AppBaseRequest request);
+
   @MultiPart()
   @POST("/project/secretary/v1/talk/generate")
   Future<BaseResponse<TalkGenerateResponse>> uploadTalkFile(

+ 4 - 1
lib/data/api/request/talk_request.dart

@@ -8,7 +8,10 @@ class TalkRequest extends AppBaseRequest {
   @JsonKey(name: 'talkId')
   String? talkId;
 
-  TalkRequest(this.talkId);
+  @JsonKey(name: 'example')
+  bool? isExample;
+
+  TalkRequest(this.talkId, {this.isExample});
 
   @override
   Map<String, dynamic> toJson() => _$TalkRequestToJson(this);

+ 23 - 0
lib/data/api/response/example_info_response.dart

@@ -0,0 +1,23 @@
+import 'package:electronic_assistant/data/bean/agenda.dart';
+import 'package:electronic_assistant/data/bean/folder.dart';
+import 'package:electronic_assistant/data/bean/talks.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+part 'example_info_response.g.dart';
+
+@JsonSerializable()
+class ExampleInfoResponse {
+  @JsonKey(name: 'talkInfos')
+  List<TalkBean>? talkInfoList;
+
+  @JsonKey(name: 'agendas')
+  List<Agenda>? agendaList;
+
+  @JsonKey(name: 'folders')
+  List<Folder>? folderList;
+
+  ExampleInfoResponse(this.talkInfoList, this.agendaList, this.folderList);
+
+  factory ExampleInfoResponse.fromJson(Map<String, dynamic> json) =>
+      _$ExampleInfoResponseFromJson(json);
+}

+ 19 - 0
lib/data/bean/folder.dart

@@ -0,0 +1,19 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'folder.g.dart';
+
+@JsonSerializable()
+class Folder {
+  @JsonKey(name: 'id')
+  late int id;
+
+  @JsonKey(name: 'name')
+  String? name;
+
+  @JsonKey(name: 'createTime')
+  String? createTime;
+
+  Folder(this.id, this.name, this.createTime);
+
+  factory Folder.fromJson(Map<String, dynamic> json) => _$FolderFromJson(json);
+}

+ 0 - 7
lib/data/repositories/account_repository.dart

@@ -124,13 +124,6 @@ class AccountRepository {
     eventBus.emit(EventUserLogout);
   }
 
-  void cleanLoginInfo() {
-    _token = null;
-    _phone = null;
-    KVUtil.putString(ACCOUNT_TOKEN, null);
-    KVUtil.putString(ACCOUNT_PHONE, null);
-    isLogin.value = false;
-  }
 
   getUserSubName(String? phone) {
     String name = StringName.account.tr;

+ 9 - 2
lib/data/repositories/agenda_repository.dart

@@ -10,6 +10,7 @@ import '../api/request/agenda_todo_request.dart';
 import '../api/response/agenda_list_all_response.dart';
 import '../api/response/agenda_list_mine_response.dart';
 import '../api/response/agenda_response.dart';
+import 'account_repository.dart';
 
 class AgendaRepository {
   AgendaRepository._();
@@ -22,6 +23,10 @@ class AgendaRepository {
     _agendaList.clear();
   }
 
+  void setAgendaList(List<Agenda> list) {
+    _agendaList.assignAll(list);
+  }
+
   removeItem(Agenda item) {
     _agendaList.removeWhere((element) => element.id == item.id);
   }
@@ -64,13 +69,15 @@ class AgendaRepository {
 
   Future<AgendaListAllResponse> agendaListAll(String talkId) {
     return atmobApi
-        .agendaListAll(TalkRequest(talkId))
+        .agendaListAll(
+            TalkRequest(talkId, isExample: !accountRepository.isLogin.value))
         .then(HttpHandler.handle(true));
   }
 
   Future<AgendaListMineResponse> agendaListMine(String talkId) {
     return atmobApi
-        .agendaListMine(TalkRequest(talkId))
+        .agendaListMine(
+            TalkRequest(talkId, isExample: !accountRepository.isLogin.value))
         .then(HttpHandler.handle(true));
   }
 

+ 33 - 0
lib/data/repositories/config_repository.dart

@@ -0,0 +1,33 @@
+import 'package:electronic_assistant/base/app_base_request.dart';
+import 'package:electronic_assistant/data/api/atmob_api.dart';
+import 'package:electronic_assistant/utils/async_util.dart';
+import 'package:electronic_assistant/utils/cancel_future.dart';
+import 'package:electronic_assistant/utils/http_handler.dart';
+
+import '../api/response/example_info_response.dart';
+
+class ConfigRepository {
+  ConfigRepository._();
+
+  ExampleInfoResponse? _exampleInfo;
+
+  Future<ExampleInfoResponse> getExampleInfo() async {
+    if (_exampleInfo != null) {
+      return _exampleInfo!;
+    }
+    return await AsyncUtil.retryWhen(() => _requestExampleInfo(), 3,
+        const Duration(seconds: 1), (error) => true);
+  }
+
+  Future<ExampleInfoResponse> _requestExampleInfo() {
+    return atmobApi
+        .exampleInfo(AppBaseRequest())
+        .then(HttpHandler.handle(true))
+        .then((response) {
+      _exampleInfo = response;
+      return response;
+    });
+  }
+}
+
+final configRepository = ConfigRepository._();

+ 12 - 3
lib/data/repositories/talk_repository.dart

@@ -4,6 +4,7 @@ import 'package:electronic_assistant/data/api/atmob_api.dart';
 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:flutter/widgets.dart';
 import 'package:get/get.dart';
 
 import '../../utils/http_handler.dart';
@@ -16,6 +17,7 @@ import '../api/response/talk_info_response.dart';
 import '../api/response/talk_paginate_response.dart';
 import '../bean/talk_original.dart';
 import '../bean/talks.dart';
+import 'account_repository.dart';
 
 class TalkRepository {
   TalkRepository._();
@@ -33,6 +35,10 @@ class TalkRepository {
     }
   }
 
+  void setTalkList(List<TalkBean> list) {
+    _talkList.assignAll(list);
+  }
+
   void addNewTalkData(TalkBean talkInfo) {
     _talkList.insert(0, talkInfo);
   }
@@ -77,7 +83,8 @@ class TalkRepository {
 
   Future<List<TalkOriginal>> talkOriginal(String? talkId) {
     return atmobApi
-        .talkOriginal(TalkRequest(talkId))
+        .talkOriginal(
+            TalkRequest(talkId, isExample: !accountRepository.isLogin.value))
         .then(HttpHandler.handle(false))
         .then((data) {
       if (data.list != null) {
@@ -95,8 +102,10 @@ class TalkRepository {
         .then(HttpHandler.handle(false));
   }
 
-  Future<TalkInfoResponse> talkInfo(String id) {
-    return atmobApi.talkInfo(TalkRequest(id)).then(HttpHandler.handle(true));
+  Future<TalkInfoResponse> talkInfo(String id, {bool? isExample}) {
+    return atmobApi
+        .talkInfo(TalkRequest(id, isExample: isExample))
+        .then(HttpHandler.handle(true));
   }
 
   Future<void> talkRename(String? id, String? title) {

+ 26 - 15
lib/module/files/controller.dart

@@ -1,11 +1,14 @@
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:flutter/widgets.dart';
 import 'package:get/get_rx/src/rx_types/rx_types.dart';
 import 'package:pull_to_refresh/pull_to_refresh.dart';
 
+import '../../data/api/response/example_info_response.dart';
 import '../../data/bean/talks.dart';
+import '../../data/repositories/config_repository.dart';
 
 class FilesController extends BaseController {
   final refreshController = RefreshController(initialRefresh: false);
@@ -22,22 +25,30 @@ class FilesController extends BaseController {
 
   RxList<TalkBean> get talkList => talkRepository.talkList;
 
-  void requestTalkData({int page = 1}) {
-    talkRepository.requestTalkPagePaginate(page, pageSize).then((response) {
-      debugPrint("requestTalkData-response-$response");
-      if (talkRepository.talkList.length >= response.count) {
-        debugPrint("requestTalkData-没有更多数据了");
-        refreshController.loadNoData();
-      } else {
-        refreshController.loadComplete();
-      }
+  void requestTalkData({int page = 1}) async {
+    if (accountRepository.isLogin.value) {
+      talkRepository.requestTalkPagePaginate(page, pageSize).then((response) {
+        debugPrint("requestTalkData-response-$response");
+        if (talkRepository.talkList.length >= response.count) {
+          debugPrint("requestTalkData-没有更多数据了");
+          refreshController.loadNoData();
+        } else {
+          refreshController.loadComplete();
+        }
+        refreshController.refreshCompleted();
+      }).catchError((error) {
+        debugPrint("requestTalkData-catchError-$error");
+        refreshController.loadFailed();
+        refreshController.refreshFailed();
+        ErrorHandler.toastError(error);
+      });
+    } else {
+      ExampleInfoResponse exampleInfo = await configRepository.getExampleInfo();
+      talkRepository.setTalkList(
+          exampleInfo.talkInfoList != null ? exampleInfo.talkInfoList! : []);
       refreshController.refreshCompleted();
-    }).catchError((error) {
-      debugPrint("requestTalkData-catchError-$error");
-      refreshController.loadFailed();
-      refreshController.refreshFailed();
-      ErrorHandler.toastError(error);
-    });
+      refreshController.loadNoData();
+    }
   }
 
   void onRefreshData() {

+ 16 - 4
lib/module/home/controller.dart

@@ -1,6 +1,7 @@
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/talks.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/module/main/controller.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
@@ -8,6 +9,7 @@ import 'package:electronic_assistant/utils/event_bus.dart';
 import 'package:electronic_assistant/widget/pull_to_refresh.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
+import '../../data/api/response/example_info_response.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/repositories/account_repository.dart';
 import '../../utils/error_handler.dart';
@@ -52,11 +54,21 @@ class HomePageController extends BaseController {
 
   void requestHomeData() async {
     try {
-      await Future.wait([
-        talkRepository.requestHomeTalkData(),
-        agendaRepository.requestHomeAgendaData(),
-      ]);
+      if (accountRepository.isLogin.value) {
+        await Future.wait([
+          talkRepository.requestHomeTalkData(),
+          agendaRepository.requestHomeAgendaData(),
+        ]);
+      } else {
+        ExampleInfoResponse exampleInfo =
+            await configRepository.getExampleInfo();
+        talkRepository.setTalkList(
+            exampleInfo.talkInfoList != null ? exampleInfo.talkInfoList! : []);
+        agendaRepository.setAgendaList(
+            exampleInfo.agendaList != null ? exampleInfo.agendaList! : []);
+      }
     } catch (e) {
+      refreshController.refreshCompleted();
       // Handle errors if necessary
     } finally {
       refreshController.refreshCompleted();

+ 1 - 0
lib/module/talk/controller.dart

@@ -2,6 +2,7 @@ import 'dart:async';
 import 'dart:io';
 
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/task_repository.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/talk/summary/view.dart';

+ 4 - 1
lib/module/talk/summary/controller.dart

@@ -2,6 +2,7 @@ import 'dart:async';
 
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
+import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:get/get.dart';
 import '../../../data/bean/agenda_list_all_bean.dart';
@@ -34,7 +35,9 @@ class SummaryController extends BaseController {
     if (id == null) {
       return;
     }
-    talkRepository.talkInfo(id).then((data) {
+    talkRepository
+        .talkInfo(id, isExample: !accountRepository.isLogin.value)
+        .then((data) {
       summaryBean.value = data.talkInfo;
     });
     talkController.refreshAgendaAllData();

+ 7 - 7
lib/module/talk/summary/view.dart

@@ -28,9 +28,8 @@ class SummaryView extends BasePage<SummaryController> {
             EdgeInsets.only(left: 12.w, right: 12.w, top: 16.h, bottom: 20.h),
         child: Obx(() {
           return HtmlWidget(
-            md.markdownToHtml(controller.summaryBean.value?.summary.value ?? "",
-                inlineSyntaxes: md.ExtensionSet.gitHubWeb.inlineSyntaxes,
-                blockSyntaxes: md.ExtensionSet.gitHubWeb.blockSyntaxes),
+            md.markdownToHtml(
+                controller.summaryBean.value?.summary.value ?? ""),
             textStyle:
                 TextStyle(fontSize: 14.sp, color: ColorName.primaryTextColor),
           );
@@ -73,9 +72,9 @@ class SummaryView extends BasePage<SummaryController> {
   }
 
   Widget buildSummaryStatusView() {
-    if (controller.summaryBean.value?.status == TalkStatus.analysisFail) {
+    if (controller.summaryBean.value?.status.value == TalkStatus.analysisFail) {
       return getTalkFailView();
-    } else if (controller.summaryBean.value?.status ==
+    } else if (controller.summaryBean.value?.status.value ==
         TalkStatus.analysisSuccess) {
       return ListView(padding: EdgeInsets.only(bottom: 150.h), children: [
         // buildTemplateView(),
@@ -86,8 +85,9 @@ class SummaryView extends BasePage<SummaryController> {
         ),
         buildAllTaskView(),
       ]);
-    } else if (controller.summaryBean.value?.status == TalkStatus.analysing ||
-        controller.summaryBean.value?.status == TalkStatus.waitAnalysis) {
+    } else if (controller.summaryBean.value?.status.value ==
+            TalkStatus.analysing ||
+        controller.summaryBean.value?.status.value == TalkStatus.waitAnalysis) {
       return getTalkLoadingView();
     } else {
       return Container();

+ 1 - 0
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/repositories/account_repository.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';

+ 14 - 4
lib/utils/async_util.dart

@@ -40,9 +40,11 @@ class AsyncUtil {
   }
 
   static CancelableFuture<T> retryWhen<T>(FutureCallback<T> callback,
-      int maxRetry, Duration interval, Predicate<dynamic> predicate) {
+      int maxRetry, Duration interval, Predicate<dynamic> predicate,
+      [Duration? timeout]) {
     int retryCount = 0;
     Timer? timer;
+    Timer? timeoutTimer;
 
     void attempt(Completer<T> completer) {
       callback().then((value) {
@@ -62,15 +64,23 @@ class AsyncUtil {
     }
 
     return CancelableFuture<T>((completer) {
+      if (timeout != null) {
+        timeoutTimer = Timer(timeout, () {
+          if (!completer.isCompleted) {
+            completer.completeError(TimeoutException('Operation timed out'));
+          }
+        });
+      }
       attempt(completer);
     }, () {
       timer?.cancel();
+      timeoutTimer?.cancel();
     });
   }
 
-  static CancelableFuture<T> retry<T>(
-      FutureCallback<T> callback, int maxRetry, Duration interval) {
-    return retryWhen(callback, maxRetry, interval, (error) => true);
+  static CancelableFuture<T> retry<T>(FutureCallback<T> callback, int maxRetry,
+      Duration interval, [Duration? timeout]) {
+    return retryWhen(callback, maxRetry, interval, (error) => true, timeout);
   }
 
   static CancelableFuture<T> delay<T>(

+ 3 - 3
lib/utils/cancel_future.dart

@@ -4,14 +4,14 @@ import 'async_typeof.dart';
 class CancelableFuture<T> implements Future<T> {
   final Completer<T> _completer = Completer<T>();
 
-  Cancelable? cancelable;
+  final Cancelable? _cancelable;
 
-  CancelableFuture(FutureCompleter<T> completer, this.cancelable) {
+  CancelableFuture(FutureCompleter<T> completer, this._cancelable) {
     completer.call(_completer);
   }
 
   void cancel() {
-    cancelable?.call();
+    _cancelable?.call();
   }
 
   @override