From 76b3cd1abf649b074f59cf308d1e98fdfb82712b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=8C=AF=E5=8D=87?= <359059686@qq.com> Date: Fri, 7 Nov 2025 08:57:47 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20=E9=97=AE=E9=A2=98=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repositories/problem_repository.dart | 139 ------------------ .../entities/problem_upload_status.dart | 10 ++ .../controllers/problem_list_controller.dart | 29 +++- .../presentation/pages/problem_list_page.dart | 28 +++- 4 files changed, 57 insertions(+), 149 deletions(-) delete mode 100644 lib/app/features/problem/data/repositories/problem_repository.dart create mode 100644 lib/app/features/problem/domain/entities/problem_upload_status.dart diff --git a/lib/app/features/problem/data/repositories/problem_repository.dart b/lib/app/features/problem/data/repositories/problem_repository.dart deleted file mode 100644 index 34afd80..0000000 --- a/lib/app/features/problem/data/repositories/problem_repository.dart +++ /dev/null @@ -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 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 insertProblem(Problem problem) async { -// await problemLocalDataSource.insertProblem(problem); -// } - -// Future deleteProblem(String problemId) async { -// await problemLocalDataSource.deleteProblem(problemId); -// } - -// // 在ProblemRepository中添加 -// Future> 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 会自动解析 JSON,response.data 已经是 Map 或 List -// final Map data = response.data; -// final List 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 post( -// Map apiPayload, -// CancelToken cancelToken, -// ) async { -// // 3. 发送给服务器 -// final response = await httpProvider.post( -// ApiEndpoints.postProblem, -// data: apiPayload, -// cancelToken: cancelToken, -// ); -// return response; -// } - -// /// put -// Future put( -// String id, -// Map apiPayload, -// CancelToken cancelToken, -// ) async { -// // 3. 发送给服务器 -// final response = await httpProvider.put( -// ApiEndpoints.putProblemById(id), -// data: apiPayload, -// cancelToken: cancelToken, -// ); -// return response; -// } - -// /// delete -// Future delete(String id, CancelToken cancelToken) async { -// // 3. 发送给服务器 -// final response = await httpProvider.delete( -// ApiEndpoints.deleteProblemById(id), -// cancelToken: cancelToken, -// ); -// return response; -// } -// } diff --git a/lib/app/features/problem/domain/entities/problem_upload_status.dart b/lib/app/features/problem/domain/entities/problem_upload_status.dart new file mode 100644 index 0000000..644e48b --- /dev/null +++ b/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); +} diff --git a/lib/app/features/problem/presentation/controllers/problem_list_controller.dart b/lib/app/features/problem/presentation/controllers/problem_list_controller.dart index 52ac9ac..fdccafe 100644 --- a/lib/app/features/problem/presentation/controllers/problem_list_controller.dart +++ b/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(null); + final selectedStatus = Rx(null); final selectedBound = Rx(null); final startDate = Rx(null); final endDate = Rx(null); final selectedProblems = {}.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(); diff --git a/lib/app/features/problem/presentation/pages/problem_list_page.dart b/lib/app/features/problem/presentation/pages/problem_list_page.dart index 396b9d1..efa7d17 100644 --- a/lib/app/features/problem/presentation/pages/problem_list_page.dart +++ b/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 { children: [ Expanded( child: Obx( - () => DropdownButtonFormField( + () => DropdownButtonFormField( 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 { ), 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(