9 小时以前 9bad721754fe8bbe2e5f459d0706e0fefac569f3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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。
 * <p>
 * 这里是「模板 → 报告」的对外入口:预览只渲不存,出件才落库并冻结数据快照。
 * 数据由调用方传入,本模块不认识任何业务单据。
 */
@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<QcReportInstancePreviewRespVO> 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<QcReportInstanceGenerateRespVO> 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<QcReportInstanceGenerateFromQcRespVO> 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<QcReportInstanceRespVO> 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<Map<String, Object>> getSnapshot(@RequestParam("id") Long id) {
        return success(instanceService.getSnapshot(id));
    }
 
    @GetMapping("/page")
    @Operation(summary = "获得报告实例分页")
    @PreAuthorize("@ss.hasPermission('qc-report:instance:query')")
    public CommonResult<PageResult<QcReportInstanceRespVO>> getInstancePage(
            @Valid QcReportInstancePageReqVO pageReqVO) {
        PageResult<QcReportInstanceDO> 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<QcReportInstanceRegenerateRespVO> 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<QcReportInstancePdfRespVO> 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<Boolean> 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;
    }
 
}