Compare commits

..

3 Commits

Author SHA1 Message Date
machuanyu 290d4efddf 入参优化 2024-03-14 13:46:27 +08:00
machuanyu e0814ba901 Merge branch 'main' into mcy_revision 2024-03-14 10:23:14 +08:00
1147192855@qq.com 52321c54d0 进入收藏页面 处理页面中文传值问题 2024-03-14 09:59:28 +08:00
6 changed files with 456 additions and 358 deletions

View File

@ -67,10 +67,10 @@ class Items extends Object {
String className;
@JsonKey(name: 'questionPage')
int questionPage;
int? questionPage;
@JsonKey(name: 'questionPicture')
String questionPicture;
String? questionPicture;
@JsonKey(name: 'createTime')
String createTime;

View File

@ -12,7 +12,10 @@ class FavoriteStudentDialog extends StatefulWidget {
final Function deleteFav;
const FavoriteStudentDialog(
{Key? key, required this.item, required this.group,required this.deleteFav})
{Key? key,
required this.item,
required this.group,
required this.deleteFav})
: super(key: key);
@override
@ -26,7 +29,6 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
late Items currentStudent;
void initState() {
pageController = PageController(initialPage: defaultIndex);
currentStudent = widget.item;
List<Items> list = [];
widget.group.forEach((element) {
@ -38,6 +40,7 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
imageList = list;
defaultIndex = list.indexWhere((element) => element.id == widget.item.id);
});
pageController = PageController(initialPage: defaultIndex);
}
void dispose() {
@ -66,13 +69,25 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
style: TextStyle(fontSize: 12.sp, color: Color(0xFF868686)),
),
InkWell(
onTap: (){
onTap: () {
widget.deleteFav(currentStudent);
imageList.removeAt(defaultIndex);
print('imageList.length=${imageList.length}');
print('defaultIndex=${defaultIndex}');
setState(() {
if (imageList.length > 0) {
if (defaultIndex < imageList.length) {
currentStudent = imageList[defaultIndex];
} else {
currentStudent = imageList[defaultIndex - 1];
defaultIndex = defaultIndex - 1;
}
} else {
currentStudent.className = '';
currentStudent.studentName = '';
}
});
},
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8.r),
@ -98,8 +113,8 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
SizedBox(
height: 10.r,
),
imageList.length>0?
Expanded(
imageList.length > 0
? Expanded(
child: Container(
color: Colors.white,
width: MediaQuery.of(context).size.width,
@ -108,7 +123,7 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
builder: (BuildContext context, int index) {
final Items item = imageList[index];
return PhotoViewGalleryPageOptions(
imageProvider: NetworkImage(item.questionPicture),
imageProvider: NetworkImage(item.questionPicture!),
heroAttributes: PhotoViewHeroAttributes(tag: item.id),
);
},
@ -121,14 +136,15 @@ class _FavoriteStudentDialogState extends State<FavoriteStudentDialog> {
});
},
scrollDirection: Axis.horizontal,
),
),
):Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height/2 - 200.r),
)
: Padding(
padding: EdgeInsets.only(
top: MediaQuery.of(context).size.height / 2 - 200.r),
child: MyEmptyWidget(),
),
if(imageList.length>0)
if (imageList.length > 0)
Padding(
padding: EdgeInsets.symmetric(vertical: 15.r),
child: Row(

View File

@ -19,16 +19,16 @@ part 'job_favorite.g.dart';
///
class JobFavorite extends StatefulWidget {
final int jobId;
final int schoolId;
final int gradeId;
final String className;
final int? schoolId;
final int? gradeId;
final String? className;
final String jobName;
const JobFavorite({
required this.jobId,
required this.schoolId,
required this.gradeId,
required this.className,
this.schoolId,
this.gradeId,
this.className,
required this.jobName,
super.key,
});
@ -43,6 +43,7 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
JobReportJoinClass? classData;
late String loginName;
final int pageSize = 100;
String className = '-1';
@override
void initState() {
@ -55,6 +56,10 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
loginName = userInfo['loginName'];
});
});*/
if(widget.className != null){
className = widget.className!;
}
getInvolveClasses();
_future = getData();
}
@ -62,7 +67,7 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
Future<List<Items>> getData() async {
var _client = await getClient();
var result =
await _client.getListOfJobFavorites(widget.jobId, widget.jobName, widget.className, pageSize);
await _client.getListOfJobFavorites(widget.jobId, widget.jobName, className == '全部'?'':className, pageSize);
return result.data!.items;
}
@ -98,7 +103,7 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
deleteFav(Items student) async{
RestClient _client = await getClient();
BaseStructureResult res = await _client.getJobDeFavorites(widget.jobId,student.studentId,student.questionPage);
BaseStructureResult res = await _client.getJobDeFavorites(widget.jobId,student.studentId,student.questionPage!);
if(res.success){
_future = getData();
setState(() {
@ -140,15 +145,18 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
(List<Items>? datas) {
if (datas == null)
return Container(
child: InkWell(
onTap: (){
toUpState(setState, () => _future = getData(), mounted);
},
child: Center(
child: quickText('请求错误'),
child: quickText('请求错误,点击再次发起请求'),
),
),
);
List pageList = [];
List groupList = [];
String name = '';
if (datas!.length > 0) {
name = datas[0].jobName;
for (var item in datas) {
pageList.add(item.questionPage);
}
@ -169,7 +177,7 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
name,
widget.jobName,
style: TextStyle(fontSize: 14.sp, color: Color(0xFF3C3C3C)),
),
//
@ -180,6 +188,7 @@ class _JobFavoriteState extends State<JobFavorite> with CommonMixin {
$classSelection(involveClasses, classData, call: (JobReportJoinClass _classData) {
classData = _classData;
if (_classData.gradeId == -1) classData = null;
className = _classData.className;
_future = getData();
toUpState(setState, () {}, mounted);
}),
@ -376,6 +385,7 @@ Widget $classSelection(List<JobReportJoinClass>? involveClasses, JobReportJoinCl
onChanged: (String? value) {
if (value == null) return;
call(involveClasses.firstWhere((element) => element.uniqueId == value));
},
),
);

View File

@ -7,7 +7,6 @@ import 'package:flutter_screenutil/flutter_screenutil.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/job/job_data_report.dart';
import 'package:marking_app/common/model/job/job_report_join_class.dart';
import 'package:marking_app/pages/homework_correction/widget/quick_student_data_table.dart';
import 'package:marking_app/utils/easy_refresh/MyEmptyWidget.dart';
import 'package:marking_app/utils/index.dart';
@ -17,19 +16,28 @@ import 'package:percent_indicator/linear_percent_indicator.dart';
class QuickDataCheckPage extends StatefulWidget {
final int jobId;
final String className;
final int? schoolId;
final int? gradeId;
const QuickDataCheckPage({Key? key, required this.jobId,required this.className}) : super(key: key);
const QuickDataCheckPage(
{Key? key,
required this.jobId,
required this.className,
this.schoolId,
this.gradeId})
: super(key: key);
@override
State<QuickDataCheckPage> createState() => _QuickDataCheckPageState();
}
class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixin {
class _QuickDataCheckPageState extends State<QuickDataCheckPage>
with CommonMixin {
JobDataReport? jobData;
void initState() {
super.initState();
EasyLoading.show(status:'loading...');
EasyLoading.show(status: 'loading...');
getJobDataReport();
}
@ -37,17 +45,22 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
RestClient _client = await getClient();
Map<String, dynamic> params = {};
params['jobid'] = widget.jobId;
print(widget.jobId);
params['className'] = widget.className;
if (widget.schoolId != null) {
params['schoolId'] = widget.schoolId;
}
if (widget.gradeId != null) {
params['gradeId'] = widget.gradeId;
}
BaseStructureResult<JobDataReport?> data =
await _client.getJobDataCenterReport(params);
EasyLoading.dismiss();
if(data.code == 200){
if (data.code == 200) {
setState(() {
jobData = data.data;
});
}
}
@override
@ -90,9 +103,10 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
))),
],
),
SizedBox(height:10.r),
jobData != null?
Expanded(child: SingleChildScrollView(
SizedBox(height: 10.r),
jobData != null
? Expanded(
child: SingleChildScrollView(
child: Column(
children: [
Padding(
@ -110,17 +124,21 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
),
Text(
widget.className,
style: TextStyle(fontSize: 14.r, color: Colors.white),
style: TextStyle(
fontSize: 14.r, color: Colors.white),
)
],
),
),
Container(
padding: EdgeInsets.symmetric(vertical: 10.r, horizontal: 15.r),
margin: EdgeInsets.symmetric(vertical: 10.r, horizontal: 14.r),
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 15.r),
margin: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 14.r),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(6.r))),
borderRadius:
BorderRadius.all(Radius.circular(6.r))),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@ -132,8 +150,8 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
height: 14.r,
decoration: BoxDecoration(
color: Color(0xFF4CC793),
borderRadius:
BorderRadius.all(Radius.circular(7.r))),
borderRadius: BorderRadius.all(
Radius.circular(7.r))),
),
SizedBox(
width: 6.r,
@ -141,7 +159,8 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
Text(
'已提交',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF333333)),
fontSize: 12.sp,
color: Color(0xFF333333)),
),
SizedBox(
width: 35.r,
@ -151,8 +170,8 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
height: 14.r,
decoration: BoxDecoration(
color: Color(0xFF6888FD),
borderRadius:
BorderRadius.all(Radius.circular(7.r))),
borderRadius: BorderRadius.all(
Radius.circular(7.r))),
),
SizedBox(
width: 6.r,
@ -160,7 +179,8 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
Text(
'未提交',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF333333)),
fontSize: 12.sp,
color: Color(0xFF333333)),
)
],
),
@ -171,12 +191,19 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
PieChartData(
borderData: FlBorderData(show: false),
sectionsSpace: 0,
centerSpaceRadius: MediaQuery.of(context).size.width * 0.1,
centerSpaceRadius:
MediaQuery.of(context).size.width * 0.1,
sections: [
PieChartSectionData(
color: Color(0xFF4CC793),
value: jobData!.validCount/(jobData!.validCount+jobData!.noAnswerCount) * 100,
radius: MediaQuery.of(context).size.width * 0.1 + 5,
value: jobData!.validCount /
(jobData!.validCount +
jobData!.noAnswerCount) *
100,
radius:
MediaQuery.of(context).size.width *
0.1 +
5,
title: '${jobData!.validCount}',
titleStyle: TextStyle(
fontSize: 14.sp,
@ -185,8 +212,13 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
),
PieChartSectionData(
color: Color(0xFF6888FD),
value: jobData!.noAnswerCount/(jobData!.validCount+jobData!.noAnswerCount) * 100,
radius: MediaQuery.of(context).size.width * 0.1,
value: jobData!.noAnswerCount /
(jobData!.validCount +
jobData!.noAnswerCount) *
100,
radius:
MediaQuery.of(context).size.width *
0.1,
title: '${jobData!.noAnswerCount}',
titleStyle: TextStyle(
fontSize: 14.sp,
@ -199,22 +231,27 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
),
//
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'客观题答题进度',
style: TextStyle(
fontSize: 10.sp, color: Color(0xFF8B8B8B)),
fontSize: 10.sp,
color: Color(0xFF8B8B8B)),
),
Text('${doubleToStringAsFixed(jobData!.kgValidRate)}%',
Text(
'${doubleToStringAsFixed(jobData!.kgValidRate)}%',
style: TextStyle(
fontSize: 10.sp, color: Color(0xFF333333)),
fontSize: 10.sp,
color: Color(0xFF333333)),
),
],
),
SizedBox(height: 6.r),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 10,
@ -223,7 +260,7 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
animation: true,
lineHeight: 9.h,
animationDuration: 2500,
percent: jobData!.kgValidRate/100,
percent: jobData!.kgValidRate / 100,
progressColor: Color(0xFFFF7F22),
backgroundColor: Color(0xFFEAEAEA),
barRadius: Radius.circular(10.r),
@ -233,23 +270,27 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
SizedBox(height: 20.r),
//
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'主观题答题进度',
style: TextStyle(
fontSize: 10.sp, color: Color(0xFF8B8B8B)),
fontSize: 10.sp,
color: Color(0xFF8B8B8B)),
),
Text(
'${doubleToStringAsFixed(jobData!.zgValidRate)}%',
style: TextStyle(
fontSize: 10.sp, color: Color(0xFF333333)),
fontSize: 10.sp,
color: Color(0xFF333333)),
),
],
),
SizedBox(height: 6.r),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 10,
@ -258,7 +299,7 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
animation: true,
lineHeight: 9.h,
animationDuration: 2500,
percent: jobData!.zgValidRate/100,
percent: jobData!.zgValidRate / 100,
progressColor: Color(0xFFFF7F22),
backgroundColor: Color(0xFFEAEAEA),
barRadius: Radius.circular(10.r),
@ -269,15 +310,18 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
),
),
Container(
padding: EdgeInsets.symmetric(vertical: 10.r, horizontal: 10.r),
margin: EdgeInsets.symmetric(vertical: 10.r, horizontal: 14.r),
padding: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 10.r),
margin: EdgeInsets.symmetric(
vertical: 10.r, horizontal: 14.r),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(6.r))),
borderRadius:
BorderRadius.all(Radius.circular(6.r))),
child: Column(
children: [
InkWell(
onTap: (){
onTap: () {
jobData!.studentDetails.sort((a, b) {
int num1 = a.kgValidRate + a.zgValidRate;
int num2 = b.kgValidRate + b.zgValidRate;
@ -293,7 +337,8 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
Text(
'未提交排序',
style: TextStyle(
fontSize: 12.sp, color: Color(0xFF6888FD)),
fontSize: 12.sp,
color: Color(0xFF6888FD)),
),
SizedBox(
width: 10.r,
@ -306,11 +351,22 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
],
),
),
SizedBox(height: 10.r,),
SizedBox(
height: jobData!.studentDetails.length>5?350.r:jobData!.studentDetails.length * 50.r + 40.r,
height: 10.r,
),
SizedBox(
height: jobData!.studentDetails.length > 5
? 350.r
: jobData!.studentDetails.length * 50.r +
40.r,
child: QuickStudentDataTable(
headList: ['学生姓名','客观题','主观题','客观题错题','主观题错题'],
headList: [
'学生姓名',
'客观题',
'主观题',
'客观题错题',
'主观题错题'
],
bodyList: jobData!.studentDetails,
jobId: widget.jobId,
fixedRows: 1,
@ -322,8 +378,10 @@ class _QuickDataCheckPageState extends State<QuickDataCheckPage> with CommonMixi
),
],
),
)):Padding(
padding: EdgeInsets.only(top: MediaQuery.of(context).size.height/2 - 200.r),
))
: Padding(
padding: EdgeInsets.only(
top: MediaQuery.of(context).size.height / 2 - 200.r),
child: MyEmptyWidget(),
)
],

View File

@ -278,7 +278,15 @@ class RouterManager {
handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
int jobId = int.parse(params['jobId']![0]);
String className = params['className']![0];
return QuickDataCheckPage(jobId: jobId, className: className);
int? schoolId;
if (params['schoolId'] != null && params['schoolId']![0] != null && params['schoolId']![0] != 'null') {
schoolId = int.parse(params['schoolId']![0]);
}
int? gradeId;
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);
},
);
@ -309,10 +317,16 @@ class RouterManager {
static final _jobFavoritePagePathHandler = Handler(
handlerFunc: (BuildContext? context, Map<String, List<String>> params) {
int jobId = int.parse(params['jobId']![0]);
int gradeId = int.parse(params['gradeId']![0]);
int schoolId = int.parse(params['schoolId']![0]);
String className = params['className']![0];
String jobName = params['jobName']![0];
String? className = params['className']![0];
int? schoolId;
if (params['schoolId'] != null && params['schoolId']![0] != null && params['schoolId']![0] != 'null') {
schoolId = int.parse(params['schoolId']![0]);
}
int? gradeId;
if (params['gradeId'] != null && params['gradeId']![0] != null && params['gradeId']![0] != 'null') {
gradeId = int.parse(params['gradeId']![0]);
}
return JobFavorite(jobId: jobId, gradeId: gradeId, schoolId: schoolId, className: className,jobName:jobName);
},
);

View File

@ -308,7 +308,7 @@ abstract class RestClient {
Future<BaseStructureResult<JobFavStudent>> getListOfJobFavorites(
@the_retrofit.Query("JobId") int jobId,
@the_retrofit.Query("JobName") String jobName,
@the_retrofit.Query("className") String className,
@the_retrofit.Query("className") String? className,
@the_retrofit.Query("PageSize") int pageSize,
);