diff --git a/.gitignore b/.gitignore index 16f39b3..64f504f 100644 --- a/.gitignore +++ b/.gitignore @@ -224,3 +224,4 @@ marking_app/lib/common/model/job/job_knowledge_detail_student.g.dart marking_app/lib/pages/homework_correction/job_home.g.dart marking_app/lib/common/model/marking/keyboard_assist_event.g.dart marking_app/lib/common/model/marking/marking_history_zoom_info.g.dart +marking_app/lib/common/model/job/job_handwriting.g.dart diff --git a/marking_app/lib/common/model/job/job_handwriting.dart b/marking_app/lib/common/model/job/job_handwriting.dart new file mode 100644 index 0000000..4d947fe --- /dev/null +++ b/marking_app/lib/common/model/job/job_handwriting.dart @@ -0,0 +1,55 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'job_handwriting.g.dart'; + +@JsonSerializable() +class JobHandwriting extends Object { + @JsonKey(name: 'lattices') + List lattices; + + @JsonKey(name: 'paperPicture') + String paperPicture; + + @JsonKey(name: 'pageNum') + int pageNum; + + @JsonKey(name: 'pageCount') + int pageCount; + + JobHandwriting( + this.lattices, + this.paperPicture, + this.pageNum, + this.pageCount, + ); + + factory JobHandwriting.fromJson(Map srcJson) => _$JobHandwritingFromJson(srcJson); + + Map toJson() => _$JobHandwritingToJson(this); +} + +@JsonSerializable() +class Lattices extends Object { + @JsonKey(name: 'stroke') + int stroke; + + @JsonKey(name: 'x') + int x; + + @JsonKey(name: 'y') + int y; + + @JsonKey(name: 'time') + int time; + + Lattices( + this.stroke, + this.x, + this.y, + this.time, + ); + + factory Lattices.fromJson(Map srcJson) => _$LatticesFromJson(srcJson); + + Map toJson() => _$LatticesToJson(this); +} diff --git a/marking_app/lib/pages/homework_correction/quick_check_personal.dart b/marking_app/lib/pages/homework_correction/quick_check_personal.dart index e883b0c..b6ef307 100644 --- a/marking_app/lib/pages/homework_correction/quick_check_personal.dart +++ b/marking_app/lib/pages/homework_correction/quick_check_personal.dart @@ -12,20 +12,19 @@ import 'package:marking_app/utils/common_utils.dart'; import 'package:marking_app/utils/request/rest_client.dart'; import 'package:marking_app/utils/toast_utils.dart'; +import 'widget/answer_handwriting.dart'; + class QuickCheckPersonal extends StatefulWidget { final int jobId; final int studentId; - const QuickCheckPersonal( - {Key? key, required this.jobId, required this.studentId}) - : super(key: key); + const QuickCheckPersonal({Key? key, required this.jobId, required this.studentId}) : super(key: key); @override State createState() => _QuickCheckPersonalState(); } -class _QuickCheckPersonalState extends State - with CommonMixin { +class _QuickCheckPersonalState extends State with CommonMixin { StudentDetails? studentInfo; void initState() { @@ -40,18 +39,16 @@ class _QuickCheckPersonalState extends State params['jobid'] = widget.jobId; // params['jobid'] = '521646983660101'; params['studentId'] = widget.studentId; - BaseStructureResult data = - await _client.getJobPersonalReport(params); - if(data.data!.studentId != null){ + BaseStructureResult data = await _client.getJobPersonalReport(params); + if (data.data!.studentId != null) { setState(() { studentInfo = data.data; }); - }else{ + } else { Navigator.pop(context); ToastUtils.showError('暂无数据'); } EasyLoading.dismiss(); - } @override @@ -74,7 +71,7 @@ class _QuickCheckPersonalState extends State ), actions: [ ReturnToHomepage(), - /* Title( + /* Title( color: Color(0xFF6888FD), child: Container( child: InkWell( @@ -89,20 +86,19 @@ class _QuickCheckPersonalState extends State alignment: Alignment.center, ), ),*/ - ], ), - body: SingleChildScrollView( child: Column( children: [ Padding( - padding: EdgeInsets.only(top: 14.r,left: 14.r), + padding: EdgeInsets.only(top: 14.r, left: 14.r), child: Row( children: [ InkWell( - onTap: (){ - RouterManager.router.navigateTo(context, '${RouterManager.jobPersonalDetailPath}?studentId=${widget.studentId}&studentName=${Uri.encodeComponent(studentInfo!.studentName!)}'); + onTap: () { + RouterManager.router.navigateTo(context, + '${RouterManager.jobPersonalDetailPath}?studentId=${widget.studentId}&studentName=${Uri.encodeComponent(studentInfo!.studentName!)}'); }, child: Container( width: 93.r, @@ -112,20 +108,33 @@ class _QuickCheckPersonalState extends State borderRadius: BorderRadius.circular(4.r), ), child: Center( - child: Text('历史查询',style: TextStyle(fontSize: 10.r,color: Color(0xFF2080F7)),), + child: Text( + '历史查询', + style: TextStyle(fontSize: 10.r, color: Color(0xFF2080F7)), + ), ), ), ), - SizedBox(width: 10.r,), - Container( - width: 93.r, - height: 28.r, - decoration: BoxDecoration( - color: Color(0xFFEDFFF7), - borderRadius: BorderRadius.circular(4.r), - ), - child: Center( - child: Text('原稿笔迹',style: TextStyle(fontSize: 10.r,color: Color(0xFF4CC793)),), + SizedBox( + width: 10.r, + ), + InkWell( + onTap: () { + showAnswerHandwriting(context, jobId: widget.jobId, studentId: widget.studentId); + }, + child: Container( + width: 93.r, + height: 28.r, + decoration: BoxDecoration( + color: Color(0xFFEDFFF7), + borderRadius: BorderRadius.circular(4.r), + ), + child: Center( + child: Text( + '原稿笔迹', + style: TextStyle(fontSize: 10.r, color: Color(0xFF4CC793)), + ), + ), ), ), ], @@ -147,22 +156,22 @@ class _QuickCheckPersonalState extends State children: [ Text( '客观题', - style: TextStyle( - fontSize: 14.sp, color: Color(0xFF5C5C5C),fontWeight: FontWeight.w600), + style: TextStyle(fontSize: 14.sp, color: Color(0xFF5C5C5C), fontWeight: FontWeight.w600), ), SizedBox( width: 10.r, ), Text( '${studentInfo!.kgValidRate}%', - style: TextStyle( - fontSize: 14.sp, color: Color(0xFF6888FD),fontWeight: FontWeight.w600), + style: TextStyle(fontSize: 14.sp, color: Color(0xFF6888FD), fontWeight: FontWeight.w600), ), ], ), - SizedBox(height: 10.r,), SizedBox( - height: studentInfo!.kgDetails.length>8?300.r:studentInfo!.kgDetails.length * 40.r + 40.r, + height: 10.r, + ), + SizedBox( + height: studentInfo!.kgDetails.length > 8 ? 300.r : studentInfo!.kgDetails.length * 40.r + 40.r, child: StudentKgTable( headList: ['题号', '学生答案', '标准答案'], bodyList: studentInfo!.kgDetails, @@ -171,7 +180,9 @@ class _QuickCheckPersonalState extends State ], ), ), - SizedBox(height: 15.r,), + SizedBox( + height: 15.r, + ), //主观题 Container( padding: EdgeInsets.symmetric(vertical: 14.r, horizontal: 10.r), @@ -188,24 +199,24 @@ class _QuickCheckPersonalState extends State children: [ Text( '主观题', - style: TextStyle( - fontSize: 14.sp, color: Color(0xFF5C5C5C),fontWeight: FontWeight.w600), + style: TextStyle(fontSize: 14.sp, color: Color(0xFF5C5C5C), fontWeight: FontWeight.w600), ), SizedBox( width: 10.r, ), Text( '${studentInfo!.zgValidRate}%', - style: TextStyle( - fontSize: 14.sp, color: Color(0xFF6888FD),fontWeight: FontWeight.w600), + style: TextStyle(fontSize: 14.sp, color: Color(0xFF6888FD), fontWeight: FontWeight.w600), ), ], ), - SizedBox(height: 10.r,), SizedBox( - height: studentInfo!.zgDetails.length>8?300.r:studentInfo!.zgDetails.length * 40.r + 40.r, + height: 10.r, + ), + SizedBox( + height: studentInfo!.zgDetails.length > 8 ? 300.r : studentInfo!.zgDetails.length * 40.r + 40.r, child: StudentZgTable( - headList: ['题号', '用时', '学生答案','批注结果','批注'], + headList: ['题号', '用时', '学生答案', '批注结果', '批注'], bodyList: studentInfo!.zgDetails, ), ) diff --git a/marking_app/lib/pages/homework_correction/widget/answer_handwriting.dart b/marking_app/lib/pages/homework_correction/widget/answer_handwriting.dart new file mode 100644 index 0000000..8bf8322 --- /dev/null +++ b/marking_app/lib/pages/homework_correction/widget/answer_handwriting.dart @@ -0,0 +1,255 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_spinkit/flutter_spinkit.dart'; +import 'package:marking_app/common/mixin/common.dart'; +import 'package:marking_app/common/model/job/job_handwriting.dart'; +import 'package:marking_app/utils/index.dart'; +import 'package:marking_app/utils/my_text.dart'; + +/// 学生答题轨迹 +class AnswerHandwriting extends Dialog { + final int jobId; + final int studentId; + final int? pageNum; + final int? questionNo; + final Function closeCall; + const AnswerHandwriting({required this.jobId, required this.studentId, required this.closeCall, this.pageNum, this.questionNo}); + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + // color: Color.fromRGBO(0, 0, 0, 0.6), + width: ScreenUtil().screenWidth - 60.w, + height: ScreenUtil().screenHeight - 160.h, + child: AnswerHandwritingMainBox(jobId: jobId, studentId: studentId, pageNum: pageNum, questionNo: questionNo, closeCall: closeCall), + ), + ); + } +} + +Future showAnswerHandwriting(BuildContext context, {required int jobId, required int studentId, int? pageNum}) async { + return showDialog( + context: context, + builder: (BuildContext context) => AnswerHandwriting( + jobId: jobId, + studentId: studentId, + pageNum: pageNum, + closeCall: () => Navigator.of(context).pop(), + ), + ); +} + +// 主图 +class AnswerHandwritingMainBox extends HookWidget { + const AnswerHandwritingMainBox({ + required this.jobId, + required this.studentId, + required this.closeCall, + this.pageNum, + this.questionNo, + Key? key, + }) : super(key: key); + + final int jobId; + final int studentId; + final int? pageNum; + final int? questionNo; + final Function closeCall; + + @override + Widget build(BuildContext context) { + var _useStateModel = UseMainBoxState.use(jobId, studentId, pageNum, questionNo); + + useValueChanged(_useStateModel.handwritingData.value, (_, __) { + var theData = _useStateModel.handwritingData.value; + _useStateModel.pageNum.value = theData?.pageNum; + _useStateModel.pageCount.value = theData?.pageCount ?? 0; + }); + + useValueChanged(_useStateModel.pageNum.value, (oldVal, __) { + if (oldVal != null && oldVal != _useStateModel.pageNum.value) _useStateModel.getData().catchError((e) => closeCall()); + }); + + useEffect(() { + _useStateModel.getData().catchError((e) => closeCall()); + _useStateModel.imageKey.value = UniqueKey(); + return () {}; + }, []); + + JobHandwriting? _data = _useStateModel.handwritingData.value; + print('这里是build:${_useStateModel.pageNum.value}'); + + if (_data == null) return Container(); + return Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + child: CachedNetworkImage( + key: _useStateModel.imageKey.value, + fit: BoxFit.contain, + imageUrl: _data?.paperPicture ?? '', + imageBuilder: (context, imageProvider) { + return Image(image: imageProvider, fit: BoxFit.fitWidth); + }, + placeholder: (context, url) => Center(child: SpinKitWaveSpinner(color: Theme.of(context).primaryColor, size: 50.r)), + errorWidget: (context, url, error) { + return Center( + child: GestureDetector( + onTap: () => (_useStateModel.imageKey.value = UniqueKey()), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset('assets/images/test_paper_loading_failed.png'), + quickText('加载失败,点击重试', color: Color.fromRGBO(148, 163, 182, 1), size: 12.sp), + ], + ), + ), + ); + }, + ), + ), + if (_useStateModel.handwritingData.value != null && _useStateModel.pageNum.value != null && _useStateModel.pageNum.value! > 1) + Positioned( + left: 3.w, + top: 280.h, + child: FloatingActionButton( + heroTag: '点击前往上一题', + tooltip: '点击前往上一题', + focusColor: Theme.of(context).primaryColor, + backgroundColor: const Color.fromRGBO(24, 32, 32, 0.1), + elevation: 6.r, + onPressed: () => easyThrottle('answer_handwriting_previous', () { + _useStateModel.pageNum.value = _useStateModel.pageNum.value! - 1; + }), + child: Icon(Icons.arrow_back_ios, color: Colors.white, size: 22.sp), + ), + ), + // 下一题 按钮 + if (_useStateModel.handwritingData.value != null && + _useStateModel.pageNum.value != null && + _useStateModel.pageNum.value! < _useStateModel.pageCount.value) + Positioned( + right: 3.w, + top: 280.h, + child: FloatingActionButton( + heroTag: '点击前往下一题', + tooltip: '点击前往下一题', + elevation: 6.r, + backgroundColor: const Color.fromRGBO(24, 32, 32, 0.1), + onPressed: () => easyThrottle('answer_handwriting_next', () { + _useStateModel.pageNum.value = _useStateModel.pageNum.value! + 1; + }), + child: Icon(Icons.arrow_forward_ios, color: Colors.white, size: 22.sp), + ), + ), + ], + ), + Expanded( + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10.w, vertical: 10.h), + alignment: Alignment.center, + color: Color.fromRGBO(0, 0, 0, 0.5), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + InkWell( + onTap: () {}, + child: Icon( + // Icons.play_circle_outline + Icons.pause_circle_outline, + color: Colors.white, + size: 28.r, + ), + ), + SizedBox(width: 6.w), + Expanded( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 20.h, + color: Theme.of(context).primaryColor, + ), + SizedBox(height: 4.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + quickText('累计停顿:2次', color: Colors.white, size: 7.sp), + quickText('04:30', color: Colors.white, size: 7.sp), + ], + ) + ], + ), + ), + SizedBox(width: 16.w), + InkWell( + onTap: () {}, + child: Container( + // alignment: Alignment., + padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h), + decoration: BoxDecoration(color: Color.fromRGBO(182, 197, 250, 1), borderRadius: BorderRadius.circular(4.r)), + child: quickText('原速播放', color: Color.fromRGBO(79, 114, 244, 1), size: 10.sp, align: TextAlign.center), + ), + ), + ], + ), + ), + ), + ], + ); + } +} + +class UseMainBoxState with CommonMixin { + final int jobId; + final int studentId; + final int? questionNo; + final ValueNotifier pageNum; + final ValueNotifier pageCount; + final ValueNotifier handwritingData; + final ValueNotifier imageKey; + UseMainBoxState._({ + required this.jobId, + required this.studentId, + required this.pageNum, + required this.handwritingData, + required this.questionNo, + required this.pageCount, + required this.imageKey, + }); + + // 工厂构造函数 + factory UseMainBoxState.use(int jobId, int studentId, [int? pageNum, int? questionNo]) { + return UseMainBoxState._( + jobId: jobId, + studentId: studentId, + questionNo: questionNo, + pageNum: useState(pageNum), + handwritingData: useState(null), + pageCount: useState(0), + imageKey: useState(null), + ); + } + + Future getData() async { + try { + ToastUtils.showLoading(); + var _client = await getClient(); + var res = await _client.getHandwriting(jobId, studentId, questionNo, pageNum.value); + if (res?.success ?? false) { + handwritingData.value = res!.data; + return; + } + Future.delayed(Duration(seconds: 1), () => ToastUtils.showError(res?.message ?? '笔记数据请求失败')); + } catch (e) { + } finally { + ToastUtils.dismiss(); + } + } +} diff --git a/marking_app/lib/utils/request/rest_client.dart b/marking_app/lib/utils/request/rest_client.dart index 6d8789a..6737395 100644 --- a/marking_app/lib/utils/request/rest_client.dart +++ b/marking_app/lib/utils/request/rest_client.dart @@ -19,6 +19,7 @@ import 'package:marking_app/common/model/job/job_data_report.dart'; import 'package:marking_app/common/model/job/job_do_marking_status_info.dart'; import 'package:marking_app/common/model/job/job_fav_student.dart'; import 'package:marking_app/common/model/job/job_favorite_model.dart'; +import 'package:marking_app/common/model/job/job_handwriting.dart'; import 'package:marking_app/common/model/job/job_knowledge_detail_student.dart'; import 'package:marking_app/common/model/job/job_knowledge_points.dart'; import 'package:marking_app/common/model/job/job_knowledge_points_detail.dart'; @@ -74,8 +75,7 @@ abstract class RestClient { // 最新版本 @the_retrofit.GET("/api/version/latest?mobileTypeEnum={mobileTypeEnum}") - Future> getLatestVersion( - @the_retrofit.Path("mobileTypeEnum") int mobileTypeEnum); // 1 安卓 2 ios + Future> getLatestVersion(@the_retrofit.Path("mobileTypeEnum") int mobileTypeEnum); // 1 安卓 2 ios // 用户登录 /auth/login/exam-marking/user-mobile @the_retrofit.POST("/auth/login/exam-marking/user") @@ -91,8 +91,7 @@ abstract class RestClient { // 阅卷列表 => 分页获取 @the_retrofit.GET("/api/marking/list") - Future>> getMarkingsByPage( - @the_retrofit.Queries() MarkingListParams params); + Future>> getMarkingsByPage(@the_retrofit.Queries() MarkingListParams params); // /api/marking/list @@ -117,13 +116,11 @@ abstract class RestClient { // 阅卷 => 获取考试试题 @the_retrofit.GET("/api/marking/question") - Future> getTestQuestionsOfExam( - @the_retrofit.Queries() MarkingTextQuestionParams params); + Future> getTestQuestionsOfExam(@the_retrofit.Queries() MarkingTextQuestionParams params); // 阅卷 => 获取考试tab(试题批次) @the_retrofit.GET("/api/marking/{markingUserId}/tab") - Future>> getTestQuestionsOfTab( - @the_retrofit.Path("markingUserId") int markingUserId); + Future>> getTestQuestionsOfTab(@the_retrofit.Path("markingUserId") int markingUserId); // 阅卷 => 单个试题Tag阅卷详情 @the_retrofit.GET("/api/marking/{markingUserId}/progress") @@ -137,16 +134,15 @@ abstract class RestClient { // 阅卷 => 获取考试tab下某次试题 @the_retrofit.GET("/api/marking/{markingUserId}/detail") - Future> getTabOfExam(@the_retrofit.Path("markingUserId") int markingUserId, - @the_retrofit.Queries() MarkingTextQuestionTabParams params); + Future> getTabOfExam( + @the_retrofit.Path("markingUserId") int markingUserId, @the_retrofit.Queries() MarkingTextQuestionTabParams params); // 阅卷 => 提交考试试题 @the_retrofit.PUT("/api/marking") Future> submitTestQuestionsOfExam(@the_retrofit.Body() SubmitExamParams params); @the_retrofit.PUT("/api/marking/error") - Future> submitTestQuestionsOfExamAbnormal( - @the_retrofit.Body() SubmitExamAbnormalParams params); + Future> submitTestQuestionsOfExamAbnormal(@the_retrofit.Body() SubmitExamAbnormalParams params); // 阅卷 => 提交考试试题 @the_retrofit.PUT("/api/marking/review") @@ -158,8 +154,7 @@ abstract class RestClient { // 阅卷 => 结束阅卷 @the_retrofit.GET("/api/marking/original-paper") - Future>> getViewOriginalVolume( - @the_retrofit.Query("markingUserDetailId") String markingUserDetailId); + Future>> getViewOriginalVolume(@the_retrofit.Query("markingUserDetailId") String markingUserDetailId); // 阅卷 => 查看答案 @the_retrofit.GET("/api/marking/answer") @@ -185,25 +180,21 @@ abstract class RestClient { // 阅卷 => 获取异常详细信息 @the_retrofit.GET("/api/marking/error-info") - Future> getMarkingQuestionsErrorInfo( - @the_retrofit.Query("markingUserDetailId") int id); + Future> getMarkingQuestionsErrorInfo(@the_retrofit.Query("markingUserDetailId") int id); // 阅卷 => 获取仲裁详细信息 @the_retrofit.GET("/api/marking/history-score") - Future>> getArbitrateOfHistoryScore( - @the_retrofit.Query("markingUserDetailId") int id); + Future>> getArbitrateOfHistoryScore(@the_retrofit.Query("markingUserDetailId") int id); // 阅卷 => 获取仲裁详细信息 @the_retrofit.GET("/api/marking/rating-info") - Future>> getMarkingRatingInfo( - @the_retrofit.Query("markingUserId") int id); + Future>> getMarkingRatingInfo(@the_retrofit.Query("markingUserId") int id); // ------------------------------------------ 作业 ------------------------------------------ // 作业 => 作业列表 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task") - Future>> getJobsByPage( - @the_retrofit.Queries() MarkingListParams params); + Future>> getJobsByPage(@the_retrofit.Queries() MarkingListParams params); // 作业 => 批改获取tabs @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task/tabs") @@ -211,13 +202,11 @@ abstract class RestClient { // 作业 => 批改获取tabs @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Marking/students") - Future>> getJobWithStudents( - @the_retrofit.Queries() JobConcernedWithStudentParams params); + Future>> getJobWithStudents(@the_retrofit.Queries() JobConcernedWithStudentParams params); // 作业 => 获取考试tab下某次试题 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task/detail") - Future> getJobTabOfExam( - @the_retrofit.Queries() MarkingTextQuestionJobTabParams params); + Future> getJobTabOfExam(@the_retrofit.Queries() MarkingTextQuestionJobTabParams params); // 作业 => 提交 @the_retrofit.POST("${RequestConfig.hwProxyKeywords}/api/Task") @@ -229,8 +218,7 @@ abstract class RestClient { // 作业 => 获取考试tab下某次试题 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task/questions") - Future>> toGoreviewAgainPage( - @the_retrofit.Queries() ReviewAgainListParams params); + Future>> toGoreviewAgainPage(@the_retrofit.Queries() ReviewAgainListParams params); // 作业 => 获取参考答案 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task/answer") @@ -241,8 +229,7 @@ abstract class RestClient { // 作业 => 上传图片请求参数 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Upload") - Future> getUploadFile( - @the_retrofit.Queries() UploadFileInterfaceConfigParams params); + Future> getUploadFile(@the_retrofit.Queries() UploadFileInterfaceConfigParams params); // 作业 => 获取参考答案 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Dpc/studentAnswerHandwriting") @@ -251,18 +238,16 @@ abstract class RestClient { // 作业 => 查询作业是否收藏 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Dpc/collect") - Future> getJobCollect(@the_retrofit.Query("taskId") int taskId, - @the_retrofit.Query("studentId") int studentId, @the_retrofit.Query("paperId") int paperId); + Future> getJobCollect( + @the_retrofit.Query("taskId") int taskId, @the_retrofit.Query("studentId") int studentId, @the_retrofit.Query("paperId") int paperId); // 作业 => 作业优先批阅取消 @the_retrofit.POST("/api/read/cancel-job-read-level") - Future> jobPriorityReviewCancel( - @the_retrofit.Field("jobId") int jobId, @the_retrofit.Field("studentId") int studentId); + Future> jobPriorityReviewCancel(@the_retrofit.Field("jobId") int jobId, @the_retrofit.Field("studentId") int studentId); // 作业 => 作业优先批阅加入 @the_retrofit.POST("/api/read/join-read-level") - Future jobPriorityReviewJoin( - @the_retrofit.Field("jobId") int jobId, @the_retrofit.Field("studentId") int studentId); + Future jobPriorityReviewJoin(@the_retrofit.Field("jobId") int jobId, @the_retrofit.Field("studentId") int studentId); // 作业 => 查询作业是否收藏 @the_retrofit.POST("${RequestConfig.hwProxyKeywords}/api/Dpc/collect") @@ -297,13 +282,11 @@ abstract class RestClient { // 作业 => 列表 ==> 参与班级列表 @the_retrofit.GET("${RequestConfig.hwProxyKeywords}/api/Task/tasks") - Future>> getJobListParticipateInClass( - @the_retrofit.Query("markingId") int jobId); + Future>> getJobListParticipateInClass(@the_retrofit.Query("markingId") int jobId); // 作业 => 作业收藏数量 @the_retrofit.GET("/dpc-api/api/read/job-favorite-count-by-class") - Future>> getListOfJobFavoriteNumber( - @the_retrofit.Query("jobid") int jobId); + Future>> getListOfJobFavoriteNumber(@the_retrofit.Query("jobid") int jobId); // 作业 => 作业收藏列表 @the_retrofit.GET("/api/jobs/fav-student-jobs") @@ -316,13 +299,11 @@ abstract class RestClient { // 作业 => 作业收藏列表 @the_retrofit.POST("${RequestConfig.hwProxyKeywords}/dpc-api/api/read/cancel-favorite") - Future> toJobCancelFavorite( - @the_retrofit.Field() int jobId, @the_retrofit.Field() int studentId); + Future> toJobCancelFavorite(@the_retrofit.Field() int jobId, @the_retrofit.Field() int studentId); // 作业 => 数据快查 @the_retrofit.GET("/api/read/job-data-center-report") - Future> getJobDataCenterReport( - @the_retrofit.Queries() Map params); + Future> getJobDataCenterReport(@the_retrofit.Queries() Map params); // 作业 => 数据快查--个人 @the_retrofit.GET("/api/read/job-data-center-student-report") @@ -330,8 +311,7 @@ abstract class RestClient { // 作业 => 优先批阅,学生分组列表 @the_retrofit.GET("/api/read/job-read-level-student-groups") - Future>> getJobLevelStudentGroups( - @the_retrofit.Query("account") String account); + Future>> getJobLevelStudentGroups(@the_retrofit.Query("account") String account); // 作业 => 优先批阅,优先批阅列表 @the_retrofit.GET("/api/read/job-read-level") @@ -344,44 +324,53 @@ abstract class RestClient { // 作业 => 取消收藏 @the_retrofit.POST("/api/jobs/de-fav-student-job") - Future getJobDeFavorites(@the_retrofit.Field("jobId") int jobId, - @the_retrofit.Field("studentId") int studentId, @the_retrofit.Field("questionPage") int questionPage); + Future getJobDeFavorites( + @the_retrofit.Field("jobId") int jobId, @the_retrofit.Field("studentId") int studentId, @the_retrofit.Field("questionPage") int questionPage); // 作业 => 学生作业详情历史 @the_retrofit.GET("/api/read/student-job-history") Future> getStudentJobHistory( - @the_retrofit.Query("StudentId") int studentId, - @the_retrofit.Query("IsPaper") bool isPaper, - @the_retrofit.Query("DateStart") String? dateStart, - @the_retrofit.Query("DateEnd") String? dateEnd, - @the_retrofit.Query("Page") int page, - @the_retrofit.Query("PageSize") int pageSize, - ); + @the_retrofit.Query("StudentId") int studentId, + @the_retrofit.Query("IsPaper") bool isPaper, + @the_retrofit.Query("DateStart") String? dateStart, + @the_retrofit.Query("DateEnd") String? dateEnd, + @the_retrofit.Query("Page") int page, + @the_retrofit.Query("PageSize") int pageSize, + ); // 作业 => 知识点掌握 @the_retrofit.GET("/api/jobs/knowledge-report") Future>> getKnowledgeReport( - @the_retrofit.Query("dateStart") String? dateStart, - @the_retrofit.Query("dateEnd") String? dateEnd, - @the_retrofit.Query("knowledgeName") String? knowledgeName, - ); + @the_retrofit.Query("dateStart") String? dateStart, + @the_retrofit.Query("dateEnd") String? dateEnd, + @the_retrofit.Query("knowledgeName") String? knowledgeName, + ); // 作业 => 知识点掌握详情 @the_retrofit.GET("/api/jobs/knowledge-detail-report") Future>> getKnowledgeReportDetail( - @the_retrofit.Query("KnowledgeId") int knowledgeId, - ); + @the_retrofit.Query("KnowledgeId") int knowledgeId, + ); // 作业 => 知识点掌握详情人员名单 @the_retrofit.GET("/api/jobs/knowledge-question-detail/{questionid}") Future>> getKnowledgeStudent( - @the_retrofit.Path("questionid") int questionid, - ); + @the_retrofit.Path("questionid") int questionid, + ); // 作业 => 知识点掌握详情原卷图 @the_retrofit.GET("/api/jobs/question-paper-img/{sectionid}/{questionno}") Future> getKnowledgeImg( - @the_retrofit.Path("sectionid") int questionid, - @the_retrofit.Path("questionno") String questionno, - ); + @the_retrofit.Path("sectionid") int questionid, + @the_retrofit.Path("questionno") String questionno, + ); + + // 作业 => 获取学生原稿笔记 + @the_retrofit.GET("/api/jobs/student-paper-handwriting") + Future?> getHandwriting( + @the_retrofit.Query("jobId") int jobId, + @the_retrofit.Query("studentId") int studentId, + @the_retrofit.Query("questionNo") int? questionNo, + @the_retrofit.Query("pageNum") int? pageNum, + ); }