Browse Source

feat : 问题查询条件

dev
徐振升 2 months ago
parent
commit
76b3cd1abf
  1. 139
      lib/app/features/problem/data/repositories/problem_repository.dart
  2. 10
      lib/app/features/problem/domain/entities/problem_upload_status.dart
  3. 29
      lib/app/features/problem/presentation/controllers/problem_list_controller.dart
  4. 28
      lib/app/features/problem/presentation/pages/problem_list_page.dart

139
lib/app/features/problem/data/repositories/problem_repository.dart

@ -1,139 +0,0 @@
// import 'package:dio/dio.dart';
// import 'package:get/get.dart' hide MultipartFile, FormData, Response;
// import 'package:problem_check_system/app/core/extensions/http_response_extension.dart';
// import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
// import 'package:problem_check_system/app/features/problem/data/model/problem_model.dart';
// import 'package:problem_check_system/app/core/models/server_problem.dart';
// import 'package:problem_check_system/app/core/services/network_status_service.dart';
// import 'package:problem_check_system/app/core/services/http_provider.dart';
// import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
// import 'package:problem_check_system/app/features/problem/data/datasources/problem_local_data_source.dart';
// ///
// ///
// class ProblemRepository extends GetxService {
// final ProblemLocalDataSource problemLocalDataSource;
// final HttpProvider httpProvider;
// final NetworkStatusService networkStatusService;
// final AuthRepository authRepository;
// RxBool get isOnline => networkStatusService.isOnline;
// ProblemRepository({
// required this.problemLocalDataSource,
// required this.httpProvider,
// required this.networkStatusService,
// required this.authRepository,
// });
// ///
// Future<void> updateProblem(Problem problem) async {
// await problemLocalDataSource.updateProblem(problem);
// }
// ///
// /// - `startDate`/`endDate`
// /// - `syncStatus`'已上传', '未上传', '全部'
// /// - `bindStatus`'已绑定', '未绑定', '全部'
// Future getProblems({
// DateTime? startDate,
// DateTime? endDate,
// String? syncStatus,
// String? bindStatus,
// }) async {
// return await problemLocalDataSource.getProblems(
// startDate: startDate,
// endDate: endDate,
// syncStatus: syncStatus,
// bindStatus: bindStatus,
// );
// }
// Future<void> insertProblem(Problem problem) async {
// await problemLocalDataSource.insertProblem(problem);
// }
// Future<void> deleteProblem(String problemId) async {
// await problemLocalDataSource.deleteProblem(problemId);
// }
// // ProblemRepository中添加
// Future<List<ServerProblem>> fetchProblemsFromServer({
// DateTime? startTime,
// DateTime? endTime,
// int? pageNumber,
// int? pageSize,
// CancelToken? cancelToken,
// }) async {
// try {
// final response = await httpProvider.get(
// ApiEndpoints.getProblems,
// queryParameters: {
// 'creatorId': authRepository.getUserId(),
// if (startTime != null)
// 'StartTime': startTime.toUtc().toIso8601String(),
// if (endTime != null) 'EndTime': endTime.toUtc().toIso8601String(),
// if (pageNumber != null) 'pageNumber': pageNumber,
// if (pageSize != null) 'pageSize': pageSize,
// },
// cancelToken: cancelToken,
// );
// if (response.isSuccess) {
// // Dio JSONresponse.data Map List
// final Map<String, dynamic> data = response.data;
// final List<dynamic> items = data['items'];
// // 使 Freezed fromJson
// return items.map((item) => ServerProblem.fromJson(item)).toList();
// } else {
// throw Exception('拉取问题失败: ${response.statusCode}');
// }
// } on DioException catch (e) {
// Get.log("Dio 异常$e");
// rethrow;
// } catch (e) {
// Get.log("解析失败:$e");
// rethrow;
// }
// }
// /// post
// Future<Response> post(
// Map<String, Object> apiPayload,
// CancelToken cancelToken,
// ) async {
// // 3.
// final response = await httpProvider.post(
// ApiEndpoints.postProblem,
// data: apiPayload,
// cancelToken: cancelToken,
// );
// return response;
// }
// /// put
// Future<Response> put(
// String id,
// Map<String, Object> apiPayload,
// CancelToken cancelToken,
// ) async {
// // 3.
// final response = await httpProvider.put(
// ApiEndpoints.putProblemById(id),
// data: apiPayload,
// cancelToken: cancelToken,
// );
// return response;
// }
// /// delete
// Future<Response> delete(String id, CancelToken cancelToken) async {
// // 3.
// final response = await httpProvider.delete(
// ApiEndpoints.deleteProblemById(id),
// cancelToken: cancelToken,
// );
// return response;
// }
// }

10
lib/app/features/problem/domain/entities/problem_upload_status.dart

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
enum ProblemUploadStatus {
uploaded('已上传', Colors.green),
notUploaded('未上传', Colors.red);
final String displayName;
final Color displayColor;
const ProblemUploadStatus(this.displayName, this.displayColor);
}

29
lib/app/features/problem/presentation/controllers/problem_list_controller.dart

@ -1,12 +1,13 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/domain/entities/sync_status.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/form_mode.dart';
import 'package:problem_check_system/app/core/routes/app_routes.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_bind_status.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_entity.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_filter_params.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_list_item_entity.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_upload_status.dart';
import 'package:problem_check_system/app/features/problem/domain/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/get_all_problems_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/resolve_conflict_usecase.dart';
@ -28,13 +29,25 @@ class ProblemListController extends GetxController {
final isSyncing = false.obs;
final nameController = TextEditingController();
final selectedStatus = Rx<SyncStatus?>(null);
final selectedStatus = Rx<ProblemUploadStatus?>(null);
final selectedBound = Rx<ProblemBindStatus?>(null);
final startDate = Rx<DateTime?>(null);
final endDate = Rx<DateTime?>(null);
final selectedProblems = <ProblemEntity>{}.obs;
final ExpansibleController expansibleController = ExpansibleController();
bool? get isUploaded {
return selectedStatus.value == null
? null
: selectedStatus.value == ProblemUploadStatus.uploaded;
}
bool? get isBound {
return selectedBound.value == null
? null
: selectedBound.value == ProblemBindStatus.bound;
}
@override
void onInit() {
// -
@ -164,7 +177,14 @@ class ProblemListController extends GetxController {
expansibleController.collapse();
isLoading.value = true;
try {
final result = await getAllProblemsUsecase.call();
final ProblemFilterParams params = ProblemFilterParams(
enterpriseName: nameController.value.text,
startTime: startDate.value,
endTime: endDate.value,
isUploaded: isUploaded,
isBound: isBound,
);
final result = await getAllProblemsUsecase(filter: params);
problemList.assignAll(result);
} catch (e) {
Get.snackbar('错误', '加载问题列表失败: $e');
@ -175,7 +195,8 @@ class ProblemListController extends GetxController {
void clearFilters() {
nameController.clear();
// selectedType.value = null;
selectedBound.value = null;
selectedStatus.value = null;
startDate.value = null;
endDate.value = null;
loadProblemItems();

28
lib/app/features/problem/presentation/pages/problem_list_page.dart

@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/domain/entities/sync_status.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/pages/widgets/custom_app_bar.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_bind_status.dart';
import 'package:problem_check_system/app/features/problem/domain/entities/problem_upload_status.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_list_controller.dart';
import 'package:problem_check_system/app/features/problem/presentation/pages/widgets/problem_card.dart';
@ -70,19 +70,27 @@ class ProblemListPage extends GetView<ProblemListController> {
children: [
Expanded(
child: Obx(
() => DropdownButtonFormField<SyncStatus>(
() => DropdownButtonFormField<ProblemUploadStatus>(
initialValue: controller.selectedStatus.value,
decoration: InputDecoration(
labelText: '问题状态',
labelText: '同步状态',
prefixIcon: const Icon(Icons.category),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.r),
),
isDense: true,
),
hint: const Text('请选择问题状态'),
hint: Text(
'请选择',
style: TextStyle(
fontSize: 14.sp,
color: controller.selectedStatus.value == null
? Colors.grey[700]
: Colors.black87,
),
),
isExpanded: true,
items: SyncStatus.values.map((status) {
items: ProblemUploadStatus.values.map((status) {
return DropdownMenuItem(
value: status,
child: Text(status.displayName),
@ -107,7 +115,15 @@ class ProblemListPage extends GetView<ProblemListController> {
),
isDense: true,
),
hint: const Text('请选择绑定状态'),
hint: Text(
'请选择',
style: TextStyle(
fontSize: 14.sp,
color: controller.selectedBound.value == null
? Colors.grey[700]
: Colors.black87,
),
),
isExpanded: true,
items: ProblemBindStatus.values.map((bound) {
return DropdownMenuItem(

Loading…
Cancel
Save