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
flowchart LR
  subgraph S1 [销售前端 CRM]
    CL[线索] --> CU[客户]
    CU --> BU[商机]
    BU --> QU[报价单]
    QU --> CT[合同]
    CT --> IV[开票]
    IV --> RK[回款]
    CT --> PL[回款计划]
  end
  subgraph S2 [执行链 ERP+MES]
    SO[销售订单] --> MP[MPS]
    MP --> WO[工单]
    WO --> TK[任务]
    TK --> FB[报工]
    FB --> PP[产品产出]
    PR[采购申请] --> PO[采购订单]
    PO --> AN[到货通知]
    AN --> IR[采购入库]
  end
  subgraph S3 [仓储与财务]
    ST[库存台账]
    PS[销售出库]
    RC[收款单]
    PI[采购来票] --> PA[付款单]
  end
  CT -->|generateSaleOrder 带入客户产品折扣定金·回写orderId| SO
  SO -->|审批通过带入 saleOrderId 行ID 数量 客户 交期| MP
  PO -->|确认收货带入订单行物料供应商数量| AN
  AN -->|IQC完成后生成·带入合格行| IR
  FB -->|BOM倒冲扣减| ST
  PP -->|IN事务入库| ST
  IR -->|IN事务入库·回写inCount| PO
  PS -->|OUT事务出库·回写outCount| SO
  FB -->|最后一道工序回写已生产数量| WO
  FB -->|ProductionFinishedEvent 回写生产状态| SO
  IV -->|回款强制先开票| RK
  RC -->|关联CRM客户校验| CU
  PA -->|关联来票与供应商| PI
  subgraph S4 [智能质检报告 qcreport]
    RPT[报告模板] --> RPTV[模板版本]
    RPTVSAVE[设计器保存 create 或 update] -->|写入侧闸门 规则101_006 画布安全101_009 不合格不落库| RPTV
    RPTVSAVE -.->|只卡新写入 存量脏画布不回溯核查| CVNOTE[画布校验覆盖 tagName 属性名 整段CSS 三处注入面]
    RPTV --> RPI[报告实例]
    RPI --> SNAP[数据快照冻结]
    RPI --> RHTML[HTML 渲染产物]
    RPI --> RPDF[PDF 产物]
    AISRC[源文件 扫描件照片·电子版PDF·Word Excel·txt csv] -->|上传走 system Storage API 取 blobId 并绑为模板附件| AIRD[AI 识别草稿]
    AIRD -->|人工在设计器确认后保存| RPTV
  end
  QCDOC[质检单 IQC IPQC OQC RQC] -->|generate-from-qc·带 qcType qcId templateId| QCGATE{五道校验 类型 存在 已完成 已判定 模板类型 有检验项}
  QCGATE -->|任一不过·按业务优先级只报第一处| QCERR[105_000~105_006]
  QCGATE -->|通过| MESQCAPI[MesQcReportApi 四层取数·单头 判定依据行 样品 实测值]
  MESQCAPI -->|纯函数映射器归一 含原判定 qcResult qcResultText| RPI
  MESQCAPI -.->|分组标题跳过 指标已删 未录实测值 样品超3| QCWARN[warnings 软提示·不落库]
  QCWARN -.-> RPI
  RPI -.->|undecidableCount=快照 result 为空串的项·生成时弹提示| QCFE
  RPI -.->|businessType=mes_qc_iqc 等表名 + businessId 反查·一单可出多份| QCFE
  RPT -.->|report_type 数字字符串须等于 qcType·前端据此过滤模板列表| QCGATE
  RPTV -->|模板停用后不再出新件·历史实例不受影响·当前版本不可停用 101_010| RPI
  RPT -->|进入设计器带 templateId 调 AI 导入| AIRD
  RPI -->|列表 详情 预览 打印| QCFE["前端报告页面 /qc/report-instance 已落地·iframe 渲染 render_html + 快照页签 + 导出PDF"]
  RPDF -->|归档 附件中心 recordType=qc_report_instance| PDFARCH[system_storage_attachment]
  AISRC -.->|归属 附件中心 recordType=qc_report_template| PDFARCH
  AISRC -.->|同一模板重复导入按替换处理·先删旧附件·连同 blob 行与磁盘文件一起清| PDFARCH
  QCFE -.->|权限码 qc-report:instance:query/export/delete/create 已入 system_menu| SYS1[system_menu]
  QCGATE -.->|权限码 qc-report:instance:generate 已入 system_menu id=1075416| SYS1[system_menu]
  QCDOC -.->|前端入口 行操作「出报告」仅 status=已完成可见·四页共用同一弹窗| UIREP[出报告弹窗·只列同类型 启用 且有生效版本的模板]
  UIREP -->|选模板后 POST generate-from-qc| QCGATE
  UIREP -.->|结果就地展示 reportNo itemCount 与 undecidableCount 告警| QCFE
  QCFE -.->|进入时带 businessType+businessId 路由 query·预填搜索表单的「业务单据」字段| UIREP
  RPT -.->|权限码 qc-report:template:ai-import 已入 system_menu| SYS1
  subgraph S5 [独立财务报销 finance]
    RBM[报销单 finance_reimbursement] --> RBI[报销明细 finance_reimbursement_item]
    RBM --> RBA[发票附件 recordType=finance_reimbursement]
    RBM --> RBS[状态 草稿0 审批中15 已通过20 已驳回35 已归档40]
  end
  RBM -->|create 带主表与 items 数组与 blobIds 一次性提交| RBI
  RBI -.->|invoiceAmount 求和回填 totalAmount·用户可手改·后端不校验一致性| RBM
  RBM -->|submit 带 id 与 processDefinitionKey 走 query| RBS
  RBS -.->|BPM 监听器结果回写 通过20 驳回35 取消退回0| RBM
  RBA -.->|上传与保存分离·禁在业务表存文件地址| PDFARCH
  FINNOTE[独立模块·销售采购链条任意单据均不生成报销单·报销单亦不回写任何外部单据·唯一例外是课题经费拨付] -.-> RBM
  subgraph S6 [独立课题管理 research]
    RGL[课题指南 research_guideline] --> RAP[课题申报书 research_application]
    RAP --> RRV[专家评审明细 research_topic_review]
    RAP --> RFR[经费拨付记录 research_fund_record]
    RAP --> RST[状态 草稿0 审批中15 已立项20 已驳回35]
  end
  UMSM[会员 ums_member] -->|"选会员带出 applicantName workUnit jobTitle contactPhone contactEmail·软关联无外键"| RAP
  RGL -->|"申报时引用·要求 publishStatus=已发布20 且 现在在 applyStartTime 至 applyEndTime 内"| RAP
  RAP -->|"category 冗余自指南·不信任前端传值"| RAP
  RAP -->|"submit 带 id 与 processDefinitionKey 走 query·回写 processInstanceId"| RST
  RST -.->|"BPM 监听器 ResearchApplicationStatusListener 回写 通过20 驳回35 取消退回0"| RAP
  RAP -->|"审批通过后 approveApplication 生成 researchNo LX 与 approveTime·已有编号幂等跳过"| RAP
  RRV -->|"recalculate: compositeScore 加权 0.3/0.3/0.2/0.2 → ranking 降序重排 → 主单 reviewAvgScore 与 reviewPass"| RAP
  RRV -.->|"明细删空时主单汇总清为 null"| RAP
  RAP -->|"publishNotice 生成 system_notice 公告并回写 noticeId·重复发布拦截"| SYS2[system_notice 系统公告]
  RFR -->|"金额校验 已登记 + 本次 不得超出 budgetAmount 申请经费"| RAP
  RFR -.->|"凭证走附件中心 recordType=research_fund_record·同一批 blob 双绑 finance_reimbursement·表内不存文件地址"| PDFARCH
  RAP -.->|"申报附件 recordType=research_application"| PDFARCH
  RGL -.->|"指南附件 recordType=research_guideline"| PDFARCH
  RFR -->|"1:1 生成报销单·经 FinanceReimbursementApi 本地 Bean 建单并立即 submit·回写 reimbursement_id/reimbursement_no·台账置 15 报销审批中"| RBM
  RBM -->|"报销单进入同一条 BPM 流程 finance_reimbursement_approve(财务审核 → 财务主管审批)·businessKey=报销单 ID"| RBS
  RBS -.->|"BPM 监听器 ResearchFundStatusListener 回写课题台账 通过20 驳回30(+驳回原因/时间) 撤回0"| RFR
  RESNOTE[一期已对接财务·课题台账为拨款台账·报销单为财务出账凭证·两边以 reimbursement_id 软关联无外键·财务侧直接删单会留下悬空 ID 由业务报错兜底] -.-> RFR
  subgraph S7 [独立档案管理 archive]
    ACD[档案分类 archive_category 树形] --> ADO[档案 archive_document]
    ADO --> ABR[借阅单 archive_borrow]
    ADO --> AST[档案状态 10在库 20借出中]
    ABR --> ABS[借阅状态 0草稿 15审批中 20借出中 30已归还 35已驳回]
  end
  ACD -->|"新建档案按分类带出 default_secret_level 默认密级·财务分类=3 保密"| ADO
  ADO -.->|"电子附件 recordType=archive_document·表内不存文件地址"| PDFARCH
  ADO -->|"档案编号 DA + yyyyMMdd + 6位流水(Redis·每日重置)·借阅单号 JY + 同日流水"| ADO
  RAP -->|"手动「归档」经 yudao-module-archive-api.archiveBySource(sourceType=2·密级 2内部·sourceNo=立项编号·blobIds=申报书附件)·幂等"| ADO
  UMSM -->|"手动「归档」(sourceType=3·密级 2内部·sourceNo=会员编号·blobIds=会员材料)"| ADO
  RBM -->|"既有 archive 归档同事务叠加 archiveBySource(sourceType=4·密级 3保密·sourceNo=报销单号·blobIds=发票附件)·报销单 20→40 与生成档案两表并写"| ADO
  ADO -->|"回写来源表 archive_document_id 作为已归档硬标记·来源侧重复点归档按其错误码拦截并给出已生成档案编号"| RAP
  ADO -->|"回写 archive_document_id"| RBM
  ABR -->|"submit 前校验: 同一档案不得已有 审批中 15 或 借出中 20 的借阅单·命中报已借用(带档案名与已存在借阅单号)"| ABS
  ABS -.->|"BPM 监听器 ArchiveBorrowStatusListener 回写 通过20 驳回35 取消退回0"| ABR
  ABS -->|"业务动作: 归还登记 仅放行 20 借出中 → 30 已归还·回写 returnTime 与归还确认人"| ABR
  ABR -->|"审批通过条件更新 archive_document SET status=20 WHERE status=10·归还条件更新回 10·影响 0 行即报冲突并回滚"| AST
  ABR -.->|"逾期不落库·查询时实时计算 status=20 且 return_deadline 早于今天·overdue-page 为独立入口非查询参数"| ABS
  ADO -.->|"密级=3 保密 且无 archive:document:sensitive 时·详情报错·列表与导出强制过滤 secret_level 不等于 3"| SEC3[权限点 archive:document:sensitive]
  ARCNOTE[独立模块·三方归档为列表页手动按钮而非事件驱动·归档只生成档案不回写来源单据业务状态(财务侧 20→40 是既有逻辑·本模块仅叠加)] -.-> ADO