package controller import ( "context" "strings" "github.com/gogf/gf/v2/net/ghttp" "observer-server/biz/model/dto" "observer-server/biz/service" ) // cAdmin 后台管理端接口:薄透传;service 按表归入各表文件 // (订单→service.Order、授权→service.License、数据集→service.Dataset、 // 训练→service.Training、模型版本→service.ModelVersion、标注→service.LabelTask)。 // 独立 controller 聚合,避免同一 controller 挂客户端组 + 管理组时路由重复注册。 type cAdmin struct{} var Admin = &cAdmin{} // ---------- 订单/授权/App 版本(既有) ---------- // ListOrders 订单列表 func (c *cAdmin) ListOrders(ctx context.Context, req *dto.AdminOrderListReq) (*dto.AdminOrderListRes, error) { return service.Order.AdminListOrders(ctx, req) } // ListLicenses 授权列表 func (c *cAdmin) ListLicenses(ctx context.Context, req *dto.AdminLicenseListReq) (*dto.AdminLicenseListRes, error) { return service.License.AdminListLicenses(ctx, req) } // Grant 手动授权 func (c *cAdmin) Grant(ctx context.Context, req *dto.AdminGrantReq) (*dto.AdminGrantRes, error) { return service.License.AdminGrant(ctx, req) } // Revoke 撤销授权 func (c *cAdmin) Revoke(ctx context.Context, req *dto.AdminRevokeReq) (*dto.AdminRevokeRes, error) { return service.License.AdminRevoke(ctx, req) } // Remark 写账号备注 func (c *cAdmin) Remark(ctx context.Context, req *dto.AdminRemarkReq) (*dto.AdminRemarkRes, error) { return service.License.AdminRemark(ctx, req) } // ListAppVersions 版本记录列表 func (c *cAdmin) ListAppVersions(ctx context.Context, req *dto.AdminAppVersionListReq) (*dto.AdminAppVersionListRes, error) { return service.AppVersion.AdminListVersions(ctx, req) } // AddAppVersion 新增版本记录 func (c *cAdmin) AddAppVersion(ctx context.Context, req *dto.AdminAppVersionAddReq) (*dto.AdminAppVersionAddRes, error) { return service.AppVersion.AdminAddVersion(ctx, req) } // DeleteAppVersion 删除版本记录 func (c *cAdmin) DeleteAppVersion(ctx context.Context, req *dto.AdminAppVersionDeleteReq) (*dto.AdminAppVersionDeleteRes, error) { return service.AppVersion.AdminDeleteVersion(ctx, req) } // ---------- 数据集管理 ---------- // ListDatasets 数据集列表 func (c *cAdmin) ListDatasets(ctx context.Context, req *dto.AdminDatasetListReq) (*dto.AdminDatasetListRes, error) { return service.Dataset.AdminListDatasets(ctx, req) } // CreateDataset 新建数据集 func (c *cAdmin) CreateDataset(ctx context.Context, req *dto.AdminDatasetCreateReq) (*dto.AdminDatasetCreateRes, error) { return service.Dataset.AdminCreateDataset(ctx, req) } // UpdateDataset 更新数据集配置(封面/描述/AI 标注端点/训练机 SSH) func (c *cAdmin) UpdateDataset(ctx context.Context, req *dto.AdminDatasetUpdateReq) (*dto.AdminDatasetUpdateRes, error) { return service.Dataset.AdminUpdateDataset(ctx, req) } // DeleteDataset 删除数据集 func (c *cAdmin) DeleteDataset(ctx context.Context, req *dto.AdminDatasetDeleteReq) (*dto.AdminDatasetDeleteRes, error) { return service.Dataset.AdminDeleteDataset(ctx, req) } // NegativeLibrary 获取负样本库(无则创建) func (c *cAdmin) NegativeLibrary(ctx context.Context, req *dto.AdminDatasetNegativeReq) (*dto.AdminDatasetNegativeRes, error) { return service.Dataset.AdminNegativeLibrary(ctx, req) } // NegativeGenerate 负样本批量生成(异步任务,含 RF-DETR 空检剔除) func (c *cAdmin) NegativeGenerate(ctx context.Context, req *dto.AdminNegativeGenerateReq) (*dto.AdminNegativeGenerateRes, error) { return service.Dataset.AdminNegativeGenerate(ctx, req) } // UploadImages 上传图片 func (c *cAdmin) UploadImages(ctx context.Context, req *dto.AdminDatasetUploadReq) (*dto.AdminDatasetUploadRes, error) { return service.Dataset.AdminUploadImages(ctx, req) } // GenerateImages AI 生成图片(异步任务,返回 taskId 供轮询进度) func (c *cAdmin) GenerateImages(ctx context.Context, req *dto.AdminDatasetGenerateReq) (*dto.AdminDatasetGenerateRes, error) { return service.Dataset.AdminGenerateImages(ctx, req) } // GenTaskQuery 生成任务进度查询 func (c *cAdmin) GenTaskQuery(ctx context.Context, req *dto.AdminGenTaskQueryReq) (*dto.AdminGenTaskQueryRes, error) { return service.Dataset.AdminGenTaskQuery(ctx, req) } // GenPools VLM 重新生成数据集生成参数池 func (c *cAdmin) GenPools(ctx context.Context, req *dto.AdminGenPoolsReq) (*dto.AdminGenPoolsRes, error) { return service.Dataset.AdminGenPools(ctx, req) } // ListImages 数据集图片列表 func (c *cAdmin) ListImages(ctx context.Context, req *dto.AdminDatasetImagesReq) (*dto.AdminDatasetImagesRes, error) { return service.Dataset.AdminListImages(ctx, req) } // DeleteImages 删除图片 func (c *cAdmin) DeleteImages(ctx context.Context, req *dto.AdminDatasetImagesDeleteReq) (*dto.AdminDatasetImagesDeleteRes, error) { return service.Dataset.AdminDeleteImages(ctx, req) } // CleanPreview 数据清洗预览(桶分布/候选清单/已排除清单) func (c *cAdmin) CleanPreview(ctx context.Context, req *dto.AdminDatasetCleanPreviewReq) (*dto.AdminDatasetCleanPreviewRes, error) { return service.Dataset.AdminCleanPreview(ctx, req) } // CleanApply 数据清洗执行(批量置/清排除标记) func (c *cAdmin) CleanApply(ctx context.Context, req *dto.AdminDatasetCleanApplyReq) (*dto.AdminDatasetCleanApplyRes, error) { return service.Dataset.AdminCleanApply(ctx, req) } // Image 图片访问(直写响应体:service 校验归属返回路径,controller 输出二进制) func (c *cAdmin) Image(ctx context.Context, req *dto.AdminDatasetImageReq) (*dto.AdminDatasetImageRes, error) { path, err := service.Dataset.ImageFile(ctx, req.DatasetId, req.Filename) if err != nil { return nil, err } r := ghttp.RequestFromCtx(ctx) r.Response.ServeFile(path) return &dto.AdminDatasetImageRes{}, nil } // UploadCover 上传数据集封面 func (c *cAdmin) UploadCover(ctx context.Context, req *dto.AdminDatasetCoverUploadReq) (*dto.AdminDatasetCoverUploadRes, error) { return service.Dataset.AdminUploadCover(ctx, req) } // Cover 封面访问(直写响应体;URL 不随封面更换变化,必须 no-store 防浏览器缓存旧图; // datasetId=0 时按 name+filename 直读——新建对话框预生成封面回显) func (c *cAdmin) Cover(ctx context.Context, req *dto.AdminDatasetCoverReq) (*dto.AdminDatasetCoverRes, error) { path, err := service.Dataset.CoverFile(ctx, req.DatasetId, strings.TrimSpace(req.Name), strings.TrimSpace(req.Filename)) if err != nil { return nil, err } r := ghttp.RequestFromCtx(ctx) r.Response.Header().Set("Cache-Control", "no-store") r.Response.ServeFile(path) return &dto.AdminDatasetCoverRes{}, nil } // DeleteCover 删除数据集封面 func (c *cAdmin) DeleteCover(ctx context.Context, req *dto.AdminDatasetCoverDeleteReq) (*dto.AdminDatasetCoverDeleteRes, error) { return service.Dataset.AdminDeleteCover(ctx, req) } // GenCover 生成数据集封面(z-image 文生图;编辑对话框「AI 生成封面」按钮入口,datasetId=0 新建预生成) func (c *cAdmin) GenCover(ctx context.Context, req *dto.AdminGenCoverReq) (*dto.AdminGenCoverRes, error) { return service.Dataset.AdminGenCover(ctx, req) } // ---------- 训练编排 ---------- // ListTrainings 训练任务列表 func (c *cAdmin) ListTrainings(ctx context.Context, req *dto.AdminTrainingListReq) (*dto.AdminTrainingListRes, error) { return service.Training.AdminListTrainings(ctx, req) } // StartTraining 发起训练 func (c *cAdmin) StartTraining(ctx context.Context, req *dto.AdminTrainingStartReq) (*dto.AdminTrainingStartRes, error) { return service.Training.AdminStartTraining(ctx, req) } // TrainingDetail 训练任务详情 func (c *cAdmin) TrainingDetail(ctx context.Context, req *dto.AdminTrainingDetailReq) (*dto.AdminTrainingDetailRes, error) { return service.Training.AdminTrainingDetail(ctx, req) } // CancelTraining 取消训练 func (c *cAdmin) CancelTraining(ctx context.Context, req *dto.AdminTrainingCancelReq) (*dto.AdminTrainingCancelRes, error) { return service.Training.AdminCancelTraining(ctx, req) } // PublishTraining 发布模型版本 func (c *cAdmin) PublishTraining(ctx context.Context, req *dto.AdminTrainingPublishReq) (*dto.AdminTrainingPublishRes, error) { return service.Training.AdminPublish(ctx, req) } // ---------- 预标注 ---------- // ListLabelTasks 预标注任务列表 func (c *cAdmin) ListLabelTasks(ctx context.Context, req *dto.AdminLabelTaskListReq) (*dto.AdminLabelTaskListRes, error) { return service.LabelTask.AdminListLabelTasks(ctx, req) } // StartLabelTask 发起预标注 func (c *cAdmin) StartLabelTask(ctx context.Context, req *dto.AdminLabelTaskStartReq) (*dto.AdminLabelTaskStartRes, error) { return service.LabelTask.AdminStartLabelTask(ctx, req) } // LabelTaskDetail 预标注任务详情(工作台数据) func (c *cAdmin) LabelTaskDetail(ctx context.Context, req *dto.AdminLabelTaskDetailReq) (*dto.AdminLabelTaskDetailRes, error) { return service.LabelTask.AdminLabelTaskDetail(ctx, req) } // LabelWorkbench 标注工作台数据(无历史任务时直接用数据集图片 + 已确认标注) func (c *cAdmin) LabelWorkbench(ctx context.Context, req *dto.AdminLabelWorkbenchReq) (*dto.AdminLabelWorkbenchRes, error) { return service.LabelTask.AdminLabelWorkbench(ctx, req) } // SaveLabel 保存单张图标注 func (c *cAdmin) SaveLabel(ctx context.Context, req *dto.AdminLabelSaveReq) (*dto.AdminLabelSaveRes, error) { return service.LabelTask.AdminLabelSave(ctx, req) } // VlmReview VLM 藏匿位补检(两阶段标注第二阶段;VL 与图像生成显存互斥,批量补检须在生成空闲时执行) func (c *cAdmin) VlmReview(ctx context.Context, req *dto.AdminImageVlmReviewReq) (*dto.AdminImageVlmReviewRes, error) { return service.LabelTask.AdminImageVlmReview(ctx, req) } // ---------- 标注众包(2026-09-04) ---------- // CreateAnnotateTask 下发标注任务 func (c *cAdmin) CreateAnnotateTask(ctx context.Context, req *dto.AdminAnnotateTaskCreateReq) (*dto.AdminAnnotateTaskCreateRes, error) { return service.Annotate.AdminCreateTask(ctx, req) } // ListAnnotateTasks 标注任务列表 func (c *cAdmin) ListAnnotateTasks(ctx context.Context, req *dto.AdminAnnotateTaskListReq) (*dto.AdminAnnotateTaskListRes, error) { return service.Annotate.AdminListTasks(ctx, req) } // StopAnnotateTask 停用标注任务 func (c *cAdmin) StopAnnotateTask(ctx context.Context, req *dto.AdminAnnotateTaskStopReq) (*dto.AdminAnnotateTaskStopRes, error) { return service.Annotate.AdminStopTask(ctx, req) } // AnnotateReview 批量审核标注(通过/拒绝) func (c *cAdmin) AnnotateReview(ctx context.Context, req *dto.AdminAnnotateReviewReq) (*dto.AdminAnnotateReviewRes, error) { return service.Annotate.AdminReview(ctx, req) } // ListAnnotateRecords 用户标注记录列表 func (c *cAdmin) ListAnnotateRecords(ctx context.Context, req *dto.AdminAnnotateRecordListReq) (*dto.AdminAnnotateRecordListRes, error) { return service.Annotate.AdminListRecords(ctx, req) } // UnfreezeAnnotate 手动解冻标注资格 func (c *cAdmin) UnfreezeAnnotate(ctx context.Context, req *dto.AdminAnnotateUnfreezeReq) (*dto.AdminAnnotateUnfreezeRes, error) { return service.Annotate.AdminUnfreeze(ctx, req) } // StartCombined 综合训练发起(多物种合并模型) func (c *cAdmin) StartCombined(ctx context.Context, req *dto.AdminTrainingCombinedStartReq) (*dto.AdminTrainingCombinedStartRes, error) { return service.Training.AdminStartCombined(ctx, req) } // ListFalseTargets 假目标上报列表 func (c *cAdmin) ListFalseTargets(ctx context.Context, req *dto.AdminFalseTargetListReq) (*dto.AdminFalseTargetListRes, error) { return service.FalseTarget.AdminList(ctx, req) } // FalseTargetImage 假目标裁剪图预览(直写响应体) func (c *cAdmin) FalseTargetImage(ctx context.Context, req *dto.AdminFalseTargetImageReq) (*dto.AdminFalseTargetImageRes, error) { path, err := service.FalseTarget.ImageFile(ctx, req.Id) if err != nil { return nil, err } r := ghttp.RequestFromCtx(ctx) r.Response.ServeFile(path) return &dto.AdminFalseTargetImageRes{}, nil } // ReviewFalseTargets 审核假目标上报(通过=入负样本库;拒绝=删文件) func (c *cAdmin) ReviewFalseTargets(ctx context.Context, req *dto.AdminFalseTargetReviewReq) (*dto.AdminFalseTargetReviewRes, error) { return service.FalseTarget.AdminReview(ctx, req) }