6 小时以前 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
package cn.iocoder.yudao.module.qcreport.service.instance;
 
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateFromQcReqVO;
import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstanceGenerateReqVO;
import cn.iocoder.yudao.module.qcreport.controller.admin.instance.vo.QcReportInstancePageReqVO;
import cn.iocoder.yudao.module.qcreport.dal.dataobject.instance.QcReportInstanceDO;
import cn.iocoder.yudao.module.qcreport.engine.render.RenderOutcome;
 
import java.util.Map;
 
/**
 * 智能质检报告实例 Service 接口。
 * <p>
 * 这里是「模板 → 报告」的出件链路:取已发布版本 → 渲染 → 落库并冻结数据快照。
 * 数据由调用方传进来,本模块不认识任何业务单据(MES 质检单的归一化由 MES 侧提供)。
 */
public interface QcReportInstanceService {
 
    /**
     * 预览:只渲染,不落库、不生成编号。
     *
     * @param reqVO 出件入参
     * @return 渲染产物;报告编号取入参里带过来的那个,没带则为空
     */
    RenderOutcome preview(QcReportInstanceGenerateReqVO reqVO);
 
    /**
     * 出件:渲染 + 落库 + 冻结数据快照。
     *
     * @param reqVO 出件入参
     * @return 报告实例与数据缺口清单
     */
    GenerateResult generate(QcReportInstanceGenerateReqVO reqVO);
 
    /**
     * 由质检单出件:从 MES 取质检单数据 → 映射成报告上下文 → 走既有的出件流程。
     * <p>
     * 刻意不新开一条落库路径:内部就是调 {@link #generate},于是版本发布校验、
     * 编号生成与撞号重试、数据快照冻结、判定引擎全部照旧生效,一条都没绕开。
     * <p>
     * 出件前的校验按业务优先级只报第一处:类型不合法 → 单据不存在 → 未完成 → 未判定 →
     * 模板类型不符 → 没有可用检验项。一次抛多条会让用户抓不住重点。
     *
     * @param reqVO 质检单 + 模板选择
     * @return 报告实例与本次出件的提示信息
     */
    GenerateFromQcResult generateFromQc(QcReportInstanceGenerateFromQcReqVO reqVO);
 
    /**
     * 重新生成:用实例里冻结的数据快照与同一模板版本重渲,覆盖产物 HTML。
     * <p>
     * 快照与报告编号都不变。重新生成的是「排版」,不是「数据」——数据以快照为准,
     * 业务系统里的数据后来怎么变都不会影响这份历史报告。
     * <p>
     * <b>已归档的 PDF 会被一并作废</b>:产物 HTML 换了,再留着旧 PDF 就是「页面是新排版、
     * 下载到的是旧文件」的静默不一致。宁可让产物消失(随时可再导一次),也不留这种错配。
     *
     * @param id 实例编号
     * @return 报告实例与数据缺口清单
     */
    GenerateResult regenerate(Long id);
 
    /**
     * 导出 PDF:把实例里**已存的**渲染产物 HTML 交给 Chromium 打印,并归档到附件库。
     * <p>
     * 刻意不重渲:设计器/详情页看到的 HTML 与 PDF 必须出自同一份字节,
     * 否则就会出现「页面上好好的、打出来变形」这类对不上账的问题。要换排版请先「重新生成」。
     * <p>
     * 归档走 system 模块的附件中间表({@code recordType = qc_report_instance}),
     * 因此「这份报告有没有 PDF、去哪儿下载」用标准的附件列表接口即可查到。
     *
     * @param id 实例编号
     * @return 归档后的 PDF 信息与耗时
     */
    PdfArchiveResult exportPdf(Long id);
 
    /**
     * 校验实例存在,并返回
     *
     * @param id 实例编号
     * @return 报告实例
     */
    QcReportInstanceDO validateInstanceExists(Long id);
 
    /**
     * 获得报告实例
     *
     * @param id 实例编号
     * @return 报告实例
     */
    QcReportInstanceDO getInstance(Long id);
 
    /**
     * 获得实例冻结的数据快照
     *
     * @param id 实例编号
     * @return 数据快照,形如 {@code {report, inspectionItems}}
     */
    Map<String, Object> getSnapshot(Long id);
 
    /**
     * 获得报告实例分页
     *
     * @param pageReqVO 分页查询
     * @return 实例分页
     */
    PageResult<QcReportInstanceDO> getInstancePage(QcReportInstancePageReqVO pageReqVO);
 
    /**
     * 删除报告实例。已归档的 PDF 一并清理,不留下查不到主人的文件与附件记录。
     *
     * @param id 实例编号
     */
    void deleteInstance(Long id);
 
}