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