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

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

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

Loading…
Cancel
Save