Marking.Client.Moblie/marking_app/lib/components/TestPaperItem.dart

556 lines
24 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: wangyang 1147192855@qq.com
* @Date: 2022-07-12 16:29:30
* @LastEditors: wangyang 1147192855@qq.com
* @LastEditTime: 2022-09-28 13:48:52
* @FilePath: \marking_app\lib\components\TestPaperItem.dart
* @Description: 阅卷任务ITEM
*/
import 'package:achievement_view/achievement_view.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:marking_app/common/config/request_config.dart';
import 'package:marking_app/common/mixin/common.dart';
import 'package:marking_app/common/model/common/base_structure_result.dart';
import 'package:marking_app/common/model/enum/marking_list_type.dart';
import 'package:marking_app/common/model/enum/subject.dart';
import 'package:marking_app/common/model/marking/current_review_task.dart';
import 'package:marking_app/common/model/marking/marking_item.dart';
import 'package:marking_app/provider/review_provider.dart';
import 'package:marking_app/routes/RouterManager.dart';
import 'package:marking_app/utils/index.dart';
import 'package:marking_app/utils/my_text.dart';
import 'package:marking_app/utils/request/rest_client.dart';
import 'package:percent_indicator/percent_indicator.dart';
class TestPaperItem extends ConsumerWidget with CommonMixin {
final MarkingItem markingItem;
final bool isHomeworkCorrection;
final VoidCallback? call;
final MarkingListType? markingtype;
const TestPaperItem(
{required this.markingItem, this.markingtype, this.isHomeworkCorrection = false, this.call, Key? key})
: super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
double indent = 6.w; // 缩进宽度.
switch (markingtype) {
case MarkingListType.EXCEPTIONAL:
case MarkingListType.ARBITRATE:
indent += 20.w + 8.w;
break;
case MarkingListType.NORMAL:
indent += 36.w + 8.w;
break;
default:
indent = 0;
}
final textPainter = TextPainter(
text: TextSpan(text: " ", style: TextStyle(fontSize: 18.sp)),
textDirection: TextDirection.ltr,
);
textPainter.layout();
final spaceWidth = textPainter.width;
String spaceText = '';
List.generate((indent / spaceWidth).floor(), (e) => null).forEach((element) {
spaceText += ' ';
});
return Container(
margin: EdgeInsets.only(top: 12.h, left: 14.w, right: 14.w),
padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 10.h),
constraints: BoxConstraints(
minHeight: 120.h,
maxHeight: 130.h,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(6.w)),
boxShadow: [
BoxShadow(
color: const Color.fromRGBO(46, 91, 255, 0.1),
offset: Offset(0, -0.4.h), //阴影y轴偏移量
blurRadius: 10, //阴影模糊程度
spreadRadius: 6, //阴影扩散程度
)
],
),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Stack(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// SizedBox(width: indent),
// if (isHomeworkCorrection)
// Container(
// padding: EdgeInsets.all(2.w),
// margin: EdgeInsets.only(right: 8.w),
// child: Icon(Icons.menu_book_rounded, size: 18.sp),
// ),
Expanded(
child: Text(
spaceText + markingItem.examName,
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 18.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(45, 56, 76, 1),
),
),
),
],
),
Row(
children: [
if (markingtype == MarkingListType.EXCEPTIONAL)
Container(
width: 20.w,
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 2.h),
margin: EdgeInsets.only(right: 8.w),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.only(topLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)),
color: const Color.fromRGBO(245, 108, 108, 0.236),
),
child: Text(
'',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(215, 74, 74, 1),
),
),
),
if (markingtype == MarkingListType.ARBITRATE)
Container(
width: 20.w,
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 2.h),
margin: EdgeInsets.only(right: 8.w),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.only(topLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)),
color: const Color.fromRGBO(4, 201, 208, 0.10),
),
child: Text(
'',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(4, 201, 208, 1),
),
),
),
if (markingtype == MarkingListType.NORMAL)
Container(
width: 36.w,
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 2.h),
margin: EdgeInsets.only(right: 8.w),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius:
BorderRadius.only(topLeft: Radius.circular(6.r), bottomRight: Radius.circular(6.r)),
color: const Color.fromRGBO(231, 236, 255, 1),
),
child: Text(
'月考',
style: TextStyle(
fontSize: 14.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(46, 91, 255, 1),
),
),
),
],
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
getSubjectEnumName(markingItem.subjectId),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 12.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(80, 87, 103, 1),
),
),
Container(
width: 1.w,
height: 10.sp,
color: const Color.fromRGBO(80, 87, 103, 1),
margin: EdgeInsets.symmetric(horizontal: 10.w),
),
if (markingtype == MarkingListType.NORMAL || isHomeworkCorrection)
Text(
'题量:${markingItem.totalCount}',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 12.sp,
fontWeight: FontWeight.w400,
color: const Color.fromRGBO(80, 87, 103, 1),
),
)
else if (markingtype == MarkingListType.EXCEPTIONAL)
Container(
margin: EdgeInsets.only(right: 4.w),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.warning_amber_rounded,
color: const Color.fromRGBO(215, 74, 74, 1),
size: 15.sp,
),
SizedBox(width: 2.w),
if ((markingItem.totalCount - markingItem.finishCount) > 0)
quickText(
'${markingItem.totalCount - markingItem.finishCount}个异常待处理',
color: Colors.red,
size: 11.sp,
)
else
quickText('暂无异常', color: Colors.grey, size: 11.sp)
],
),
)
else if (markingtype == MarkingListType.ARBITRATE)
Container(
margin: EdgeInsets.only(right: 4.w),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.edit_square,
color: const Color.fromRGBO(4, 201, 208, 1),
size: 15.sp,
),
SizedBox(width: 2.w),
if ((markingItem.totalCount - markingItem.finishCount) > 0)
quickText(
'${markingItem.totalCount - markingItem.finishCount}个仲裁待处理',
color: const Color.fromRGBO(4, 201, 208, 1),
size: 11.sp,
)
else
quickText('暂无仲裁', color: Colors.grey, size: 11.sp)
],
),
)
],
),
Expanded(child: SizedBox()),
Row(
mainAxisSize: MainAxisSize.min,
children: [
Container(
margin: EdgeInsets.only(right: 4.w),
child: Row(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'${markingItem.finishCount}',
style: TextStyle(
color: markingItem.isFinish && isHomeworkCorrection
? Colors.green
: Theme.of(context).primaryColor,
fontSize: 12.sp),
),
Text(
'/',
style: TextStyle(color: const Color.fromRGBO(148, 163, 182, 1), fontSize: 12.sp),
),
Text(
'${markingItem.totalCount}',
style: TextStyle(color: Color.fromRGBO(148, 163, 182, 1), fontSize: 12.sp),
),
],
),
),
Container(
width: 100.w,
child: LinearPercentIndicator(
padding: EdgeInsets.zero,
animation: true,
lineHeight: 8.h,
animationDuration: 2500,
percent: markingItem.completionRate,
center: Text(
'${markingItem.completionRateStr}%',
style: TextStyle(color: Colors.white, fontSize: 8.sp),
),
// linearStrokeCap: LinearStrokeCap.butt,
progressColor:
markingItem.isFinish && isHomeworkCorrection ? Colors.green : Theme.of(context).primaryColor,
backgroundColor: const Color.fromRGBO(219, 224, 243, 1),
barRadius: Radius.circular(10.r),
),
),
],
),
],
),
Container(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (markingItem.isFinish)
Container(
margin: EdgeInsets.only(left: 7.w),
child: MaterialButton(
color: const Color.fromRGBO(245, 246, 251, 1),
disabledColor: const Color.fromRGBO(245, 246, 251, 1),
textColor: const Color.fromRGBO(80, 87, 103, 1),
minWidth: 60.w,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(6.w),
),
),
onPressed: () {
goToReviewHomework(markingItem: markingItem, ref: ref, context: context, call: () => call!());
// goToReviewHomework(markingItem: markingItem, ref: ref, context: context);
},
child: Text(
'已完成',
style: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(148, 163, 182, 1),
fontWeight: FontWeight.w400,
),
),
),
),
if (false && !markingItem.isFinish && !isHomeworkCorrection)
MaterialButton(
color: const Color.fromRGBO(245, 246, 251, 1),
disabledColor: const Color.fromRGBO(245, 246, 251, 1),
minWidth: 60.w,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(6.w)),
),
onPressed: () {
int examSubjectId = markingItem.examSubjectId;
RouterManager.router.navigateTo(
context,
'${RouterManager.markingProgressPath}?examSubjectId=$examSubjectId&name=${Uri.encodeComponent(markingItem.examName)}',
transition: getTransition(),
);
},
child: Text(
'进度',
style: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(80, 87, 103, 1),
fontWeight: FontWeight.w400,
),
),
),
/** 异常和仲裁没有回评 注释回评
if (markingtype == MarkingListType.NORMAL && !markingItem.isFinish && markingItem.finishCount > 0)
Container(
margin: EdgeInsets.only(left: 7.w),
child: MaterialButton(
color: const Color.fromRGBO(245, 246, 251, 1),
disabledColor: const Color.fromRGBO(245, 246, 251, 1),
textColor: const Color.fromRGBO(80, 87, 103, 1),
minWidth: 60.w,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(6.w))),
onPressed: () {
RouterManager.router.navigateTo(
context,
'${isHomeworkCorrection ? RouterManager.markingJobReviewPath : RouterManager.markingReviewPath}?markingtype=${markingtype?.index}&markingUserId=${markingItem.markingUserId}&examSubjectId=${markingItem.examSubjectId}&examName=${Uri.encodeComponent(markingItem.examName)}',
transition: getTransition(),
);
},
child: Text(
'回评',
style: TextStyle(
fontSize: 16.sp,
color: const Color.fromRGBO(80, 87, 103, 1),
fontWeight: FontWeight.w400,
),
),
),
),
*/
if (!markingItem.isFinish)
if ([MarkingListType.EXCEPTIONAL, MarkingListType.ARBITRATE].contains(markingtype))
Container(
margin: EdgeInsets.only(left: 7.w),
child: MaterialButton(
color: const Color.fromRGBO(54, 86, 255, 0.99),
disabledColor: const Color.fromRGBO(54, 86, 255, 0.99),
onPressed: markingItem.isFinish
? null
: () {
if (markingItem.finishCount == 0 && markingItem.totalCount == 0) {
return AchievementView(
elevation: 0.5,
duration: Duration(seconds: 1),
title: "提示",
subTitle: "暂时没有任务,休息一会吧",
color: Theme.of(context).primaryColor,
).show(context);
}
goToReviewTestPaper(
markingtype: markingtype!,
markingItem: markingItem,
ref: ref,
context: context,
call: call,
);
},
minWidth: 60.w,
shape: RoundedRectangleBorder(
//边框颜色
// side: const BorderSide(
// color: Colors.deepPurple,
// width: 1,
// ),
//边框圆角
borderRadius: BorderRadius.all(Radius.circular(6.w)),
),
padding: EdgeInsets.symmetric(horizontal: 5.w, vertical: 4.h),
child: Text(
'处 理',
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
fontWeight: FontWeight.w400,
),
),
),
)
else
Container(
margin: EdgeInsets.only(left: 7.w),
child: MaterialButton(
color: const Color.fromRGBO(54, 86, 255, 0.99),
disabledColor: const Color.fromRGBO(54, 86, 255, 0.99),
onPressed: markingItem.isFinish
? null
: () {
if (markingItem.finishCount == 0 && markingItem.totalCount == 0) {
return AchievementView(
elevation: 0.5,
duration: Duration(seconds: 1),
title: "提示",
subTitle: "暂时没有任务,休息一会吧",
color: Theme.of(context).primaryColor,
).show(context);
}
isHomeworkCorrection
? goToReviewHomework(
markingItem: markingItem, ref: ref, context: context, call: () => call!())
: goToReviewTestPaper(
markingtype: markingtype!,
markingItem: markingItem,
ref: ref,
context: context,
call: call,
);
},
minWidth: 60.w,
shape: RoundedRectangleBorder(
//边框颜色
// side: const BorderSide(
// color: Colors.deepPurple,
// width: 1,
// ),
//边框圆角
borderRadius: BorderRadius.all(Radius.circular(6.w)),
),
child: Text(
isHomeworkCorrection ? '批阅' : '阅卷',
style: TextStyle(
fontSize: 14.sp,
color: Colors.white,
fontWeight: FontWeight.w400,
),
),
),
),
],
),
),
],
),
);
}
// 结束阅卷任务
Future<void> toTaskEnd(BuildContext context, WidgetRef ref, String markingUserId) async {
RestClient client = await getClient();
BaseStructureResult<bool?> result = await client.endMarkingTask(markingUserId);
if (result.code == RequestConfig.successCode && result.data == null ? false : result.data!) {
ref
.read(currentTaskIdProvider.notifier)
.setDoTaskEntity(CurrentReviewTask(taskId: markingItem.markingUserId, refresh: true));
} else {
ToastUtils.getFluttertoast(context: context, msg: '提交失败');
}
}
// 批阅作业
Future<void> goToReviewHomework({
required MarkingItem markingItem,
required WidgetRef ref,
required BuildContext context,
required VoidCallback call,
}) async {
int taskId = markingItem.markingUserId;
toPrint(val: '批阅作业.........');
// ref.read(currentTaskIdProvider.notifier).setDoTaskEntity(CurrentReviewTask(taskId: taskId));
// DetailId 回评需要传DetailId正常阅卷不需要PageOper(0下一题1上一题2当前题) 回评需要传2 IsReview 是否会评 0否 1是
RouterManager.router
.navigateTo(context, '${RouterManager.markingHomeworkDoPath}?taskId=$taskId', transition: getTransition())
.then((value) {
call();
});
}
// 批阅试卷
Future<void> goToReviewTestPaper({
required MarkingListType markingtype,
required MarkingItem markingItem,
required WidgetRef ref,
required BuildContext context,
VoidCallback? call,
}) async {
int taskId = markingItem.markingUserId;
int examSubjectId = markingItem.examSubjectId;
ref.read(currentTaskIdProvider.notifier).setDoTaskEntity(CurrentReviewTask(taskId: taskId));
// DetailId 回评需要传DetailId正常阅卷不需要PageOper(0下一题1上一题2当前题) 回评需要传2 IsReview 是否会评 0否 1是
return RouterManager.router
.navigateTo(
context,
'${RouterManager.markingDoPath}?markingtype=${markingtype.index}&markingUserId=$taskId&examSubjectId=$examSubjectId&detailId=${null}&pageOper=${null}',
transition: getTransition(),
)
.then((value) {
if (value == true && call != null) call();
});
}
}