Compare commits

...

2 Commits

Author SHA1 Message Date
1147192855@qq.com d93a203ee6 no message 2024-06-04 15:02:35 +08:00
1147192855@qq.com beab37d15d no message 2024-06-04 15:01:57 +08:00
11 changed files with 313 additions and 900 deletions

2
.gitignore vendored
View File

@ -49,3 +49,5 @@ making_school_asignment_app/lib/common/api/retrofit_client.g.dart
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
making_school_asignment_app/lib/common/api/retrofit_client.g.dart
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart

View File

@ -1,678 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'retrofit_client.dart';
// **************************************************************************
// RetrofitGenerator
// **************************************************************************
// ignore_for_file: unnecessary_brace_in_string_interps,no_leading_underscores_for_local_identifiers
class _RetrofitClient implements RetrofitClient {
_RetrofitClient(
this._dio, {
this.baseUrl,
});
final Dio _dio;
String? baseUrl;
@override
Future<BasePageData<AppVersionModel>?> getAppVersions(
BaseAppVersion appVersion) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(appVersion.toJson());
final _result = await _dio.fetch<Map<String, dynamic>?>(
_setStreamType<BasePageData<AppVersionModel>>(Options(
method: 'POST',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/infra/AppVersion/GetList',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data == null
? null
: BasePageData<AppVersionModel>.fromJson(
_result.data!,
(json) => AppVersionModel.fromJson(json as Map<String, dynamic>),
);
return value;
}
@override
Future<dynamic> toLogin(
String account,
String password,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = {
'account': account,
'password': password,
};
final _result = await _dio.fetch(_setStreamType<dynamic>(Options(
method: 'POST',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/rbac/Auth/DcLogin',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data;
return value;
}
@override
Future<UserInfoDetail?> getUser(String userId) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{r'userId': userId};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>?>(_setStreamType<UserInfoDetail>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/rbac/User/GetUser',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value =
_result.data == null ? null : UserInfoDetail.fromJson(_result.data!);
return value;
}
@override
Future<WorkStudent> getWorkList(WorkStudentParams params) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.addAll(params.toJson());
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>>(_setStreamType<WorkStudent>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Homework/GetList',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = WorkStudent.fromJson(_result.data!);
return value;
}
@override
Future<Map<String, List<EnumSubject>>> getEnumSubjectList(
List<dynamic> enumNames) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{r'enumNames': enumNames};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio.fetch<Map<String, dynamic>>(
_setStreamType<Map<String, List<EnumSubject>>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/app/Common/GetEnumInfos',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!.map((k, dynamic v) => MapEntry(
k,
(v as List)
.map((i) => EnumSubject.fromJson(i as Map<String, dynamic>))
.toList()));
return value;
}
@override
Future<List<ClassItem>> getStudentClass() async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result =
await _dio.fetch<List<dynamic>>(_setStreamType<List<ClassItem>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/rbac/SchoolUser/GetTeacherClassSubject',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) => ClassItem.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<List<StudentItem>> getStudentList(
String classId,
int subject,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'ClassId': classId,
r'Subject': subject,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<List<dynamic>>(_setStreamType<List<StudentItem>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/rbac/Student/GetPriorityAnnotateStudents',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) => StudentItem.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<WorkStudent> getUnAnnotateList(WorkStudentParams params) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.addAll(params.toJson());
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>>(_setStreamType<WorkStudent>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Annotate/GetUnAnnotateList',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = WorkStudent.fromJson(_result.data!);
return value;
}
@override
Future<WorkStudent> getAnnotatedList(WorkStudentParams params) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.addAll(params.toJson());
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>>(_setStreamType<WorkStudent>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Annotate/GetAnnotatedList',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = WorkStudent.fromJson(_result.data!);
return value;
}
@override
Future<List<AnnotatedClass>> getAnnotatedClassList(String homeworkId) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{r'homeworkId': homeworkId};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<List<dynamic>>(_setStreamType<List<AnnotatedClass>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Annotate/Get',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) => AnnotatedClass.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<HomeworkDetails> getHomeworkDetails(
String homeworkId,
String classId,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'homeworkId': homeworkId,
r'classId': classId,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>>(_setStreamType<HomeworkDetails>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetHomeworkDtls',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = HomeworkDetails.fromJson(_result.data!);
return value;
}
@override
Future<StudentHistory> getStudentHistory(StudentHistoryParams params) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.addAll(params.toJson());
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio
.fetch<Map<String, dynamic>>(_setStreamType<StudentHistory>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetStudentHistory',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = StudentHistory.fromJson(_result.data!);
return value;
}
@override
Future<dynamic> getAnnotateStudent(
String classId,
int studentId,
bool priorityAnnotate,
int subject,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = {
'classId': classId,
'studentId': studentId,
'priorityAnnotate': priorityAnnotate,
'subject': subject,
};
final _result = await _dio.fetch(_setStreamType<dynamic>(Options(
method: 'POST',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/rbac/Student/PriorityAnnotateStudent',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data;
return value;
}
@override
Future<StudentPersonalInfo> getStudentHomework(
String homeworkId,
int studentId,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'HomeworkId': homeworkId,
r'StudentId': studentId,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio.fetch<Map<String, dynamic>>(
_setStreamType<StudentPersonalInfo>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetStudentHomework',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = StudentPersonalInfo.fromJson(_result.data!);
return value;
}
@override
Future<List<KnowledgePointsGrasp>> getKnowledgeReport(
String dateStart,
String dateEnd,
String knowledgeName,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'DateStart': dateStart,
r'DateEnd': dateEnd,
r'KnowledgeName': knowledgeName,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio.fetch<List<dynamic>>(
_setStreamType<List<KnowledgePointsGrasp>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetKnowledgeReport',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) =>
KnowledgePointsGrasp.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<List<KnowledgeReportDetail>> getKnowledgeReportDetail(
String dateStart,
String dateEnd,
int knowledgeId,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'DateStart': dateStart,
r'DateEnd': dateEnd,
r'KnowledgeId': knowledgeId,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio.fetch<List<dynamic>>(
_setStreamType<List<KnowledgeReportDetail>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetKnowledgeReportDetail',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) =>
KnowledgeReportDetail.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<List<Students>> getQuestionStudentState(
String homeworkId,
int templateId,
int questionNo,
) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{
r'HomeworkId': homeworkId,
r'TemplateId': templateId,
r'QuestionNo': questionNo,
};
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result =
await _dio.fetch<List<dynamic>>(_setStreamType<List<Students>>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/HmsReport/GetQuestionStudentState',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
var value = _result.data!
.map((dynamic i) => Students.fromJson(i as Map<String, dynamic>))
.toList();
return value;
}
@override
Future<dynamic> getCollect(String homeworkId) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = {'homeworkId': homeworkId};
final _result = await _dio.fetch(_setStreamType<dynamic>(Options(
method: 'POST',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Homework/Collect',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data;
return value;
}
@override
Future<dynamic> toFavStudent(FavorParam param) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
final _headers = <String, dynamic>{};
final _data = <String, dynamic>{};
_data.addAll(param.toJson());
final _result = await _dio.fetch(_setStreamType<dynamic>(Options(
method: 'POST',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/FavStudent/FavStudent',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = _result.data;
return value;
}
@override
Future<DoPaperDetailsResult> getDoPaperDetails(
DoPaperDetailsParam param) async {
final _extra = <String, dynamic>{};
final queryParameters = <String, dynamic>{};
queryParameters.addAll(param.toJson());
final _headers = <String, dynamic>{};
const Map<String, dynamic>? _data = null;
final _result = await _dio.fetch<Map<String, dynamic>>(
_setStreamType<DoPaperDetailsResult>(Options(
method: 'GET',
headers: _headers,
extra: _extra,
)
.compose(
_dio.options,
'/api/hms/Annotate/GetForAnnotate',
queryParameters: queryParameters,
data: _data,
)
.copyWith(
baseUrl: _combineBaseUrls(
_dio.options.baseUrl,
baseUrl,
))));
final value = DoPaperDetailsResult.fromJson(_result.data!);
return value;
}
RequestOptions _setStreamType<T>(RequestOptions requestOptions) {
if (T != dynamic &&
!(requestOptions.responseType == ResponseType.bytes ||
requestOptions.responseType == ResponseType.stream)) {
if (T == String) {
requestOptions.responseType = ResponseType.plain;
} else {
requestOptions.responseType = ResponseType.json;
}
}
return requestOptions;
}
String _combineBaseUrls(
String dioBaseUrl,
String? baseUrl,
) {
if (baseUrl == null || baseUrl.trim().isEmpty) {
return dioBaseUrl;
}
final url = Uri.parse(baseUrl);
if (url.isAbsolute) {
return url.toString();
}
return Uri.parse(dioBaseUrl).resolveUri(url).toString();
}
}

View File

@ -1,3 +1,4 @@
import 'package:get/get.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
part 'do_paper_details_result.g.dart'; part 'do_paper_details_result.g.dart';
@ -5,7 +6,15 @@ part 'do_paper_details_result.g.dart';
@JsonSerializable(checked: true) @JsonSerializable(checked: true)
class DoPaperDetailsResult extends Object { class DoPaperDetailsResult extends Object {
@JsonKey(name: 'templateIds') @JsonKey(name: 'templateIds')
Object templateIds; Map<String, bool> templateIds;
//
@JsonKey(name: 'templateIdKeys')
List<int>? templateIdKeys;
//
@JsonKey(name: 'templateIdKeyMap')
Map<int, int>? templateIdKeyMap;
@JsonKey(name: 'students') @JsonKey(name: 'students')
List<PaperStudents> students; List<PaperStudents> students;
@ -16,16 +25,20 @@ class DoPaperDetailsResult extends Object {
@JsonKey(name: 'studentId') @JsonKey(name: 'studentId')
int studentId; int studentId;
@JsonKey(name: 'annotatedCount') //
@JsonKey(name: 'priority', defaultValue: false)
bool priority;
@JsonKey(name: 'annotatedCount') //
int annotatedCount; int annotatedCount;
@JsonKey(name: 'submitCount') @JsonKey(name: 'submitCount') //
int submitCount; int submitCount;
@JsonKey(name: 'zgtAnswer') @JsonKey(name: 'zgtAnswer') //
String zgtAnswer; String zgtAnswer;
@JsonKey(name: 'zgtAnnotate') @JsonKey(name: 'zgtAnnotate') //
String? zgtAnnotate; String? zgtAnnotate;
@JsonKey(name: 'lastAnswerTime') @JsonKey(name: 'lastAnswerTime')
@ -61,7 +74,26 @@ class DoPaperDetailsResult extends Object {
this.unSubmitStudents, this.unSubmitStudents,
this.lastPage, this.lastPage,
this.nextPage, this.nextPage,
); this.templateIdKeys,
this.templateIdKeyMap,
this.priority,
) {
if (templateIds.keys.isNotEmpty) {
templateIdKeys = templateIds.keys.map((e) => int.parse(e)).toList();
templateIdKeyMap = <int, int>{};
for (var i = 1; i <= templateIdKeys!.length; i++) {
var theVal = templateIdKeys![i - 1];
templateIdKeyMap![i] = theVal;
templateIdKeyMap![theVal] = i;
}
}
//
if (students.isNotEmpty) {
var currentStudent = students.firstWhereOrNull((e) => e.id == studentId);
if (currentStudent != null) priority = currentStudent.isPriority;
}
}
factory DoPaperDetailsResult.fromJson(Map<String, dynamic> srcJson) => _$DoPaperDetailsResultFromJson(srcJson); factory DoPaperDetailsResult.fromJson(Map<String, dynamic> srcJson) => _$DoPaperDetailsResultFromJson(srcJson);

View File

@ -1,11 +1,16 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:making_school_asignment_app/common/job/marking_models/do_paper_details_param.dart';
import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart'; import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart'; import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart';
part 'dropdown_switch_students_type.g.dart';
/// ///
class DropdownSwitchStudentsType extends StatefulWidget { class DropdownSwitchStudentsType extends StatefulWidget {
const DropdownSwitchStudentsType({super.key}); const DropdownSwitchStudentsType({super.key});
@ -16,7 +21,7 @@ class DropdownSwitchStudentsType extends StatefulWidget {
class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType> { class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType> {
final logic = Get.find<HomeworkReviewLogic>(); final logic = Get.find<HomeworkReviewLogic>();
final sateData = Get.find<HomeworkReviewLogic>().state; final sateData = Get.find<HomeworkReviewLogic>().state.data;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -43,24 +48,28 @@ class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType>
color: const Color.fromRGBO(244, 244, 244, 1), color: const Color.fromRGBO(244, 244, 244, 1),
borderRadius: BorderRadius.circular(4.r), borderRadius: BorderRadius.circular(4.r),
), ),
child: DropdownButton( child: Obx(() {
return DropdownButton(
isExpanded: true, isExpanded: true,
underline: Container(), underline: Container(),
padding: EdgeInsets.only(right: 4.w), padding: EdgeInsets.only(right: 4.w),
icon: const Icon(Icons.keyboard_arrow_down_rounded), icon: const Icon(Icons.keyboard_arrow_down_rounded),
value: 1, // TODO value: sateData.value?.templateId, // TODO
hint: const Text('请选择作业页码'), // hint: const Text('请选择作业页码'), //
items: [1, 2, 3].map((e) { items: sateData.value?.templateIdKeys?.map((e) {
//
return DropdownMenuItem( return DropdownMenuItem(
value: e, value: e,
child: quickText('$e页', color: const Color.fromRGBO(79, 79, 79, 1), size: 14.sp), child: quickText('${sateData.value!.templateIdKeyMap![e]}', color: const Color.fromRGBO(79, 79, 79, 1), size: 14.sp),
); );
}).toList(), }).toList(),
onChanged: (value) { onChanged: (value) {
if (logic.state.param.value.templateId == value) return;
logic.state.param.value.templateId = value;
logic.state.param.value = DoPaperDetailsParam.fromJson(logic.state.param.value.toJson());
// _useSwitchStudentAndType.currentTab.value = _useSwitchStudentAndType.tabs.value.firstWhere((element) => element.pageIndex == value); // _useSwitchStudentAndType.currentTab.value = _useSwitchStudentAndType.tabs.value.firstWhere((element) => element.pageIndex == value);
}, },
), );
}),
), ),
), ),
const Expanded(flex: 1, child: SizedBox()), const Expanded(flex: 1, child: SizedBox()),
@ -74,42 +83,37 @@ class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType>
color: const Color.fromRGBO(244, 244, 244, 1), color: const Color.fromRGBO(244, 244, 244, 1),
borderRadius: BorderRadius.circular(4.r), borderRadius: BorderRadius.circular(4.r),
), ),
child: DropdownButton( child: Obx(() {
onTap: () { return DropdownButton(
//
// _useSwitchStudentAndType.getDataForStudents(taskId: taskId);
},
padding: EdgeInsets.only(right: 4.w), padding: EdgeInsets.only(right: 4.w),
icon: const Icon(Icons.keyboard_arrow_down_rounded), icon: const Icon(Icons.keyboard_arrow_down_rounded),
value: '汪杨', value: sateData.value?.studentId,
underline: Container(), underline: Container(),
isExpanded: true, isExpanded: true,
items: ['汪杨'].map((e) { items: sateData.value?.students.map((e) {
return DropdownMenuItem( return DropdownMenuItem(value: e.id, child: quickText(e.name, color: const Color.fromRGBO(79, 79, 79, 1), size: 14.sp));
value: e,
child: quickText(e, color: const Color.fromRGBO(79, 79, 79, 1), size: 14.sp),
);
}).toList(), }).toList(),
hint: const Text('请选择学生'), // hint: const Text('请选择学生'), //
onChanged: (value) { onChanged: (value) {
// JobConcernedWithStudent? currentStudent = _useSwitchStudentAndType.currentStudent.value; if (logic.state.param.value.studentId == value) return;
// if (currentStudent?.studentId == value) return; logic.state.param.value.studentId = value;
// _useSwitchStudentAndType.studentBusInfo.value = null; // BUS通知记录 logic.state.param.value = DoPaperDetailsParam.fromJson(logic.state.param.value.toJson());
// _useSwitchStudentAndType.currentStudent.value =
// _useSwitchStudentAndType.studentData.value.firstWhereOrNull((element) => element.studentId == value);
}, },
), );
}),
), ),
Positioned( Positioned(
left: 2.w, left: 2.w,
child: Stack( child: Stack(
alignment: const FractionalOffset(0.52, 0.24), alignment: const FractionalOffset(0.52, 0.24),
children: [ children: [
Icon( Obx(() {
return Icon(
const IconData(0xe63d, fontFamily: "AlibabaIcon"), const IconData(0xe63d, fontFamily: "AlibabaIcon"),
size: 12.sp, size: 12.sp,
color: true ? const Color.fromRGBO(76, 199, 147, 1) : const Color.fromRGBO(164, 164, 164, 1), color: sateData.value?.priority ?? false ? const Color.fromRGBO(76, 199, 147, 1) : const Color.fromRGBO(164, 164, 164, 1),
), );
}),
quickText('优先', size: 4.sp, color: Colors.white), quickText('优先', size: 4.sp, color: Colors.white),
], ],
), ),
@ -120,41 +124,82 @@ class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType>
const Expanded(flex: 1, child: SizedBox()), const Expanded(flex: 1, child: SizedBox()),
Expanded( Expanded(
flex: isPad() ? 4 : 5, flex: isPad() ? 4 : 5,
child: Row( child: const Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
// if (_useSwitchStudentAndType.isFinish.value && $ContinueToReview(), //
// _useSwitchStudentAndType.tabs.value.firstWhereOrNull((e) => e.finishCount < e.total) != null) $HistoryHomework() //
Expanded( ],
),
),
],
),
);
}
}
@swidget
Widget $continueToReview(BuildContext context, {bool isFloatingAction = false}) {
final logic = Get.find<HomeworkReviewLogic>();
final sateData = Get.find<HomeworkReviewLogic>().state.data;
return Obx(() {
var data = sateData.value;
var param = logic.state.param.value;
int? submitCount = data?.submitCount; //
int? annotatedCount = data?.annotatedCount; //
if (data == null || (submitCount == annotatedCount || (param.templateId == null && param.studentId == null))) return const SizedBox();
callFun() => easyThrottle(
'DO_PAPERS_JOB_CONTINUE_TO_REVIEW',
() {
var param = logic.state.param.value;
param.templateId = null;
param.studentId = null;
logic.state.param.value = DoPaperDetailsParam.fromJson(param.toJson());
},
);
if (isFloatingAction) {
return FloatingActionButton(
elevation: 8,
tooltip: "继续批阅",
backgroundColor: Colors.white,
onPressed: callFun,
child: Icon(Icons.flip_camera_android_outlined, size: 20.sp, color: Theme.of(context).primaryColor),
);
}
return Expanded(
child: InkWell(
onTap: callFun,
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Icon(Icons.flip_camera_android_outlined, size: 10.sp, color: Theme.of(context).primaryColor.withOpacity(0.8)), Icon(Icons.flip_camera_android_outlined, size: 12.sp, color: Theme.of(context).primaryColor.withOpacity(0.8)),
SizedBox(width: 1.w), SizedBox(width: 1.w),
InkWell( quickText(
onTap: () => easyThrottle(
'DO_PAPERS_JOB_CONTINUE_TO_REVIEW',
() {
// var _currentTabNew = _useSwitchStudentAndType.tabs.value.firstWhere((e) => e.finishCount < e.total);
// _useSwitchStudentAndType.eventFire(model: MarkingTextQuestionJobTabParamsBus(taskId, _currentTabNew.pageIndex));
},
),
child: quickText(
'继续批阅', '继续批阅',
size: 10.sp, size: 10.sp,
decoration: TextDecoration.underline, decoration: TextDecoration.underline,
color: Theme.of(context).primaryColor.withOpacity(0.9), color: Theme.of(context).primaryColor.withOpacity(0.9),
), ),
),
SizedBox(width: 2.w), SizedBox(width: 2.w),
], ],
), ),
), ));
Expanded( });
}
//
@swidget
Widget $historyHomework(BuildContext context) {
final sateData = Get.find<HomeworkReviewLogic>().state.data;
return Expanded(
child: InkWell( child: InkWell(
onTap: () => easyThrottle('DO_PAPERS_JOB_HISTORICAL_HOMEWORK', () { onTap: () => easyThrottle('DO_PAPERS_JOB_HISTORICAL_HOMEWORK', () {
// TODO
int? studentId = sateData.value?.studentId;
if (kDebugMode) print(studentId);
// JobConcernedWithStudent? _studentModel = _useSwitchStudentAndType.currentStudent.value; // JobConcernedWithStudent? _studentModel = _useSwitchStudentAndType.currentStudent.value;
// if (_studentModel == null) return; // if (_studentModel == null) return;
// String url = // String url =
@ -175,12 +220,5 @@ class _DropdownSwitchStudentsTypeState extends State<DropdownSwitchStudentsType>
], ],
), ),
), ),
),
],
),
),
],
),
); );
} }
}

View File

@ -69,11 +69,13 @@ class _FavoriteState extends State<FavoriteWidget> with RequestToolMixin {
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Icon( Obx(() {
return Icon(
const IconData(0xe63c, fontFamily: "AlibabaIcon"), const IconData(0xe63c, fontFamily: "AlibabaIcon"),
size: 18.sp, size: 18.sp,
color: favorite.value ? const Color.fromRGBO(255, 172, 48, 1) : const Color.fromRGBO(164, 164, 164, 1), color: favorite.value ? const Color.fromRGBO(255, 172, 48, 1) : const Color.fromRGBO(164, 164, 164, 1),
), );
}),
SizedBox(width: 6.w), SizedBox(width: 6.w),
], ],
), ),

View File

@ -0,0 +1,103 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:get/get.dart';
import 'package:making_school_asignment_app/common/job/marking_models/do_paper_details_param.dart';
import 'package:making_school_asignment_app/common/job/marking_models/do_paper_details_result.dart';
import 'package:making_school_asignment_app/common/utils/anti_shake_throttling.dart';
import 'package:making_school_asignment_app/page/home_page/children/homework_review/configuration_files/index.dart';
import 'dropdown_switch_students_type.dart';
part 'question_paper_view.g.dart';
//
class QuestionPaperView extends StatefulWidget {
const QuestionPaperView({super.key});
@override
State<QuestionPaperView> createState() => _QuestionPaperViewState();
}
class _QuestionPaperViewState extends State<QuestionPaperView> {
final logic = Get.find<HomeworkReviewLogic>();
final sateData = Get.find<HomeworkReviewLogic>().state;
@override
Widget build(BuildContext context) {
return LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
var maxWidth = constraints.maxWidth;
var maxHeight = constraints.maxHeight;
return Stack(
children: [
$MainBox(maxWidth, maxHeight),
Positioned(
left: 3.w,
top: (maxHeight / 2) - 20.h,
child: Obx(() {
LastPage? lastPageVal = sateData.data.value?.lastPage;
if (lastPageVal == null) return const SizedBox();
return FloatingActionButton(
heroTag: '点击前往上一题',
tooltip: '点击前往上一题',
focusColor: Theme.of(context).primaryColor,
backgroundColor: const Color.fromRGBO(24, 32, 32, 0.1),
elevation: 6.r,
onPressed: () => easyThrottle('TestQuestionSwitch', () {
var param = sateData.param.value;
param.studentId = lastPageVal.studentId;
param.templateId = lastPageVal.templateId;
sateData.param.value = DoPaperDetailsParam.fromJson(param.toJson());
}),
child: Icon(Icons.arrow_back_ios, color: Colors.white, size: 22.sp),
);
}),
),
Positioned(
right: 2.w,
top: (maxHeight / 2) - 20.h,
child: Obx(() {
NextPage? nextPageVal = sateData.data.value?.nextPage;
if (nextPageVal == null) return const SizedBox();
return FloatingActionButton(
heroTag: '点击前往下一题',
tooltip: '点击前往下一题',
elevation: 6.r,
backgroundColor: const Color.fromRGBO(24, 32, 32, 0.1),
onPressed: () => easyThrottle('TestQuestionSwitch', () {
var param = sateData.param.value;
param.studentId = nextPageVal.studentId;
param.templateId = nextPageVal.templateId;
sateData.param.value = DoPaperDetailsParam.fromJson(param.toJson());
}),
child: Icon(Icons.arrow_forward_ios, color: Colors.white, size: 22.sp),
);
}),
),
],
);
});
}
}
@hwidget
Widget $mainBox(double maxWidth, double maxHeight) {
useEffect(() {
return () {};
}, []);
return Stack(
alignment: const FractionalOffset(0.94, 0.94),
children: [
Container(
width: maxWidth,
height: maxHeight,
color: Colors.yellow,
),
//
const $ContinueToReview(isFloatingAction: true)
],
);
}

View File

@ -39,6 +39,7 @@ class HomeworkReviewBinding extends Bindings {
} }
class HomeworkReviewLogic extends GetxController with RequestToolMixin { class HomeworkReviewLogic extends GetxController with RequestToolMixin {
late StreamSubscription<DoPaperDetailsParam> _paramListen;
final HomeworkReviewState state = HomeworkReviewState(); final HomeworkReviewState state = HomeworkReviewState();
final HomeworkReviewAnnotationsControlState annotationState = HomeworkReviewAnnotationsControlState(); final HomeworkReviewAnnotationsControlState annotationState = HomeworkReviewAnnotationsControlState();
@ -52,10 +53,18 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
subject: Get.arguments['subject'], subject: Get.arguments['subject'],
).obs; ).obs;
state.data = Rx<DoPaperDetailsResult?>(null); state.data = Rx<DoPaperDetailsResult?>(null);
getList(); getData();
//
_paramListen = state.param.listen((e) => getData());
} }
void getList() async { @override
void disposeId(Object id) {
_paramListen.cancel();
super.disposeId(id);
}
void getData() async {
var timerControl = Timer(const Duration(milliseconds: 300), () => ToastUtils.showLoading()); var timerControl = Timer(const Duration(milliseconds: 300), () => ToastUtils.showLoading());
try { try {
DoPaperDetailsResult? data = await getClient().getDoPaperDetails(state.param.value); DoPaperDetailsResult? data = await getClient().getDoPaperDetails(state.param.value);

View File

@ -9,6 +9,7 @@ import 'components/bottom_operation_bar.dart';
import 'components/button_floating_action.dart'; import 'components/button_floating_action.dart';
import 'components/dropdown_switch_students_type.dart'; import 'components/dropdown_switch_students_type.dart';
import 'components/favorite_widget.dart'; import 'components/favorite_widget.dart';
import 'components/question_paper_view.dart';
import 'configuration_files/index.dart'; import 'configuration_files/index.dart';
class HomeworkReview extends StatefulWidget { class HomeworkReview extends StatefulWidget {
@ -40,7 +41,7 @@ class _HomeworkReviewState extends State<HomeworkReview> {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
// titleSpacing: 0, // titleSpacing: 0,
leading: IconButton(icon: const Icon(Icons.arrow_back_ios), onPressed: () => {}), leading: IconButton(icon: const Icon(Icons.arrow_back_ios), onPressed: () => Get.back()),
iconTheme: const IconThemeData(color: Colors.black), iconTheme: const IconThemeData(color: Colors.black),
title: quickText(sateData.param.value.homeworkName), title: quickText(sateData.param.value.homeworkName),
backgroundColor: Colors.white, backgroundColor: Colors.white,
@ -57,8 +58,7 @@ class _HomeworkReviewState extends State<HomeworkReview> {
// //
const DropdownSwitchStudentsType(), const DropdownSwitchStudentsType(),
SizedBox(height: 1.h), SizedBox(height: 1.h),
// Expanded(child: ExamPaperAndScoringView(taskId: taskId, className: className)), const Expanded(child: QuestionPaperView()),
const Expanded(child: SizedBox()),
const BottomAnnotationSwitch(), const BottomAnnotationSwitch(),
], ],
), ),

View File

@ -1,104 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'read_over_view.dart';
// **************************************************************************
// FunctionalWidgetGenerator
// **************************************************************************
///
/// OnRefreshCallback? onRefresh
///
class $EasyRefresh extends StatelessWidget {
///
/// OnRefreshCallback? onRefresh
///
const $EasyRefresh({
Key? key,
required this.controller,
required this.onRefresh,
required this.onLoad,
required this.data,
required this.tab,
required this.type,
required this.logic,
}) : super(key: key);
///
/// OnRefreshCallback? onRefresh
///
final EasyRefreshController controller;
///
/// OnRefreshCallback? onRefresh
///
final Future<void> Function(
EasyRefreshController,
int,
) onRefresh;
///
/// OnRefreshCallback? onRefresh
///
final Future<void> Function(
EasyRefreshController,
int,
) onLoad;
///
/// OnRefreshCallback? onRefresh
///
final List<Items> data;
///
/// OnRefreshCallback? onRefresh
///
final int tab;
///
/// OnRefreshCallback? onRefresh
///
final int type;
///
/// OnRefreshCallback? onRefresh
///
final ReadOverLogic logic;
@override
Widget build(BuildContext _context) => $easyRefresh(
controller: controller,
onRefresh: onRefresh,
onLoad: onLoad,
data: data,
tab: tab,
type: type,
logic: logic,
);
}
class $ReviewedItem extends StatelessWidget {
const $ReviewedItem({
Key? key,
required this.jobTaskItem,
required this.type,
required this.subjectName,
required this.logic,
}) : super(key: key);
final Items jobTaskItem;
final int type;
final String subjectName;
final ReadOverLogic logic;
@override
Widget build(BuildContext _context) => $reviewedItem(
jobTaskItem: jobTaskItem,
type: type,
subjectName: subjectName,
logic: logic,
);
}

View File

@ -350,6 +350,14 @@ packages:
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.2.2" version: "2.2.2"
flutter_hooks:
dependency: "direct main"
description:
name: flutter_hooks
sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.20.5"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:

View File

@ -80,6 +80,7 @@ dependencies:
dropdown_button2: ^2.3.9 dropdown_button2: ^2.3.9
syncfusion_flutter_datepicker: ^25.2.5 syncfusion_flutter_datepicker: ^25.2.5
easy_debounce: ^2.0.3 # 防抖节流 easy_debounce: ^2.0.3 # 防抖节流
flutter_hooks: ^0.20.5
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: