package cn.iocoder.yudao.module.qcreport.controller.admin.aiimport.vo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; import java.util.List; /** * AI 识别文件生成模板草稿的入参。 *

* 文件不走这里上传:先由前端调 system 模块的 {@code /system/storage-blob/upload} 拿到 blobId, * 再把 blobId 交给本接口。业务模块不自建上传通道,也不碰 MultipartFile(见 file-upload.md)。 *

* 返回的只是**草稿**,不落库。人工在设计器里确认、调整并点保存,才会真正写入模板版本。 */ @Schema(description = "管理后台 - 智能质检报告 AI 模板草稿 Request VO") @Data public class QcReportAiDraftReqVO { /** * 文件数量上限**不在注解里写死**:它由 {@code yudao.qcreport.ai-import.max-files} 决定, * 服务层在读取任何文件之前先比对配置值并给出带两个实际值的提示。 * 这里再写一个数字就是第二个真相来源——它与配置不同步时,用户看到的上限与真正生效的上限对不上, * 而且注解永远只会更严,配置便只敢往下调。 */ @Schema(description = "上传文件对应的 blobId 列表,顺序即文档页序。个数上限见 yudao.qcreport.ai-import.max-files", requiredMode = Schema.RequiredMode.REQUIRED, example = "[2048, 2049]") @NotEmpty(message = "请至少上传一个文件") private List blobIds; @Schema(description = "目标模板编号,用于日志留痕与附件归属", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") @NotNull(message = "模板编号不能为空") private Long templateId; @Schema(description = "前端组件清单的 Schema 版本。两端不一致时直接报错," + "避免模型基于过期的积木清单编出注册表里不存在的组件", requiredMode = Schema.RequiredMode.REQUIRED, example = "1.1") @NotBlank(message = "Schema 版本不能为空") private String schemaVersion; @Schema(description = "可用组件积木清单,由前端从活注册表生成", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(message = "组件清单不能为空") private List catalog; @Schema(description = "用户补充说明,会拼进提示词帮助模型理解文档", example = "这是 IQC 来料检验报告") private String hint; }