package cn.iocoder.yudao.module.qcreport.controller.admin.instance; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateFromQcReqVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateFromQcRespVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateReqVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateRespVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstancePageReqVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstancePdfRespVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstancePreviewRespVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceRegenerateRespVO; import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceRespVO; import cn.iocoder.yudao.module.qcreport.dal.dataobject.instance.QcReportInstanceDO; import cn.iocoder.yudao.module.qcreport.engine.render.RenderOutcome; import cn.iocoder.yudao.module.qcreport.service.instance.GenerateFromQcResult; import cn.iocoder.yudao.module.qcreport.service.instance.GenerateResult; import cn.iocoder.yudao.module.qcreport.service.instance.PdfArchiveResult; import cn.iocoder.yudao.module.qcreport.service.instance.QcReportInstanceService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; /** * 智能质检报告实例 Controller。 *

* 这里是「模板 → 报告」的对外入口:预览只渲不存,出件才落库并冻结数据快照。 * 数据由调用方传入,本模块不认识任何业务单据。 */ @Tag(name = "管理后台 - 智能质检报告实例") @RestController @RequestMapping("/qc-report/instance") @Validated public class QcReportInstanceController { @Resource private QcReportInstanceService instanceService; @PostMapping("/preview") @Operation(summary = "预览报告(只渲染,不落库、不消耗报告编号)") @PreAuthorize("@ss.hasPermission('qc-report:instance:query')") public CommonResult preview(@Valid @RequestBody QcReportInstanceGenerateReqVO reqVO) { RenderOutcome outcome = instanceService.preview(reqVO); QcReportInstancePreviewRespVO respVO = new QcReportInstancePreviewRespVO(); respVO.setReportNo(outcome.context().getReport() == null ? null : outcome.context().getReport().getReportNo()); respVO.setHtml(outcome.html()); respVO.setErrors(outcome.errors()); return success(respVO); } @PostMapping("/generate") @Operation(summary = "出件:渲染 + 落库 + 冻结数据快照") @PreAuthorize("@ss.hasPermission('qc-report:instance:create')") public CommonResult generate( @Valid @RequestBody QcReportInstanceGenerateReqVO reqVO) { return success(toGenerateRespVO(instanceService.generate(reqVO))); } @PostMapping("/generate-from-qc") @Operation(summary = "由质检单生成报告(数据从 MES 取,模板由用户选择)") @PreAuthorize("@ss.hasPermission('qc-report:instance:generate')") public CommonResult generateFromQc( @Valid @RequestBody QcReportInstanceGenerateFromQcReqVO reqVO) { GenerateFromQcResult result = instanceService.generateFromQc(reqVO); QcReportInstanceGenerateFromQcRespVO respVO = new QcReportInstanceGenerateFromQcRespVO(); respVO.setId(result.instance().getId()); respVO.setReportNo(result.instance().getReportNo()); respVO.setTemplateVersion(result.instance().getTemplateVersion()); respVO.setItemCount(result.itemCount()); respVO.setUndecidableCount(result.undecidableCount()); respVO.setWarnings(result.warnings()); respVO.setErrors(result.errors()); return success(respVO); } @GetMapping("/get") @Operation(summary = "获得报告实例(含渲染产物 HTML,不含数据快照)") @Parameter(name = "id", description = "实例编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('qc-report:instance:query')") public CommonResult getInstance(@RequestParam("id") Long id) { QcReportInstanceDO instance = instanceService.getInstance(id); return success(BeanUtils.toBean(instance, QcReportInstanceRespVO.class)); } @GetMapping("/snapshot") @Operation(summary = "获得报告实例冻结的数据快照") @Parameter(name = "id", description = "实例编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('qc-report:instance:query')") public CommonResult> getSnapshot(@RequestParam("id") Long id) { return success(instanceService.getSnapshot(id)); } @GetMapping("/page") @Operation(summary = "获得报告实例分页") @PreAuthorize("@ss.hasPermission('qc-report:instance:query')") public CommonResult> getInstancePage( @Valid QcReportInstancePageReqVO pageReqVO) { PageResult pageResult = instanceService.getInstancePage(pageReqVO); return success(BeanUtils.toBean(pageResult, QcReportInstanceRespVO.class)); } @PostMapping("/regenerate") @Operation(summary = "重新生成报告(用冻结的数据快照 + 同一模板版本重渲,覆盖产物 HTML)") @Parameter(name = "id", description = "实例编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('qc-report:instance:create')") public CommonResult regenerate(@RequestParam("id") Long id) { GenerateResult result = instanceService.regenerate(id); QcReportInstanceRegenerateRespVO respVO = new QcReportInstanceRegenerateRespVO(); respVO.setId(result.instance().getId()); respVO.setReportNo(result.instance().getReportNo()); respVO.setErrors(result.errors()); return success(respVO); } @PostMapping("/pdf") @Operation(summary = "导出 PDF(打印实例已存的产物 HTML 并归档到附件库,可重复调用)") @Parameter(name = "id", description = "实例编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('qc-report:instance:export')") public CommonResult exportPdf(@RequestParam("id") Long id) { PdfArchiveResult result = instanceService.exportPdf(id); QcReportInstancePdfRespVO respVO = new QcReportInstancePdfRespVO(); respVO.setId(result.instanceId()); respVO.setReportNo(result.reportNo()); respVO.setFileName(result.fileName()); respVO.setByteSize(result.byteSize()); respVO.setBlobId(result.blobId()); respVO.setAttachmentId(result.attachmentId()); respVO.setPreviewURL(result.previewURL()); respVO.setDownloadURL(result.downloadURL()); respVO.setDurationMs(result.durationMs()); respVO.setPdfDurationMs(result.pdfDurationMs()); respVO.setBrowserStatus(result.browserStatus()); return success(respVO); } @DeleteMapping("/delete") @Operation(summary = "删除报告实例") @Parameter(name = "id", description = "实例编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('qc-report:instance:delete')") public CommonResult deleteInstance(@RequestParam("id") Long id) { instanceService.deleteInstance(id); return success(true); } private QcReportInstanceGenerateRespVO toGenerateRespVO(GenerateResult result) { QcReportInstanceDO instance = result.instance(); QcReportInstanceGenerateRespVO respVO = new QcReportInstanceGenerateRespVO(); respVO.setId(instance.getId()); respVO.setReportNo(instance.getReportNo()); respVO.setTemplateVersion(instance.getTemplateVersion()); respVO.setStatus(instance.getStatus()); respVO.setErrors(result.errors()); return respVO; } }