Files
observer/server/biz/controller/admin.go
T
admin 87ab06221c 综合训练(多物种合并模型)全链路:合并打包/独立版本序列/App 覆盖互斥 + 管理端发布入口
- 后端:/admin/trainings/combined 发起(≥2 数据集、类别重映射、防重名、负样本单份);
  model_training/model_version 加 kind+dataset_ids(迁移 v14),综合任务 dataset_id=0、
  文件基名 combined(_n)、版本序列独立;训练列表补 published 标记
- 管理端:数据训练页工具栏发起综合训练;横幅常驻进行中任务 + 每档最近一条已结束任务,
  成功未发布给「发布模型」入口(可关闭收起)
- App:目录解析 kind/datasetIds、激活覆盖互斥、自动更新退场改目标档待办横幅手动一键下载
2026-09-09 15:45:51 +08:00

290 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}