import 'package:dio/dio.dart'; import 'package:get/get.dart' hide MultipartFile, FormData, Response; import 'package:problem_check_system/core/extensions/http_response_extension.dart'; import 'package:problem_check_system/core/utils/constants/api_endpoints.dart'; import 'package:problem_check_system/data/models/problem_model.dart'; import 'package:problem_check_system/data/models/server_problem.dart'; import 'package:problem_check_system/data/providers/connectivity_provider.dart'; import 'package:problem_check_system/data/providers/http_provider.dart'; import 'package:problem_check_system/data/providers/sqlite_provider.dart'; /// 问题仓库,负责处理问题数据的本地持久化。 /// 它封装了底层数据库操作,为业务逻辑层提供一个简洁的接口。 class ProblemRepository extends GetxService { final SQLiteProvider sqliteProvider; final HttpProvider httpProvider; final ConnectivityProvider connectivityProvider; RxBool get isOnline => connectivityProvider.isOnline; ProblemRepository({ required this.sqliteProvider, required this.httpProvider, required this.connectivityProvider, }); /// 更新本地数据库中的一个问题。 Future updateProblem(Problem problem) async { await sqliteProvider.updateProblem(problem); } /// 通用查询方法,根据可选的筛选条件获取问题列表。 /// - `startDate`/`endDate`:筛选创建时间范围。 /// - `syncStatus`:筛选上传状态('已上传', '未上传', '全部')。 /// - `bindStatus`:筛选绑定状态('已绑定', '未绑定', '全部')。 Future getProblems({ DateTime? startDate, DateTime? endDate, String? syncStatus, String? bindStatus, }) async { return await sqliteProvider.getProblems( startDate: startDate, endDate: endDate, syncStatus: syncStatus, bindStatus: bindStatus, ); } Future insertProblem(Problem problem) async { await sqliteProvider.insertProblem(problem); } Future deleteProblem(String problemId) async { await sqliteProvider.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: { 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) { // 假设服务器返回的是Problem对象的列表 final List data = response.data; return data.map((json) => ServerProblem.fromJson(json)).toList(); } else { throw Exception('拉取问题失败: ${response.statusCode}'); } } on DioException catch (e) { throw Exception('拉取问题失败: $e'); } } /// 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; } }