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.
99 lines
3.1 KiB
99 lines
3.1 KiB
1 day ago
|
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(),
|
||
|
);
|
||
|
}
|
||
|
}
|