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 接口。 *
* 这里是「模板 → 报告」的出件链路:取已发布版本 → 渲染 → 落库并冻结数据快照。 * 数据由调用方传进来,本模块不认识任何业务单据(MES 质检单的归一化由 MES 侧提供)。 */ public interface QcReportInstanceService { /** * 预览:只渲染,不落库、不生成编号。 * * @param reqVO 出件入参 * @return 渲染产物;报告编号取入参里带过来的那个,没带则为空 */ RenderOutcome preview(QcReportInstanceGenerateReqVO reqVO); /** * 出件:渲染 + 落库 + 冻结数据快照。 * * @param reqVO 出件入参 * @return 报告实例与数据缺口清单 */ GenerateResult generate(QcReportInstanceGenerateReqVO reqVO); /** * 由质检单出件:从 MES 取质检单数据 → 映射成报告上下文 → 走既有的出件流程。 *
* 刻意不新开一条落库路径:内部就是调 {@link #generate},于是版本发布校验、 * 编号生成与撞号重试、数据快照冻结、判定引擎全部照旧生效,一条都没绕开。 *
* 出件前的校验按业务优先级只报第一处:类型不合法 → 单据不存在 → 未完成 → 未判定 → * 模板类型不符 → 没有可用检验项。一次抛多条会让用户抓不住重点。 * * @param reqVO 质检单 + 模板选择 * @return 报告实例与本次出件的提示信息 */ GenerateFromQcResult generateFromQc(QcReportInstanceGenerateFromQcReqVO reqVO); /** * 重新生成:用实例里冻结的数据快照与同一模板版本重渲,覆盖产物 HTML。 *
* 快照与报告编号都不变。重新生成的是「排版」,不是「数据」——数据以快照为准, * 业务系统里的数据后来怎么变都不会影响这份历史报告。 *
* 已归档的 PDF 会被一并作废:产物 HTML 换了,再留着旧 PDF 就是「页面是新排版、 * 下载到的是旧文件」的静默不一致。宁可让产物消失(随时可再导一次),也不留这种错配。 * * @param id 实例编号 * @return 报告实例与数据缺口清单 */ GenerateResult regenerate(Long id); /** * 导出 PDF:把实例里**已存的**渲染产物 HTML 交给 Chromium 打印,并归档到附件库。 *
* 刻意不重渲:设计器/详情页看到的 HTML 与 PDF 必须出自同一份字节, * 否则就会出现「页面上好好的、打出来变形」这类对不上账的问题。要换排版请先「重新生成」。 *
* 归档走 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