package com.label.controller; import com.label.common.result.PageResult; import com.label.common.result.Result; import com.label.common.shiro.TokenPrincipal; import com.label.entity.TrainingDataset; import com.label.entity.ExportBatch; import com.label.service.ExportService; import com.label.service.FinetuneService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.apache.shiro.authz.annotation.RequiresRoles; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * 训练数据导出与微调接口(5 个端点,全部 ADMIN 权限)。 */ @Tag(name = "导出管理", description = "训练样本查询、导出批次和微调任务") @RestController @RequiredArgsConstructor public class ExportController { private final ExportService exportService; private final FinetuneService finetuneService; /** GET /api/training/samples — 分页查询已审批可导出样本 */ @Operation(summary = "分页查询可导出训练样本") @GetMapping("/api/training/samples") @RequiresRoles("ADMIN") public Result> listSamples( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int pageSize, @RequestParam(required = false) String sampleType, @RequestParam(required = false) Boolean exported, HttpServletRequest request) { return Result.success(exportService.listSamples(page, pageSize, sampleType, exported, principal(request))); } /** POST /api/export/batch — 创建导出批次 */ @Operation(summary = "创建导出批次") @PostMapping("/api/export/batch") @RequiresRoles("ADMIN") @ResponseStatus(HttpStatus.CREATED) public Result createBatch(@RequestBody Map body, HttpServletRequest request) { @SuppressWarnings("unchecked") List rawIds = (List) body.get("sampleIds"); List sampleIds = rawIds.stream() .map(id -> Long.parseLong(id.toString())) .toList(); return Result.success(exportService.createBatch(sampleIds, principal(request))); } /** POST /api/export/{batchId}/finetune — 提交微调任务 */ @Operation(summary = "提交微调任务") @PostMapping("/api/export/{batchId}/finetune") @RequiresRoles("ADMIN") public Result> triggerFinetune(@PathVariable Long batchId, HttpServletRequest request) { return Result.success(finetuneService.trigger(batchId, principal(request))); } /** GET /api/export/{batchId}/status — 查询微调状态 */ @Operation(summary = "查询微调状态") @GetMapping("/api/export/{batchId}/status") @RequiresRoles("ADMIN") public Result> getFinetuneStatus(@PathVariable Long batchId, HttpServletRequest request) { return Result.success(finetuneService.getStatus(batchId, principal(request))); } /** GET /api/export/list — 分页查询导出批次列表 */ @Operation(summary = "分页查询导出批次") @GetMapping("/api/export/list") @RequiresRoles("ADMIN") public Result> listBatches( @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int pageSize, HttpServletRequest request) { return Result.success(exportService.listBatches(page, pageSize, principal(request))); } private TokenPrincipal principal(HttpServletRequest request) { return (TokenPrincipal) request.getAttribute("__token_principal__"); } }