云
2026-09-29 f87ce86307056f63f79312178037cc8714eb2b13
docs/project-business/mermaid/09-data-flow.mmd
@@ -104,3 +104,24 @@
  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