Browse Source

修改会议记录模版

weicu
tanlongsheng 12 months ago
parent
commit
83d1b8fc0a
  1. 4
      lib/modules/meeting/controllers/meeting_details_controller.dart
  2. 37
      lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart
  3. 39
      lib/modules/meeting/views/template/template_all_view.dart
  4. 184
      lib/modules/meeting/views/template/template_details_view.dart
  5. 86
      lib/modules/meeting/views/template/template_edit_view.dart
  6. 73
      lib/modules/meeting/views/template/template_view.dart

4
lib/modules/meeting/controllers/meeting_details_controller.dart

@ -69,6 +69,10 @@ class MeetingDetailsController extends GetxController
RxBool isDownload = false.obs;
RxDouble downloadProgress = 0.0.obs;
List categoryTemplateList = [];
Map editTemplate = {};
int deleteTemplateId = 0;
@override
void onInit() {
super.onInit();

37
lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart

@ -46,7 +46,6 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
'auto_fix_high': Icons.auto_fix_high,
};
List _categoryTemplateList = [];
List _originalTemplate = [];
Map _templateData = {};
@ -60,10 +59,13 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
}
void _getTemplate() async {
_categoryTemplateList = await SqfliteApi.getMeetingCategoryTemplateList();
_controller.categoryTemplateList =
await SqfliteApi.getMeetingCategoryTemplateList();
_controller.editTemplate = {};
_controller.deleteTemplateId = 0;
_lastTemplateData = _storage.read("meeting_last_template_Data") ?? {};
_originalTemplate = _storage.read("meeting_template_list") ??
_categoryTemplateList[0]['template'];
_controller.categoryTemplateList[0]['template'];
if (_lastTemplateData.isNotEmpty) {
_templateData = _lastTemplateData;
} else {
@ -162,7 +164,6 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
() => TemplateView(
_templateData,
_lastTemplateData['id'] ?? 0,
_categoryTemplateList,
),
preventDuplicates: false,
);
@ -182,6 +183,34 @@ class _GenerateBottomSheetState extends State<GenerateBottomSheet> {
_templateList = list;
});
}
if (_controller.editTemplate.isNotEmpty) {
Map? editMap = _templateList.firstWhere(
(element) =>
element['id'] == _controller.editTemplate['id'],
orElse: () => null);
if (editMap != null) {
editMap['name'] = _controller.editTemplate['name'];
editMap['desc'] = _controller.editTemplate['desc'];
editMap['prompt'] = _controller.editTemplate['prompt'];
}
if (_controller.editTemplate['id'] == _templateData['id']) {
_templateData['name'] = _controller.editTemplate['name'];
_templateData['desc'] = _controller.editTemplate['desc'];
_templateData['prompt'] =
_controller.editTemplate['prompt'];
}
setState(() {});
}
if (_controller.deleteTemplateId != 0) {
_templateList.removeWhere((element) =>
element['id'] == _controller.deleteTemplateId);
if (_controller.deleteTemplateId == _templateData['id']) {
_templateData = _templateList[0];
}
setState(() {});
_storage.write("meeting_last_template_Data", {});
_storage.write("meeting_template_list", _templateList);
}
},
child: Row(
children: [

39
lib/modules/meeting/views/template/template_all_view.dart

@ -3,6 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../../../data/services/db/sqflite_api.dart';
import '../../controllers/meeting_details_controller.dart';
import 'template_details_view.dart';
class TemplateAllView extends StatefulWidget {
final String title;
@ -19,6 +21,8 @@ class TemplateAllView extends StatefulWidget {
}
class _TemplateAllViewState extends State<TemplateAllView> {
final _controller = Get.find<MeetingDetailsController>();
final Map _icons = {
'auto_stories': Icons.auto_stories,
'auto_graph': Icons.auto_graph,
@ -47,7 +51,7 @@ class _TemplateAllViewState extends State<TemplateAllView> {
_getTemplate();
}
void _getTemplate() async {
Future _getTemplate() async {
List list = await SqfliteApi.getMeetingTemplateList(widget.categoryid);
List templateList = [];
for (var element in list) {
@ -245,6 +249,39 @@ class _TemplateAllViewState extends State<TemplateAllView> {
),
),
),
Positioned(
top: 0,
right: 0,
child: GestureDetector(
onTap: () async {
await Get.to(() => TemplateDetailsView(template,
isEdit: widget.title == '自定义'));
if (_controller.editTemplate.isNotEmpty) {
await _getTemplate();
if (_controller.editTemplate['id'] == _templateData['id']) {
_templateData['name'] = _controller.editTemplate['name'];
_templateData['desc'] = _controller.editTemplate['desc'];
_templateData['prompt'] =
_controller.editTemplate['prompt'];
}
}
if (_controller.deleteTemplateId != 0) {
await _getTemplate();
if (_controller.deleteTemplateId == _templateData['id']) {
_templateData = {};
}
}
},
child: Padding(
padding: EdgeInsets.all(10.w),
child: Icon(
Icons.fullscreen,
color: Colors.grey[600],
size: 26.w,
),
),
),
),
if (widget.lastTemplateId == template['id'])
Positioned(
top: 0,

184
lib/modules/meeting/views/template/template_details_view.dart

@ -3,10 +3,31 @@ import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
class TemplateDetailsView extends StatelessWidget {
import '../../../../data/services/db/sqflite_api.dart';
import '../../../../data/services/network/api.dart';
import '../../controllers/meeting_details_controller.dart';
import 'template_edit_view.dart';
class TemplateDetailsView extends StatefulWidget {
final Map data;
final bool isEdit;
const TemplateDetailsView(this.data, {super.key, this.isEdit = false});
@override
State<TemplateDetailsView> createState() => _TemplateDetailsViewState();
}
class _TemplateDetailsViewState extends State<TemplateDetailsView> {
final _controller = Get.find<MeetingDetailsController>();
Map _templateData = {};
const TemplateDetailsView(this.data, {super.key});
@override
void initState() {
super.initState();
_templateData = widget.data;
}
@override
Widget build(BuildContext context) {
@ -55,7 +76,7 @@ class TemplateDetailsView extends StatelessWidget {
Padding(
padding: EdgeInsets.only(top: 20.w),
child: Text(
data['name'],
_templateData['name'],
style: TextStyle(
fontSize: 20.sp,
fontWeight: FontWeight.bold,
@ -75,7 +96,7 @@ class TemplateDetailsView extends StatelessWidget {
Wrap(
spacing: 5.w,
children: List.generate(
data['tag'].length,
_templateData['tag'].length,
(int idx) {
return Container(
padding:
@ -85,7 +106,7 @@ class TemplateDetailsView extends StatelessWidget {
borderRadius: BorderRadius.circular(4.r),
),
child: Text(
data['tag'][idx],
_templateData['tag'][idx],
style: TextStyle(
fontSize: 10.sp,
color: Colors.grey[600],
@ -106,7 +127,7 @@ class TemplateDetailsView extends StatelessWidget {
),
),
Text(
data['desc'],
_templateData['desc'],
style: TextStyle(
fontSize: 14.sp,
color: Colors.grey[600],
@ -123,61 +144,130 @@ class TemplateDetailsView extends StatelessWidget {
),
),
MarkdownBody(
data: data['prompt'],
data: _templateData['prompt'],
),
],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w),
child: Row(
children: [
Expanded(
child: GestureDetector(
onTap: () {},
child: Container(
height: 48.w,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.r),
border: Border.all(
color: Colors.black,
if (widget.isEdit)
Padding(
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w),
child: Row(
children: [
Expanded(
child: GestureDetector(
onTap: () async {
var result = await Get.to(
() => TemplateEditView(data: _templateData));
if (result != null) {
setState(() {
_templateData['name'] = result['name'];
_templateData['desc'] = result['desc'];
_templateData['prompt'] = result['prompt'];
});
}
},
child: Container(
height: 48.w,
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.r),
border: Border.all(
color: Colors.black,
),
),
),
child: Text(
'修改',
style: TextStyle(
fontSize: 16.sp,
color: Colors.black,
child: Text(
'修改',
style: TextStyle(
fontSize: 16.sp,
color: Colors.black,
),
),
),
),
),
),
15.horizontalSpace,
Expanded(
child: GestureDetector(
onTap: () {},
child: Container(
height: 48.w,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(12.r),
),
child: Text(
'删除',
style: TextStyle(
fontSize: 16.sp,
color: Colors.white,
15.horizontalSpace,
Expanded(
child: GestureDetector(
onTap: () {
Get.dialog(
AlertDialog(
backgroundColor:
isDarkMode ? Colors.grey[900] : Colors.white,
title: Text(
'删除模版',
style: TextStyle(
color: isDarkMode ? Colors.white : Colors.black87,
),
),
content: Text(
'确定要删除当前模版吗?',
style: TextStyle(
color: isDarkMode
? Colors.grey[400]
: Colors.grey[600],
),
),
actions: [
TextButton(
onPressed: () => Get.back(),
child: Text(
'cancel'.tr,
style: TextStyle(
color: isDarkMode
? Colors.grey[400]
: Colors.grey[600],
),
),
),
TextButton(
onPressed: () async {
Get.back();
var response = await Api.delEchomeetTemplates({
'ids': [_templateData['id']],
});
if (response != null) {
await SqfliteApi.deleteMeetingTemplate(
_templateData['id']);
_controller.categoryTemplateList =
await SqfliteApi
.getMeetingCategoryTemplateList();
_controller.deleteTemplateId =
_templateData['id'];
Get.back();
}
},
child: Text(
'confirm'.tr,
style: const TextStyle(
color: Colors.red,
),
),
),
],
),
);
},
child: Container(
height: 48.w,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.red,
borderRadius: BorderRadius.circular(12.r),
),
child: Text(
'删除',
style: TextStyle(
fontSize: 16.sp,
color: Colors.white,
),
),
),
),
),
),
],
],
),
),
),
],
);
}

86
lib/modules/meeting/views/template/template_edit_view.dart

@ -2,18 +2,25 @@ import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../../../../data/services/db/sqflite_api.dart';
import '../../../../data/services/network/api.dart';
import '../../controllers/meeting_details_controller.dart';
class TemplateEditView extends StatefulWidget {
const TemplateEditView({super.key});
final Map? data;
final int? categoryid;
const TemplateEditView({super.key, this.data, this.categoryid});
@override
State<TemplateEditView> createState() => _TemplateEditViewState();
}
class _TemplateEditViewState extends State<TemplateEditView> {
final _controller = Get.find<MeetingDetailsController>();
final TextEditingController _nameController = TextEditingController();
final TextEditingController _descController = TextEditingController();
final TextEditingController _promptController = TextEditingController();
@ -23,6 +30,11 @@ class _TemplateEditViewState extends State<TemplateEditView> {
@override
void initState() {
super.initState();
if (widget.data != null) {
_nameController.text = widget.data?['name'];
_descController.text = widget.data?['desc'];
_promptController.text = widget.data?['prompt'];
}
}
@override
@ -61,7 +73,7 @@ class _TemplateEditViewState extends State<TemplateEditView> {
onPressed: () => Get.back(),
),
title: Text(
'创建模版',
widget.data != null ? '编辑模版' : '创建模版',
style: TextStyle(
fontSize: 17.sp,
fontWeight: FontWeight.w600,
@ -204,7 +216,7 @@ class _TemplateEditViewState extends State<TemplateEditView> {
void _submit() async {
EasyLoading.show();
Map data = {
"template": {
"template": <String, Object?>{
'ttype': '自定义',
'tags': '',
'icon': 'auto_fix_high',
@ -214,11 +226,71 @@ class _TemplateEditViewState extends State<TemplateEditView> {
'template': _promptController.text,
},
};
var response = await Api.addEchomeetTemplates(data);
if (response != null) {
print('----$response--------');
// await SqfliteApi.insertMeetingTemplate(data['template']);
if (widget.data != null) {
data['template']['id'] = widget.data?['id'];
var response = await Api.updateEchomeetTemplates(data);
if (response != null) {
await SqfliteApi.editMeetingTemplate(widget.data?['id'], {
'name': _nameController.text,
'desc': _descController.text,
'prompt': _promptController.text,
});
_controller.editTemplate = {
'id': widget.data?['id'],
'name': _nameController.text,
'desc': _descController.text,
'prompt': _promptController.text,
};
final GetStorage storage = GetStorage();
Map lastTemplateData = storage.read("meeting_last_template_Data") ?? {};
List originalTemplate = storage.read("meeting_template_list") ?? [];
if (lastTemplateData.isNotEmpty &&
lastTemplateData['id'] == widget.data?['id']) {
lastTemplateData['name'] = _nameController.text;
lastTemplateData['desc'] = _descController.text;
lastTemplateData['prompt'] = _promptController.text;
storage.write("meeting_last_template_Data", lastTemplateData);
}
if (originalTemplate.isNotEmpty) {
Map? originalMap = originalTemplate.firstWhere(
(element) => element['id'] == widget.data?['id'],
orElse: () => null);
if (originalMap != null) {
originalMap['name'] = _nameController.text;
originalMap['desc'] = _descController.text;
originalMap['prompt'] = _promptController.text;
storage.write("meeting_template_list", originalTemplate);
}
}
}
} else {
var response = await Api.addEchomeetTemplates(data);
if (response != null) {
await SqfliteApi.insertMeetingTemplate({
"id": response['template']['id'],
'categoryid': widget.categoryid,
'name': _nameController.text,
'icon': 'auto_fix_high',
'tag': '',
'desc': _descController.text,
'outline': '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。',
'prompt': _promptController.text,
});
_controller.editTemplate = {
'id': response['template']['id'],
'name': _nameController.text,
'desc': _descController.text,
'prompt': _promptController.text,
};
}
}
_controller.categoryTemplateList =
await SqfliteApi.getMeetingCategoryTemplateList();
Get.back(result: {
'name': _nameController.text,
'desc': _descController.text,
'prompt': _promptController.text,
});
EasyLoading.dismiss();
}
}

73
lib/modules/meeting/views/template/template_view.dart

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import '../../controllers/meeting_details_controller.dart';
import 'template_all_view.dart';
import 'template_details_view.dart';
import 'template_edit_view.dart';
@ -9,16 +10,16 @@ import 'template_edit_view.dart';
class TemplateView extends StatefulWidget {
final Map templateData;
final int lastTemplateId;
final List categoryList;
const TemplateView(this.templateData, this.lastTemplateId, this.categoryList,
{super.key});
const TemplateView(this.templateData, this.lastTemplateId, {super.key});
@override
State<TemplateView> createState() => _TemplateViewState();
}
class _TemplateViewState extends State<TemplateView> {
final _controller = Get.find<MeetingDetailsController>();
final Map _icons = {
'auto_stories': Icons.auto_stories,
'auto_graph': Icons.auto_graph,
@ -38,7 +39,7 @@ class _TemplateViewState extends State<TemplateView> {
'auto_fix_high': Icons.auto_fix_high,
};
final List _categoryTemplateList = [];
List _categoryTemplateList = [];
Map _templateData = {};
@override
@ -47,8 +48,9 @@ class _TemplateViewState extends State<TemplateView> {
_getTemplate();
}
void _getTemplate() async {
for (var element in widget.categoryList) {
void _getTemplate() {
_categoryTemplateList = [];
for (var element in _controller.categoryTemplateList) {
List templateList = [];
bool isAdd = false;
if (element['id'] == widget.templateData['categoryid']) {
@ -71,7 +73,28 @@ class _TemplateViewState extends State<TemplateView> {
'template': templateList,
});
}
_templateData = widget.templateData;
setState(() {
_templateData = widget.templateData;
});
}
void _returnCallback() {
if (_controller.editTemplate.isNotEmpty) {
_getTemplate();
if (_controller.editTemplate['id'] == _templateData['id']) {
_templateData['name'] = _controller.editTemplate['name'];
_templateData['desc'] = _controller.editTemplate['desc'];
_templateData['prompt'] = _controller.editTemplate['prompt'];
}
}
if (_controller.deleteTemplateId != 0) {
_getTemplate();
if (_controller.deleteTemplateId == _templateData['id']) {
_templateData = {};
}
_categoryTemplateList.last['template'].removeWhere(
(element) => element['id'] == _controller.deleteTemplateId);
}
}
@override
@ -127,13 +150,15 @@ class _TemplateViewState extends State<TemplateView> {
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w),
child: GestureDetector(
onTap: () {
Get.back(result: _templateData);
if (_templateData.isNotEmpty) {
Get.back(result: _templateData);
}
},
child: Container(
height: 48.w,
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.black,
color: _templateData.isNotEmpty ? Colors.black : Colors.grey,
borderRadius: BorderRadius.circular(12.r),
),
child: Text(
@ -155,13 +180,14 @@ class _TemplateViewState extends State<TemplateView> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector(
onTap: () {
Get.to(() => TemplateAllView(
onTap: () async {
await Get.to(() => TemplateAllView(
data['name'],
data['id'],
_templateData,
widget.lastTemplateId,
));
_returnCallback();
},
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.w),
@ -189,7 +215,7 @@ class _TemplateViewState extends State<TemplateView> {
child: isLast && data['template'].length == 0
? Padding(
padding: EdgeInsets.symmetric(horizontal: 8.w),
child: _createTemplate(),
child: _createTemplate(data['id']),
)
: ListView.builder(
itemCount: data['template'].length,
@ -200,11 +226,11 @@ class _TemplateViewState extends State<TemplateView> {
return isLast && index == 0
? Row(
children: [
_createTemplate(),
_template(template),
_createTemplate(data['id']),
_template(template, true),
],
)
: _template(template);
: _template(template, false);
},
),
),
@ -212,7 +238,7 @@ class _TemplateViewState extends State<TemplateView> {
);
}
Widget _template(Map template) {
Widget _template(Map template, bool isEdit) {
return Container(
width: 200.w,
margin: EdgeInsets.symmetric(horizontal: 4.w),
@ -309,8 +335,10 @@ class _TemplateViewState extends State<TemplateView> {
top: 0,
right: 0,
child: GestureDetector(
onTap: () {
Get.to(() => TemplateDetailsView(template));
onTap: () async {
await Get.to(
() => TemplateDetailsView(template, isEdit: isEdit));
_returnCallback();
},
child: Padding(
padding: EdgeInsets.all(10.w),
@ -371,10 +399,13 @@ class _TemplateViewState extends State<TemplateView> {
);
}
Widget _createTemplate() {
Widget _createTemplate(int categoryid) {
return GestureDetector(
onTap: () {
Get.to(() => const TemplateEditView());
onTap: () async {
await Get.to(() => TemplateEditView(categoryid: categoryid));
if (_controller.editTemplate.isNotEmpty) {
_getTemplate();
}
},
child: Container(
width: 200.w,

Loading…
Cancel
Save