From ad660bec119e300419c3e4309c55428ca476e127 Mon Sep 17 00:00:00 2001 From: "1147192855@qq.com" <1147192855@qq.com> Date: Fri, 10 May 2024 19:26:59 +0800 Subject: [PATCH] no message --- .../model/marking/marking_text_question.dart | 34 ++++++------- .../lib/components/PictureOverview.dart | 50 ++++++++++++++++--- marking_app/lib/pages/marking/do_papers.dart | 23 ++++++--- 3 files changed, 73 insertions(+), 34 deletions(-) diff --git a/marking_app/lib/common/model/marking/marking_text_question.dart b/marking_app/lib/common/model/marking/marking_text_question.dart index f206ab9..12adc1c 100644 --- a/marking_app/lib/common/model/marking/marking_text_question.dart +++ b/marking_app/lib/common/model/marking/marking_text_question.dart @@ -96,9 +96,9 @@ class MarkingTextQuestion extends Object { @JsonKey(name: 'papersUrlStr') List? papersUrlStr; - // 批注图片 预提交集合 - @JsonKey(name: 'commentImageUrlTodo') - List? commentImageUrlTodo; + // // 批注图片 预提交集合 + // @JsonKey(name: 'commentImageUrlTodo') + // List? commentImageUrlTodo; // 批注图片Map @JsonKey(name: 'commentImageUrlMap') @@ -115,8 +115,8 @@ class MarkingTextQuestion extends Object { @JsonKey(name: 'historicalScorings') List? historicalScorings; - MarkingTextQuestion(this.id, this.totalScore, this.isFinish, this.subQuestionDetailList, this.isException, - this.questionNum, this.score, this.studentAnswerList, + MarkingTextQuestion( + this.id, this.totalScore, this.isFinish, this.subQuestionDetailList, this.isException, this.questionNum, this.score, this.studentAnswerList, // this.questionIndex, {required this.commentImageUrl, required this.lastOne, @@ -130,7 +130,7 @@ class MarkingTextQuestion extends Object { // this.totalCount = 0, // this.currentIndex = 0, this.papersUrl = const [], - this.commentImageUrlTodo, + // this.commentImageUrlTodo, this.commentImageUrlMap = const {}}) { score = isFinish ? score : null; completeRating = isFinish && score != null; @@ -140,14 +140,20 @@ class MarkingTextQuestion extends Object { commentImageUrlMap = Map(); if (commentImageUrl.isNotEmpty) { - for (var element in commentImageUrl) { - commentImageUrlMap[element] = '$element?${DateTime.now().millisecondsSinceEpoch}'; + // for (var element in commentImageUrl) { + // commentImageUrlMap[element] = '$element?${DateTime.now().millisecondsSinceEpoch}'; + // } + for (var i = 0; i < commentImageUrl.length; i++) { + var element = commentImageUrl[i]; + var originalImage = studentAnswerList[i]; + commentImageUrlMap[originalImage] = '$element?${DateTime.now().millisecondsSinceEpoch}'; } } else { for (var element in studentAnswerList) { commentImageUrlMap[element] = element; } } + // if (historicalScore != null) { // this.historicalScorings = (jsonDecode(historicalScore!) as List).map((e) { // return HistoricalScoring.fromJson(e as Map); @@ -165,10 +171,6 @@ class MarkingTextQuestion extends Object { factory MarkingTextQuestion.fromJson(Map srcJson) => _$MarkingTextQuestionFromJson(srcJson); List getImageData() { - if (commentImageUrlTodo != null && commentImageUrlTodo!.isNotEmpty) { - return commentImageUrlTodo!; - } - if (commentImageUrl.isNotEmpty) { return commentImageUrl; } @@ -178,10 +180,8 @@ class MarkingTextQuestion extends Object { bool setImageList(String resImage, int imageIndex) { try { - commentImageUrlTodo ??= getImageData().map((e) => e).toList(); String oldImage = studentAnswerList[imageIndex]; commentImageUrlMap[oldImage] = '$resImage?${DateTime.now().millisecondsSinceEpoch}'; - commentImageUrlTodo![imageIndex] = resImage; return true; } catch (e) { return false; @@ -220,11 +220,7 @@ class SubQuestions extends Object { bool completeRating; SubQuestions( - {required this.subQuestionScore, - required this.subQuestionNum, - this.subQuestionGotScore, - required this.isFinish, - this.completeRating = false}) { + {required this.subQuestionScore, required this.subQuestionNum, this.subQuestionGotScore, required this.isFinish, this.completeRating = false}) { subQuestionGotScore = isFinish ? subQuestionGotScore : null; completeRating = isFinish && subQuestionGotScore != null; } diff --git a/marking_app/lib/components/PictureOverview.dart b/marking_app/lib/components/PictureOverview.dart index 2498ef7..8c89dbb 100644 --- a/marking_app/lib/components/PictureOverview.dart +++ b/marking_app/lib/components/PictureOverview.dart @@ -30,6 +30,7 @@ import 'package:marking_app/common/model/job/upload_file_interface_config_params import 'package:marking_app/common/model/marking/annotation_graffiti_switch.dart'; import 'package:marking_app/common/model/marking/do_marking_keyboard_model.dart'; import 'package:marking_app/common/model/marking/marking_history_zoom_info.dart'; +import 'package:marking_app/common/model/marking/marking_text_question.dart'; import 'package:marking_app/common/model/marking/switch_keyboard_to_reload_images.dart'; import 'package:marking_app/pages/common/event_bus_mixin.dart'; import 'package:marking_app/pages/homework_correction/hooks/use_cached_img_refresh.dart'; @@ -69,6 +70,7 @@ class PictureOverview extends StatefulHookConsumerWidget { final bool annotationsFlag; final String testQuestionNumber; final Map commentImageMap; + final MarkingTextQuestion data; const PictureOverview({ required this.imageItems, @@ -77,6 +79,7 @@ class PictureOverview extends StatefulHookConsumerWidget { required this.testQuestionNumber, required this.questionNum, required this.markingUserId, + required this.data, this.homework = false, this.imageScale = 1, this.imagePosition, @@ -87,7 +90,7 @@ class PictureOverview extends StatefulHookConsumerWidget { PictureOverviewState createState() => PictureOverviewState(); } -class PictureOverviewState extends ConsumerState with CommonMixin { +class PictureOverviewState extends ConsumerState with CommonMixin, EventBusMixin { final GlobalKey theglobalKey = GlobalKey(); final GlobalKey<_ExamPaperDrawingState> examPaperDrawingKey = GlobalKey<_ExamPaperDrawingState>(); final GlobalKey zoomGlobalKey = GlobalKey(); // zoom @@ -132,11 +135,39 @@ class PictureOverviewState extends ConsumerState with CommonMix graffitiSwitch = state; toUpState(setState, () {}, mounted); }); + + // 事件总线监听 清空数据 + eventOn(callback: (BottomAnnotationSwitchCleanallOfMarking item) async { + if (ref.read(drawMarkingProvider).data.isEmpty) { + if (widget.data.commentImageUrl.isNotEmpty) { + bool? res = await showDialog( + // 表示点击灰色背景的时候是否消失弹出框 + barrierDismissible: false, + context: context, + builder: (context1) { + return AlertDialog(content: quickText("是否撤销上次批注痕迹"), actions: [ + TextButton(child: quickText("取消"), onPressed: () => Navigator.pop(context1, false)), + TextButton(child: quickText("确定", color: Theme.of(context).primaryColor), onPressed: () => Navigator.pop(context1, true)) + ]); + }, + ); + if (res == true) { + widget.data.commentImageUrl.removeAt(currentIndex); + var theUrl = widget.imageItems[currentIndex]; + widget.commentImageMap[theUrl] = theUrl; + toUpState(setState, () {}, mounted); + } + } else { + ToastUtils.showInfo('批注已清空'); + } + } + }); } @override void dispose() { _annotationsListener(); + eventCancel(); try { _imageStream?.removeListener(_imageStreamListener!); if (temFile != null) { @@ -156,9 +187,12 @@ class PictureOverviewState extends ConsumerState with CommonMix // 没有图片就上传图片 RenderRepaintBoundary? boundary = theglobalKey.currentContext!.findRenderObject() as RenderRepaintBoundary?; if (boundary == null) return null; - double dpr = MediaQuery.of(context).devicePixelRatio; - // double dpr = ui.window.devicePixelRatio; - ui.Image image = await boundary.toImage(pixelRatio: dpr); + // double dpr = MediaQuery.of(context).devicePixelRatio; + + double pixelRatio = MediaQuery.of(context).devicePixelRatio; + if (imagInfoModel?.pixelRatio != null) pixelRatio = imagInfoModel!.pixelRatio; + + ui.Image image = await boundary.toImage(pixelRatio: pixelRatio); ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); if (byteData == null) { /// 等于null 已经是异常了 @@ -172,8 +206,11 @@ class PictureOverviewState extends ConsumerState with CommonMix temFile = file; } - crypto.Digest fileMd5 = crypto.md5.convert(await temFile!.readAsBytes()); + if (imagInfoModel != null) { + // 剪切图片 + } + crypto.Digest fileMd5 = crypto.md5.convert(await temFile!.readAsBytes()); RestClient _client = await getClient(); BaseStructureResult resUploadConfig = await _client.getUploadFile(UploadFileInterfaceConfigParams( fileName: '1.png', @@ -459,7 +496,6 @@ class _ExamPaperDrawingState extends ConsumerState with EventB eventOn(callback: (BottomAnnotationSwitchCleanallOfMarking item) { if (item.previousStep) { if (ref.read(drawMarkingProvider).data.isEmpty) { - ToastUtils.showInfo('批注已清空'); return; } var index = pointsPureData.toList().lastIndexOf(null); @@ -508,7 +544,7 @@ class _ExamPaperDrawingState extends ConsumerState with EventB isComplex: true, willChange: true, foregroundPainter: DrawingPainter(ctrl: _vnHandWritings), - child: RepaintBoundary(child: widget.child), + child: widget.child, ), ); } diff --git a/marking_app/lib/pages/marking/do_papers.dart b/marking_app/lib/pages/marking/do_papers.dart index 953b02e..27cec61 100644 --- a/marking_app/lib/pages/marking/do_papers.dart +++ b/marking_app/lib/pages/marking/do_papers.dart @@ -28,6 +28,7 @@ import 'package:marking_app/common/model/common/base_structure_result.dart'; import 'package:marking_app/common/model/common/upload_img_secret_key.dart'; import 'package:marking_app/common/model/enum/KeyboardType.dart'; import 'package:marking_app/common/model/enum/marking_list_type.dart'; +import 'package:marking_app/common/model/enum/review_marks_bottom_btns_enum.dart'; import 'package:marking_app/common/model/marking/current_review_task.dart'; import 'package:marking_app/common/model/marking/do_marking_keyboard_model.dart'; import 'package:marking_app/common/model/marking/keyboard_assist_event.dart'; @@ -52,6 +53,8 @@ import 'package:marking_app/components/marking/review_records_view.dart'; import 'package:marking_app/components/marking/selectable_keyboard_bottom.dart'; import 'package:marking_app/pages/common/event_bus_mixin.dart'; import 'package:marking_app/pages/marking/hooks/use_zoomImage_history_utils.dart'; +import 'package:marking_app/pages/marking/provider/do_paper_bottom_review_marks_provider.dart'; +import 'package:marking_app/pages/marking/provider/draw_marking_provider.dart'; import 'package:marking_app/pages/marking/provider/rating_progress_provider.dart'; import 'package:marking_app/provider/annotation_graffiti_switch_provider.dart'; import 'package:marking_app/provider/do_marking_provider.dart'; @@ -158,6 +161,10 @@ class _MarkingPapersState extends ConsumerState fToast.init(context); Future.delayed(const Duration(seconds: 0)).then((onValue) { ref.read(annotationGraffitiSwitchProvider.notifier).init(); + // 重置批阅痕迹 + ref.read(drawMarkingProvider.notifier).setState(DrawMarkingVal([], [])); + // 重置批阅动作按钮 + ref.read(doPaperBottomReviewMarksProvider.notifier).setState(ReviewMarksBottomBtnsEnum.DRAG); }); // 批注监听 @@ -460,15 +467,10 @@ class _MarkingPapersState extends ConsumerState RestClient client = await getClient(); String? commentImageUrlStr; - List? commentImageUrl = currentQuestion?.commentImageUrlTodo; - if (commentImageUrl?.isEmpty ?? true) commentImageUrl = currentQuestion?.commentImageUrl; + List? commentImageUrl = + (currentQuestion?.commentImageUrl.isNotEmpty ?? false) || res?.url != null ? currentQuestion?.commentImageUrlMap.values.toList() : null; if (commentImageUrl?.isNotEmpty ?? false) commentImageUrlStr = jsonEncode(commentImageUrl); - // bool excessContinue = - // _currentTab?.agreementExcess == null ? true : _currentTab!.agreementExcess!; // 如果没有询问默认为true 如果询问了 就已询问为主 - bool isExit = false; - MarkingTextQuestionTab? nextTag; - BaseStructureResult result = await client.submitTestQuestionsOfExam(SubmitExamParams( widget.markingUserId, detailId, @@ -1124,6 +1126,10 @@ class _MarkingPapersState extends ConsumerState setTimeOut(300, () => ToastUtils.showError('请求错诶,请重试')); throw Error(); } + // 重置批阅动作 + ref.read(doPaperBottomReviewMarksProvider.notifier).setState(ReviewMarksBottomBtnsEnum.DRAG); + // 重置批阅痕迹 + ref.read(drawMarkingProvider.notifier).setState(DrawMarkingVal([], [])); currentQuestion = result.data; if (temTab != null) { result.data!.scoreInterval = temTab.scoreInterval ?? 1; @@ -1919,6 +1925,7 @@ class _MarkingPapersState extends ConsumerState // margin: EdgeInsets.only(top: 6.h), padding: EdgeInsets.symmetric(horizontal: 1.w), child: PictureOverview( + data: data, questionNum: data.questionNum, markingUserId: widget.markingUserId, key: pictureOverviewKey, @@ -1927,7 +1934,7 @@ class _MarkingPapersState extends ConsumerState annotationsFlag: annotationSwitch, commentImageMap: data.commentImageUrlMap, testQuestionNumber: widget.markingUserId.toString() + '-' + data.questionNum, - imageItems: data.getImageData(), + imageItems: data.studentAnswerList, ), ),