Преглед на файлове

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

Destiny преди 1 година
родител
ревизия
a73ab4d6b6

BIN
assets/images/icon_talk_summary_unanalyzed.webp


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

@@ -10,7 +10,7 @@
     <string name="home_talk_quick_audio">快速录音谈话内容</string>
     <string name="home_talk_example">示例</string>
     <string name="home_talk_todo_title">待办事项</string>
-    <string name="home_talk_thinking">小思路</string>
+    <string name="home_talk_thinking">小思路</string>
     <string name="home_talk_todo1">想找更多待办?查看</string>
     <string name="home_talk_todo2">全部待办</string>
     <string name="home_popup_tips_txt">当前有未完成录音,\n快来处理</string>
@@ -41,4 +41,10 @@
     <string name="talk_rename_delete_prompt">是否删除“%s”模板?该谈话包含您的待办事项,将一并删除。</string>
     <string name="talk_delete_success">删除成功</string>
     <string name="talk_delete_fail">删除失败</string>
+    <string name="talk_tab_summary">谈话总结</string>
+    <string name="talk_tab_my_task">我的待办</string>
+    <string name="talk_tab_original">谈话原文</string>
+    <string name="talk_un_analyzed">谈话未分析</string>
+    <string name="talk_un_analyzed_tips">谈话提交分析后,可查看相关内容</string>
+    <string name="talk_analyzed_btn_txt">小听分析</string>
 </resources>

+ 18 - 0
lib/base/base_controller.dart

@@ -2,6 +2,24 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 
 class BaseController extends GetxController {
+  Map? parameters;
+
+  @override
+  void onInit() {
+    super.onInit();
+    _initParameters();
+  }
+
+  void _initParameters() {
+    var getParameters = Get.parameters;
+    var getArguments = Get.arguments;
+    parameters ??= <dynamic, dynamic>{};
+    parameters?.addAll(getParameters);
+    if (getArguments != null && getArguments is Map) {
+      parameters?.addAll(getArguments);
+    }
+  }
+
   /// 隐藏键盘
   void hideKeyboard(BuildContext context) {
     FocusScopeNode currentFocus = FocusScope.of(context);

+ 2 - 0
lib/data/bean/talks.dart

@@ -37,6 +37,8 @@ class TalkBean {
   @JsonKey(name: 'example')
   bool? isExample;
 
+  bool? isAnalyseDone;
+
   TalkBean(
       {this.id,
       this.taskId,

+ 7 - 1
lib/data/repositories/home_repository.dart

@@ -8,7 +8,13 @@ class HomeRepository {
   HomeRepository._();
 
   Future<HomeInfoResponse> homeInfo() {
-    return atmobApi.homeInfo(AppBaseRequest()).then(HttpHandler.handle(true));
+    return atmobApi
+        .homeInfo(AppBaseRequest())
+        .then(HttpHandler.handle(true))
+        .then((data) {
+      data.talks.map((bean) => bean.isAnalyseDone = true);
+      return data;
+    });
   }
 }
 

+ 8 - 1
lib/main.dart

@@ -13,14 +13,21 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
 void main() async {
   WidgetsFlutterBinding.ensureInitialized();
 
+  //全局配置smart
+  smartConfig();
   //获取包信息
   appInfoUtil.init();
   //mmkv
-  await KVUtil.init();
+  KVUtil.init();
 
   runApp(const MyApp());
 }
 
+void smartConfig() {
+  SmartDialog.config.custom =
+      SmartConfigCustom(animationType: SmartAnimationType.fade);
+}
+
 class MyApp extends StatelessWidget {
   const MyApp({super.key});
 

+ 6 - 1
lib/module/home/view.dart

@@ -16,6 +16,7 @@ import 'package:get/get.dart';
 
 import '../../data/bean/agenda.dart';
 import '../../router/app_pages.dart';
+import '../talk/view.dart';
 import '../task/task_item_view.dart';
 import 'controller.dart';
 
@@ -317,13 +318,17 @@ class HomePage extends BasePage<HomePageController> {
         }, onDelete: () {
           showDeleteTalkDialog(item);
         });
+      }, onItemClick: () {
+        TalkPage.start(item);
       }),
     );
   }
 
   Widget _buildTalkView(TalkBean item,
-      {GestureLongPressStartCallback? onLongPressStart}) {
+      {VoidCallback? onItemClick,
+      GestureLongPressStartCallback? onLongPressStart}) {
     return GestureDetector(
+      onTap: onItemClick,
       onLongPressStart: onLongPressStart,
       child: Container(
           width: 258.w,

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

@@ -0,0 +1,28 @@
+import 'dart:ui';
+
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+
+import '../../data/bean/talks.dart';
+
+class TalkController extends BaseController {
+  late TalkBean? talkBean;
+
+  final List<String> tabBeans = [
+    StringName.talkTabSummary.tr,
+    StringName.talkTabMyTask.tr,
+    StringName.talkTabOriginal.tr
+  ];
+
+  @override
+  void onInit() {
+    super.onInit();
+    getArguments();
+  }
+
+  void getArguments() {
+    Get.arguments is TalkBean ? Get.arguments as TalkBean : null;
+  }
+}

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

@@ -0,0 +1,4 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+
+class OriginalController extends BaseController {}

+ 13 - 0
lib/module/talk/original/view.dart

@@ -0,0 +1,13 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:flutter/material.dart';
+
+import 'controller.dart';
+
+class OriginalView extends BasePage<OriginalController> {
+  const OriginalView({super.key});
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Container();
+  }
+}

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

@@ -0,0 +1,15 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+
+import '../controller.dart';
+
+class SummaryController extends BaseController {
+  TalkController talkController = Get.find();
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+}
+
+// enum Summar

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

@@ -0,0 +1,56 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/dialog/rename_dialog.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:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+
+import '../../../utils/common_style.dart';
+import 'controller.dart';
+
+class SummaryView extends BasePage<SummaryController> {
+  const SummaryView({super.key});
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Stack(
+      children: [
+        SizedBox(
+          width: double.infinity,
+          child: Column(
+            children: [
+              SizedBox(height: 119.h),
+              SizedBox(
+                  width: 100.w,
+                  height: 100.w,
+                  child: Assets.images.iconTalkSummaryUnanalyzed.image()),
+              SizedBox(height: 4.h),
+              Text(StringName.talkUnAnalyzed.tr,
+                  style: TextStyle(
+                      fontSize: 15.sp, color: ColorName.primaryTextColor)),
+              SizedBox(height: 2.h),
+              Text(StringName.talkUnAnalyzedTips.tr,
+                  style: TextStyle(
+                      fontSize: 12.sp, color: ColorName.secondaryTextColor)),
+              SizedBox(height: 24.h),
+              Container(
+                decoration: getPrimaryBtnDecoration(8),
+                width: 240.w,
+                height: 48.w,
+                child: Center(
+                  child: Text(
+                    StringName.talkAnalyzedBtnTxt.tr,
+                    style: TextStyle(fontSize: 16.sp, color: ColorName.white),
+                  ),
+                ),
+              )
+            ],
+          ),
+        ),
+      ],
+    );
+  }
+}

+ 4 - 0
lib/module/talk/todo/controller.dart

@@ -0,0 +1,4 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:get/get.dart';
+
+class TodoController extends BaseController {}

+ 13 - 0
lib/module/talk/todo/view.dart

@@ -0,0 +1,13 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:flutter/material.dart';
+
+import 'controller.dart';
+
+class TodoView extends BasePage<TodoController> {
+  const TodoView({super.key});
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Container();
+  }
+}

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

@@ -0,0 +1,136 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/module/talk/controller.dart';
+import 'package:electronic_assistant/module/talk/original/view.dart';
+import 'package:electronic_assistant/module/talk/summary/view.dart';
+import 'package:electronic_assistant/module/talk/todo/view.dart';
+import 'package:electronic_assistant/resource/colors.gen.dart';
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:electronic_assistant/utils/fixed_size_tab_indicator.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+
+import '../../data/bean/talks.dart';
+import '../../resource/assets.gen.dart';
+import '../../router/app_pages.dart';
+
+class TalkPage extends BasePage<TalkController> {
+  TalkPage({super.key});
+
+  static void start(TalkBean item) {
+    Get.toNamed(RoutePath.talkDetail, arguments: item);
+  }
+
+  final pages = [SummaryView(), TodoView(), OriginalView()];
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Stack(
+      children: [
+        buildTopGradient(),
+        Column(
+          crossAxisAlignment: CrossAxisAlignment.start,
+          children: [
+            AppBar(
+              systemOverlayStyle: SystemUiOverlayStyle.dark,
+              backgroundColor: Colors.transparent,
+              leading: IconButton(
+                icon: SizedBox(
+                    width: 24.w,
+                    height: 24.w,
+                    child: Assets.images.iconBack.image()),
+                // Custom icon
+                onPressed: () {
+                  Get.back();
+                },
+              ),
+            ),
+            Padding(
+              padding: EdgeInsets.symmetric(horizontal: 12.w),
+              child: Column(
+                crossAxisAlignment: CrossAxisAlignment.start,
+                children: [
+                  SizedBox(height: 8.h),
+                  Text('8月16日10时53分录音',
+                      style: TextStyle(
+                          fontSize: 22.sp,
+                          fontWeight: FontWeight.bold,
+                          color: ColorName.primaryTextColor)),
+                  SizedBox(height: 4.h),
+                  Text('2024-07-25  16:31',
+                      style: TextStyle(
+                          fontSize: 12.sp,
+                          color: ColorName.secondaryTextColor)),
+                  SizedBox(height: 14.h),
+                ],
+              ),
+            ),
+            Expanded(
+                child: DefaultTabController(
+                    length: controller.tabBeans.length,
+                    child: Column(
+                      children: [
+                        Container(
+                          decoration: const BoxDecoration(
+                              color: Colors.white,
+                              borderRadius: BorderRadius.only(
+                                topLeft: Radius.circular(12),
+                                topRight: Radius.circular(12),
+                              )),
+                          child: TabBar(
+                              labelStyle: TextStyle(
+                                  fontSize: 16.sp, fontWeight: FontWeight.bold),
+                              unselectedLabelStyle: TextStyle(fontSize: 14.sp),
+                              labelColor: ColorName.primaryTextColor,
+                              unselectedLabelColor:
+                                  ColorName.secondaryTextColor,
+                              labelPadding: EdgeInsets.only(top: 4.h),
+                              dividerHeight: 0,
+                              indicator: FixedSizeTabIndicator(
+                                  width: 16.w,
+                                  height: 3.w,
+                                  radius: 3,
+                                  color: ColorName.colorPrimary),
+                              tabs: controller.tabBeans
+                                  .map((txt) => Tab(text: txt))
+                                  .toList()),
+                        ),
+                        Divider(
+                            height: 1,
+                            color: const Color(0xFFf6f6f6),
+                            indent: 12.w,
+                            endIndent: 12.w),
+                        Expanded(
+                            child: TabBarView(
+                          children: pages,
+                        ))
+                      ],
+                    )))
+          ],
+        )
+      ],
+    );
+  }
+
+  @override
+  bool immersive() {
+    return true;
+  }
+
+  Container buildTopGradient() {
+    return Container(
+        width: 1.sw,
+        height: 180.h,
+        decoration: BoxDecoration(
+          gradient: LinearGradient(
+            colors: ['#E1E9FF'.toColor(), '#F9FAFE'.toColor()],
+            begin: Alignment.topCenter,
+            end: Alignment.bottomCenter,
+            stops: const [0.3, 1.0],
+          ),
+        ));
+  }
+}

+ 2 - 7
lib/module/task/task_item_view.dart

@@ -6,6 +6,7 @@ import 'package:get/get.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/colors.gen.dart';
 import '../../resource/string.gen.dart';
+import '../../utils/common_style.dart';
 
 Widget taskItemView(Agenda item,
     {VoidCallback? onCheckClick, VoidCallback? onThinkingClick}) {
@@ -57,13 +58,7 @@ Widget taskItemView(Agenda item,
           ),
         ),
         Container(
-          decoration: BoxDecoration(
-            gradient: LinearGradient(
-              colors: ['#9075FF'.toColor(), '#4366FF'.toColor()],
-              stops: const [0.3, 1.0],
-            ),
-            borderRadius: BorderRadius.circular(6),
-          ),
+          decoration: getPrimaryBtnDecoration(6),
           padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 4).w,
           child: Text(
             StringName.homeTalkThinking.tr,

+ 6 - 0
lib/router/app_pages.dart

@@ -1,4 +1,6 @@
 import 'package:electronic_assistant/module/main/controller.dart';
+import 'package:electronic_assistant/module/talk/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';
 import 'package:electronic_assistant/module/task/view.dart';
@@ -40,6 +42,8 @@ abstract class RoutePath {
   static const chat = '/chat';
 
   static const record = '/record';
+
+  static const talkDetail = '/talkDetail';
 }
 
 class AppBinding extends Bindings {
@@ -50,6 +54,7 @@ class AppBinding extends Bindings {
     lazyPut(() => LoginController());
     lazyPut(() => TaskController());
     lazyPut(() => ChatController());
+    lazyPut(() => TalkController());
     lazyPut(() => RecordController());
   }
 
@@ -68,4 +73,5 @@ final generalPages = [
   GetPage(name: RoutePath.task, page: () => const TaskPage()),
   GetPage(name: RoutePath.taskSearch, page: () => const TaskSearchPage()),
   GetPage(name: RoutePath.record, page: () => const RecordPage()),
+  GetPage(name: RoutePath.talkDetail, page: () => TalkPage()),
 ];

+ 14 - 0
lib/utils/common_style.dart

@@ -0,0 +1,14 @@
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:flutter/cupertino.dart';
+
+Decoration getPrimaryBtnDecoration(double radius) {
+  return BoxDecoration(
+    gradient: LinearGradient(
+      colors: ['#9075FF'.toColor(), '#4366FF'.toColor()],
+      stops: const [0.3, 1.0],
+      begin: Alignment.topLeft,
+      end: Alignment.bottomRight,
+    ),
+    borderRadius: BorderRadius.circular(radius),
+  );
+}

+ 44 - 0
lib/utils/fixed_size_tab_indicator.dart

@@ -0,0 +1,44 @@
+import 'package:flutter/cupertino.dart';
+
+class FixedSizeTabIndicator extends Decoration {
+  final double width; // Fixed width
+  final double height; // Indicator height
+  final double radius; // Corner radius
+  final Color color; // Indicator color
+
+  const FixedSizeTabIndicator({
+    required this.width,
+    required this.height,
+    required this.radius,
+    required this.color,
+  });
+
+  @override
+  BoxPainter createBoxPainter([VoidCallback? onChanged]) {
+    return _CustomPainter(this, onChanged);
+  }
+}
+
+class _CustomPainter extends BoxPainter {
+  final FixedSizeTabIndicator decoration;
+
+  _CustomPainter(this.decoration, VoidCallback? onChanged) : super(onChanged);
+
+  @override
+  void paint(Canvas canvas, Offset offset, ImageConfiguration configuration) {
+    final Paint paint = Paint();
+    paint.color = decoration.color;
+    paint.style = PaintingStyle.fill;
+
+    final double xPos =
+        offset.dx + (configuration.size!.width / 2) - (decoration.width / 2);
+    final double yPos = configuration.size!.height - decoration.height;
+
+    final Rect rect =
+        Rect.fromLTWH(xPos, yPos, decoration.width, decoration.height);
+    final RRect rRect = RRect.fromRectAndRadius(
+        rect, Radius.circular(decoration.radius)); // Rounded corners
+
+    canvas.drawRRect(rRect, paint);
+  }
+}