You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
3.1 KiB

import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:uuid/uuid.dart';
enum ProblemSyncStatus {
/// 未跟踪 - 需要被移除的记录(如本地删除但从未同步过)
untracked,
/// 已同步 - 与服务器完全一致(类似git的unmodified)
synced,
/// 待创建 - 新问题,需要上传到服务器(类似git的untracked → staged)
pendingCreate,
/// 待更新 - 已修改的问题,需要更新到服务器(类似git的modified → staged)
pendingUpdate,
/// 待删除 - 已标记删除,需要从服务器删除(类似git的deleted → staged)
pendingDelete,
}
/// 问题状态管理器 - 类似 git add/git commit
class ProblemStateManager {
/// 静态对象uuid
static final Uuid _uuid = Uuid();
/// 创建新问题(类似创建新文件)
static Problem createNewProblem({
required String description,
required String location,
required List<ImageMetadata> imageUrls,
}) {
return Problem(
id: _uuid.v4(),
description: description,
location: location,
imageUrls: imageUrls,
creationTime: DateTime.now(),
lastModifiedTime: DateTime.now(),
syncStatus: ProblemSyncStatus.pendingCreate,
);
}
/// 修改问题内容(类似编辑文件)
static Problem modifyProblem(Problem problem) {
final newStatus = problem.syncStatus == ProblemSyncStatus.synced
? ProblemSyncStatus
.pendingUpdate // 已同步的改为待更新
: problem.syncStatus; // 保持原有待处理状态
return problem.copyWith(
syncStatus: newStatus,
lastModifiedTime: DateTime.now(),
);
}
/// 标记问题为删除
static Problem markForDeletion(Problem problem) {
switch (problem.syncStatus) {
case ProblemSyncStatus.pendingCreate:
// 待创建的问题 → 未跟踪(直接移除)
return problem.copyWith(
syncStatus: ProblemSyncStatus.untracked,
lastModifiedTime: DateTime.now(),
);
case ProblemSyncStatus.synced:
case ProblemSyncStatus.pendingUpdate:
// 已同步或待更新的问题 → 待删除(需要服务器操作)
return problem.copyWith(
syncStatus: ProblemSyncStatus.pendingDelete,
lastModifiedTime: DateTime.now(),
);
case ProblemSyncStatus.untracked:
case ProblemSyncStatus.pendingDelete:
// 已经是删除相关状态,无需变化
return problem;
}
}
/// 撤销删除(类似 git reset)
static Problem undoDeletion(Problem problem) {
if (problem.syncStatus == ProblemSyncStatus.pendingDelete) {
return problem.copyWith(
syncStatus: ProblemSyncStatus.pendingUpdate,
lastModifiedTime: DateTime.now(),
);
}
return problem;
}
/// 同步成功后的状态更新(类似 git commit 成功)
static Problem markAsSynced(Problem problem) {
return problem.copyWith(
syncStatus: ProblemSyncStatus.synced,
lastModifiedTime: DateTime.now(),
);
}
}