Browse Source

fix : 获取远程问题列表

dev
徐振升 5 hours ago
parent
commit
e46c976c1f
  1. 2
      lib/app/features/problem/data/datasources/problem_remote_data_source.dart
  2. 7
      lib/app/features/problem/data/repositories/problem_repository_impl.dart
  3. 2
      lib/app/features/problem/domain/repositories/problem_repository.dart
  4. 12
      lib/app/features/problem/domain/usecases/resolve_conflict_usecase.dart
  5. 14
      lib/app/features/problem/presentation/bindings/problem_list_binding.dart
  6. 181
      lib/app/features/problem/presentation/controllers/problem_list_controller.dart
  7. 2
      lib/app/features/problem/presentation/pages/problem_list_page.dart

2
lib/app/features/problem/data/datasources/problem_remote_data_source.dart

@ -61,7 +61,7 @@ class ProblemRemoteDataSourceImpl implements ProblemRemoteDataSource {
queryParameters: filter.toJson(), queryParameters: filter.toJson(),
); );
// 'data' // 'data'
final List<dynamic> problemListJson = response.data['data']; final List<dynamic> problemListJson = response.data['items'];
return problemListJson.map((json) => ProblemDto.fromJson(json)).toList(); return problemListJson.map((json) => ProblemDto.fromJson(json)).toList();
} on DioException catch (e) { } on DioException catch (e) {
// //

7
lib/app/features/problem/data/repositories/problem_repository_impl.dart

@ -235,4 +235,11 @@ class ProblemRepositoryImpl implements ProblemRepository {
conflicts: conflicts, conflicts: conflicts,
); );
} }
@override
Future<void> resolveConflictAndUpdate(ProblemEntity chosenProblem) {
//
final problemMap = ProblemModel.fromEntity(chosenProblem).toMap();
return localDataSource.updateProblem(problemMap);
}
} }

2
lib/app/features/problem/domain/repositories/problem_repository.dart

@ -21,4 +21,6 @@ abstract class ProblemRepository {
Future<ProblemEntity> syncProblemToServer(ProblemEntity problem); Future<ProblemEntity> syncProblemToServer(ProblemEntity problem);
Future<ProblemSyncResult> syncWithServer(); Future<ProblemSyncResult> syncWithServer();
//
Future<void> resolveConflictAndUpdate(ProblemEntity chosenProblem) async {}
} }

12
lib/app/features/problem/domain/usecases/resolve_conflict_usecase.dart

@ -0,0 +1,12 @@
import 'package:problem_check_system/app/features/problem/domain/entities/problem_entity.dart';
import 'package:problem_check_system/app/features/problem/domain/repositories/problem_repository.dart';
class ProblemResolveConflictUsecase {
final ProblemRepository repository;
ProblemResolveConflictUsecase({required this.repository});
Future<void> call(ProblemEntity chosenProblem) async {
return repository.resolveConflictAndUpdate(chosenProblem);
}
}

14
lib/app/features/problem/presentation/bindings/problem_list_binding.dart

@ -6,6 +6,8 @@ import 'package:problem_check_system/app/features/problem/data/datasources/probl
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository_impl.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository_impl.dart';
import 'package:problem_check_system/app/features/problem/domain/repositories/problem_repository.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/get_all_problems_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/resolve_conflict_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/sync_problems_usecase.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_list_controller.dart'; import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_list_controller.dart';
class ProblemListBinding extends BaseBindings { class ProblemListBinding extends BaseBindings {
@ -40,12 +42,22 @@ class ProblemListBinding extends BaseBindings {
Get.lazyPut<GetAllProblemsUsecase>( Get.lazyPut<GetAllProblemsUsecase>(
() => GetAllProblemsUsecase(problemRepository: Get.find()), () => GetAllProblemsUsecase(problemRepository: Get.find()),
); );
Get.lazyPut<SyncProblemsUsecase>(
() => SyncProblemsUsecase(repository: Get.find()),
);
Get.lazyPut<ProblemResolveConflictUsecase>(
() => ProblemResolveConflictUsecase(repository: Get.find()),
);
} }
@override @override
void register5Controllers() { void register5Controllers() {
Get.lazyPut<ProblemListController>( Get.lazyPut<ProblemListController>(
() => ProblemListController(getAllProblemsUsecase: Get.find()), () => ProblemListController(
getAllProblemsUsecase: Get.find(),
syncProblemsUsecase: Get.find(),
problemResolveConflictUsecase: Get.find(),
),
); );
} }
} }

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

@ -1,20 +1,24 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.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/models/form_mode.dart';
import 'package:problem_check_system/app/core/routes/app_routes.dart'; import 'package:problem_check_system/app/core/routes/app_routes.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_entity.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_list_item_entity.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/get_all_problems_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/resolve_conflict_usecase.dart';
import 'package:problem_check_system/app/features/problem/domain/usecases/sync_problems_usecase.dart';
class ProblemListController extends GetxController { class ProblemListController extends GetxController {
final GetAllProblemsUsecase getAllProblemsUsecase; final GetAllProblemsUsecase getAllProblemsUsecase;
// final SyncEnterprisesUsecase syncEnterprisesUsecase; final SyncProblemsUsecase syncProblemsUsecase;
// final ResolveConflictUsecase resolveConflictUsecase; final ProblemResolveConflictUsecase problemResolveConflictUsecase;
ProblemListController({ ProblemListController({
required this.getAllProblemsUsecase, required this.getAllProblemsUsecase,
// required this.syncEnterprisesUsecase, required this.syncProblemsUsecase,
// required this.resolveConflictUsecase, required this.problemResolveConflictUsecase,
}); });
final problemList = <ProblemListItemEntity>[].obs; final problemList = <ProblemListItemEntity>[].obs;
@ -45,31 +49,32 @@ class ProblemListController extends GetxController {
// --- --- // --- ---
// //
Future<void> loadAndSyncEnterprises() async { Future<void> loadAndSyncProblems() async {
try { try {
isLoading(true); isLoading(true);
isSyncing(true); isSyncing(true);
// // 1: // 1:
// final syncResult = await syncEnterprisesUsecase(); final syncResult = await syncProblemsUsecase();
// // 2: // 2:
// if (syncResult.hasConflicts) { if (syncResult.hasConflicts) {
// // //
// for (final conflict in syncResult.conflicts) { for (final conflict in syncResult.conflicts) {
// final chosenVersion = await _showConflictDialog(conflict); final chosenVersion = await _showConflictDialog(conflict);
// if (chosenVersion != null) { if (chosenVersion != null) {
// // //
// await resolveConflictUsecase(chosenVersion); await problemResolveConflictUsecase(chosenVersion);
// } }
// } }
// } }
isSyncing(false); isSyncing(false);
// 3: // 3:
await loadProblemItems(); await loadProblemItems();
} catch (e) { } catch (e) {
Get.log('操作失败: $e');
Get.snackbar('错误', '操作失败: $e'); Get.snackbar('错误', '操作失败: $e');
} finally { } finally {
isLoading(false); isLoading(false);
@ -77,74 +82,76 @@ class ProblemListController extends GetxController {
} }
} }
// // [] // []
// Future<Enterprise?> _showConflictDialog(EnterpriseConflict conflict) { Future<ProblemEntity?> _showConflictDialog(ProblemConflict conflict) {
// return Get.dialog<Enterprise>( return Get.dialog<ProblemEntity>(
// AlertDialog( AlertDialog(
// title: Text('数据冲突'), title: Text('数据冲突'),
// content: Column( content: Column(
// mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
// crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
// children: [ children: [
// Text('${conflict.localVersion.name} 服务器上的数据与本地数据不一致,请选择要保留的版本。'), Text(
// const SizedBox(height: 24), '${conflict.localVersion.description} 服务器上的数据与本地数据不一致,请选择要保留的版本。',
),
// // --- --- const SizedBox(height: 24),
// Row(
// children: [ // --- ---
// // 使 Expanded Row(
// Expanded( children: [
// child: ElevatedButton( // 使 Expanded
// child: Text( Expanded(
// '使用客户端版本\n(修改于: ${conflict.localVersion.lastModifiedTime.toLocal().toDateTimeString2()})', child: ElevatedButton(
// textAlign: TextAlign.center, child: Text(
// ), '使用客户端版本\n(修改于: ${conflict.localVersion.lastModifiedTime.toLocal().toDateTimeString2()})',
// onPressed: () => Get.back(result: conflict.localVersion), textAlign: TextAlign.center,
// ), ),
// ), onPressed: () => Get.back(result: conflict.localVersion),
// const SizedBox(width: 8), // ),
// // ),
// IconButton( const SizedBox(width: 8), //
// icon: const Icon(Icons.info_outline), //
// tooltip: '查看客户端版本详情', IconButton(
// onPressed: () => navigateToDetailsView(conflict.localVersion), icon: const Icon(Icons.info_outline),
// ), tooltip: '查看客户端版本详情',
// ], onPressed: () => navigateToDetailsView(conflict.localVersion),
// ), ),
// const SizedBox(height: 8), ],
),
// // --- --- const SizedBox(height: 8),
// Row(
// children: [ // --- ---
// Expanded( Row(
// child: ElevatedButton( children: [
// style: ElevatedButton.styleFrom( Expanded(
// backgroundColor: Get.theme.colorScheme.primary, child: ElevatedButton(
// foregroundColor: Get.theme.colorScheme.onPrimary, style: ElevatedButton.styleFrom(
// ), backgroundColor: Get.theme.colorScheme.primary,
// child: Text( foregroundColor: Get.theme.colorScheme.onPrimary,
// '使用服务器版本\n(修改于: ${conflict.serverVersion.lastModifiedTime.toLocal().toDateTimeString2()})', ),
// textAlign: TextAlign.center, child: Text(
// ), '使用服务器版本\n(修改于: ${conflict.serverVersion.lastModifiedTime.toLocal().toDateTimeString2()})',
// onPressed: () => Get.back(result: conflict.serverVersion), textAlign: TextAlign.center,
// ), ),
// ), onPressed: () => Get.back(result: conflict.serverVersion),
// const SizedBox(width: 8), ),
// IconButton( ),
// icon: const Icon(Icons.info_outline), const SizedBox(width: 8),
// tooltip: '查看服务器版本详情', IconButton(
// onPressed: () => icon: const Icon(Icons.info_outline),
// navigateToDetailsView(conflict.serverVersion), tooltip: '查看服务器版本详情',
// ), onPressed: () =>
// ], navigateToDetailsView(conflict.serverVersion),
// ), ),
// ], ],
// ), ),
// ), ],
// // false ),
// barrierDismissible: false, ),
// ); // false
// } barrierDismissible: false,
);
}
void search() { void search() {
loadProblemItems(); loadProblemItems();

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

@ -208,7 +208,7 @@ class ProblemListPage extends GetView<ProblemListController> {
// 使 // 使
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async => controller.loadAndSyncEnterprises(), onRefresh: () async => controller.loadAndSyncProblems(),
child: ListView.builder( child: ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h),
itemCount: controller.problemList.length, itemCount: controller.problemList.length,

Loading…
Cancel
Save