import 'package:flutter/src/widgets/framework.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:making_school_asignment_app/common/job/homework_details.dart'; import 'package:making_school_asignment_app/page/home_page/children/quick_data_check/quick_data_check_state.dart'; import 'dart:math'; class Utils { static Utils? _instance; Utils._internal(); static Utils getInstance() { _instance ??= Utils._internal(); return _instance!; } /// 关闭键盘 static void hideKeyboard() { FocusScopeNode? currentFocus = Get.focusScope?.nearestScope; if (currentFocus == null) { return; } if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) { FocusManager.instance.primaryFocus?.unfocus(); } } void setTimeOut(int seconds, call) => Future.delayed(Duration(seconds: seconds), call); // 是否是平板 static bool isPad([double mobilePhoneScale = 1.2]) { return ScreenUtil().scaleWidth > mobilePhoneScale; } static String getDoubleRemoveZero(double? val, [String? defaultVal]) { try { if (val == null) throw Exception('数据为空'); List _valArr = val.toString().split('.'); if (_valArr.length >= 2) { if (int.parse(_valArr[1]) == 0) { return val.toInt().toString(); } return val.toString(); } return val.toInt().toString(); } catch (e) { return defaultVal ?? ''; } } /// 去除小数点 static String doubleToStringAsFixed(double val, {int fractionDigits = 2}) { return val.toStringAsFixed(fractionDigits).replaceAll(RegExp(r'\.0*$'), ''); } static calcRate(int divisor, int dividend) { if (dividend != 0) { return ((100 * divisor) / dividend); // return ((100 * divisor) / dividend).toStringAsFixed(0); } else { return 0.0; } } /// 秒转时分秒 static String second2HMS(int sec, {bool isEasy = false}) { String hms = "0"; if (!isEasy) hms = "0秒"; if (sec > 0) { int h = sec ~/ 3600; int m = (sec % 3600) ~/ 60; int s = sec % 60; if (h > 0) { hms = "$h时$m分$s秒"; } else { if (m > 0) { hms = "$m分$s秒"; } else { hms = "$s秒"; } } } return hms; } static getHomeworkData(HomeworkDetails data) { CountData dataCount = CountData(); List kgt = data.dtls.where((w) => w.questionType == 1).toList(); dataCount.kgtAnswerCount = kgt.where((w) => w.state != 0).length; dataCount.kgtOkCount = kgt.where((w) => w.state == 3).length; dataCount.kgtDtlCount = kgt.length; dataCount.kgtAnswerRate = Utils.calcRate(dataCount.kgtAnswerCount!, dataCount.kgtDtlCount!); dataCount.kgtOkRate = Utils.calcRate(dataCount.kgtOkCount!, dataCount.kgtDtlCount!); dataCount.kgtCount = data.questions.where((w) => w.questionType == 1).length; List zgt = data.dtls.where((w) => w.questionType == 2).toList(); dataCount.zgtAnswerCount = zgt.where((w) => w.state != 0).length; dataCount.zgtOkCount = zgt.where((w) => w.state == 3).length; dataCount.zgtDtlCount = zgt.length; dataCount.zgtAnswerRate = Utils.calcRate(dataCount.zgtAnswerCount!, dataCount.zgtDtlCount!); dataCount.zgtOkRate = Utils.calcRate(dataCount.zgtOkCount!, dataCount.zgtDtlCount!); dataCount.zgtCount = data.questions.where((w) => w.questionType == 2).length; dataCount.studentCount = data.students.length; dataCount.priorityStudents = data.students.where((w) => w.priorityAnnotate!).toList(); //已提交学生数 dataCount.studentSubmitCount = data.students.where((s) => s.state != 0).length; dataCount.studentSubmitStudents = data.students.where((s) => s.state != 0).toList(); //未提交学生数 dataCount.noAnswerCount = data.students.length - dataCount.studentSubmitCount!; dataCount.noAnswerStudents = data.students.where((s) => s.state == 0).toList(); for (var stu in data.students) { stu.kgtStu = kgt.where((w) => w.studentId == stu.studentId).toList(); stu.kgtStu!.sort((a, b) => num.parse(a.questionNo).compareTo(num.parse(b.questionNo))); stu.kgtOkCount = stu.kgtStu!.where((w) => w.state == 3).length; stu.kgtErrorCount = stu.kgtStu!.where((w) => w.state == 2).length; stu.kgtAnswerCount = stu.kgtStu!.where((w) => w.state != 0).length; stu.zgtStu = zgt.where((w) => w.studentId == stu.studentId).toList(); stu.zgtStu!.sort((a, b) => num.parse(a.questionNo).compareTo(num.parse(b.questionNo))); stu.zgtOkCount = stu.zgtStu!.where((w) => w.state == 3).length; stu.zgtErrorCount = stu.zgtStu!.where((w) => w.state == 2).length; stu.zgtUnrated = stu.zgtStu!.where((w) => w.state == 1).length; stu.zgtAnswerCount = stu.zgtStu!.where((w) => w.state != 0).length; stu.isAllCorrect = stu.kgtOkCount! + stu.zgtOkCount! == kgt.length + zgt.length ? true : false; stu.allOk = data.dtls.where((w) { if (stu.studentId == w.studentId) { stu.useTime = w.useTime; } for (var que in data.questions) { if (w.templateId == que.templateId && w.questionNo == que.questionNo) { w.answer = que.answer; w.questionPicture = que.questionPicture; } } return w.studentId == stu.studentId && w.state != 3; }).length ?? 0; if ((stu.kgtStu!.length - stu.kgtAnswerCount!) + (stu.zgtStu!.length - stu.zgtAnswerCount!) == (stu.kgtStu!.length + stu.zgtStu!.length)) { stu.allNotDone = true; } else { stu.allNotDone = false; } stu.noAnswerCount = data.dtls.where((w) => w.state == 0 && stu.studentId == w.studentId).length; List ques = data.questions; stu.queDtls = data.dtls .where((w) => w.studentId == stu.studentId && ques.indexWhere((q) => w.templateId == q.templateId && w.questionNo == q.questionNo) > -1) .toList(); int okCount = stu.queDtls!.where((w) => w.state == 3).length; int ttlCount = stu.queDtls!.length; stu.okRate = Utils.calcRate(okCount, ttlCount); var stuDtls = data.dtls.where((w) => w.studentId == stu.studentId); var secList = []; for(var sec in stuDtls){ if(sec.useTime >= 1){ var date = DateTime.parse(sec.lastAnswerTime!); var lastSec =(date.difference(DateTime(1970)).inSeconds).floor(); secList.add(lastSec); secList.add(lastSec - sec.useTime); } } secList.sort(); var maxSec = secList.isNotEmpty?secList.last:0; var minSec = secList.isNotEmpty?secList.first:0; var secTime = secList.isNotEmpty?maxSec-minSec:0; stu.ttlSec = second2HMS(secTime); } data.students.sort((a, b) { int num1 = a.state; int num2 = b.state; return num2.compareTo(num1); }); //全对 dataCount.allCorrect = data.students.where((w) => w.isAllCorrect == true).length; dataCount.allCorrectStudents = data.students.where((w) => w.isAllCorrect == true).toList(); //优 dataCount.levelOneCount = data.students.where((s) => s.okRate! >= 85).length; dataCount.levelOneStudents = data.students.where((s) => s.okRate! >= 85).toList(); //良 dataCount.levelTwoCount = data.students.where((s) => s.okRate! < 85 && s.okRate! >= 55).length; dataCount.levelTwoStudents = data.students.where((s) => s.okRate! < 85 && s.okRate! >= 55).toList(); //中 dataCount.levelThreeCount = data.students.where((s) => s.okRate! < 55 && s.okRate! >= 25).length; dataCount.levelThreeStudents = data.students.where((s) => s.okRate! < 55 && s.okRate! >= 25).toList(); //差 dataCount.levelFourCount = data.students.where((s) => s.okRate! < 25).length; dataCount.levelFourStudents = data.students.where((s) => s.okRate! < 25).toList(); for (var que in data.questions) { List ques = data.dtls.where((w) => w.templateId == que.templateId && w.questionNo == que.questionNo).toList(); que.answerCount = ques.where((w) => w.state != 0).length; que.answerRate = Utils.calcRate(que.answerCount!, dataCount.studentCount!); int okCount = ques.where((w) => w.state == 3).length; que.okRate = Utils.calcRate(okCount, dataCount.studentCount!); que.priorityInfo = ques.where((w) { return dataCount.priorityStudents!.indexWhere((s) { w.studentName = s.studentName; return s.studentId == w.studentId; }) > -1 && w.state != 3; }).toList(); que.answerNgStudents = ques.where((w) { w.studentName = data.students.firstWhere((s) => s.studentId == w.studentId).studentName; return w.state == 2; }).toList(); que.noAnswerStudents = ques.where((w) { return w.state == 0; }).toList(); que.answerOkStudents = ques.where((w) { return w.state == 3; }).toList(); //作答效率 int middleTime = 0; if (ques.length % 2 == 0) { int index = (ques.length / 2).ceil(); middleTime = ((ques[index].useTime + ques[index - 1].useTime) / 2).ceil(); } else { int index = ((ques.length + 1) / 2).ceil(); middleTime = ques[index - 1].useTime; } var excellent = ques.where((w) => w.state == 3 && w.useTime <= middleTime).length; var good = ques.where((w) => w.state == 3 && w.useTime > middleTime).length; var middle = ques.where((w) => w.state != 3 && w.useTime <= middleTime).length; var differ = ques.where((w) => w.state != 3 && w.useTime > middleTime).length; que.overallTitles = [OverallTitles('优秀', excellent), OverallTitles('良好', good), OverallTitles('中', middle), OverallTitles('差', differ)]; } for (var know in data.knows) { List ques = data.questions.where((w) => w.knows.indexWhere((k) => k.knowledgeId == know.knowledgeId) > -1).toList(); List queDtls = data.dtls.where((w) => ques.indexWhere((q) => w.templateId == q.templateId && w.questionNo == q.questionNo) > -1).toList(); know.okCount = queDtls.where((w) => w.state == 3).length; know.ttlCount = queDtls.length; know.okRate = Utils.calcRate(know.okCount!, know.ttlCount!); } return dataCount; } static DateTime getWeekStartDate() { DateTime now = DateTime.now(); int dayOfWeek = now.weekday; // 获取今天是周几(1代表周一,7代表周日) int diff = dayOfWeek - 1; // 计算今天距离周一的天数差 if (diff < 0) { diff += 7; // 如果是周日,则需要加上一周的天数 } return now.subtract(Duration(days: diff)); // 减去天数差,得到本周一的时间 } static DateTime getWeekEndDate() { DateTime now = DateTime.now(); int dayOfWeek = now.weekday; // 获取今天是周几 int diff = 7 - dayOfWeek; // 计算今天距离周日的天数差 if (diff == 0) { diff = 7; // 如果是周日,则加上一周的天数 } return now.add(Duration(days: diff)); // 加上天数差减一,得到本周日的时间 } } // 是否是平板 bool isPad([double mobilePhoneScale = 1.2]) { return ScreenUtil().scaleWidth > mobilePhoneScale; } void toUpState(Function(void Function()) setState, VoidCallback fn, bool mounted) { if (mounted) setState(fn); }