using OrpaonVision.ConfigApp.Annotation.Options; using OrpaonVision.Core.Annotation; using OrpaonVision.Core.Annotation.Contracts; using OrpaonVision.Core.Enums; using OrpaonVision.Core.Results; namespace OrpaonVision.ConfigApp.Annotation.Services; /// /// CVAT 标注同步应用服务(骨架实现)。 /// /// 说明: /// - 当前阶段先提供参数校验与返回契约,便于前后链路先跑通; /// - 实际 HTTP 调用、认证、重试策略将在后续迭代补齐。 /// public sealed class CvatAnnotationSyncAppService : IAnnotationSyncAppService { private readonly CvatOptions _options; /// /// 构造函数。 /// /// CVAT 配置。 public CvatAnnotationSyncAppService(CvatOptions options) { _options = options; } /// public Task SyncProjectAsync(SyncAnnotationProjectCommand command, CancellationToken cancellationToken = default) { if (command.Platform != AnnotationPlatformEnum.Cvat) { return Task.FromResult(Result.Fail("ANNOTATION_PLATFORM_NOT_SUPPORTED", "当前版本仅支持 CVAT 平台同步。")); } if (command.ProjectId == Guid.Empty || command.AnnotationTaskId == Guid.Empty) { return Task.FromResult(Result.Fail("ANNOTATION_ARGUMENT_INVALID", "项目标识或标注任务标识无效。")); } if (string.IsNullOrWhiteSpace(command.CvatServerEndpoint)) { return Task.FromResult(Result.Fail("ANNOTATION_ENDPOINT_REQUIRED", "CVAT 服务地址不能为空。")); } if (!Uri.TryCreate(command.CvatServerEndpoint, UriKind.Absolute, out _)) { return Task.FromResult(Result.Fail("ANNOTATION_ENDPOINT_INVALID", "CVAT 服务地址格式不合法。")); } if (command.CvatTaskId <= 0 || command.CvatProjectId <= 0) { return Task.FromResult(Result.Fail("ANNOTATION_CVAT_ID_INVALID", "CVAT 项目 ID 或任务 ID 必须大于 0。")); } // 当前为骨架实现:预留后续与 CVAT API 的双向同步逻辑。 return Task.FromResult(Result.Success(message: "CVAT 同步请求已受理。")); } /// public Task> GetSyncStatusAsync(Guid projectId, CancellationToken cancellationToken = default) { if (projectId == Guid.Empty) { return Task.FromResult(Result.Fail("ANNOTATION_PROJECT_ID_INVALID", "项目标识不能为空。")); } var status = new AnnotationSyncStatusDto { ProjectId = projectId, AnnotationTaskId = Guid.Empty, Platform = AnnotationPlatformEnum.Cvat, SyncStatus = AnnotationSyncStatusEnum.None, ProgressPercent = 0, LastSyncedAtUtc = null, LastErrorMessage = null }; return Task.FromResult(Result.Success(status, message: $"CVAT 状态查询完成({_options.ServerEndpoint})。")); } }