docs/project-business/data/flows.json
@@ -1,12 +1,12 @@
{
  "flows": [
    {"id": "sales", "name": "销售流程", "mermaid": "mermaid/02-sales-flow.mmd", "color": "#4f9cff",
     "summary": "线索转化客户 → 商机推进 → 报价(可AI识别) → 合同 BPM 审批 → 生成 ERP 销售订单并审批 → 需生产行自动建 MPS → 发货通知 → 销售出库(OQC)回写 → 开票(BPM) → 回款(先开票校验)。",
     "summary": "线索转化客户 → 商机推进 → 报价(可AI识别) → 合同 BPM 审批 → 生成 ERP 销售订单并审批(无关联合同时自动反向生成草稿合同) → 需生产行自动建 MPS → 发货通知 → 销售出库(OQC)回写 → 开票(BPM) → 回款(先开票校验)。",
     "steps": [
       {"stage": "获客", "action": "线索转化客户、建联系人、立项商机", "roles": ["销售内勤"]},
       {"stage": "报价", "action": "商机赢单后建报价单(AI OCR 预填),转合同", "roles": ["销售内勤"]},
       {"stage": "签约", "action": "合同来源:手工新建 / 报价单转入 / Excel 导入(一合同多产品明细行);提交 BPM 审批(可选流程定义),通过=20", "roles": ["销售", "审批人"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction 明细创建 MPS", "roles": ["销售", "计划员"]},
       {"stage": "接单", "action": "合同一键生成销售订单(XSDD),销售订单再走 BPM;审批通过自动为 needProduction 明细创建 MPS;订单无关联合同时按客户名称-销售合同-订单号自动生成 CRM 草稿合同(草稿不发起审批,负责人取销售员,同单只生成一份,生成失败不阻塞订单审批)", "roles": ["销售", "计划员"]},
       {"stage": "交付", "action": "发货通知审核(占用)→ 销售出库 OQC → 发运 → 出库回写部分/全部出库", "roles": ["仓管", "质检"]},
       {"stage": "回款", "action": "开票 BPM(累计≤合同额) → 回款强制先开票(累计≤合同剩余与开票剩余)", "roles": ["财务", "销售"]}]},
    {"id": "purchase", "name": "采购流程", "mermaid": "mermaid/03-purchase-flow.mmd", "color": "#5fc79e",
@@ -20,16 +20,17 @@
       {"stage": "退货", "action": "IQC 不合格退货→供应商退货出库(选料锁定到订单行);报废走 NCR", "roles": ["仓管"]},
       {"stage": "付款", "action": "采购来票(FPD, AI OCR, ≤订单总价) → 付款单(FKD 关联来票+附件, ≤来票金额) BPM 审批", "roles": ["财务", "审批人"]}]},
    {"id": "production", "name": "生产流程", "mermaid": "mermaid/04-production-flow.mmd", "color": "#e0b34f",
     "summary": "销售订单驱动 MPS → 下发工单 → 按工艺路线拆工序任务 → 领料/线边备料 → 报工(工序顺序硬校验+BPM) → 倒冲消耗/产出入库/IPQC → 末道工序回写进度 → 自动完工 → ProductionFinishedEvent 回写销售订单。",
     "summary": "销售订单驱动 MPS → 下发工单 → 按工艺路线拆工序任务 → 算料(产品BOM×工单数量·带单价/金额) → 领料/线边备料 → 报工(工序顺序硬校验+BPM) → 倒冲消耗/产出入库/IPQC → 审批后自动重算工单物料成本并对超耗物料站内信报警 → 末道工序回写进度 → 自动完工 → ProductionFinishedEvent 回写销售订单;MPS 成本按计划数量占工单数量分摊。",
     "steps": [
       {"stage": "计划", "action": "MPS 创建(手工或销售订单自动)→下发或合并下发为工单", "roles": ["计划员"]},
       {"stage": "派工", "action": "工单确认按工艺路线逐工序生成任务,可指派/暂停/取消", "roles": ["车间主任"]},
       {"stage": "备料", "action": "生产领料单出库或线边虚拟库备料", "roles": ["仓管"]},
       {"stage": "报工", "action": "提交报工:上一道工序未报满直接拦截;启用 BPM 走审批", "roles": ["操作工"]},
       {"stage": "联动", "action": "审批通过按工序标记: 倒冲→自动物料消耗扣线边库(允许负库存);质检→产出待检行等 IPQC;关键非检→直接产出入库", "roles": ["系统自动"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;MPS 累计判断完成并发事件给销售订单", "roles": ["系统自动"]}]},
       {"stage": "核算", "action": "算料:产品 BOM 单位用量×工单数量展开原材料(无产品BOM回退路线产出链/工单BOM),带需求数量/已消耗/单价/需求金额,价格取物料采购价否则取已审核采购订单加权均价,均无则金额为0并标记缺价;成本:报工审批后自动重算工单标准/实际/超耗物料成本与实际单位成本(实际消耗取倒冲消耗记录,已报工数量取工单产量与各工序审批报工累计的最大值);超耗阈值按 工单→产品→全局参数(默认5%) 取值,单料实际消耗>标准用量×(1+阈值%)即生成报警记录并按参数配置的接收人发站内信,同工单同物料仅报一次;MPS 成本按 MPS计划数量÷工单数量 分摊", "roles": ["系统自动", "计划员"]},
       {"stage": "完工", "action": "仅末道工序回写工单已生产数量,达标自动完成;人工完成要求已生产数量>0(为 0 拦截);完工前必须已登记留样记录(手工完成与自动完工一致,未登记拦截);完工时同步关联 MPS 为已完成并回写产量与完成日期,MPS 累计判断完成并发事件给销售订单", "roles": ["系统自动"]}]},
    {"id": "quality", "name": "质量流程", "mermaid": "mermaid/05-quality-flow.mmd", "color": "#e06c6c",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + 判定四果(合格/特采/退货/报废) + NCR 评审处置关闭;AI 提供判定建议;NCR 当前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES 取,五道校验后渲染落库)。",
     "summary": "四道检验闸口(IQC/IPQC/OQC/RQC,二态 0→4) + 判定四果(合格/特采/退货/报废) + NCR 评审处置关闭 + 完工留样登记;AI 提供判定建议;NCR 当前仅台账不触发返工单;检验单可由智能质检报告平台一键出件(generate-from-qc:数据从 MES 取,五道校验后渲染落库)。",
     "steps": [
       {"stage": "来料", "action": "到货通知/外协入库→IQC,结论回写推进待入库或触发退货", "roles": ["IQC 质检员"]},
       {"stage": "过程", "action": "报工质检工序产出行→IPQC,合格拆行入库、不合格生成 NCR", "roles": ["IPQC 质检员"]},
@@ -37,6 +38,7 @@
       {"stage": "退货", "action": "退料/销售退货/售后退货→RQC,结论回调单据与售后", "roles": ["RQC 质检员"]},
       {"stage": "导入", "action": "IQC/IPQC/OQC 三列表各支持 Excel 批量导入(按钮在「新增」与「导出」之间,纯新增不做更新覆盖):一行一张单,编号留空自动生成,质检方案留空按物料+检验类型自动匹配,检测人员留空取当前登录用户;物料/供应商/客户/工单/工位按编码或名称精确匹配(IPQC 物料由工单推导,模板不填),合格+不合格=检测/接收数量、IPQC 工废+料废+其他废品≤不合格、OQC 客户须在本人数据权限内;逐行导入部分成功,失败行进 failureList 带行号与可执行动作,成功单一律待检验0;同一批数据不可重复导入:文件内重复行与库内已存在同业务键单据(IQC 物料+供应商+供应商批次+来料日期、IPQC 生产工单+检验类型+工位+检测日期、OQC 物料+客户+批次号+出货日期)均拒该行,提示含维度、双方实际值与「先删除该单据再重试」动作", "roles": ["质检员", "IQC 质检员", "IPQC 质检员", "OQC 质检员"]},
       {"stage": "不合格", "action": "NCR: 待评审→评审→处置(退货/报废/返工/让步接收/降级)→关闭", "roles": ["质量工程师"]},
       {"stage": "留样", "action": "生产工单完工前必须登记留样记录(一张工单一条,编号 LY+日期+4位流水,留样数量默认 2 件,到期=留样日期+6个月);销售订单按 MPS 自动绑定、合并下发多单需指定、客户订单来源按来源单号校验、库存备货可不绑定,MPS 记录的销售订单在系统中不存在时提示并阻断保存;手工完成与报工达标自动完工均校验,未登记拦截;工单已完成不允许删除留样", "roles": ["质检员", "留样管理员"]},
       {"stage": "出件", "action": "两条出件入口:①通用 generate/preview(调用方自带上下文) 渲染 HTML 并冻结数据快照,编号 QR+日期+4位流水按天独立,preview 只渲染不落库不消耗编号,regenerate 用冻结快照重渲且数据与编号不变并作废已归档 PDF,导出 PDF 由后端调 Chromium 打印实例已存的 HTML 后归档附件中心;②generate-from-qc 由质检单直接出件(数据经 MesQcReportApi 从 MES 取,前端不拼上下文),出件前五道校验按业务优先级只报第一处:类型非法/单据不存在/未完成检验/未填判定/模板类型不符/无可用检验项,报告头另带单据原判定 qcResult+qcResultText 与引擎判定并存,响应回 undecidableCount 待判定项数与 warnings(分组标题跳过/指标已删/未录实测值/样品超3),同一张单据可反复出多份", "roles": ["质检员"]},
       {"stage": "建模板", "action": "AI 导入:上传既有检验报告文件(扫描件/照片、电子版 PDF、Word/Excel) → 识别成模板草稿(不落库) → 人工在设计器确认调整后保存为版本;.doc/.xls 旧格式不支持", "roles": ["质检员", "质量工程师"]}]},
    {"id": "warehouse", "name": "仓储流程", "mermaid": "mermaid/06-warehouse-flow.mmd", "color": "#7e6bd6",