From c53b0cc7c541f3e48af5dbb9b0b29751ae2c69b0 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Mon, 26 May 2025 18:39:58 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E6=A8=A1=E7=89=88=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/db/database_helper.dart | 220 ++++++++++++++++++ lib/data/services/db/sqflite_api.dart | 33 +++ .../meeting/views/generate_bottom_sheet.dart | 95 ++++---- lib/modules/meeting/views/template_view.dart | 158 +++---------- 4 files changed, 331 insertions(+), 175 deletions(-) diff --git a/lib/data/services/db/database_helper.dart b/lib/data/services/db/database_helper.dart index 5257c524c..9c9794381 100644 --- a/lib/data/services/db/database_helper.dart +++ b/lib/data/services/db/database_helper.dart @@ -62,6 +62,226 @@ class DatabaseHelper { speaker TEXT ) '''); + // 商务会议助手模版分类 + batch.execute(''' + CREATE TABLE IF NOT EXISTS meetingcategorytemplate ( + id INTEGER PRIMARY KEY, + name TEXT + ) + '''); + // 商务会议助手模版 + batch.execute(''' + CREATE TABLE IF NOT EXISTS meetingtemplate ( + id INTEGER PRIMARY KEY, + categoryid INTEGER, + name TEXT, + icon TEXT, + tag TEXT, + desc TEXT, + prompt TEXT + ) + '''); + // 商务会议助手插入默认模版 + batch.insert('meetingcategorytemplate', { + 'id': 1, + 'name': '通用', + }); + batch.insert('meetingcategorytemplate', { + 'id': 2, + 'name': '会议', + }); + batch.insert('meetingcategorytemplate', { + 'id': 3, + 'name': '演讲', + }); + batch.insert('meetingcategorytemplate', { + 'id': 4, + 'name': '自定义', + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '会议纪要', + 'icon': 'auto_stories', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': 'Autopilot', + 'icon': 'auto_graph', + 'tag': '自适应结构, 全场景适配', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '推理Autopilot', + 'icon': 'add_to_drive_outlined', + 'tag': '推理模型, 自动结构化', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '通话', + 'icon': 'perm_phone_msg', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '项目计划', + 'icon': 'assignment', + 'tag': '目标, 里程碑', + 'desc': '用于规划项目阶段和关键节点,跟踪项目执行进度', + 'prompt': '请按时间顺序整理项目阶段' + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '头脑风暴', + 'icon': 'lightbulb', + 'tag': '创意, 发散思维', + 'desc': '记录创意发散过程,结构化整理核心创意点', + 'prompt': '请将讨论内容按创新性排序' + }); + batch.insert('meetingtemplate', { + 'categoryid': 1, + 'name': '日常记录', + 'icon': 'note', + 'tag': '日志, 每日总结', + 'desc': '自动化生成结构化日报,自动提取工作亮点与待办事项', + 'prompt': '请按优先级排列今日工作事项' + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '咨询', + 'icon': 'auto_stories', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '讨论', + 'icon': 'auto_graph', + 'tag': '自适应结构, 全场景适配', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '汇报', + 'icon': 'add_to_drive_outlined', + 'tag': '推理模型, 自动结构化', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '任务分配', + 'icon': 'perm_phone_msg', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '评审会议', + 'icon': 'rate_review', + 'tag': '质量评估, 改进建议', + 'desc': '用于评估项目阶段成果,生成改进建议和风险评估', + 'prompt': '请按优先级列出需要改进的环节' + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '周例会', + 'icon': 'event_repeat', + 'tag': '进度汇报, 计划制定', + 'desc': '自动生成每周工作进展摘要,识别延期风险', + 'prompt': '请按部门分类整理工作进度' + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '客户洽谈', + 'icon': 'handshake', + 'tag': '需求沟通, 合同条款', + 'desc': '记录客户核心诉求和合作关键条款', + 'prompt': '请按优先级排列客户需求' + }); + batch.insert('meetingtemplate', { + 'categoryid': 2, + 'name': '项目复盘', + 'icon': 'restart_alt', + 'tag': '经验总结, 问题分析', + 'desc': '自动生成项目得失分析报告', + 'prompt': '请按影响程度排序待改进项' + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '课堂笔记', + 'icon': 'auto_stories', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '讲座', + 'icon': 'auto_graph', + 'tag': '自适应结构, 全场景适配', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '培训', + 'icon': 'add_to_drive_outlined', + 'tag': '推理模型, 自动结构化', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': 'Sermon', + 'icon': 'perm_phone_msg', + 'tag': '主题, 代办事项', + 'desc': '旨在概述和回顾项目内容,重点捕捉所提话题的精髓和关键点', + 'prompt': '提示词', + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '产品发布会', + 'icon': 'rocket_launch', + 'tag': '功能展示, 市场定位', + 'desc': '结构化整理产品核心卖点和市场差异化特征', + 'prompt': '请按用户场景分类产品功能' + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '技术分享', + 'icon': 'code', + 'tag': '知识传递, 最佳实践', + 'desc': '自动提取技术要点和可复用代码片段', + 'prompt': '请按技术难度分级整理内容' + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '投资者路演', + 'icon': 'bar_chart', + 'tag': '财务数据, 商业模式', + 'desc': '自动提取核心财务指标和增长预期', + 'prompt': '请按投资关注度整理内容' + }); + batch.insert('meetingtemplate', { + 'categoryid': 3, + 'name': '学术报告', + 'icon': 'school', + 'tag': '研究成果, 数据分析', + 'desc': '结构化整理实验数据和学术论点', + 'prompt': '请按研究重要性排序结论' + }); await batch.commit(); } } diff --git a/lib/data/services/db/sqflite_api.dart b/lib/data/services/db/sqflite_api.dart index bf2d5a8cf..faf8c639b 100644 --- a/lib/data/services/db/sqflite_api.dart +++ b/lib/data/services/db/sqflite_api.dart @@ -165,4 +165,37 @@ class SqfliteApi { .delete('meetingspeaker', where: 'meetingid = ?', whereArgs: [id]); }); } + + // 获取商务会议助手所有分类模版列表 + static Future getMeetingCategoryTemplateList() async { + final db = await DatabaseHelper().database; + List categorytemplateList = await db.query('meetingcategorytemplate'); + final dataList = + categorytemplateList.map((item) => Map.from(item)).toList(); + for (var element in dataList) { + final List templateList = await db.query( + 'meetingtemplate', + limit: 4, + where: 'categoryid = ?', + whereArgs: [element['id']], + ); + element['template'] = templateList + .map((item) => { + ...Map.from(item), + 'tag': item['tag'].isNotEmpty ? item['tag'].split(',') : [], + }) + .toList(); + } + return dataList; + } + + // 获取商务会议助手模版列表 + static Future getMeetingTemplateList(int id) async { + final db = await DatabaseHelper().database; + return await db.query( + 'meetingtemplate', + where: 'categoryid = ?', + whereArgs: [id], + ); + } } diff --git a/lib/modules/meeting/views/generate_bottom_sheet.dart b/lib/modules/meeting/views/generate_bottom_sheet.dart index 413e81bc2..fbb4907a7 100644 --- a/lib/modules/meeting/views/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/generate_bottom_sheet.dart @@ -1,6 +1,8 @@ +import 'package:deep_voice/data/services/db/sqflite_api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import '../controllers/meeting_details_controller.dart'; import 'record_language_bottom_sheet.dart'; @@ -17,54 +19,46 @@ class _GenerateBottomSheetState extends State { final _controller = Get.find(); final ScrollController _scrollController = ScrollController(); + final GetStorage _storage = GetStorage(); + bool _isSpeaker = true; String _languageText = '中文普通话(简体)'; String _language = 'zh-CN'; - final List _originalTemplate = [ - { - 'id': 1, - 'name': '会议纪要', - 'icon': Icons.auto_stories, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - { - 'id': 2, - 'name': 'Autopilot', - 'icon': Icons.auto_graph, - 'tag': ['自适应结构', '全场景适配'], - 'desc': '', - }, - { - 'id': 3, - 'name': '推理Autopilot', - 'icon': Icons.add_to_drive_outlined, - 'tag': ['推理模型', '自动结构化'], - 'desc': '', - }, - { - 'id': 4, - 'name': '通话', - 'icon': Icons.perm_phone_msg, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - ]; + final Map _icons = { + 'auto_stories': Icons.auto_stories, + 'auto_graph': Icons.auto_graph, + 'add_to_drive_outlined': Icons.add_to_drive_outlined, + 'perm_phone_msg': Icons.perm_phone_msg, + 'auto_fix_high': Icons.auto_fix_high, + }; + + List _categoryTemplateList = []; + List _originalTemplate = []; - int _templateId = 0; - int _lastTemplateId = 0; + Map _templateData = {}; + Map _lastTemplateData = {}; List _templateList = []; @override void initState() { super.initState(); - if (_lastTemplateId != 0) { - _templateId = _lastTemplateId; + _getTemplate(); + } + + void _getTemplate() async { + _categoryTemplateList = await SqfliteApi.getMeetingCategoryTemplateList(); + _lastTemplateData = _storage.read("meeting_last_template_Data") ?? {}; + _originalTemplate = _storage.read("meeting_template_list") ?? + _categoryTemplateList[0]['template']; + if (_lastTemplateData.isNotEmpty) { + _templateData = _lastTemplateData; } else { - _templateId = _originalTemplate[0]['id']; + _templateData = _originalTemplate[0]; } - _templateList = List.from(_originalTemplate); + setState(() { + _templateList = List.from(_originalTemplate); + }); } @override @@ -152,8 +146,9 @@ class _GenerateBottomSheetState extends State { GestureDetector( onTap: () async { var result = await Get.to(TemplateView( - _templateId, - _lastTemplateId, + _templateData, + _lastTemplateData['id'] ?? 0, + _categoryTemplateList, )); if (result != null) { _scrollController.jumpTo(0); @@ -167,7 +162,7 @@ class _GenerateBottomSheetState extends State { list.insert(0, result); } setState(() { - _templateId = result['id']; + _templateData = result; _templateList = list; }); } @@ -262,8 +257,18 @@ class _GenerateBottomSheetState extends State { padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), child: GestureDetector( onTap: () { + if (_templateData['id'] != _templateList[0]['id']) { + int index = _templateList + .indexWhere((v) => v['id'] == _templateData['id']); + if (index != -1) { + Map itemToMove = _templateList.removeAt(index); + _templateList.insert(0, itemToMove); + } + } + _storage.write("meeting_last_template_Data", _templateData); + _storage.write("meeting_template_list", _templateList); Get.back(); - _controller.summaryCreate(); + // _controller.summaryCreate(); }, child: Container( height: 48.w, @@ -297,7 +302,7 @@ class _GenerateBottomSheetState extends State { child: GestureDetector( onTap: () { setState(() { - _templateId = data['id']; + _templateData = data; }); }, child: Stack( @@ -306,7 +311,7 @@ class _GenerateBottomSheetState extends State { padding: EdgeInsets.all(5.w), decoration: BoxDecoration( color: Colors.white, - gradient: _templateId == data['id'] + gradient: _templateData['id'] == data['id'] ? const LinearGradient( colors: [Colors.blue, Colors.pinkAccent], begin: Alignment.centerLeft, @@ -327,7 +332,7 @@ class _GenerateBottomSheetState extends State { Padding( padding: EdgeInsets.only(top: 5.w), child: Icon( - data['icon'], + _icons[data['icon']], color: Colors.orange, size: 30.w, ), @@ -379,7 +384,7 @@ class _GenerateBottomSheetState extends State { ), ), ), - if (_lastTemplateId == data['id']) + if (_lastTemplateData['id'] == data['id']) Positioned( top: 0, left: 0, @@ -402,7 +407,7 @@ class _GenerateBottomSheetState extends State { ), ), ), - if (_templateId == data['id']) + if (_templateData['id'] == data['id']) Positioned( right: -18.w, bottom: -18.w, diff --git a/lib/modules/meeting/views/template_view.dart b/lib/modules/meeting/views/template_view.dart index 28e381f5a..291a462cb 100644 --- a/lib/modules/meeting/views/template_view.dart +++ b/lib/modules/meeting/views/template_view.dart @@ -3,148 +3,46 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; class TemplateView extends StatefulWidget { - final int templateId; + final Map templateData; final int lastTemplateId; + final List categoryList; - const TemplateView(this.templateId, this.lastTemplateId, {super.key}); + const TemplateView(this.templateData, this.lastTemplateId, this.categoryList, + {super.key}); @override State createState() => _TemplateViewState(); } class _TemplateViewState extends State { - final List _categoryList = [ - { - 'id': 1, - 'name': '通用', - 'template': [ - { - 'id': 1, - 'name': '会议纪要', - 'icon': Icons.auto_stories, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - { - 'id': 2, - 'name': 'Autopilot', - 'icon': Icons.auto_graph, - 'tag': ['自适应结构', '全场景适配'], - 'desc': '', - }, - { - 'id': 3, - 'name': '推理Autopilot', - 'icon': Icons.add_to_drive_outlined, - 'tag': ['推理模型', '自动结构化'], - 'desc': '', - }, - { - 'id': 4, - 'name': '通话', - 'icon': Icons.perm_phone_msg, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - ], - }, - { - 'id': 2, - 'name': '会议', - 'template': [ - { - 'id': 5, - 'name': '咨询', - 'icon': Icons.auto_stories, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - { - 'id': 6, - 'name': '讨论', - 'icon': Icons.auto_graph, - 'tag': ['自适应结构', '全场景适配'], - 'desc': '', - }, - { - 'id': 7, - 'name': '汇报', - 'icon': Icons.add_to_drive_outlined, - 'tag': ['推理模型', '自动结构化'], - 'desc': '', - }, - { - 'id': 8, - 'name': '任务分配', - 'icon': Icons.perm_phone_msg, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - ], - }, - { - 'id': 3, - 'name': '演讲', - 'template': [ - { - 'id': 9, - 'name': '课堂笔记', - 'icon': Icons.auto_stories, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - { - 'id': 10, - 'name': '讲座', - 'icon': Icons.auto_graph, - 'tag': ['自适应结构', '全场景适配'], - 'desc': '', - }, - { - 'id': 11, - 'name': '培训', - 'icon': Icons.add_to_drive_outlined, - 'tag': ['推理模型', '自动结构化'], - 'desc': '', - }, - { - 'id': 12, - 'name': 'Sermon', - 'icon': Icons.perm_phone_msg, - 'tag': ['主题', '代办事项'], - 'desc': '', - }, - ], - }, - { - 'id': 4, - 'name': '自定义', - 'template': [ - { - 'id': 13, - 'name': '自定义', - 'icon': Icons.auto_fix_high, - 'tag': [], - 'desc': '自定义模版', - }, - ], - }, - ]; + final Map _icons = { + 'auto_stories': Icons.auto_stories, + 'auto_graph': Icons.auto_graph, + 'add_to_drive_outlined': Icons.add_to_drive_outlined, + 'perm_phone_msg': Icons.perm_phone_msg, + 'auto_fix_high': Icons.auto_fix_high, + }; Map _templateData = {}; @override void initState() { super.initState(); - outerLoop: - for (var element in _categoryList) { - List template = element['template']; - for (var item in template) { - if (item['id'] == widget.templateId) { - _templateData = item; - break outerLoop; - } + Map templateMap = widget.categoryList.firstWhere( + (item) => item['id'] == widget.templateData['categoryid'], + orElse: () => {}, + ); + if (templateMap.isNotEmpty) { + List template = templateMap['template']; + int index = + template.indexWhere((v) => v['id'] == widget.templateData['id']); + if (index != -1) { + Map itemToMove = template.removeAt(index); + template.insert(0, itemToMove); + } else { + template.insert(0, widget.templateData); } + _templateData = widget.templateData; } } @@ -190,9 +88,9 @@ class _TemplateViewState extends State { children: [ Expanded( child: ListView.builder( - itemCount: _categoryList.length, + itemCount: widget.categoryList.length, itemBuilder: (BuildContext context, int index) { - Map data = _categoryList[index]; + Map data = widget.categoryList[index]; return _item(data); }, ), @@ -304,7 +202,7 @@ class _TemplateViewState extends State { Padding( padding: EdgeInsets.only(top: 5.w), child: Icon( - template['icon'], + _icons[template['icon']], color: Colors.orange, size: 30.w, ), From 77c1c26871edc6c08cde75cc1b696e4fbae74940 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Tue, 27 May 2025 15:55:36 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E6=A8=A1=E7=89=88=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/views/generate_bottom_sheet.dart | 33 +- .../meeting/views/meeting_details_view.dart | 4 +- lib/modules/meeting/views/meeting_view.dart | 199 ++++++------ lib/modules/meeting/views/speech_tab.dart | 22 +- lib/modules/meeting/views/summary_tab.dart | 14 +- .../meeting/views/template_all_view.dart | 296 ++++++++++++++++++ lib/modules/meeting/views/template_view.dart | 104 ++++-- pubspec.yaml | 4 +- 8 files changed, 499 insertions(+), 177 deletions(-) create mode 100644 lib/modules/meeting/views/template_all_view.dart diff --git a/lib/modules/meeting/views/generate_bottom_sheet.dart b/lib/modules/meeting/views/generate_bottom_sheet.dart index fbb4907a7..3343357b2 100644 --- a/lib/modules/meeting/views/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/generate_bottom_sheet.dart @@ -30,6 +30,17 @@ class _GenerateBottomSheetState extends State { 'auto_graph': Icons.auto_graph, 'add_to_drive_outlined': Icons.add_to_drive_outlined, 'perm_phone_msg': Icons.perm_phone_msg, + 'assignment': Icons.assignment, + 'lightbulb': Icons.lightbulb, + 'note': Icons.note, + 'rate_review': Icons.rate_review, + 'event_repeat': Icons.event_repeat, + 'handshake': Icons.handshake, + 'restart_alt': Icons.restart_alt, + 'rocket_launch': Icons.rocket_launch, + 'code': Icons.code, + 'bar_chart': Icons.bar_chart, + 'school': Icons.school, 'auto_fix_high': Icons.auto_fix_high, }; @@ -145,11 +156,14 @@ class _GenerateBottomSheetState extends State { ), GestureDetector( onTap: () async { - var result = await Get.to(TemplateView( - _templateData, - _lastTemplateData['id'] ?? 0, - _categoryTemplateList, - )); + var result = await Get.to( + () => TemplateView( + _templateData, + _lastTemplateData['id'] ?? 0, + _categoryTemplateList, + ), + preventDuplicates: false, + ); if (result != null) { _scrollController.jumpTo(0); List list = List.from(_originalTemplate); @@ -228,8 +242,8 @@ class _GenerateBottomSheetState extends State { value: _languageText, isBorder: false, onTap: () { - showModalBottomSheet( - context: context, + Get.bottomSheet( + RecordLanguageBottomSheet(_language), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -237,9 +251,6 @@ class _GenerateBottomSheetState extends State { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return RecordLanguageBottomSheet(_language); - }, ).then((value) { if (value != null) { setState(() { @@ -268,7 +279,7 @@ class _GenerateBottomSheetState extends State { _storage.write("meeting_last_template_Data", _templateData); _storage.write("meeting_template_list", _templateList); Get.back(); - // _controller.summaryCreate(); + _controller.summaryCreate(); }, child: Container( height: 48.w, diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index fa8bb5621..11a1049ef 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -22,7 +22,7 @@ class MeetingDetailsView extends GetView { () => Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: _buildAppBar(isDarkMode), - body: _buildBody(context, isDarkMode), + body: _buildBody(isDarkMode), ), ); } @@ -166,7 +166,7 @@ class MeetingDetailsView extends GetView { } // 构建主体内容 - Widget _buildBody(BuildContext context, bool isDarkMode) { + Widget _buildBody(bool isDarkMode) { double initialPosition = 0; return Column( children: [ diff --git a/lib/modules/meeting/views/meeting_view.dart b/lib/modules/meeting/views/meeting_view.dart index 4aa03a9a5..8fbf34fbb 100644 --- a/lib/modules/meeting/views/meeting_view.dart +++ b/lib/modules/meeting/views/meeting_view.dart @@ -245,125 +245,120 @@ class MeetingView extends GetView { bool isDarkMode, int id, ) { - showModalBottomSheet( - context: context, - isScrollControlled: true, - clipBehavior: Clip.hardEdge, - builder: (BuildContext context) { - return Padding( - padding: MediaQuery.of(context).viewInsets, - child: Container( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), - color: isDarkMode ? AppColors.darkBackground : Colors.grey[50], - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - 'editMeetingTitle'.tr, // 编辑会议标题 + Get.bottomSheet( + Padding( + padding: MediaQuery.of(context).viewInsets, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + color: isDarkMode ? AppColors.darkBackground : Colors.grey[50], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'editMeetingTitle'.tr, // 编辑会议标题 + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + fontSize: 16.sp, + ), + ), + Container( + height: 48.w, + margin: EdgeInsets.only(top: 10.w, bottom: 20.w), + alignment: Alignment.center, + decoration: BoxDecoration( + color: isDarkMode + ? Colors.white.withOpacity(0.05) + : Colors.white, + borderRadius: BorderRadius.circular(12.w), + boxShadow: [ + BoxShadow( + color: isDarkMode + ? Colors.black.withOpacity(0.2) + : Colors.black.withOpacity(0.05), + blurRadius: 10, + offset: const Offset(0, 2), + ), + ], + ), + child: TextField( + controller: controller.titleController, style: TextStyle( color: isDarkMode ? Colors.white : Colors.black87, fontSize: 16.sp, ), - ), - Container( - height: 48.w, - margin: EdgeInsets.only(top: 10.w, bottom: 20.w), - alignment: Alignment.center, - decoration: BoxDecoration( - color: isDarkMode - ? Colors.white.withOpacity(0.05) - : Colors.white, - borderRadius: BorderRadius.circular(12.w), - boxShadow: [ - BoxShadow( - color: isDarkMode - ? Colors.black.withOpacity(0.2) - : Colors.black.withOpacity(0.05), - blurRadius: 10, - offset: const Offset(0, 2), - ), - ], - ), - child: TextField( - controller: controller.titleController, - style: TextStyle( - color: isDarkMode ? Colors.white : Colors.black87, + decoration: InputDecoration( + hintText: 'maxCharacters'.tr, + hintStyle: TextStyle( + color: isDarkMode ? Colors.white70 : Colors.black54, fontSize: 16.sp, ), - decoration: InputDecoration( - hintText: 'maxCharacters'.tr, - hintStyle: TextStyle( - color: isDarkMode ? Colors.white70 : Colors.black54, - fontSize: 16.sp, - ), - fillColor: Colors.transparent, - border: InputBorder.none, - contentPadding: EdgeInsets.symmetric(horizontal: 10.w), - ), + fillColor: Colors.transparent, + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(horizontal: 10.w), ), ), - Padding( - padding: EdgeInsets.only(top: 30.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - GestureDetector( - onTap: () { - Get.back(); - }, - child: Container( - width: 120.w, - height: 40.w, - alignment: Alignment.center, - decoration: BoxDecoration( - border: Border.all( - width: 2.w, - color: - isDarkMode ? AppColors.primary : Colors.blue, - ), - borderRadius: BorderRadius.circular(12.w), - ), - child: Text( - 'cancel'.tr, // 取消 - style: TextStyle( - fontSize: 14.sp, - color: - isDarkMode ? AppColors.primary : Colors.blue, - ), + ), + Padding( + padding: EdgeInsets.only(top: 30.w), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + width: 120.w, + height: 40.w, + alignment: Alignment.center, + decoration: BoxDecoration( + border: Border.all( + width: 2.w, + color: isDarkMode ? AppColors.primary : Colors.blue, ), + borderRadius: BorderRadius.circular(12.w), ), - ), - GestureDetector( - onTap: () { - String title = controller.titleController.text; - controller.editMeetingTitle(id, title); - }, - child: Container( - width: 120.w, - height: 40.w, - alignment: Alignment.center, - decoration: BoxDecoration( + child: Text( + 'cancel'.tr, // 取消 + style: TextStyle( + fontSize: 14.sp, color: isDarkMode ? AppColors.primary : Colors.blue, - borderRadius: BorderRadius.circular(12.w), ), - child: Text( - 'confirm'.tr, // 确认 - style: TextStyle( - color: Colors.white, - fontSize: 14.sp, - ), + ), + ), + ), + GestureDetector( + onTap: () { + String title = controller.titleController.text; + controller.editMeetingTitle(id, title); + }, + child: Container( + width: 120.w, + height: 40.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: isDarkMode ? AppColors.primary : Colors.blue, + borderRadius: BorderRadius.circular(12.w), + ), + child: Text( + 'confirm'.tr, // 确认 + style: TextStyle( + color: Colors.white, + fontSize: 14.sp, ), ), ), - ], - ), + ), + ], ), - ], - ), + ), + ], ), - ); - }, + ), + ), + isScrollControlled: true, + clipBehavior: Clip.hardEdge, ); } } diff --git a/lib/modules/meeting/views/speech_tab.dart b/lib/modules/meeting/views/speech_tab.dart index 0e65a49c8..adcecc391 100644 --- a/lib/modules/meeting/views/speech_tab.dart +++ b/lib/modules/meeting/views/speech_tab.dart @@ -52,8 +52,8 @@ class SpeechTab extends GetView { GestureDetector( onTap: () { if (controller.isSpeakerText.value) return; - showModalBottomSheet( - context: context, + Get.bottomSheet( + SpeakerBottomSheet(item['id'], item['speaker']), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -61,10 +61,6 @@ class SpeechTab extends GetView { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return SpeakerBottomSheet( - item['id'], item['speaker']); - }, ); }, child: Padding( @@ -270,8 +266,8 @@ class SpeechTab extends GetView { Icons.supervisor_account, '命名发言者', () { - showModalBottomSheet( - context: context, + Get.bottomSheet( + const SpeakerAllBottomSheet(), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -279,9 +275,6 @@ class SpeechTab extends GetView { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return const SpeakerAllBottomSheet(); - }, ); }, ), @@ -292,8 +285,8 @@ class SpeechTab extends GetView { Icons.auto_awesome, '生成', () { - showModalBottomSheet( - context: context, + Get.bottomSheet( + const GenerateBottomSheet(), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -301,9 +294,6 @@ class SpeechTab extends GetView { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return const GenerateBottomSheet(); - }, ); }, ), diff --git a/lib/modules/meeting/views/summary_tab.dart b/lib/modules/meeting/views/summary_tab.dart index 4da336ef9..61c9c0b7e 100644 --- a/lib/modules/meeting/views/summary_tab.dart +++ b/lib/modules/meeting/views/summary_tab.dart @@ -298,8 +298,8 @@ class _SummaryTabState extends State { Icons.supervisor_account, '编辑发言者', () { - showModalBottomSheet( - context: context, + Get.bottomSheet( + const SpeakerAllBottomSheet(), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -307,9 +307,6 @@ class _SummaryTabState extends State { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return const SpeakerAllBottomSheet(); - }, ); }, ), @@ -320,8 +317,8 @@ class _SummaryTabState extends State { Icons.auto_awesome, '生成', () { - showModalBottomSheet( - context: context, + Get.bottomSheet( + const GenerateBottomSheet(), isScrollControlled: true, backgroundColor: Colors.grey[100], shape: RoundedRectangleBorder( @@ -329,9 +326,6 @@ class _SummaryTabState extends State { top: Radius.circular(12.r), ), ), - builder: (BuildContext context) { - return const GenerateBottomSheet(); - }, ); }, ), diff --git a/lib/modules/meeting/views/template_all_view.dart b/lib/modules/meeting/views/template_all_view.dart new file mode 100644 index 000000000..95a644e89 --- /dev/null +++ b/lib/modules/meeting/views/template_all_view.dart @@ -0,0 +1,296 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../data/services/db/sqflite_api.dart'; + +class TemplateAllView extends StatefulWidget { + final String title; + final int categoryid; + final Map templateData; + final int lastTemplateId; + + const TemplateAllView( + this.title, this.categoryid, this.templateData, this.lastTemplateId, + {super.key}); + + @override + State createState() => _TemplateAllViewState(); +} + +class _TemplateAllViewState extends State { + final Map _icons = { + 'auto_stories': Icons.auto_stories, + 'auto_graph': Icons.auto_graph, + 'add_to_drive_outlined': Icons.add_to_drive_outlined, + 'perm_phone_msg': Icons.perm_phone_msg, + 'assignment': Icons.assignment, + 'lightbulb': Icons.lightbulb, + 'note': Icons.note, + 'rate_review': Icons.rate_review, + 'event_repeat': Icons.event_repeat, + 'handshake': Icons.handshake, + 'restart_alt': Icons.restart_alt, + 'rocket_launch': Icons.rocket_launch, + 'code': Icons.code, + 'bar_chart': Icons.bar_chart, + 'school': Icons.school, + 'auto_fix_high': Icons.auto_fix_high, + }; + + List _templateList = []; + Map _templateData = {}; + + @override + void initState() { + super.initState(); + _getTemplate(); + } + + void _getTemplate() async { + List list = await SqfliteApi.getMeetingTemplateList(widget.categoryid); + List templateList = []; + for (var element in list) { + Map item = { + ...element, + 'tag': element['tag'].isNotEmpty ? element['tag'].split(',') : [], + }; + if (element['id'] == widget.templateData['id']) { + templateList.insert(0, item); + _templateData = widget.templateData; + } else { + templateList.add(item); + } + } + setState(() { + _templateList = templateList; + }); + } + + @override + Widget build(BuildContext context) { + final isDarkMode = Theme.of(context).brightness == Brightness.dark; + + return Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ); + } + + // 构建应用栏 + PreferredSizeWidget _buildAppBar(bool isDarkMode) { + return AppBar( + backgroundColor: isDarkMode ? Colors.black : Colors.white, + elevation: 0.5, + leading: IconButton( + icon: Icon( + Icons.arrow_back_ios, + color: isDarkMode ? Colors.white : Colors.black, + size: 20.sp, + ), + onPressed: () => Get.back(), + ), + title: Text( + widget.title, + style: TextStyle( + fontSize: 17.sp, + fontWeight: FontWeight.w600, + color: isDarkMode ? Colors.white : Colors.black, + ), + ), + centerTitle: true, + ); + } + + // 构建主体内容 + Widget _buildBody(bool isDarkMode) { + return Column( + children: [ + Expanded( + child: GridView.builder( + itemCount: _templateList.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 12.w, + crossAxisSpacing: 12.w, + childAspectRatio: 1.sw / 2 / 150.w, + ), + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + itemBuilder: (BuildContext context, int index) { + Map data = _templateList[index]; + return _item(data); + }, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + child: GestureDetector( + onTap: () { + if (_templateData.isNotEmpty) { + Get.back(); + Get.back(result: _templateData); + } + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: _templateData.isNotEmpty ? Colors.black : Colors.grey, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + '就用这个模版', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ); + } + + Widget _item(Map template) { + return Container( + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(14.w), + ), + child: GestureDetector( + onTap: () { + setState(() { + _templateData = template; + }); + }, + child: Stack( + children: [ + Container( + padding: EdgeInsets.all(5.w), + decoration: BoxDecoration( + color: Colors.white, + gradient: _templateData['id'] == template['id'] + ? const LinearGradient( + colors: [Colors.blue, Colors.pinkAccent], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ) + : null, + ), + child: Container( + width: double.infinity, + padding: EdgeInsets.all(10.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.w), + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: 5.w), + child: Icon( + _icons[template['icon']], + color: Colors.orange, + size: 30.w, + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.w), + child: Text( + template['name'], + style: TextStyle( + fontSize: 16.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), + ), + ), + template['tag'].isNotEmpty + ? Wrap( + spacing: 5.w, + children: List.generate( + template['tag'].length, + (int idx) { + return Container( + padding: EdgeInsets.symmetric( + horizontal: 5.w, vertical: 2.w), + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(4.r), + ), + child: Text( + template['tag'][idx], + style: TextStyle( + fontSize: 10.sp, + color: Colors.grey[600], + ), + ), + ); + }, + ), + ) + : Text( + template['desc'], + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 12.sp, + color: Colors.grey[600], + ), + ), + ], + ), + ), + ), + if (widget.lastTemplateId == template['id']) + Positioned( + top: 0, + left: 0, + child: Container( + padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 1.w), + decoration: BoxDecoration( + color: Colors.blue, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(12.w), + bottomRight: Radius.circular(4.w), + ), + ), + child: Text( + '上次使用', + style: TextStyle( + color: Colors.white, + fontSize: 12.sp, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + if (_templateData['id'] == template['id']) + Positioned( + right: -18.w, + bottom: -18.w, + child: Container( + width: 40.w, + height: 40.w, + padding: EdgeInsets.all(2.w), + alignment: Alignment.topLeft, + decoration: BoxDecoration( + color: Colors.pinkAccent, + borderRadius: BorderRadius.circular(40.r), + ), + child: Icon( + Icons.check, + color: Colors.white, + size: 18.w, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/modules/meeting/views/template_view.dart b/lib/modules/meeting/views/template_view.dart index 291a462cb..a1cccd0ff 100644 --- a/lib/modules/meeting/views/template_view.dart +++ b/lib/modules/meeting/views/template_view.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'template_all_view.dart'; + class TemplateView extends StatefulWidget { final Map templateData; final int lastTemplateId; @@ -20,30 +22,54 @@ class _TemplateViewState extends State { 'auto_graph': Icons.auto_graph, 'add_to_drive_outlined': Icons.add_to_drive_outlined, 'perm_phone_msg': Icons.perm_phone_msg, + 'assignment': Icons.assignment, + 'lightbulb': Icons.lightbulb, + 'note': Icons.note, + 'rate_review': Icons.rate_review, + 'event_repeat': Icons.event_repeat, + 'handshake': Icons.handshake, + 'restart_alt': Icons.restart_alt, + 'rocket_launch': Icons.rocket_launch, + 'code': Icons.code, + 'bar_chart': Icons.bar_chart, + 'school': Icons.school, 'auto_fix_high': Icons.auto_fix_high, }; + final List _categoryTemplateList = []; Map _templateData = {}; @override void initState() { super.initState(); - Map templateMap = widget.categoryList.firstWhere( - (item) => item['id'] == widget.templateData['categoryid'], - orElse: () => {}, - ); - if (templateMap.isNotEmpty) { - List template = templateMap['template']; - int index = - template.indexWhere((v) => v['id'] == widget.templateData['id']); - if (index != -1) { - Map itemToMove = template.removeAt(index); - template.insert(0, itemToMove); - } else { - template.insert(0, widget.templateData); + _getTemplate(); + } + + void _getTemplate() async { + for (var element in widget.categoryList) { + List templateList = []; + bool isAdd = false; + if (element['id'] == widget.templateData['categoryid']) { + isAdd = true; + } + for (var template in element['template']) { + if (template['id'] == widget.templateData['id']) { + isAdd = false; + templateList.insert(0, template); + } else { + templateList.add(template); + } + } + if (isAdd) { + templateList.insert(0, widget.templateData); } - _templateData = widget.templateData; + _categoryTemplateList.add({ + 'id': element['id'], + 'name': element['name'], + 'template': templateList, + }); } + _templateData = widget.templateData; } @override @@ -53,7 +79,7 @@ class _TemplateViewState extends State { return Scaffold( backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], appBar: _buildAppBar(isDarkMode), - body: _buildBody(context, isDarkMode), + body: _buildBody(isDarkMode), ); } @@ -83,14 +109,14 @@ class _TemplateViewState extends State { } // 构建主体内容 - Widget _buildBody(BuildContext context, bool isDarkMode) { + Widget _buildBody(bool isDarkMode) { return Column( children: [ Expanded( child: ListView.builder( - itemCount: widget.categoryList.length, + itemCount: _categoryTemplateList.length, itemBuilder: (BuildContext context, int index) { - Map data = widget.categoryList[index]; + Map data = _categoryTemplateList[index]; return _item(data); }, ), @@ -125,23 +151,33 @@ class _TemplateViewState extends State { Widget _item(Map data) { return Column( children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.w), - child: Row( - children: [ - Text( - data['name'], - style: TextStyle( - fontSize: 18.sp, - color: Colors.black87, - fontWeight: FontWeight.bold, + GestureDetector( + onTap: () { + Get.to(() => TemplateAllView( + data['name'], + data['id'], + _templateData, + widget.lastTemplateId, + )); + }, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.w), + child: Row( + children: [ + Text( + data['name'], + style: TextStyle( + fontSize: 18.sp, + color: Colors.black87, + fontWeight: FontWeight.bold, + ), ), - ), - const Icon( - Icons.keyboard_arrow_right, - color: Colors.grey, - ) - ], + const Icon( + Icons.keyboard_arrow_right, + color: Colors.grey, + ) + ], + ), ), ), Container( diff --git a/pubspec.yaml b/pubspec.yaml index 4cc804bcb..cbb9288a8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ dependencies: flutter_localizations: sdk: flutter cupertino_icons: ^1.0.6 - get: ^4.6.6 + get: ^4.7.2 json_annotation: ^4.9.0 get_storage: ^2.1.1 http: ^1.3.0 @@ -31,7 +31,7 @@ dependencies: logger: ^2.0.2+1 flutter_blue_plus: ^1.31.16 just_audio: ^0.9.36 - webview_flutter: ^4.12.0 + webview_flutter: ^4.13.0 flutter_easyloading: ^3.0.5 package_info_plus: ^8.3.0 file_picker: ^10.1.5 From 9a09dcf4894aa65be82c1251cfd3e5db8bd57fc6 Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 28 May 2025 15:35:35 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E5=8A=A9=E6=89=8B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AD=89=E5=BE=85=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/lottie/meeting_wait.json | 1 + .../controllers/meeting_controller.dart | 2 +- .../meeting_details_controller.dart | 21 ++++---- .../meeting/views/meeting_details_view.dart | 48 +++++++++++++++++-- lib/modules/meeting/views/speech_tab.dart | 6 +-- lib/modules/meeting/views/summary_tab.dart | 4 +- 6 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 assets/lottie/meeting_wait.json diff --git a/assets/lottie/meeting_wait.json b/assets/lottie/meeting_wait.json new file mode 100644 index 000000000..49f02a469 --- /dev/null +++ b/assets/lottie/meeting_wait.json @@ -0,0 +1 @@ +{"v":"5.6.3","fr":24,"ip":0,"op":75,"w":1000,"h":1000,"nm":"step two","ddd":0,"assets":[],"fonts":{"list":[{"fName":"Lato-Heavy","fFamily":"Lato","fStyle":"Heavy","ascent":74.6490478515625}]},"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"NULL CONTROL 2","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[288.769,691.391,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ADD","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.142],"y":[1]},"o":{"x":[0.858],"y":[0]},"t":3,"s":[-360]},{"i":{"x":[0.142],"y":[1]},"o":{"x":[0.858],"y":[0]},"t":33,"s":[0]},{"t":69,"s":[360]}],"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[-229.438,165.533,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.344,0.344,0.344],"y":[1,1,1]},"o":{"x":[0.656,0.656,0.656],"y":[0,0,0]},"t":3,"s":[0,0,100]},{"i":{"x":[0.344,0.344,0.344],"y":[1,1,1]},"o":{"x":[0.656,0.656,0.656],"y":[0,0,0]},"t":31,"s":[78,78,100]},{"t":69,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-9.621,-0.032],[0,0]],"o":[[0,0],[9.621,0.032],[0,0]],"v":[[-247.707,182.908],[-229.219,168.377],[-211.951,183.186]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[50.984,50.984],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":11,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-228.399,158.129],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[42,42],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[50.984,50.984],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.250980392157,0.341176470588,0.635294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.772549019608,0.682352941176,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-229.438,165.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Artwork 30","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[500,500,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":":) 2","parent":5,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[100]},{"t":51,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[6.559,-25.807,0],"ix":2},"a":{"a":0,"k":[6.559,-25.807,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-19.941,-48.382],[-22.844,-48.382],[-22.844,3.97],[-19.941,3.97]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[35.961,-75.882],[4.156,-75.882],[4.156,24.269],[35.961,24.269]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"t":{"d":{"k":[{"s":{"s":86.2156295776367,"f":"Lato-Heavy","t":":)","j":2,"tr":200,"lh":103.458755493164,"ls":0,"fc":[0.941,0.337,0.18]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":-1,"op":242,"st":2,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":":)","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"t":51,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.227],"y":[1]},"o":{"x":[0.773],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.227],"y":[1]},"o":{"x":[0.773],"y":[0]},"t":30,"s":[90]},{"t":45,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.227,"y":1},"o":{"x":0.773,"y":0},"t":21,"s":[106.506,-57.313,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.227,"y":1},"o":{"x":0.773,"y":0},"t":30,"s":[106.506,-88.313,0],"to":[0,0,0],"ti":[0,0,0]},{"t":40,"s":[106.506,-57.313,0]}],"ix":2},"a":{"a":0,"k":[0.668,-27.007,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":86.2156295776367,"f":"Lato-Heavy","t":":)","j":2,"tr":200,"lh":103.458755493164,"ls":0,"fc":[0.941,0.337,0.18]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":3,"nm":"NULL CONTROL 3","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.354,"y":1},"o":{"x":0.43,"y":0},"t":9,"s":[556.506,461.687,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.773,"y":0},"t":16,"s":[556.506,330.687,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.227,"y":0.227},"o":{"x":0.773,"y":0.773},"t":30,"s":[556.506,392.687,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.227,"y":1},"o":{"x":0.773,"y":0},"t":52,"s":[556.506,392.687,0],"to":[0,0,0],"ti":[0,0,0]},{"t":68,"s":[556.506,461.687,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"step two 8","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-6.506,157.313,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.005,1.048],[0,0],[0.692,0],[0,0],[-0.918,-0.74],[0,0]],"o":[[0,0],[0.003,-0.692],[0,0],[-1.179,0],[0,0],[0.816,0.658]],"v":[[184.356,-111.238],[184.669,-183.522],[183.42,-184.777],[93.468,-184.777],[92.684,-182.554],[182.322,-110.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.772549033165,0.68235296011,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"step two 7","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-6.506,157.313,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.85,0],[0,0],[0,3.85],[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0]],"o":[[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0],[3.85,0],[0,0],[0,3.85]],"v":[[206.07,-147.589],[28.946,-147.589],[21.946,-154.589],[21.946,-240.144],[28.946,-247.144],[206.07,-247.144],[213.07,-240.144],[213.07,-154.589]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.772549033165,0.68235296011,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":5,"nm":"join","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[204.454,-131.29,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":72,"f":"Lato-Heavy","t":"JOIN","j":2,"tr":200,"lh":86.4,"ls":0,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"step two 11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[305.441,421.46,0],"ix":2},"a":{"a":0,"k":[-194.559,-78.54,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.074,15.148],[13.632,20.976],[17.827,15.159],[0,0]],"o":[[-13.495,-14.525],[-16.251,-25.007],[-20.723,-17.622],[0,0]],"v":[[-194.559,-78.54],[-204.608,-144.479],[-277.9,-152.525],[-274.454,-203.938]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.976470589638,0.905882358551,0.050980392843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":33,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.711],"y":[1]},"o":{"x":[0.289],"y":[0]},"t":54,"s":[0]},{"t":75,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.711],"y":[1]},"o":{"x":[0.289],"y":[0]},"t":41,"s":[0]},{"t":58,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"step two 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[305.441,421.46,0],"ix":2},"a":{"a":0,"k":[-194.559,-78.54,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.074,15.148],[13.632,20.976],[17.827,15.159],[0,0]],"o":[[-13.495,-14.525],[-16.251,-25.007],[-20.723,-17.622],[0,0]],"v":[[-194.559,-78.54],[-204.608,-144.479],[-277.9,-152.525],[-274.454,-203.938]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.976470589638,0.905882358551,0.050980392843,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":33,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.711],"y":[1]},"o":{"x":[0.289],"y":[0]},"t":13,"s":[0]},{"t":34,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.711],"y":[1]},"o":{"x":[0.289],"y":[0]},"t":0,"s":[2]},{"t":17,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":3,"nm":"NULL CONTROL 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.227],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[90]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.227],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":61,"s":[0]},{"t":72,"s":[90]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.227,"y":1},"o":{"x":0.167,"y":0.167},"t":7,"s":[338.345,780.854,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.227,"y":0.227},"o":{"x":0.167,"y":0.167},"t":15,"s":[338.345,701.854,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.227,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[338.345,701.854,0],"to":[0,0,0],"ti":[0,0,0]},{"t":70,"s":[338.345,780.854,0]}],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.227,0.227,0.227],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,16.667]},"t":3,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.227,0.227,0.227],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":62,"s":[100,100,100]},{"t":68,"s":[0,0,100]}],"ix":6}},"ao":0,"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"step two 5","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.291,49.482,0],"ix":2},"a":{"a":0,"k":[-162.363,201.337,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.005,1.048],[0,0],[-0.692,0],[0,0],[0.918,-0.74],[0,0]],"o":[[0,0],[-0.003,-0.692],[0,0],[1.179,0],[0,0],[-0.816,0.658]],"v":[[-161.724,200.09],[-162.363,52.431],[-161.113,51.175],[22.636,51.175],[23.42,53.398],[-159.689,201.058]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.341176480055,0.611764729023,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"step two 4","parent":12,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50.709,50.518,0],"ix":2},"a":{"a":0,"k":[-160.946,202.372,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.85,0],[0,0],[0,3.85],[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0]],"o":[[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0],[3.85,0],[0,0],[0,3.85]],"v":[[261.5,102.5],[-261.5,102.5],[-268.5,95.5],[-268.5,-95.5],[-261.5,-102.5],[261.5,-102.5],[268.5,-95.5],[268.5,95.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.250980407,0.341176480055,0.635294139385,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"step two 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[337.637,701.337,0],"ix":2},"a":{"a":0,"k":[-162.363,201.337,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.005,1.048],[0,0],[-0.692,0],[0,0],[0.918,-0.74],[0,0]],"o":[[0,0],[-0.003,-0.692],[0,0],[1.179,0],[0,0],[-0.816,0.658]],"v":[[-161.724,200.09],[-162.363,52.431],[-161.113,51.175],[22.636,51.175],[23.42,53.398],[-159.689,201.058]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.949019607843,0.952941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"step two 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.054,702.372,0],"ix":2},"a":{"a":0,"k":[-160.946,202.372,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.85,0],[0,0],[0,3.85],[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0]],"o":[[0,0],[-3.85,0],[0,0],[0,-3.85],[0,0],[3.85,0],[0,0],[0,3.85]],"v":[[261.5,102.5],[-261.5,102.5],[-268.5,95.5],[-268.5,-95.5],[-261.5,-102.5],[261.5,-102.5],[268.5,-95.5],[268.5,95.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.949019607843,0.949019607843,0.952941176471,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"step two 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[360]},{"t":53,"s":[0]}],"ix":10},"p":{"a":0,"k":[601.542,678.252,0],"ix":2},"a":{"a":0,"k":[101.542,178.252,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-57.479,3.971],[0,0]],"o":[[0,0],[57.479,-3.971],[0,0]],"v":[[29.478,157.301],[104.912,207.014],[173.606,149.279]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.349019616842,0.494117647409,0.819607853889,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":33,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"t":50,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":29,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":3,"nm":"NULL CONTROL ","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":186,"ix":10},"p":{"a":0,"k":[689.172,563.206,0],"ix":2},"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"blue blob","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.965,"y":1},"o":{"x":0.035,"y":0},"t":0,"s":[22.126,71.025,0],"to":[0.239,-28.368,0],"ti":[1.887,-29.086,0]},{"i":{"x":0.965,"y":1},"o":{"x":0.035,"y":0},"t":38,"s":[65.66,71.025,0],"to":[-1.887,29.086,0],"ti":[-0.261,29.632,0]},{"t":75,"s":[22.126,71.025,0]}],"ix":2},"a":{"a":0,"k":[-1857.74,12.368,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.777,"y":1},"o":{"x":0.223,"y":0},"t":0,"s":[{"i":[[27.446,17.506],[16.16,10.052],[29.683,-6.073],[16.027,-24.443],[6.9,-20.868],[-3.773,-18.47],[-20.293,-8.765],[-17.671,1.505],[-20.407,9.661],[-21.669,6.911],[-2.347,17.47]],"o":[[-12.631,-8.056],[-26.087,-16.227],[-29.134,5.96],[-6.796,10.365],[-5.987,18.109],[5.219,25.546],[20.293,8.765],[22.512,-1.917],[14.354,-6.795],[21.669,-6.911],[4.382,-32.611]],"v":[[-1724.939,-56.574],[-1817.205,-112.801],[-1903.685,-126.471],[-1973.523,-76.468],[-2025.428,24.858],[-2027.401,80.891],[-1980.293,139.235],[-1882.645,153.556],[-1820.841,137.199],[-1730.669,87.911],[-1686.101,23.648]],"c":true}]},{"i":{"x":0.777,"y":1},"o":{"x":0.223,"y":0},"t":23,"s":[{"i":[[28.205,16.095],[20.842,4.302],[30.35,-10.558],[19.526,-22.806],[6.9,-20.868],[-3.773,-18.47],[-18.807,-10.984],[-24.232,4.485],[-17.658,16.707],[-21.669,6.91],[-2.198,26.097]],"o":[[-18.441,-9.846],[-27.353,-8.444],[-27.861,9.175],[-7.857,9.36],[-5.987,18.109],[5.219,25.546],[20.293,12.431],[22.261,-3.306],[13.031,-13.299],[21.669,-6.91],[3.401,-32.698]],"v":[[-1713.272,-80.241],[-1804.205,-122.468],[-1891.351,-117.804],[-1959.523,-71.134],[-2007.094,13.858],[-2009.401,69.558],[-1965.96,134.902],[-1857.978,164.889],[-1794.174,137.532],[-1727.003,71.911],[-1672.434,2.982]],"c":true}]},{"i":{"x":0.777,"y":1},"o":{"x":0.223,"y":0},"t":48,"s":[{"i":[[30.699,16.525],[31.868,-6.819],[30.089,-8.801],[28.455,-17.137],[6.9,-20.869],[-3.773,-18.47],[-19.389,-10.115],[-28.694,-1.768],[-25.913,11.933],[-10.214,23.322],[-2.257,22.717]],"o":[[-20.415,-12.618],[-31.927,3.629],[-28.36,7.915],[-16.12,10.541],[-5.987,18.109],[5.219,25.546],[20.293,10.995],[23.438,-0.654],[16.095,-8.772],[8.992,-25.333],[3.786,-32.664]],"v":[[-1728.917,-134.042],[-1832.891,-163.458],[-1900.999,-119.274],[-1973.193,-96.817],[-2024.87,-14.091],[-2030.417,50.887],[-1979.761,112.526],[-1871.327,147.63],[-1762.655,136.243],[-1704.725,70.629],[-1688.381,-29.847]],"c":true}]},{"t":75,"s":[{"i":[[27.446,17.506],[16.16,10.052],[29.683,-6.073],[16.027,-24.443],[6.9,-20.868],[-3.773,-18.47],[-20.293,-8.765],[-17.671,1.505],[-20.407,9.661],[-21.669,6.911],[-2.347,17.47]],"o":[[-12.631,-8.056],[-26.087,-16.227],[-29.134,5.96],[-6.796,10.365],[-5.987,18.109],[5.219,25.546],[20.293,8.765],[22.512,-1.917],[14.354,-6.795],[21.669,-6.911],[4.382,-32.611]],"v":[[-1724.939,-56.574],[-1817.205,-112.801],[-1903.685,-126.471],[-1973.523,-76.468],[-2025.428,24.858],[-2027.401,80.891],[-1980.293,139.235],[-1882.645,153.556],[-1820.841,137.199],[-1730.669,87.911],[-1686.101,23.648]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.533333333333,0.870588295133,0.949019667682,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"pink blob","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[4]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[27]},{"t":75,"s":[4]}],"ix":10},"p":{"a":0,"k":[265.504,435.394,0],"ix":2},"a":{"a":0,"k":[-2262.496,-68.606,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.442,0.442,0.442],"y":[1,1,1]},"o":{"x":[0.558,0.558,0.558],"y":[0,0,0]},"t":0,"s":[90,90,100]},{"i":{"x":[0.442,0.442,0.442],"y":[1,1,1]},"o":{"x":[0.558,0.558,0.558],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"t":75,"s":[90,90,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-10.555,-9.172],[-13.555,-5.11],[-7.874,-1.554],[-14.596,3.272],[-9.836,16.33],[0.511,14.237],[0.324,2.64],[-2.519,4.863],[1.197,15.338],[10.333,12.602],[23.942,1.318],[6.857,-0.997],[4.443,-1.608],[12.929,-10.601],[6.944,-20.538],[1.151,-10.762],[-2.972,-10.55]],"o":[[10.823,9.405],[7.424,2.799],[14.056,2.775],[19.151,-4.293],[7.574,-12.575],[-0.097,-2.697],[3.365,-4.366],[7.294,-14.084],[-1.297,-16.611],[-14.834,-18.091],[-6.872,-0.378],[-4.635,0.674],[-15.636,5.658],[-17.503,14.352],[-3.533,10.449],[-1.188,11.109],[3.73,13.241]],"v":[[-2339.774,9.371],[-2304.615,29.106],[-2281.567,35.38],[-2239.093,36.905],[-2192.857,1.703],[-2180.38,-40.346],[-2181.022,-48.352],[-2171.921,-62.034],[-2161.9,-104.994],[-2180.279,-147.675],[-2243.83,-175.734],[-2264.499,-173.911],[-2278.056,-170.548],[-2318.794,-147.466],[-2355.826,-91.68],[-2362.583,-59.405],[-2360.741,-25.801]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.945098042488,0.898039221764,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":240,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"J","size":72,"style":"Heavy","w":41.9,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.45,-1.816],[0.9,-1.133],[1.333,-0.5],[1.8,0],[0.883,0.2],[0.566,0],[0.533,-0.483],[0.1,-0.8],[0.133,-1.466],[0.133,-1.466],[-1.784,-0.217],[-1.834,0],[-3.034,1.266],[-2.017,2.35],[-1,3.284],[0,4.067]],"o":[[0,0],[0,0],[0,2.6],[-0.45,1.817],[-0.9,1.134],[-1.334,0.5],[-1.3,0],[-0.884,-0.2],[-1,0],[-0.534,0.484],[-0.134,1.467],[-0.134,1.467],[1.966,0.467],[1.783,0.216],[4.033,0],[3.033,-1.266],[2.016,-2.35],[1,-3.283],[0,0]],"v":[[36.3,-72.55],[21.3,-72.55],[21.3,-25.65],[20.625,-19.025],[18.6,-14.6],[15.25,-12.15],[10.55,-11.4],[7.275,-11.7],[5.1,-12],[2.8,-11.275],[1.85,-9.35],[1.45,-4.95],[1.05,-0.55],[6.675,0.475],[12.1,0.8],[22.7,-1.1],[30.275,-6.525],[34.8,-14.975],[36.3,-26]],"c":true},"ix":2},"nm":"J","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"J","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"O","size":72,"style":"Heavy","w":81.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.783,4.517],[3.25,3.317],[4.566,1.884],[5.566,0],[4.566,-1.883],[3.266,-3.3],[1.783,-4.516],[0,-5.3],[-1.784,-4.533],[-3.267,-3.3],[-4.567,-1.883],[-5.567,0],[-4.567,1.884],[-3.25,3.3],[-1.784,4.534],[0,5.3]],"o":[[-1.784,-4.516],[-3.25,-3.316],[-4.567,-1.883],[-5.567,0],[-4.567,1.884],[-3.267,3.3],[-1.784,4.517],[0,5.3],[1.783,4.534],[3.266,3.3],[4.566,1.884],[5.566,0],[4.566,-1.883],[3.25,-3.3],[1.783,-4.533],[0,-5.266]],"v":[[75.025,-50.975],[67.475,-62.725],[55.75,-70.525],[40.55,-73.35],[25.35,-70.525],[13.6,-62.75],[6.025,-51.025],[3.35,-36.3],[6.025,-21.55],[13.6,-9.8],[25.35,-2.025],[40.55,0.8],[55.75,-2.025],[67.475,-9.8],[75.025,-21.55],[77.7,-36.3]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1,-3.016],[1.883,-2.1],[2.683,-1.116],[3.4,0],[2.7,1.117],[1.883,2.1],[1,3.017],[0,3.834],[-1,3.017],[-1.884,2.117],[-2.7,1.117],[-3.4,0],[-2.684,-1.116],[-1.884,-2.116],[-1,-3.016],[0,-3.8]],"o":[[-1,3.017],[-1.884,2.1],[-2.684,1.117],[-3.4,0],[-2.7,-1.116],[-1.884,-2.1],[-1,-3.016],[0,-3.8],[1,-3.016],[1.883,-2.116],[2.7,-1.116],[3.4,0],[2.683,1.117],[1.883,2.117],[1,3.017],[0,3.834]],"v":[[60.85,-26.025],[56.525,-18.35],[49.675,-13.525],[40.55,-11.85],[31.4,-13.525],[24.525,-18.35],[20.2,-26.025],[18.7,-36.3],[20.2,-46.525],[24.525,-54.225],[31.4,-59.075],[40.55,-60.75],[49.675,-59.075],[56.525,-54.225],[60.85,-46.525],[62.35,-36.3]],"c":true},"ix":2},"nm":"O","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"O","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"I","size":72,"style":"Heavy","w":30.3,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[22.7,-72.55],[7.6,-72.55],[7.6,0],[22.7,0]],"c":true},"ix":2},"nm":"I","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"I","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"N","size":72,"style":"Heavy","w":77.35,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.067,-1.183],[-0.134,-1.266],[0,0],[0.333,0.3],[0.366,0.184],[0.45,0.05],[0.633,0],[0,0],[0,0],[0,0],[0,0],[0.05,1.134],[0.1,1.167],[0,0],[-0.8,-0.383],[-1.167,0],[0,0],[0,0]],"o":[[0,0],[0,1.067],[0.066,1.184],[0,0],[-0.4,-0.5],[-0.334,-0.3],[-0.367,-0.183],[-0.45,-0.05],[0,0],[0,0],[0,0],[0,0],[0,-0.966],[-0.05,-1.133],[0,0],[0.766,0.934],[0.8,0.384],[0,0],[0,0],[0,0]],"v":[[56.5,-72.55],[56.5,-31.05],[56.6,-27.675],[56.9,-24],[20.5,-70.2],[19.4,-71.4],[18.35,-72.125],[17.125,-72.475],[15.5,-72.55],[7.6,-72.55],[7.6,0],[20.85,0],[20.85,-41.95],[20.775,-45.1],[20.55,-48.55],[56.7,-2.55],[59.05,-0.575],[62,0],[69.75,0],[69.75,-72.55]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"N","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":":","size":86.2156295776367,"style":"Heavy","w":26.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.417,-0.966],[-0.734,-0.716],[-0.984,-0.4],[-1.167,0],[-1,0.4],[-0.734,0.717],[-0.417,0.967],[0,1.134],[0.416,0.984],[0.733,0.717],[1,0.417],[1.133,0],[0.983,-0.416],[0.733,-0.716],[0.416,-0.983],[0,-1.1]],"o":[[0.416,0.967],[0.733,0.717],[0.983,0.4],[1.133,0],[1,-0.4],[0.733,-0.716],[0.416,-0.966],[0,-1.1],[-0.417,-0.983],[-0.734,-0.716],[-1,-0.416],[-1.167,0],[-0.984,0.417],[-0.734,0.717],[-0.417,0.984],[0,1.134]],"v":[[5.525,-4.1],[7.25,-1.575],[9.825,0.1],[13.05,0.7],[16.25,0.1],[18.85,-1.575],[20.575,-4.1],[21.2,-7.25],[20.575,-10.375],[18.85,-12.925],[16.25,-14.625],[13.05,-15.25],[9.825,-14.625],[7.25,-12.925],[5.525,-10.375],[4.9,-7.25]],"c":true},"ix":2},"nm":":","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.417,-0.966],[-0.734,-0.716],[-0.984,-0.4],[-1.167,0],[-1,0.4],[-0.734,0.717],[-0.417,0.967],[0,1.134],[0.416,0.984],[0.733,0.717],[1,0.417],[1.133,0],[0.983,-0.416],[0.733,-0.716],[0.416,-0.983],[0,-1.1]],"o":[[0.416,0.967],[0.733,0.717],[0.983,0.4],[1.133,0],[1,-0.4],[0.733,-0.716],[0.416,-0.966],[0,-1.1],[-0.417,-0.983],[-0.734,-0.716],[-1,-0.416],[-1.167,0],[-0.984,0.417],[-0.734,0.717],[-0.417,0.984],[0,1.134]],"v":[[5.525,-39.1],[7.25,-36.575],[9.825,-34.9],[13.05,-34.3],[16.25,-34.9],[18.85,-36.575],[20.575,-39.1],[21.2,-42.25],[20.575,-45.375],[18.85,-47.925],[16.25,-49.625],[13.05,-50.25],[9.825,-49.625],[7.25,-47.925],[5.525,-45.375],[4.9,-42.25]],"c":true},"ix":2},"nm":":","mn":"ADBE Vector Shape - Group","hd":false}],"nm":":","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":")","size":86.2156295776367,"style":"Heavy","w":27.75,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.583,-6.6],[2.933,-5.767],[0.05,-0.55],[-0.15,-0.434],[-0.317,-0.3],[-0.367,-0.234],[0,0],[-1.734,3.833],[-1.1,3.95],[-0.517,4.05],[0,4.234],[0.516,4.067],[1.1,3.934],[1.733,3.85],[2.433,3.767],[0,0],[0.316,-0.3],[0.15,-0.433],[-0.05,-0.566],[-0.4,-0.733],[-1.584,-6.6],[0,-6.766]],"o":[[-1.584,6.6],[-0.4,0.733],[-0.05,0.55],[0.15,0.433],[0.316,0.3],[0,0],[2.433,-3.8],[1.733,-3.834],[1.1,-3.95],[0.516,-4.05],[0,-4.2],[-0.517,-4.066],[-1.1,-3.933],[-1.734,-3.85],[0,0],[-0.367,0.234],[-0.317,0.3],[-0.15,0.434],[0.05,0.567],[2.933,5.734],[1.583,6.6],[0,6.767]],"v":[[10.125,-11.3],[3.35,7.25],[2.675,9.175],[2.825,10.65],[3.525,11.75],[4.55,12.55],[10.7,16.2],[16.95,4.75],[21.2,-6.925],[23.625,-18.925],[24.4,-31.35],[23.625,-43.75],[21.2,-55.75],[16.95,-67.425],[10.7,-78.85],[4.55,-75.25],[3.525,-74.45],[2.825,-73.35],[2.675,-71.85],[3.35,-69.9],[10.125,-51.4],[12.5,-31.35]],"c":true},"ix":2},"nm":")","mn":"ADBE Vector Shape - Group","hd":false}],"nm":")","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"}]} \ No newline at end of file diff --git a/lib/modules/meeting/controllers/meeting_controller.dart b/lib/modules/meeting/controllers/meeting_controller.dart index 766e55327..8b2550838 100644 --- a/lib/modules/meeting/controllers/meeting_controller.dart +++ b/lib/modules/meeting/controllers/meeting_controller.dart @@ -75,7 +75,7 @@ class MeetingController extends GetxController { int creationTime = DateTime.now().millisecondsSinceEpoch; Map data = { 'title': fileName, - 'type': 'NOTE', + 'type': 'IMPORT', 'seconds': seconds, 'filepath': filePath, 'audiourl': audiourl, diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 8200c349c..40a127ccf 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -100,7 +100,7 @@ class MeetingDetailsController extends GetxController final data = await SqfliteApi.getMeetingDetails(id); meetingData.value = MeetingModel.fromJson(data); meetingDetails.value = MeetingDetailsModel.fromJson(data['details']); - if (meetingDetails.value.summary.isNotEmpty) { + if (meetingDetails.value.tasktype >= 3) { dragOffset.value = 0; isTop.value = true; } @@ -129,7 +129,7 @@ class MeetingDetailsController extends GetxController lottieController.stop(); } }); - if (meetingDetails.value.tasktype == 1) { + if (meetingDetails.value.tasktype >= 2) { List speakerList = await SqfliteApi.getMeetingSpeaker(id); textList.value = List.from(speakerList); } @@ -177,8 +177,7 @@ class MeetingDetailsController extends GetxController } void summaryCreate() async { - EasyLoading.show(); - if (meetingDetails.value.tasktype != 1) { + if (meetingDetails.value.tasktype == 0) { await _audioSpeaker(); } if (allText.isEmpty) { @@ -192,7 +191,6 @@ class MeetingDetailsController extends GetxController allText = text; } await _aiServiceSummary(); - EasyLoading.dismiss(); } Future _aiServiceSummary() async { @@ -202,12 +200,14 @@ class MeetingDetailsController extends GetxController {'role': 'user', 'content': allText}, ], ); - SqfliteApi.editMeeting(id, {'summary': summaryText}); + SqfliteApi.editMeeting(id, {'tasktype': 3, 'summary': summaryText}); + meetingDetails.value.tasktype = 3; meetingDetails.value.summary = summaryText; meetingDetails.refresh(); } Future _audioSpeaker() async { + EasyLoading.show(); String audiourl = meetingData.value.audiourl; if (audiourl.isEmpty) { audiourl = await UploadOss.upload( @@ -219,9 +219,12 @@ class MeetingDetailsController extends GetxController String taskId = meetingDetails.value.taskid; if (taskId.isEmpty) { taskId = await _submitTask(audiourl); + await SqfliteApi.editMeeting(id, {'tasktype': 1, 'taskid': taskId}); meetingDetails.value.taskid = taskId; - await SqfliteApi.editMeeting(id, {'taskid': taskId}); + meetingDetails.value.tasktype = 1; + meetingDetails.refresh(); } + EasyLoading.dismiss(); await _fileRecognize(taskId); } @@ -354,10 +357,10 @@ class MeetingDetailsController extends GetxController } var result = await SqfliteApi.insertMeetingSpeaker(list); if (result != null) { - await SqfliteApi.editMeeting(id, {'tasktype': 1, 'personnel': personnel}); + await SqfliteApi.editMeeting(id, {'tasktype': 2, 'personnel': personnel}); List speakerList = await SqfliteApi.getMeetingSpeaker(id); textList.value = List.from(speakerList); - meetingDetails.value.tasktype = 1; + meetingDetails.value.tasktype = 2; meetingDetails.value.personnel = personnel; meetingDetails.refresh(); } diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index 11a1049ef..b39309d67 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -3,6 +3,7 @@ import 'package:common_utils/common_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:lottie/lottie.dart'; import '../../../core/theme/app_colors.dart'; import '../controllers/meeting_details_controller.dart'; @@ -238,12 +239,29 @@ class MeetingDetailsView extends GetView { physics: const NeverScrollableScrollPhysics(), children: [ const OverviewTab(), - const SpeechTab(), - const SummaryTab(), Obx( - () => controller.meetingDetails.value.summary.isNotEmpty + () => controller.meetingDetails.value.tasktype == 1 + ? _meetingWait('正在转写...') + : const SpeechTab(), + ), + Obx( + () => controller.meetingDetails.value.tasktype == 1 || + controller.meetingDetails.value.tasktype == 2 + ? _meetingWait( + controller.meetingDetails.value.tasktype == 1 + ? '正在转写...' + : '正在总结...') + : const SummaryTab(), + ), + Obx( + () => controller.meetingDetails.value.tasktype >= 3 ? const MindMapTab() - : const SizedBox(), + : controller.meetingDetails.value.tasktype == 0 + ? const SizedBox() + : _meetingWait( + controller.meetingDetails.value.tasktype == 1 + ? '正在转写...' + : '正在总结...'), ), ], ), @@ -253,6 +271,28 @@ class MeetingDetailsView extends GetView { ); } + Widget _meetingWait(String title) { + return Stack( + alignment: Alignment.topCenter, + children: [ + Lottie.asset( + 'assets/lottie/meeting_wait.json', + ), + Positioned( + top: 320.w, + child: Text( + title, + style: TextStyle( + fontSize: 18.sp, + color: Colors.black87, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ); + } + Widget _soundWave(bool isDarkMode) { return Obx( () => SizedBox( diff --git a/lib/modules/meeting/views/speech_tab.dart b/lib/modules/meeting/views/speech_tab.dart index adcecc391..8c043cfa5 100644 --- a/lib/modules/meeting/views/speech_tab.dart +++ b/lib/modules/meeting/views/speech_tab.dart @@ -249,7 +249,7 @@ class SpeechTab extends GetView { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - if (controller.meetingDetails.value.tasktype == 1 && + if (controller.meetingDetails.value.tasktype >= 2 && !controller.isSpeakerText.value) _button( Icons.edit, @@ -260,7 +260,7 @@ class SpeechTab extends GetView { controller.isTop.value = true; }, ), - if (controller.meetingDetails.value.tasktype == 1 && + if (controller.meetingDetails.value.tasktype >= 2 && !controller.isSpeakerText.value) _button( Icons.supervisor_account, @@ -278,7 +278,7 @@ class SpeechTab extends GetView { ); }, ), - if (controller.meetingDetails.value.tasktype != 1) + if (controller.meetingDetails.value.tasktype == 0) SizedBox( width: 150.w, child: _button( diff --git a/lib/modules/meeting/views/summary_tab.dart b/lib/modules/meeting/views/summary_tab.dart index 61c9c0b7e..65fe8b17e 100644 --- a/lib/modules/meeting/views/summary_tab.dart +++ b/lib/modules/meeting/views/summary_tab.dart @@ -293,7 +293,7 @@ class _SummaryTabState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - if (_controller.meetingDetails.value.summary.isNotEmpty) + if (_controller.meetingDetails.value.tasktype >= 3) _button( Icons.supervisor_account, '编辑发言者', @@ -310,7 +310,7 @@ class _SummaryTabState extends State { ); }, ), - if (_controller.meetingDetails.value.summary.isEmpty) + if (_controller.meetingDetails.value.tasktype == 0) SizedBox( width: 150.w, child: _button( From 6073e0f7348d649fad6b111aa28bd36a5257cc5b Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Wed, 28 May 2025 16:54:43 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=AE=E7=9B=98?= =?UTF-8?q?=E5=BC=B9=E5=87=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/controllers/meeting_details_controller.dart | 7 ++++++- lib/modules/meeting/views/speaker_all_bottom_sheet.dart | 6 +----- lib/modules/meeting/views/speaker_bottom_sheet.dart | 6 +----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 40a127ccf..9bab0f952 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -133,6 +133,10 @@ class MeetingDetailsController extends GetxController List speakerList = await SqfliteApi.getMeetingSpeaker(id); textList.value = List.from(speakerList); } + if (meetingDetails.value.tasktype == 1 || + meetingDetails.value.tasktype == 2) { + summaryCreate(); + } isLoading.value = false; } @@ -177,7 +181,7 @@ class MeetingDetailsController extends GetxController } void summaryCreate() async { - if (meetingDetails.value.tasktype == 0) { + if (meetingDetails.value.tasktype <= 1) { await _audioSpeaker(); } if (allText.isEmpty) { @@ -190,6 +194,7 @@ class MeetingDetailsController extends GetxController } allText = text; } + if (allText.isEmpty) return; await _aiServiceSummary(); } diff --git a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart b/lib/modules/meeting/views/speaker_all_bottom_sheet.dart index c73e1575d..93b89c0f3 100644 --- a/lib/modules/meeting/views/speaker_all_bottom_sheet.dart +++ b/lib/modules/meeting/views/speaker_all_bottom_sheet.dart @@ -87,11 +87,7 @@ class _SpeakerAllBottomSheetState extends State { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only( - left: 12.w, - right: 12.w, - bottom: MediaQuery.of(context).viewInsets.bottom, - ), + padding: EdgeInsets.symmetric(horizontal: 12.w), child: Column( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/modules/meeting/views/speaker_bottom_sheet.dart b/lib/modules/meeting/views/speaker_bottom_sheet.dart index 94c6130cd..0a0a40871 100644 --- a/lib/modules/meeting/views/speaker_bottom_sheet.dart +++ b/lib/modules/meeting/views/speaker_bottom_sheet.dart @@ -58,11 +58,7 @@ class _SpeakerBottomSheetState extends State { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only( - left: 12.w, - right: 12.w, - bottom: MediaQuery.of(context).viewInsets.bottom, - ), + padding: EdgeInsets.symmetric(horizontal: 12.w), child: Column( mainAxisSize: MainAxisSize.min, children: [ From de92fe21642b2f01be07b9a09a6dcc7cd1d2735d Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Thu, 29 May 2025 10:52:56 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=95=86=E5=8A=A1?= =?UTF-8?q?=E4=BC=9A=E8=AE=AE=E5=8A=A9=E6=89=8B=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/data/services/db/sqflite_api.dart | 16 ++++++- .../controllers/meeting_controller.dart | 1 + .../meeting_details_controller.dart | 16 +++++++ lib/modules/meeting/model/meeting_model.dart | 3 ++ .../meeting/views/meeting_details_view.dart | 13 +++--- lib/modules/meeting/views/meeting_view.dart | 42 +++++++++++++------ 6 files changed, 72 insertions(+), 19 deletions(-) diff --git a/lib/data/services/db/sqflite_api.dart b/lib/data/services/db/sqflite_api.dart index faf8c639b..3e13d639a 100644 --- a/lib/data/services/db/sqflite_api.dart +++ b/lib/data/services/db/sqflite_api.dart @@ -7,12 +7,25 @@ class SqfliteApi { // 获取商务会议助手列表 static Future getMeetingList(int page) async { final db = await DatabaseHelper().database; - return await db.query( + List> dataList = []; + List meetingList = await db.query( 'meeting', limit: 10, offset: (page - 1) * 10, orderBy: 'creationtime DESC', ); + for (var element in meetingList) { + final List detailsList = await db.query( + 'meetingdetails', + where: 'meetingid = ?', + whereArgs: [element['id']], + ); + dataList.add({ + ...element, + 'tasktype': detailsList.first['tasktype'], + }); + } + return dataList; } // 获取商务会议助手详情 @@ -27,6 +40,7 @@ class SqfliteApi { ); return { ...meetingList.first, + 'tasktype': detailsList.first['tasktype'], 'details': detailsList.first }; } diff --git a/lib/modules/meeting/controllers/meeting_controller.dart b/lib/modules/meeting/controllers/meeting_controller.dart index 8b2550838..520225296 100644 --- a/lib/modules/meeting/controllers/meeting_controller.dart +++ b/lib/modules/meeting/controllers/meeting_controller.dart @@ -85,6 +85,7 @@ class MeetingController extends GetxController { if (meetingId != null) { dataList.insert(0, { 'id': meetingId, + 'tasktype': 0, ...data, }); } diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 9bab0f952..ebec7e774 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -16,6 +16,7 @@ import '../../../data/services/db/sqflite_api.dart'; import '../../../data/services/deapsound_ai_service.dart'; import '../model/meeting_details_model.dart'; import '../model/meeting_model.dart'; +import 'meeting_controller.dart'; class MeetingDetailsController extends GetxController with GetTickerProviderStateMixin { @@ -24,6 +25,8 @@ class MeetingDetailsController extends GetxController late AnimationController lottieController; + final _meetingController = Get.find(); + final PlayerController playerController = PlayerController(); RxBool isTop = false.obs; RxInt durationMax = 0.obs; @@ -89,6 +92,19 @@ class MeetingDetailsController extends GetxController super.onClose(); } + void popInvokedWithResult(didPop, result) { + if (meetingData.value.tasktype != meetingDetails.value.tasktype) { + int index = + _meetingController.dataList.indexWhere((item) => item['id'] == id); + if (index != -1) { + final dataMap = + Map.from(_meetingController.dataList[index]); + dataMap['tasktype'] = meetingDetails.value.tasktype; + _meetingController.dataList[index] = dataMap; + } + } + } + void _getAgent() async { final GetStorage storage = GetStorage(); Map userInfo = storage.read("user_info"); diff --git a/lib/modules/meeting/model/meeting_model.dart b/lib/modules/meeting/model/meeting_model.dart index b3b2a7869..186237cb5 100644 --- a/lib/modules/meeting/model/meeting_model.dart +++ b/lib/modules/meeting/model/meeting_model.dart @@ -7,6 +7,7 @@ class MeetingModel { late int seconds; late String filepath; late String audiourl; + late int tasktype; late int creationtime; factory MeetingModel.fromJson(Map map) => MeetingModel() @@ -16,6 +17,7 @@ class MeetingModel { ..seconds = map["seconds"] ..filepath = map["filepath"] ..audiourl = map["audiourl"] + ..tasktype = map["tasktype"] ..creationtime = map["creationtime"]; Map toJson() { @@ -26,6 +28,7 @@ class MeetingModel { data['seconds'] = seconds; data['filepath'] = filepath; data['audiourl'] = audiourl; + data['tasktype'] = tasktype; data['creationtime'] = creationtime; return data; } diff --git a/lib/modules/meeting/views/meeting_details_view.dart b/lib/modules/meeting/views/meeting_details_view.dart index b39309d67..5ce0b6cbc 100644 --- a/lib/modules/meeting/views/meeting_details_view.dart +++ b/lib/modules/meeting/views/meeting_details_view.dart @@ -19,11 +19,14 @@ class MeetingDetailsView extends GetView { Widget build(BuildContext context) { final isDarkMode = Theme.of(context).brightness == Brightness.dark; - return Obx( - () => Scaffold( - backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], - appBar: _buildAppBar(isDarkMode), - body: _buildBody(isDarkMode), + return PopScope( + onPopInvokedWithResult: controller.popInvokedWithResult, + child: Obx( + () => Scaffold( + backgroundColor: isDarkMode ? Colors.black : Colors.grey[50], + appBar: _buildAppBar(isDarkMode), + body: _buildBody(isDarkMode), + ), ), ); } diff --git a/lib/modules/meeting/views/meeting_view.dart b/lib/modules/meeting/views/meeting_view.dart index 8fbf34fbb..ae73e9ac8 100644 --- a/lib/modules/meeting/views/meeting_view.dart +++ b/lib/modules/meeting/views/meeting_view.dart @@ -140,20 +140,36 @@ class MeetingView extends GetView { ], ), ), - Container( - padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 2.w), - margin: EdgeInsets.only(top: 5.w), - decoration: BoxDecoration( - color: isDarkMode ? Colors.grey[900] : Colors.grey[100], - borderRadius: BorderRadius.circular(4.w), - ), - child: Text( - data.type, - style: TextStyle( - color: isDarkMode ? Colors.grey[400] : Colors.grey[600], - fontSize: 10.sp, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 2.w), + margin: EdgeInsets.only(top: 5.w), + decoration: BoxDecoration( + color: isDarkMode ? Colors.grey[900] : Colors.grey[100], + borderRadius: BorderRadius.circular(4.w), + ), + child: Text( + data.type, + style: TextStyle( + color: isDarkMode ? Colors.grey[400] : Colors.grey[600], + fontSize: 10.sp, + ), + ), ), - ), + if (data.tasktype == 1 || data.tasktype == 2) + Padding( + padding: EdgeInsets.only(top: 5.w), + child: Text( + data.tasktype == 1 ? '正在生成...' : '已生成', + style: TextStyle( + color: Colors.blue, + fontSize: 10.sp, + ), + ), + ), + ], ), ], ),