报告,数据快查修改

This commit is contained in:
machuanyu 2024-03-21 16:25:24 +08:00
parent b2f50b10a6
commit ad655b7cca
8 changed files with 325 additions and 233 deletions

View File

@ -57,6 +57,16 @@ class JobReportModel extends Object {
@JsonKey(name: 'zgReport')
ZgReport zgReport;
@JsonKey(name: 'noAnswerStudentNames')
List<String> noAnswerStudentNames;
@JsonKey(name: 'allCorrectStudentNames')
List<String> allCorrectStudentNames;
@JsonKey(name: 'validStudentNames')
List<String> validStudentNames;
// --
@JsonKey(name: 'allpairsStudents')
List<StudentAnswerInfos>? allpairsStudents;
@ -91,6 +101,9 @@ class JobReportModel extends Object {
this.overallTitles,
this.kgReport,
this.zgReport,
this.noAnswerStudentNames,
this.allCorrectStudentNames,
this.validStudentNames,
[
this.allpairsStudents,
this.passStudents,
@ -274,9 +287,14 @@ class OverallTitles extends Object {
@JsonKey(name: 'count')
int count;
@JsonKey(name: 'studentNames')
List<String> studentNames;
OverallTitles(
this.title,
this.count,
this.studentNames,
);
factory OverallTitles.fromJson(Map<String, dynamic> srcJson) => _$OverallTitlesFromJson(srcJson);
@ -363,7 +381,12 @@ class Details extends Object {
@JsonKey(name: 'noAnswerStudentNames')
List<String> noAnswerStudentNames;
Details(this.questionNo,this.questionId,this.partName,this.questionType,this.validRate,this.validCount,this.correctRate,this.questionAnswer,this.questionPicture,this.priorityGeneral,this.priorityStudentNames,this.answerNgStudentNames,this.noAnswerStudentNames);
@JsonKey(name: 'answerOkStudentNames')
List<String> answerOkStudentNames;
Details(this.questionNo,this.questionId,this.partName,this.questionType,this.validRate,
this.validCount,this.correctRate,this.questionAnswer,this.questionPicture,this.priorityGeneral,
this.priorityStudentNames,this.answerNgStudentNames,this.noAnswerStudentNames,this.answerOkStudentNames);
factory Details.fromJson(Map<String, dynamic> srcJson) => _$DetailsFromJson(srcJson);

View File

@ -296,7 +296,7 @@ class _JobReportState extends State<JobReport> with CommonMixin {
),
),
//
TopCount(data),
TopCount(data,classData == null?'':classData!.className),
/* InkWell(
onTap: (){
RouterManager.router.navigateTo(
@ -439,7 +439,11 @@ Widget $dropdownSelection(List<JobReportJoinClass>? involveClasses, JobReportJoi
items: involveClasses.map((e) {
return DropdownMenuItem(
value: e.uniqueId!,
child: quickText(e.graduationYear + e.className, size: 12.sp, color: Colors.black),
child: quickText(
e.uniqueId == '-1'
? e.graduationYear
:
e.gradeName + e.className, size: 12.sp, color: Colors.black),
);
}).toList(),
onChanged: (String? value) {

View File

@ -148,7 +148,7 @@ class _QuickCheckPersonalState extends State<QuickCheckPersonal>
SizedBox(
height: studentInfo!.zgDetails.length>8?300.r:studentInfo!.zgDetails.length * 40.r + 40.r,
child: StudentZgTable(
headList: ['题号', '用时', '批注结果','答案','批注'],
headList: ['题号', '用时', '学生答案','批注结果','批注'],
bodyList: studentInfo!.zgDetails,
),
)

View File

@ -17,6 +17,7 @@ import 'package:percent_indicator/linear_percent_indicator.dart';
class QuickDataCheckPage extends StatefulWidget {
final int jobId;
final String className;
final String gradeName;
final int? schoolId;
final int? gradeId;
@ -24,6 +25,7 @@ class QuickDataCheckPage extends StatefulWidget {
{Key? key,
required this.jobId,
required this.className,
required this.gradeName,
this.schoolId,
this.gradeId})
: super(key: key);
@ -171,7 +173,7 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage>
width: 6.r,
),
Text(
widget.className,
widget.gradeName + widget.className,
style: TextStyle(
fontSize: 14.r, color: Colors.white),
)

View File

@ -86,7 +86,9 @@ class _ReportTableState extends State<ReportTable> {
Expanded(
flex: 1,
child: Center(child: Text('未作答人',style: TextStyle(fontSize: 12.sp,color: Color(0xFF6A6A6A)),))),
Expanded(
flex: 1,
child: Center(child: Text('答对人数',style: TextStyle(fontSize: 12.sp,color: Color(0xFF6A6A6A)),))),
Expanded(
flex: 1,
child: Center(child: Text('答错人',style: TextStyle(fontSize: 12.sp,color: Color(0xFF6A6A6A)),))),
@ -107,6 +109,9 @@ class _ReportTableState extends State<ReportTable> {
Expanded(
flex:1,
child: Center(child: Text(item['noAnswerStudentNames'],style: TextStyle(fontSize: 12.sp,color: Color(0xFF323232)),))),
Expanded(
flex:1,
child: Center(child: Text(item['answerOkStudentNames'],style: TextStyle(fontSize: 12.sp,color: Color(0xFF323232)),))),
Expanded(
flex:1,
child: Center(child: Text(item['answerNgStudentNames'],style: TextStyle(fontSize: 12.sp,color: Color(0xFF323232)),))),
@ -138,27 +143,28 @@ class _ReportTableState extends State<ReportTable> {
});
}
void zdHandle( BuildContext context, String title, String questionNo,List noAnswerStudentNames,List answerNgStudentNames){
void zdHandle( BuildContext context, String title, String questionNo,List noAnswerStudentNames,List answerNgStudentNames, List answerOkStudentNames){
List list = [];
if(noAnswerStudentNames.length>answerNgStudentNames.length){
for(int i = 0;i<answerNgStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames[i],'answerNgStudentNames':answerNgStudentNames[i]};
list.add(obj);
}
for(int i = answerNgStudentNames.length ;i<noAnswerStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames[i],'answerNgStudentNames':'-'};
list.add(obj);
}
}else{
for(int i = 0;i<noAnswerStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames[i],'answerNgStudentNames':answerNgStudentNames[i]};
list.add(obj);
}
for(int i = noAnswerStudentNames.length ;i<answerNgStudentNames.length;i++){
var obj = {'noAnswerStudentNames':'-','answerNgStudentNames':answerNgStudentNames[i]};
list.add(obj);
}
}
if(noAnswerStudentNames.length>answerNgStudentNames.length && noAnswerStudentNames.length>answerOkStudentNames.length){
for(int i = 0;i<noAnswerStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames[i],'answerNgStudentNames':answerNgStudentNames.length>i?answerNgStudentNames[i]:'-',
'answerOkStudentNames':answerOkStudentNames.length>i?answerOkStudentNames[i]:'-'};
list.add(obj);
}
}else if(answerNgStudentNames.length>noAnswerStudentNames.length && answerNgStudentNames.length>answerOkStudentNames.length){
for(int i = 0;i<answerNgStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames.length>i?noAnswerStudentNames[i]:'-','answerNgStudentNames':answerNgStudentNames[i],
'answerOkStudentNames':answerOkStudentNames.length>i?answerOkStudentNames[i]:'-'};
list.add(obj);
}
}else if(answerOkStudentNames.length>noAnswerStudentNames.length && answerOkStudentNames.length>answerNgStudentNames.length){
for(int i = 0;i<answerOkStudentNames.length;i++){
var obj = {'noAnswerStudentNames':noAnswerStudentNames.length>i?noAnswerStudentNames[i]:'-','answerNgStudentNames':answerNgStudentNames.length>i?answerNgStudentNames[i]:'-',
'answerOkStudentNames':answerOkStudentNames[i]};
list.add(obj);
}
}
showPeopleListDialog(context:context, title:title, questionNo:questionNo,arr:list,dcList:[]);
}
@ -190,7 +196,7 @@ class _ReportTableState extends State<ReportTable> {
)),
DataCell(InkWell(
onTap: () {
zdHandle(context, '作答人数', item.questionNo,item.noAnswerStudentNames,item.answerNgStudentNames);
zdHandle(context, '作答人数', item.questionNo,item.noAnswerStudentNames,item.answerNgStudentNames,item.answerOkStudentNames);
},
child: Center(

View File

@ -84,6 +84,21 @@ class _StudentZgTableState extends State<StudentZgTable> {
style: TextStyle(fontSize: 12.sp, color: Color(0xFF525252))),
),
)),
DataCell(InkWell(
onTap: (){
if(item.state != 0){
showImgDialog(context,item.studentAnswer!);
}
},
child: Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 5.r),
child: Text(item.state!=0 ?'查看':'--',
style: TextStyle(fontSize: 12.sp, color: Color(0xFF3661FE))),
),
),
)),
DataCell(Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 5.r),
@ -94,24 +109,15 @@ class _StudentZgTableState extends State<StudentZgTable> {
)),
DataCell(InkWell(
onTap: (){
showImgDialog(context,item.studentAnswer!);
if(item.state==1 || item.state==2){
showImgDialog(context,item.annotateAnswers!);
}
},
child: Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 5.r),
child: Text('查看',
style: TextStyle(fontSize: 12.sp, color: Color(0xFF3661FE))),
),
),
)),
DataCell(InkWell(
onTap: (){
showImgDialog(context,item.annotateAnswers!);
},
child: Center(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 5.r),
child: Text('查看',
child: Text(item.state==1 || item.state==2?'查看':'--',
style: TextStyle(fontSize: 12.sp, color: Color(0xFF3661FE))),
),
),

View File

@ -1,11 +1,63 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:marking_app/common/model/job/job_report_model.dart';
import 'package:marking_app/utils/easy_refresh/MyEmptyWidget.dart';
import 'package:marking_app/utils/index.dart';
class TopCount extends StatelessWidget {
final JobReportModel data;
const TopCount(this.data,{Key? key}) : super(key: key);
final String className;
const TopCount(this.data,this.className,{Key? key}) : super(key: key);
void showStudentListDialog(
{required BuildContext context, required String title,required List arr}) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
// insetPadding: EdgeInsets.symmetric(vertical: 20.r,horizontal: 20.r),
contentPadding: EdgeInsets.all(20.r),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15.r))),
content: SizedBox(
width: MediaQuery.of(context).size.width * 0.7,
height: MediaQuery.of(context).size.height * 0.7,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Center(
child: Text(
className + title,
style: TextStyle(
fontSize: 15.sp,
color: Color(0xFF3C3C3C),
fontWeight: FontWeight.w500),
),
),
SizedBox(
height: 5.r,
),
SizedBox(height: 15.r,),
arr.length>0?Expanded(
child: ListView.builder(
shrinkWrap: true,
itemBuilder: (context,index){
var item = arr[index];
return Container(
padding: EdgeInsets.symmetric(vertical: 5.r,horizontal: 15.r),
color: index.isOdd?Colors.white:Color(0xFFF0F0F0),
child: Text(item,style: TextStyle(fontSize: 12.sp,color: Color(0xFF323232)),),
);
},itemCount: arr.length,),
):MyEmptyWidget()
],
),
),
);
});
}
@override
Widget build(BuildContext context) {
@ -21,161 +73,154 @@ class TopCount extends StatelessWidget {
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
InkWell(
onTap: (){
showStudentListDialog(context:context,title: '未提交作业学生',arr: data.noAnswerStudentNames);
},
child: Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
data.noAnswerCount.toString(),
style: TextStyle(
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 20.r,
),
Text(
'未提交',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
doubleToStringAsFixed(data.finishRate),
style: TextStyle(
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'%',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 20.r,
child: Row(
),
InkWell(
onTap: (){
showStudentListDialog(context:context,title: '已提交作业学生',arr: data.validStudentNames);
},
child: Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
data.validCount.toString(),
style: TextStyle(
fontSize: 10.sp,
color: Color(0xFFB0B0B0)),
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'/',
'',
style: TextStyle(
fontSize: 10.sp,
color: Color(0xFFB0B0B0)),
),
Text(
data.studentCount.toString(),
style: TextStyle(
fontSize: 10.sp,
color: Color(0xFFB0B0B0)),
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
),
Text(
'完成率',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
SizedBox(
height: 20.r,
),
Text(
'已提交',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
),
),
),
Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
doubleToStringAsFixed(data.correctRate),
style: TextStyle(
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'%',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 20.r,
),
Text(
'正确率',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
),
),
Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
data.allCorrect.toString(),
style: TextStyle(
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 20.r,
),
Text(
'全对',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
InkWell(
onTap: (){
showStudentListDialog(context:context,title: '全对作业学生',arr: data.allCorrectStudentNames);
},
child: Container(
width: 81.r,
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 6.r),
decoration: BoxDecoration(
border: Border.all(
width: 1.r,
color: Color(0xFF4CC793),
style: BorderStyle.solid),
borderRadius: BorderRadius.all(Radius.circular(6.r)),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 5.r,),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
data.allCorrect.toString(),
style: TextStyle(
fontSize: 24.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
Text(
'',
style: TextStyle(
fontSize: 16.sp,
color: Color(0xFF4CC793),
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 20.r,
),
Text(
'全对',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF818181)),
)
],
),
),
),
],
@ -206,55 +251,60 @@ class TopCount extends StatelessWidget {
}else if(item.title == ''){
bgColor = Color(0xFFFF6F6F);
}
return Container(
padding: EdgeInsets.symmetric(vertical: 10.r),
width: (MediaQuery.of(context).size.width - 55.r) / 2,
color: Color(0xFFF5F5F5),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: (MediaQuery.of(context).size.width - 55.r)/4 ,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
width: 28.r,
height: 28.r,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: bgColor,
width: 1.r,
style: BorderStyle.solid),
borderRadius: BorderRadius.circular(14.r)),
child: Center(
child: Text(
item.title,
style: TextStyle(
color: bgColor, fontSize: 12.r),
)),
),
],
return InkWell(
onTap: (){
showStudentListDialog(context:context,title:item.title+'等作业学生',arr: item.studentNames);
},
child: Container(
padding: EdgeInsets.symmetric(vertical: 10.r),
width: (MediaQuery.of(context).size.width - 55.r) / 2,
color: Color(0xFFF5F5F5),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
width: (MediaQuery.of(context).size.width - 55.r)/4 ,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
width: 28.r,
height: 28.r,
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(
color: bgColor,
width: 1.r,
style: BorderStyle.solid),
borderRadius: BorderRadius.circular(14.r)),
child: Center(
child: Text(
item.title,
style: TextStyle(
color: bgColor, fontSize: 12.r),
)),
),
],
),
),
),
SizedBox(
width: 10.r,
),
Text(
item.count.toString(),
style: TextStyle(
fontSize: 20.sp,
color: Color(0xFF595959)),
),
Text(
'',
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF595959)),
),
],
SizedBox(
width: 10.r,
),
Text(
item.count.toString(),
style: TextStyle(
fontSize: 20.sp,
color: Color(0xFF595959)),
),
Text(
'',
style: TextStyle(
fontSize: 14.sp,
color: Color(0xFF595959)),
),
],
),
),
);
},

View File

@ -278,6 +278,7 @@ class RouterManager {
handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
int jobId = int.parse(params['jobId']![0]);
String className = params['className']![0];
String gradeName = params['gradeName']![0];
int? schoolId;
if (params['schoolId'] != null && params['schoolId']?[0] != null && params['schoolId']![0] != 'null') {
schoolId = int.parse(params['schoolId']![0]);
@ -286,7 +287,7 @@ class RouterManager {
if (params['gradeId'] != null && params['gradeId']?[0] != null && params['gradeId']![0] != 'null') {
gradeId = int.parse(params['gradeId']![0]);
}
return QuickDataCheckPage(jobId: jobId, className: className,schoolId:schoolId,gradeId:gradeId);
return QuickDataCheckPage(jobId: jobId, className: className,gradeName:gradeName,schoolId:schoolId,gradeId:gradeId);
},
);