Browse Source

feat : 添加创建人id与修改时间utc毫秒比对

dev
徐振升 17 hours ago
parent
commit
bdfc6778f7
  1. 3
      lib/app/bindings/initial_binding.dart
  2. 14
      lib/data/models/problem_model.dart
  3. 36
      lib/data/models/problem_sync_status.dart
  4. 1
      lib/data/providers/sqlite_provider.dart
  5. 9
      lib/data/repositories/auth_repository.dart
  6. 5
      lib/data/repositories/problem_repository.dart
  7. 7
      lib/modules/auth/controllers/login_controller.dart
  8. 7
      lib/modules/home/bindings/home_binding.dart
  9. 4
      lib/modules/problem/bindings/problem_form_binding.dart
  10. 210
      lib/modules/problem/controllers/problem_controller.dart
  11. 6
      lib/modules/problem/controllers/problem_form_controller.dart

3
lib/app/bindings/initial_binding.dart

@ -8,6 +8,7 @@ import 'package:problem_check_system/data/repositories/file_repository.dart';
import 'package:problem_check_system/data/repositories/image_repository.dart'; import 'package:problem_check_system/data/repositories/image_repository.dart';
import 'package:problem_check_system/data/repositories/image_repository_impl.dart'; import 'package:problem_check_system/data/repositories/image_repository_impl.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart'; import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:uuid/uuid.dart';
class InitialBinding implements Bindings { class InitialBinding implements Bindings {
@override @override
@ -19,6 +20,7 @@ class InitialBinding implements Bindings {
void _registerCoreServices() { void _registerCoreServices() {
/// ///
Get.put<GetStorage>(GetStorage(), permanent: true); Get.put<GetStorage>(GetStorage(), permanent: true);
Get.put<Uuid>(Uuid(), permanent: true);
Get.put<HttpProvider>(HttpProvider()); Get.put<HttpProvider>(HttpProvider());
Get.put<SQLiteProvider>(SQLiteProvider()); Get.put<SQLiteProvider>(SQLiteProvider());
Get.put<ConnectivityProvider>(ConnectivityProvider()); Get.put<ConnectivityProvider>(ConnectivityProvider());
@ -43,6 +45,7 @@ class InitialBinding implements Bindings {
sqliteProvider: Get.find<SQLiteProvider>(), sqliteProvider: Get.find<SQLiteProvider>(),
httpProvider: Get.find<HttpProvider>(), httpProvider: Get.find<HttpProvider>(),
connectivityProvider: Get.find<ConnectivityProvider>(), connectivityProvider: Get.find<ConnectivityProvider>(),
authRepository: Get.find(),
), ),
); );
} }

14
lib/data/models/problem_model.dart

@ -21,6 +21,9 @@ class Problem {
/// ///
final DateTime creationTime; final DateTime creationTime;
/// id
final String creatorId;
/// ///
final ProblemSyncStatus syncStatus; final ProblemSyncStatus syncStatus;
@ -42,6 +45,7 @@ class Problem {
required this.location, required this.location,
required this.imageUrls, required this.imageUrls,
required this.creationTime, required this.creationTime,
required this.creatorId,
required this.lastModifiedTime, required this.lastModifiedTime,
this.syncStatus = ProblemSyncStatus.pendingCreate, this.syncStatus = ProblemSyncStatus.pendingCreate,
this.censorTaskId, this.censorTaskId,
@ -56,6 +60,7 @@ class Problem {
String? location, String? location,
List<ImageMetadata>? imageUrls, List<ImageMetadata>? imageUrls,
DateTime? creationTime, DateTime? creationTime,
String? creatorId,
DateTime? lastModifiedTime, DateTime? lastModifiedTime,
ProblemSyncStatus? syncStatus, ProblemSyncStatus? syncStatus,
bool? isDeleted, bool? isDeleted,
@ -69,6 +74,7 @@ class Problem {
location: location ?? this.location, location: location ?? this.location,
imageUrls: imageUrls ?? this.imageUrls, imageUrls: imageUrls ?? this.imageUrls,
creationTime: creationTime ?? this.creationTime, creationTime: creationTime ?? this.creationTime,
creatorId: creatorId ?? this.creatorId,
lastModifiedTime: lastModifiedTime ?? this.lastModifiedTime, lastModifiedTime: lastModifiedTime ?? this.lastModifiedTime,
syncStatus: syncStatus ?? this.syncStatus, syncStatus: syncStatus ?? this.syncStatus,
censorTaskId: censorTaskId ?? this.censorTaskId, censorTaskId: censorTaskId ?? this.censorTaskId,
@ -85,6 +91,7 @@ class Problem {
'location': location, 'location': location,
'imageUrls': json.encode(imageUrls.map((e) => e.toMap()).toList()), 'imageUrls': json.encode(imageUrls.map((e) => e.toMap()).toList()),
'creationTime': creationTime.millisecondsSinceEpoch, 'creationTime': creationTime.millisecondsSinceEpoch,
'creatorId': creatorId,
'lastModifiedTime': lastModifiedTime.millisecondsSinceEpoch, 'lastModifiedTime': lastModifiedTime.millisecondsSinceEpoch,
'syncStatus': syncStatus.index, 'syncStatus': syncStatus.index,
'censorTaskId': censorTaskId, 'censorTaskId': censorTaskId,
@ -112,9 +119,14 @@ class Problem {
description: map['description'], description: map['description'],
location: map['location'], location: map['location'],
imageUrls: imageUrlsList, imageUrls: imageUrlsList,
creationTime: DateTime.fromMillisecondsSinceEpoch(map['creationTime']), creationTime: DateTime.fromMillisecondsSinceEpoch(
map['creationTime'],
isUtc: true,
),
creatorId: map['creatorId'],
lastModifiedTime: DateTime.fromMillisecondsSinceEpoch( lastModifiedTime: DateTime.fromMillisecondsSinceEpoch(
map['lastModifiedTime'], map['lastModifiedTime'],
isUtc: true,
), ),
syncStatus: ProblemSyncStatus.values[map['syncStatus']], syncStatus: ProblemSyncStatus.values[map['syncStatus']],
censorTaskId: map['censorTaskId'], censorTaskId: map['censorTaskId'],

36
lib/data/models/problem_sync_status.dart

@ -1,5 +1,7 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/image_metadata_model.dart'; import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/data/models/problem_model.dart'; import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
enum ProblemSyncStatus { enum ProblemSyncStatus {
@ -20,29 +22,33 @@ enum ProblemSyncStatus {
} }
/// - git add/git commit /// - git add/git commit
class ProblemStateManager { class ProblemStateManager extends GetxController {
/// uuid /// uuid
static final Uuid _uuid = Uuid(); final Uuid uuid;
final AuthRepository authRepository;
ProblemStateManager({required this.uuid, required this.authRepository});
/// ///
static Problem createNewProblem({ Problem createNewProblem({
required String description, required String description,
required String location, required String location,
required List<ImageMetadata> imageUrls, required List<ImageMetadata> imageUrls,
}) { }) {
return Problem( return Problem(
id: _uuid.v4(), id: uuid.v4(),
description: description, description: description,
location: location, location: location,
imageUrls: imageUrls, imageUrls: imageUrls,
creationTime: DateTime.now(), creationTime: DateTime.now().toUtc(),
lastModifiedTime: DateTime.now(), creatorId: authRepository.getUserId()!,
lastModifiedTime: DateTime.now().toUtc(),
syncStatus: ProblemSyncStatus.pendingCreate, syncStatus: ProblemSyncStatus.pendingCreate,
); );
} }
/// ///
static Problem modifyProblem(Problem problem) { Problem modifyProblem(Problem problem) {
final newStatus = problem.syncStatus == ProblemSyncStatus.synced final newStatus = problem.syncStatus == ProblemSyncStatus.synced
? ProblemSyncStatus ? ProblemSyncStatus
.pendingUpdate // .pendingUpdate //
@ -50,25 +56,25 @@ class ProblemStateManager {
return problem.copyWith( return problem.copyWith(
syncStatus: newStatus, syncStatus: newStatus,
lastModifiedTime: DateTime.now(), lastModifiedTime: DateTime.now().toUtc(),
); );
} }
/// ///
static Problem markForDeletion(Problem problem) { Problem markForDeletion(Problem problem) {
switch (problem.syncStatus) { switch (problem.syncStatus) {
case ProblemSyncStatus.pendingCreate: case ProblemSyncStatus.pendingCreate:
// //
return problem.copyWith( return problem.copyWith(
syncStatus: ProblemSyncStatus.untracked, syncStatus: ProblemSyncStatus.untracked,
lastModifiedTime: DateTime.now(), lastModifiedTime: DateTime.now().toUtc(),
); );
case ProblemSyncStatus.synced: case ProblemSyncStatus.synced:
case ProblemSyncStatus.pendingUpdate: case ProblemSyncStatus.pendingUpdate:
// //
return problem.copyWith( return problem.copyWith(
syncStatus: ProblemSyncStatus.pendingDelete, syncStatus: ProblemSyncStatus.pendingDelete,
lastModifiedTime: DateTime.now(), lastModifiedTime: DateTime.now().toUtc(),
); );
case ProblemSyncStatus.untracked: case ProblemSyncStatus.untracked:
case ProblemSyncStatus.pendingDelete: case ProblemSyncStatus.pendingDelete:
@ -78,21 +84,21 @@ class ProblemStateManager {
} }
/// git reset /// git reset
static Problem undoDeletion(Problem problem) { Problem undoDeletion(Problem problem) {
if (problem.syncStatus == ProblemSyncStatus.pendingDelete) { if (problem.syncStatus == ProblemSyncStatus.pendingDelete) {
return problem.copyWith( return problem.copyWith(
syncStatus: ProblemSyncStatus.pendingUpdate, syncStatus: ProblemSyncStatus.pendingUpdate,
lastModifiedTime: DateTime.now(), lastModifiedTime: DateTime.now().toUtc(),
); );
} }
return problem; return problem;
} }
/// git commit /// git commit
static Problem markAsSynced(Problem problem) { Problem markAsSynced(Problem problem) {
return problem.copyWith( return problem.copyWith(
syncStatus: ProblemSyncStatus.synced, syncStatus: ProblemSyncStatus.synced,
lastModifiedTime: DateTime.now(), lastModifiedTime: DateTime.now().toUtc(),
); );
} }
} }

1
lib/data/providers/sqlite_provider.dart

@ -50,6 +50,7 @@ class SQLiteProvider extends GetxService {
location TEXT NOT NULL, location TEXT NOT NULL,
imageUrls TEXT NOT NULL, imageUrls TEXT NOT NULL,
creationTime INTEGER NOT NULL, creationTime INTEGER NOT NULL,
creatorId TEXT NOT NULL,
lastModifiedTime INTEGER NOT NULL, lastModifiedTime INTEGER NOT NULL,
syncStatus INTEGER NOT NULL, syncStatus INTEGER NOT NULL,
censorTaskId TEXT, censorTaskId TEXT,

9
lib/data/repositories/auth_repository.dart

@ -21,6 +21,7 @@ class AuthRepository extends GetxService {
static const String _refreshTokenKey = 'refresh_token'; static const String _refreshTokenKey = 'refresh_token';
static const String _loginKey = 'user'; static const String _loginKey = 'user';
static const String _rememberMe = 'remember_me'; static const String _rememberMe = 'remember_me';
static const String _userId = 'userId';
void saveToken(String token) { void saveToken(String token) {
storage.write(_tokenKey, token); storage.write(_tokenKey, token);
@ -38,6 +39,14 @@ class AuthRepository extends GetxService {
return storage.read(_refreshTokenKey); return storage.read(_refreshTokenKey);
} }
void saveUserId(String id) {
storage.write(_userId, id);
}
String? getUserId() {
return storage.read(_userId);
}
void addLoginKey(LoginRequest login) { void addLoginKey(LoginRequest login) {
storage.write(_loginKey, login.toJson()); storage.write(_loginKey, login.toJson());
} }

5
lib/data/repositories/problem_repository.dart

@ -7,6 +7,7 @@ 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/connectivity_provider.dart';
import 'package:problem_check_system/data/providers/http_provider.dart'; import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/providers/sqlite_provider.dart'; import 'package:problem_check_system/data/providers/sqlite_provider.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
/// ///
/// ///
@ -14,6 +15,7 @@ class ProblemRepository extends GetxService {
final SQLiteProvider sqliteProvider; final SQLiteProvider sqliteProvider;
final HttpProvider httpProvider; final HttpProvider httpProvider;
final ConnectivityProvider connectivityProvider; final ConnectivityProvider connectivityProvider;
final AuthRepository authRepository;
RxBool get isOnline => connectivityProvider.isOnline; RxBool get isOnline => connectivityProvider.isOnline;
@ -21,6 +23,7 @@ class ProblemRepository extends GetxService {
required this.sqliteProvider, required this.sqliteProvider,
required this.httpProvider, required this.httpProvider,
required this.connectivityProvider, required this.connectivityProvider,
required this.authRepository,
}); });
/// ///
@ -54,7 +57,6 @@ class ProblemRepository extends GetxService {
await sqliteProvider.deleteProblem(problemId); await sqliteProvider.deleteProblem(problemId);
} }
// TODO id,
// ProblemRepository中添加 // ProblemRepository中添加
Future<List<ServerProblem>> fetchProblemsFromServer({ Future<List<ServerProblem>> fetchProblemsFromServer({
DateTime? startTime, DateTime? startTime,
@ -67,6 +69,7 @@ class ProblemRepository extends GetxService {
final response = await httpProvider.get( final response = await httpProvider.get(
ApiEndpoints.getProblems, ApiEndpoints.getProblems,
queryParameters: { queryParameters: {
'creatorId': authRepository.getUserId(),
if (startTime != null) if (startTime != null)
'StartTime': startTime.toUtc().toIso8601String(), 'StartTime': startTime.toUtc().toIso8601String(),
if (endTime != null) 'EndTime': endTime.toUtc().toIso8601String(), if (endTime != null) 'EndTime': endTime.toUtc().toIso8601String(),

7
lib/modules/auth/controllers/login_controller.dart

@ -73,8 +73,11 @@ class LoginController extends GetxController {
_authRepository.removeLoginKey(); _authRepository.removeLoginKey();
} }
Get.offAllNamed(AppRoutes.home); Get.offAllNamed(AppRoutes.home);
// // 访
debugPrint('登录成功: $loginResponse'); var user = await _authRepository.getUserProfile();
if (user.id != null) {
_authRepository.saveUserId(user.id!);
}
} on DioException catch (e) { } on DioException catch (e) {
// DioException // DioException
// Snackbar // Snackbar

7
lib/modules/home/bindings/home_binding.dart

@ -1,4 +1,5 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart'; import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart'; import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:problem_check_system/modules/home/controllers/home_controller.dart'; import 'package:problem_check_system/modules/home/controllers/home_controller.dart';
@ -10,10 +11,14 @@ class HomeBinding implements Bindings {
void dependencies() { void dependencies() {
/// ///
Get.lazyPut<HomeController>(() => HomeController()); Get.lazyPut<HomeController>(() => HomeController());
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
/// ///
Get.lazyPut<ProblemController>( Get.lazyPut<ProblemController>(
() => ProblemController(problemRepository: Get.find<ProblemRepository>()), () => ProblemController(
problemRepository: Get.find<ProblemRepository>(),
problemStateManager: Get.find<ProblemStateManager>(),
),
fenix: true, fenix: true,
); );

4
lib/modules/problem/bindings/problem_form_binding.dart

@ -1,5 +1,6 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/data/models/problem_model.dart'; import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart'; import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart';
class ProblemFormBinding extends Bindings { class ProblemFormBinding extends Bindings {
@ -12,9 +13,12 @@ class ProblemFormBinding extends Bindings {
if (arguments != null && arguments is Problem) { if (arguments != null && arguments is Problem) {
problem = arguments; problem = arguments;
} }
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
Get.lazyPut<ProblemFormController>( Get.lazyPut<ProblemFormController>(
() => ProblemFormController( () => ProblemFormController(
problemRepository: Get.find(), problemRepository: Get.find(),
problemStateManager: Get.find(),
problem: problem, problem: problem,
isReadOnly: readOnly, isReadOnly: readOnly,
), ),

210
lib/modules/problem/controllers/problem_controller.dart

@ -25,6 +25,7 @@ class ProblemController extends GetxController
with GetSingleTickerProviderStateMixin { with GetSingleTickerProviderStateMixin {
/// ///
final ProblemRepository problemRepository; final ProblemRepository problemRepository;
final ProblemStateManager problemStateManager;
final FileRepository fileRepository = Get.find<FileRepository>(); final FileRepository fileRepository = Get.find<FileRepository>();
/// ///
@ -103,7 +104,10 @@ class ProblemController extends GetxController
/// get /// get
RxBool get isOnline => problemRepository.isOnline; RxBool get isOnline => problemRepository.isOnline;
ProblemController({required this.problemRepository}); ProblemController({
required this.problemRepository,
required this.problemStateManager,
});
@override @override
void onInit() { void onInit() {
@ -457,7 +461,7 @@ class ProblemController extends GetxController
); );
try { try {
const int totalSteps = 4; const int totalSteps = 5;
syncProgress.startSync(totalSteps); syncProgress.startSync(totalSteps);
// 1. // 1.
@ -477,10 +481,11 @@ class ProblemController extends GetxController
); );
// 4. // 4.
_downloadImagesForProblems(downloadedProblems); syncProgress.updateProgress('正在下载图片...', 4);
await downloadImagesForProblems(downloadedProblems);
// 5. // 5.
syncProgress.updateProgress('正在重新加载数据...', 4); syncProgress.updateProgress('正在重新加载数据...', 5);
await loadProblems(); await loadProblems();
syncProgress.completeSync(); syncProgress.completeSync();
@ -500,64 +505,154 @@ class ProblemController extends GetxController
} }
} }
/// ///
void _downloadImagesForProblems(List<Problem> problems) { Future<void> downloadImagesForProblems(List<Problem> problems) async {
if (problems.isEmpty) return; if (problems.isEmpty) return;
// final imageRepository = Get.find<ImageRepository>();
Future(() async { final List<Future<void>> downloadFutures = [];
final imageRepository = Get.find<ImageRepository>(); // 使GetX获取实例
for (final problem in problems) {
for (final problem in problems) { //
try { final downloadFuture = _downloadProblemImages(problem, imageRepository);
final List<ImageMetadata> downloadedImages = []; downloadFutures.add(downloadFuture);
}
for (final imageMeta in problem.imageUrls) {
if (imageMeta.remoteUrl != null && //
imageMeta.remoteUrl!.isNotEmpty) { await Future.wait(downloadFutures);
// }
final bool isDownloaded = await imageRepository.isImageDownloaded(
imageMeta.remoteUrl!,
problem.id,
);
String localPath; ///
if (isDownloaded) { Future<void> _downloadProblemImages(
// Problem problem,
localPath = (await imageRepository.getLocalImagePath( ImageRepository imageRepository,
imageMeta.remoteUrl!, ) async {
problem.id, try {
))!; final List<ImageMetadata> downloadedImages = [];
} else { final List<Future<void>> imageFutures = [];
//
localPath = await imageRepository.downloadImage( for (final imageMeta in problem.imageUrls) {
imageMeta.remoteUrl!, if (imageMeta.remoteUrl != null && imageMeta.remoteUrl!.isNotEmpty) {
problem.id, //
); final imageFuture =
} _downloadSingleImage(imageMeta, problem.id, imageRepository).then(
(downloadedImage) {
// if (downloadedImage != null) {
final downloadedImage = imageMeta.copyWith( downloadedImages.add(downloadedImage);
localPath: localPath, }
status: ImageStatus.synced, },
); );
downloadedImages.add(downloadedImage);
}
}
// imageFutures.add(imageFuture);
if (downloadedImages.isNotEmpty) {
final updatedProblem = problem.copyWith(
imageUrls: downloadedImages,
);
await problemRepository.updateProblem(updatedProblem);
}
} catch (e) {
Get.log('下载问题 ${problem.id} 的图片失败: $e');
} }
} }
});
//
await Future.wait(imageFutures);
//
if (downloadedImages.isNotEmpty) {
final updatedProblem = problem.copyWith(imageUrls: downloadedImages);
await problemRepository.updateProblem(updatedProblem);
}
} catch (e) {
Get.log('下载问题 ${problem.id} 的图片失败: $e');
rethrow; //
}
}
///
Future<ImageMetadata?> _downloadSingleImage(
ImageMetadata imageMeta,
String problemId,
ImageRepository imageRepository,
) async {
try {
final bool isDownloaded = await imageRepository.isImageDownloaded(
imageMeta.remoteUrl!,
problemId,
);
String localPath;
if (isDownloaded) {
localPath = (await imageRepository.getLocalImagePath(
imageMeta.remoteUrl!,
problemId,
))!;
} else {
localPath = await imageRepository.downloadImage(
imageMeta.remoteUrl!,
problemId,
);
}
return imageMeta.copyWith(
localPath: localPath,
status: ImageStatus.synced,
);
} catch (e) {
Get.log('下载图片 ${imageMeta.remoteUrl} 失败: $e');
return null; //
}
} }
// ///
// void _downloadImagesForProblems(List<Problem> problems) {
// if (problems.isEmpty) return;
// //
// Future(() async {
// final imageRepository = Get.find<ImageRepository>(); // 使GetX获取实例
// for (final problem in problems) {
// try {
// final List<ImageMetadata> downloadedImages = [];
// for (final imageMeta in problem.imageUrls) {
// if (imageMeta.remoteUrl != null &&
// imageMeta.remoteUrl!.isNotEmpty) {
// //
// final bool isDownloaded = await imageRepository.isImageDownloaded(
// imageMeta.remoteUrl!,
// problem.id,
// );
// String localPath;
// if (isDownloaded) {
// //
// localPath = (await imageRepository.getLocalImagePath(
// imageMeta.remoteUrl!,
// problem.id,
// ))!;
// } else {
// //
// localPath = await imageRepository.downloadImage(
// imageMeta.remoteUrl!,
// problem.id,
// );
// }
// //
// final downloadedImage = imageMeta.copyWith(
// localPath: localPath,
// status: ImageStatus.synced,
// );
// downloadedImages.add(downloadedImage);
// }
// }
// //
// if (downloadedImages.isNotEmpty) {
// final updatedProblem = problem.copyWith(
// imageUrls: downloadedImages,
// );
// await problemRepository.updateProblem(updatedProblem);
// }
// } catch (e) {
// Get.log('下载问题 ${problem.id} 的图片失败: $e');
// }
// }
// });
// }
/// ///
Future<List<Problem>> _syncProblems( Future<List<Problem>> _syncProblems(
@ -607,7 +702,9 @@ class ProblemController extends GetxController
final serverUpdated = serverProblem.lastModificationTime; final serverUpdated = serverProblem.lastModificationTime;
final localUpdated = localProblem.lastModifiedTime; final localUpdated = localProblem.lastModifiedTime;
if (serverUpdated != null && serverUpdated.isAfter(localUpdated)) { if (serverUpdated != null &&
serverUpdated.millisecondsSinceEpoch >
localUpdated.millisecondsSinceEpoch) {
// //
final updatedProblem = _convertServerProblemToLocal(serverProblem); final updatedProblem = _convertServerProblemToLocal(serverProblem);
await problemRepository.updateProblem(updatedProblem); await problemRepository.updateProblem(updatedProblem);
@ -640,6 +737,7 @@ class ProblemController extends GetxController
location: serverProblem.location, location: serverProblem.location,
imageUrls: imageMetadatas, imageUrls: imageMetadatas,
creationTime: serverProblem.creationTime, creationTime: serverProblem.creationTime,
creatorId: serverProblem.creatorId,
lastModifiedTime: serverProblem.lastModificationTime ?? DateTime.now(), lastModifiedTime: serverProblem.lastModificationTime ?? DateTime.now(),
syncStatus: ProblemSyncStatus.synced, // syncStatus: ProblemSyncStatus.synced, //
censorTaskId: serverProblem.censorTaskId, censorTaskId: serverProblem.censorTaskId,
@ -836,7 +934,7 @@ class ProblemController extends GetxController
/// ///
Future<void> deleteProblem(Problem problem) async { Future<void> deleteProblem(Problem problem) async {
try { try {
final deleteProblem = ProblemStateManager.markForDeletion(problem); final deleteProblem = problemStateManager.markForDeletion(problem);
if (deleteProblem.syncStatus == ProblemSyncStatus.untracked) { if (deleteProblem.syncStatus == ProblemSyncStatus.untracked) {
// //
await problemRepository.deleteProblem(problem.id); await problemRepository.deleteProblem(problem.id);

6
lib/modules/problem/controllers/problem_form_controller.dart

@ -20,6 +20,7 @@ class ProblemFormController extends GetxController {
final bool isReadOnly; final bool isReadOnly;
final ProblemRepository problemRepository; final ProblemRepository problemRepository;
final ProblemStateManager problemStateManager;
final TextEditingController descriptionController = TextEditingController(); final TextEditingController descriptionController = TextEditingController();
final TextEditingController locationController = TextEditingController(); final TextEditingController locationController = TextEditingController();
final RxList<XFile> selectedImages = <XFile>[].obs; final RxList<XFile> selectedImages = <XFile>[].obs;
@ -28,6 +29,7 @@ class ProblemFormController extends GetxController {
// 使便 // 使便
ProblemFormController({ ProblemFormController({
required this.problemRepository, required this.problemRepository,
required this.problemStateManager,
this.problem, this.problem,
this.isReadOnly = false, this.isReadOnly = false,
}) { }) {
@ -162,12 +164,12 @@ class ProblemFormController extends GetxController {
imageUrls: imagePaths, imageUrls: imagePaths,
); );
// //
final modifyProblem = ProblemStateManager.modifyProblem(updatedProblem); final modifyProblem = problemStateManager.modifyProblem(updatedProblem);
await problemRepository.updateProblem(modifyProblem); await problemRepository.updateProblem(modifyProblem);
} else { } else {
// //
final newProblem = ProblemStateManager.createNewProblem( final newProblem = problemStateManager.createNewProblem(
description: descriptionController.text, description: descriptionController.text,
location: locationController.text, location: locationController.text,
imageUrls: imagePaths, imageUrls: imagePaths,

Loading…
Cancel
Save