flowchart TD
|
T1[到货通知单 或 外协入库单] --> A1[IQC 来料检验·草稿0→完成4]
|
T2[报工质检工序通过后产出行] --> A2[IPQC 过程检验·草稿0→完成4]
|
T3[销售出库单提交] --> A3[OQC 出货检验·草稿0→完成4]
|
T4[生产退料单 或 销售退货单 或 售后退货] --> A4[RQC 退货检验·草稿0→完成4]
|
A1 --> R{检验判定 MesQcCheckResultEnum}
|
A2 --> R
|
A3 --> R
|
A4 --> R
|
R -->|1 合格| Q1[允许入库·回写来源单据推进状态]
|
R -->|2 特采| Q2[允许入库·并生成NCR留痕]
|
R -->|3 不合格退货| Q3[生成NCR·走供应商退货或销售退货]
|
R -->|4 不合格报废| Q4[生成NCR·走报废出库]
|
A2 -->|合格数量| Q5[报工转完成·产出拆行入库]
|
A3 -->|完成| Q6[销售出库单推进待拣货]
|
A4 -->|完成| Q7[退货单推进上架或入库·售后回调结论]
|
N1[NCR 待评审0] -->|评审| N2[已评审6]
|
N2 -->|处置方式:退货1报废2返工3让步接收4降级使用5| N3[已处置7]
|
N3 -->|关闭| N4[已关闭8]
|
Q8[支撑数据:质检方案·检验指标·缺陷库·指标结果] --- A1
|
Q8H["检验指标的层级可在质检指标页维护·条目类型 所属分组 公式 排序号·只允许两层·删分组级联删子项"] --- Q8
|
A1 -->|出件 generate-from-qc| GATE{出件六道校验·按业务优先级只报第一处}
|
A2 -->|出件 generate-from-qc| GATE
|
A3 -->|出件 generate-from-qc| GATE
|
A4 -->|出件 generate-from-qc| GATE
|
GATE -->|000 类型非法| GE0[105_000 qcType 不在 1~4]
|
GATE -->|001 单据不存在| GE1[105_001]
|
GATE -->|002 未完成检验| GE2[105_002·带当前状态中文名]
|
GATE -->|003 未填判定| GE3[105_003·列出四个可选判定]
|
GATE -->|005 模板类型不符| GE5[105_005·两边类型中文名都给·前端按 reportType 预过滤]
|
GATE -->|006 无可用检验项| GE6[105_006]
|
GATE -->|通过·只允许同类型已发布模板| RP[智能质检报告平台 qcreport]
|
RP --> RPT[报告模板 qc_report_template·启用0停用1]
|
RPT --> RPTV[模板版本 qc_report_template_version·草稿0已发布1已停用2·当前版本不可停用 101_010]
|
RPTVSAVE[设计器保存 create 或 update] -->|写入侧闸门·规则101_006 与画布安全101_009 不合格一律不落库| RPTV
|
RPTVSAVE -.->|只卡新写入·存量脏画布不回溯核查| CVNOTE[画布校验覆盖三处注入面·tagName 属性名 整段CSS]
|
RPTV -->|按已发布版本渲染| RPI[报告实例 qc_report_instance·编号 QR+yyyyMMdd+4位流水·按天独立]
|
RPI --> SNAP[冻结 data_snapshot·判定后数据含 PASS FAIL 与合格率]
|
RPI --> RHTML[render_html 完整 HTML 文档·出站已剥离事件属性与危险协议]
|
RPI --> RREGEN[重新生成 regenerate·冻结快照+同一模板版本重渲·数据与编号不变·并作废已归档PDF]
|
RPI --> RPDF[导出PDF 后端调Chromium打印已存HTML·归档 system_storage_attachment·recordType=qc_report_instance]
|
RPI --> RUI[报告实例页 /qc/report-instance·菜单挂质量管理 parent_id=5500]
|
RUI -->|权限码| RPERM["qc-report:instance:query 查询·:export 导出PDF·:delete 删除·:create 通用出件·:generate 质检单出件(menu 1075416)"]
|
RUI -->|反查 businessType=mes_qc_iqc 等表名 + businessId| RBACK[同一张质检单可出多份报告·历史留痕需要·不做重复拦截]
|
RUI --> RPREVIEW[详情弹窗·iframe sandbox空属性渲染 render_html·数据快照页签展示冻结 data_snapshot]
|
A1 -.->|前端入口·行操作「出报告」仅 status=已完成可见| UIREP[出报告弹窗·IQC IPQC OQC RQC 四页共用]
|
A2 -.->|同上| UIREP
|
A3 -.->|同上| UIREP
|
A4 -.->|同上| UIREP
|
UIREP -->|只列 reportType 与本单一致·启用·当前版本已发布且画布非空·避免选中必被拒的组合| UIPICK[用户选模板]
|
UIPICK -->|POST generate-from-qc| GATE
|
UIREP -->|结果就地展示 reportNo itemCount| UIRES["undecidableCount>0 蓝色信息条(多为过程参数无判定规则·黄色会几乎每单误报)·warnings 与 errors 逐条展示·不落库事后看不到"]
|
UIRES -->|查看报告列表| RUI
|
RUI -->|路由 query 带入 businessType+businessId 并预填搜索| RBACK
|
GATE -->|MesQcReportApi.getQcReportData| MESMAP[MES 四层取数归一·单头 / 判定依据行 max min threshold / 样品 indicator_result / 实测值 result_detail]
|
MESMAP --> RCTX[报告上下文 report+inspectionItems·由后端映射器产出·前端不再自己拼]
|
RCTX --> RCITEM[检验项=样品×指标交叉展开·全指标进不过滤·多样品时样品号折进 remark]
|
RCTX --> RCQC[携带单据原判定 qcResult 数·qcResultText 中文·与引擎判定并存互不覆盖]
|
MESMAP -->|分组项 item_type=2 与它的子项按 parent_id 还原两层·归属不看 type 也不看行序| RCTXG
|
RCTXG["分组还原·组头行背组名与 formula_text 公式·组内第一行背 span=该组总行数·同组其余行 span=1 且 hidden 让位·合并的是模板 columns 里带 # 的那一列(默认列即检验项目)·合并行数是本单该组实际行数而非主数据子项数·该组本单无子项行则不合并"] --- RCTX
|
MESMAP -.->|分组项本单没有属于它的子项 / 组头本单没有行由后端补一行| RCWARN
|
MESMAP -.->|指标已删 / 未录实测值(组头锚点行按定义无值·不报) / 样品超 3 个·进 warnings| RCWARN
|
RCWARN[warnings 软提示·不落库·事后看不到需自行留痕] --- RCTX
|
RCITEM --- RCTX
|
RCQC --- RCTX
|
RCTX --> RPI
|
RCTX --> RUNDEC["undecidableCount 没有判定结论的项数=快照里 result 为空串的项·含无判定规则与待判定两种·不计入合格率分母与报告结论·生成时弹提示不回填"]
|
RPT -->|进入设计器并带 templateId·权限 qc-report:template:ai-import| AIIMP[AI导入 qc-report/ai-import/draft]
|
AISRC["源文件 扫描件照片·电子版PDF·Word(.docx) Excel(.xlsx)·txt csv"] -->|上传走 system Storage API 取 blobId·绑为 qc_report_template 附件| AIIMP
|
AISRC -.->|同一模板重复导入按替换处理·先删旧附件再绑新的·连同 blob 行与磁盘文件一起清| AIIMP
|
AISRC -.->|docx 的 Word 页眉页脚读取并以 页眉 页脚 标记并入识别内容·页眉在正文前页脚在正文后·同时进 warnings·扫描件照片不受影响| AIIMP
|
AIIMP -->|识别·只产草稿不落库| AIRD[模板草稿 扁平组件+属性清单]
|
AIHINT[积木清单每项带 hint 选型说明·来自前端注册表 aiHint·组件选型的唯一真相来源] -.->|选型以 hint 为准·有专门组件就不退用通用组件凑数| AIIMP
|
AIIMP -->|表格末行的落款签署行属落款不属数据行·与原件页脚合并且人名日期留空手填·不得自造绑定键| AIRD
|
AIIMP -.->|原件列比默认多或表头分两层或样品字段不同时·写进组件的 columns headerSpans fields 三个文本属性覆盖·不换组件| AIRD
|
AIKEY[报告可绑定键白名单·由后端 ReportFields 反射生成·不手写] -.->|只禁编造不给可选集合模型只能猜·故全量枚举| AIIMP
|
AIRD -->|人工在设计器确认·装配器编译进画布后保存| RPTV
|
AIRD -.->|画布上的 ReportHeader ReportFooter 是正文里的抬头落款·与 PDF 每页重复的版式页眉页脚不是一回事| RPTV
|
AIIMP -.->|表头某列自己既是列名又是上格·原件里是一格纵向合并跨住上下两层、下层那格在提取文本里写着↑同上| AIRD
|
AIIMP -.->|该段标题与列名一字不差才认成纵向合并格、出 rowspan=2 一格且下层跳过该列·不一致就被当成另一层分组标题、结论二字上下各印一遍| AIRD
|
RPTVSAVE -.->|设计器画布不跑绑定·组名格的 hidden 占位符会被浏览器当成真 hidden 让整行左移、末列挤成竖排细条| CVNOTE
|
RPTVSAVE -.->|自定列不带宽度声明·列宽只能由最小内容宽度倒推·而值是占位符这类不含空格的长串·整表会被撑出纸张、末列挤成竖条| CVWIDTH
|
CVWIDTH["故自定列的单元格带 overflow-wrap:anywhere 允许长串折行·默认列有手工宽度声明不加·实测加了反而把检验项目子项挤到 30 余像素、行高翻几倍"] --- RPTVSAVE
|