Browse Source

[new]增加谈话总结显示

zk 1 năm trước cách đây
mục cha
commit
ede0196c18

BIN
assets/images/icon_talk_analyse_fail.webp


BIN
assets/images/icon_talk_collapse.webp


BIN
assets/images/icon_talk_expand.webp


BIN
assets/images/icon_task_arrow.webp


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

@@ -52,4 +52,9 @@
     <string name="talk_analyzing">小听正在分析谈话,请稍等~</string>
     <string name="talk_electric_low">电量不足无法分析谈话</string>
     <string name="talk_go_store">去充电</string>
+    <string name="talk_analyse_fail">分析失败</string>
+    <string name="talk_analyse_low_toast">小听电量太低,不足以分析这段谈话</string>
+    <string name="talk_analyse_summary_fail">谈话分析失败,点击去</string>
+    <string name="talk_todo_title">待办事项</string>
+    <string name="talk_todo_item">项</string>
 </resources>

+ 3 - 3
lib/data/api/atmob_api.dart

@@ -19,7 +19,8 @@ import 'package:electronic_assistant/data/api/response/chat_history_response.dar
 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';
-import 'package:electronic_assistant/data/api/response/talk_detail_response.dart';
+import 'package:electronic_assistant/data/api/response/talk_info_response.dart';
+import 'package:electronic_assistant/data/bean/talk_info.dart';
 import 'package:electronic_assistant/data/api/response/talk_original_response.dart';
 import 'package:electronic_assistant/data/consts/constants.dart';
 import 'package:retrofit/http.dart';
@@ -62,8 +63,7 @@ abstract class AtmobApi {
       @Body() ChatHistoryRequest request);
 
   @POST("/project/secretary/v1/talk/info")
-  Future<BaseResponse<TalkDetailResponse>> talkInfo(
-      @Body() TalkRequest request);
+  Future<BaseResponse<TalkInfoResponse>> talkInfo(@Body() TalkRequest request);
 
   @POST("/project/secretary/v1/agenda/list/all")
   Future<BaseResponse<AgendaListAllResponse>> agendaListAll(

+ 20 - 0
lib/data/api/response/talk_info_response.dart

@@ -0,0 +1,20 @@
+import 'package:electronic_assistant/data/bean/talk_info.dart';
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../bean/template_bean.dart';
+
+part 'talk_info_response.g.dart';
+
+@JsonSerializable()
+class TalkInfoResponse {
+  @JsonKey(name: 'talkInfo')
+  TalkInfo? talkInfo;
+
+  @JsonKey(name: 'templates')
+  List<TemplateBean>? templateList;
+
+  TalkInfoResponse({this.talkInfo, this.templateList});
+
+  factory TalkInfoResponse.fromJson(Map<String, dynamic> json) =>
+      _$TalkInfoResponseFromJson(json);
+}

+ 4 - 1
lib/data/bean/agenda_list_all_bean.dart

@@ -1,4 +1,5 @@
 import 'package:electronic_assistant/data/bean/agenda.dart';
+import 'package:get/get.dart';
 import 'package:json_annotation/json_annotation.dart';
 
 part 'agenda_list_all_bean.g.dart';
@@ -8,9 +9,11 @@ class AgendaListAllBean {
   @JsonKey(name: 'name')
   String? name;
 
-  @JsonKey(name: 'list')
+  @JsonKey(name: 'agendas')
   List<Agenda>? list;
 
+  final isExpanded = false.obs;
+
   AgendaListAllBean({this.name, this.list});
 
   factory AgendaListAllBean.fromJson(Map<String, dynamic> json) =>

+ 5 - 5
lib/data/api/response/talk_detail_response.dart

@@ -1,9 +1,9 @@
 import 'package:json_annotation/json_annotation.dart';
 
-part 'talk_detail_response.g.dart';
+part 'talk_info.g.dart';
 
 @JsonSerializable()
-class TalkDetailResponse {
+class TalkInfo {
   @JsonKey(name: 'id')
   String? id;
 
@@ -34,7 +34,7 @@ class TalkDetailResponse {
   @JsonKey(name: 'example')
   bool? example;
 
-  TalkDetailResponse(
+  TalkInfo(
       {this.id,
       this.taskId,
       this.ssid,
@@ -46,6 +46,6 @@ class TalkDetailResponse {
       this.createTime,
       this.example});
 
-  factory TalkDetailResponse.fromJson(Map<String, dynamic> json) =>
-      _$TalkDetailResponseFromJson(json);
+  factory TalkInfo.fromJson(Map<String, dynamic> json) =>
+      _$TalkInfoFromJson(json);
 }

+ 17 - 0
lib/data/bean/template_bean.dart

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

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

@@ -6,7 +6,8 @@ import '../api/request/talk_generate_request.dart';
 import '../api/request/talk_rename_request.dart';
 import '../api/request/talk_request.dart';
 import '../api/response/talk_check_electric_response.dart';
-import '../api/response/talk_detail_response.dart';
+import '../api/response/talk_info_response.dart';
+import '../bean/talk_info.dart';
 import '../api/response/talk_original_response.dart';
 import '../bean/talk_original.dart';
 
@@ -33,7 +34,7 @@ class TalkRepository {
         .then(HttpHandler.handle(false));
   }
 
-  Future<TalkDetailResponse> talkInfo(String id) {
+  Future<TalkInfoResponse> talkInfo(String id) {
     return atmobApi.talkInfo(TalkRequest(id)).then(HttpHandler.handle(true));
   }
 

+ 150 - 0
lib/module/talk/common_view.dart

@@ -0,0 +1,150 @@
+import 'package:electronic_assistant/data/bean/agenda_list_all_bean.dart';
+import 'package:electronic_assistant/data/bean/talk_info.dart';
+import 'package:electronic_assistant/dialog/rename_dialog.dart';
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+
+import '../../data/bean/agenda.dart';
+import '../../resource/assets.gen.dart';
+import '../../resource/colors.gen.dart';
+import '../../resource/string.gen.dart';
+
+Widget getTalkLoadingView() {
+  return SizedBox(
+    width: double.infinity,
+    child: Column(
+      children: [
+        SizedBox(height: 138.h),
+        SizedBox(
+            width: 100.w,
+            height: 100.w,
+            child: Assets.anim.talkAnalyse.image()),
+        SizedBox(height: 12.h),
+        Text(StringName.talkAnalyzing.tr,
+            style:
+                TextStyle(fontSize: 14.sp, color: ColorName.secondaryTextColor))
+      ],
+    ),
+  );
+}
+
+Widget getTalkFailView() {
+  return SizedBox(
+    width: double.infinity,
+    child: Column(
+      children: [
+        SizedBox(height: 111.h),
+        SizedBox(
+            width: 100.w,
+            height: 100.w,
+            child: Assets.images.iconTalkAnalyseFail.image()),
+        SizedBox(height: 4.h),
+        Text(StringName.talkAnalyseFail.tr,
+            style:
+                TextStyle(fontSize: 15.sp, color: ColorName.primaryTextColor)),
+        SizedBox(height: 2.h),
+      ],
+    ),
+  );
+}
+
+Widget getTodoItemView(AgendaListAllBean agenda) {
+  return Container(
+    decoration: BoxDecoration(
+      color: "#F6F5F8".toColor(),
+      borderRadius: BorderRadius.circular(6),
+    ),
+    child: Builder(builder: (context) {
+      return Theme(
+        data: Theme.of(context).copyWith(
+          splashFactory: NoSplash.splashFactory,
+        ),
+        child: ExpansionTile(
+          onExpansionChanged: (value) {
+            agenda.isExpanded.value = value;
+          },
+          shape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(4.0),
+            side: const BorderSide(color: Colors.transparent),
+          ),
+          collapsedShape: RoundedRectangleBorder(
+            borderRadius: BorderRadius.circular(4.0),
+            side: const BorderSide(color: Colors.transparent),
+          ),
+          minTileHeight: 46.h,
+          showTrailingIcon: false,
+          childrenPadding: EdgeInsets.zero,
+          tilePadding: EdgeInsets.zero,
+          title: Row(
+            children: [
+              SizedBox(width: 16.w),
+              Text(agenda.name.orEmpty,
+                  style: TextStyle(
+                      fontSize: 15.sp,
+                      color: ColorName.primaryTextColor,
+                      fontWeight: FontWeight.bold)),
+              const Spacer(),
+              Obx(() {
+                return Row(
+                  children: [
+                    Text(
+                      '${agenda.list?.length}${StringName.talkTodoItem.tr}',
+                      style: TextStyle(
+                          fontSize: 15.sp, color: ColorName.secondaryTextColor),
+                    ),
+                    SizedBox(width: 3.w),
+                    SizedBox(
+                        width: 16.w,
+                        height: 16.w,
+                        child: agenda.isExpanded.value
+                            ? Assets.images.iconTalkExpand.image()
+                            : Assets.images.iconTalkCollapse.image()),
+                  ],
+                );
+              }),
+              SizedBox(width: 12.w),
+            ],
+          ),
+          children: getTalkAgendaList(agenda.list),
+        ),
+      );
+    }),
+  );
+}
+
+List<Widget> getTalkAgendaList(List<Agenda>? list) {
+  return list?.map((agenda) {
+        return Padding(
+          padding:
+              EdgeInsets.only(left: 12.w, right: 12.w, top: 2.h, bottom: 10.h),
+          child: buildTalkNormalAgendaItem(agenda),
+        );
+      }).toList() ??
+      [];
+}
+
+Widget buildTalkNormalAgendaItem(Agenda agenda) {
+  return Row(
+    crossAxisAlignment: CrossAxisAlignment.start,
+    children: [
+      Container(
+        width: 8.w,
+        height: 8.w,
+        margin: EdgeInsets.only(top: 7.h),
+        decoration: BoxDecoration(
+          color: ColorName.colorPrimary.withOpacity(0.5),
+          shape: BoxShape.circle,
+        ),
+      ),
+      SizedBox(width: 4.w),
+      Expanded(
+        child: Text(agenda.content.orEmpty,
+            style:
+                TextStyle(fontSize: 14.sp, color: ColorName.primaryTextColor)),
+      )
+    ],
+  );
+}

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

@@ -7,7 +7,9 @@ import 'package:electronic_assistant/module/talk/todo/view.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:get/get.dart';
+import '../../data/bean/agenda_list_all_bean.dart';
 import '../../data/bean/talks.dart';
+import '../../data/repositories/agenda_repository.dart';
 import 'original/view.dart';
 
 class TalkController extends BaseController {
@@ -22,6 +24,8 @@ class TalkController extends BaseController {
 
   final audioProgressValue = 0.0.obs;
 
+  final agendaAllList = <AgendaListAllBean>[].obs;
+
   final List<String> tabBeans = [
     StringName.talkTabSummary.tr,
     StringName.talkTabMyTask.tr,
@@ -62,6 +66,7 @@ class TalkController extends BaseController {
         //提交分析
         _requestAnalyze();
       } else {
+        ToastUtil.showToast(StringName.talkAnalyseLowToast.tr);
         isShowElectricLow.value = true;
       }
     }).catchError((error) {
@@ -77,6 +82,18 @@ class TalkController extends BaseController {
     //TODO 跳转至商店页
   }
 
+  void refreshAgendaAllData() {
+    String? id = talkBean.value.id;
+    if (id == null) {
+      return;
+    }
+    agendaRepository.agendaListAll(id).then((agenda) {
+      if (agenda.list != null) {
+        agendaAllList.value = agenda.list!;
+      }
+    });
+  }
+
   @override
   void onClose() {
     super.onClose();

+ 1 - 1
lib/module/talk/original/view.dart

@@ -5,7 +5,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 
 import '../../../data/bean/talk_original.dart';
-import '../status_view.dart';
+import '../common_view.dart';
 import 'controller.dart';
 
 class OriginalView extends BasePage<OriginalController> {

+ 0 - 26
lib/module/talk/status_view.dart

@@ -1,26 +0,0 @@
-import 'package:flutter/cupertino.dart';
-import 'package:flutter_screenutil/flutter_screenutil.dart';
-import 'package:get/get.dart';
-
-import '../../resource/assets.gen.dart';
-import '../../resource/colors.gen.dart';
-import '../../resource/string.gen.dart';
-
-Widget getTalkLoadingView() {
-  return SizedBox(
-    width: double.infinity,
-    child: Column(
-      children: [
-        SizedBox(height: 138.h),
-        SizedBox(
-            width: 100.w,
-            height: 100.w,
-            child: Assets.anim.talkAnalyse.image()),
-        SizedBox(height: 12.h),
-        Text(StringName.talkAnalyzing.tr,
-            style:
-                TextStyle(fontSize: 14.sp, color: ColorName.secondaryTextColor))
-      ],
-    ),
-  );
-}

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

@@ -3,14 +3,17 @@ import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:get/get.dart';
 
-import '../../../data/api/response/talk_detail_response.dart';
-import '../../../data/repositories/agenda_repository.dart';
+import '../../../data/bean/agenda.dart';
+import '../../../data/bean/agenda_list_all_bean.dart';
+import '../../../data/bean/talk_info.dart';
 import '../controller.dart';
 
 class SummaryController extends BaseController {
   final TalkController talkController = Get.find();
 
-  final talkInfo = TalkDetailResponse().obs;
+  final talkInfo = TalkInfo().obs;
+
+  RxList<AgendaListAllBean> get agendaAllList => talkController.agendaAllList;
 
   @override
   void onReady() {
@@ -23,11 +26,11 @@ class SummaryController extends BaseController {
     if (id == null) {
       return;
     }
-    talkRepository.talkInfo(id).then((info) {
-      talkInfo.value = info;
-    }).catchError((e) {
-      ErrorHandler.toastError(e);
+    talkRepository.talkInfo(id).then((data) {
+      if (data.talkInfo != null) {
+        talkInfo.value = data.talkInfo!;
+      }
     });
-    agendaRepository.agendaListAll(id).then((agenda) {});
+    talkController.refreshAgendaAllData();
   }
 }

+ 64 - 2
lib/module/talk/summary/view.dart

@@ -1,9 +1,12 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
+import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
+import '../common_view.dart';
 import 'controller.dart';
 
 class SummaryView extends BasePage<SummaryController> {
@@ -11,8 +14,67 @@ class SummaryView extends BasePage<SummaryController> {
 
   @override
   Widget buildBody(BuildContext context) {
-    return Container(
-      child: Text('谈话总结'),
+    return ListView(children: [
+      // buildTemplateView(),
+      buildSummaryView(),
+      Container(
+        height: 6.h,
+        color: "#F6F6F6".toColor(),
+      ),
+      buildAllTaskView(),
+      buildPerchView()
+    ]);
+  }
+
+  Widget buildSummaryView() {
+    return Padding(
+        padding:
+            EdgeInsets.only(left: 12.w, right: 12.w, top: 16.h, bottom: 20.h),
+        child: Obx(() {
+          return Text(
+            controller.talkInfo.value.summary.orEmpty,
+            style:
+                TextStyle(fontSize: 14.sp, color: ColorName.primaryTextColor),
+          );
+        }));
+  }
+
+  Widget buildTemplateView() {
+    return Container();
+  }
+
+  buildAllTaskView() {
+    return Padding(
+      padding:
+          EdgeInsets.only(left: 12.w, right: 12.w, top: 20.h, bottom: 16.h),
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Text(StringName.homeTalkTodoTitle.tr,
+              style: TextStyle(
+                  fontWeight: FontWeight.bold,
+                  color: ColorName.primaryTextColor,
+                  fontSize: 15.sp)),
+          SizedBox(height: 12.h),
+          buildTodoView()
+        ],
+      ),
     );
   }
+
+  Widget buildTodoView() {
+    return Obx(() {
+      return Column(
+          children: controller.agendaAllList.map((agenda) {
+        return Padding(
+          padding: EdgeInsets.only(bottom: 8.h),
+          child: getTodoItemView(agenda),
+        );
+      }).toList());
+    });
+  }
+
+  Widget buildPerchView() {
+    return SizedBox(height: 150.h);
+  }
 }

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

@@ -44,6 +44,7 @@ class TalkPage extends BasePage<TalkController> {
               ),
             ),
             body: Column(
+              crossAxisAlignment: CrossAxisAlignment.start,
               children: [
                 Padding(
                   padding: EdgeInsets.symmetric(horizontal: 12.w),

+ 1 - 1
lib/module/task/view.dart

@@ -190,7 +190,7 @@ class TaskPage extends BasePage<TaskController> {
               SizedBox(
                   width: 16.w,
                   height: 16.h,
-                  child: Assets.images.iconTaskArrow.image())
+                  child: Assets.images.iconTalkCollapse.image())
             ],
           )
         ],

+ 2 - 0
lib/router/app_pages.dart

@@ -1,5 +1,6 @@
 import 'package:electronic_assistant/module/main/controller.dart';
 import 'package:electronic_assistant/module/talk/controller.dart';
+import 'package:electronic_assistant/module/talk/summary/controller.dart';
 import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/module/record/controller.dart';
 import 'package:electronic_assistant/module/task/search/task_search.dart';
@@ -58,6 +59,7 @@ class AppBinding extends Bindings {
     lazyPut(() => TalkController());
     lazyPut(() => RecordController());
     lazyPut(() => OriginalController());
+    lazyPut(() => SummaryController());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {