From 4255abeb666dfae84645e5870f8a18197fd9b9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=9B=E8=82=AF=E6=99=AE=E9=80=9A?= Date: Sat, 31 Jan 2026 20:07:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20=E7=AB=AF=E5=88=B0?= =?UTF-8?q?=E7=AB=AF=E4=B8=BB=E6=B5=81=E7=A8=8B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 端到端主流程.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 端到端主流程.md diff --git a/端到端主流程.md b/端到端主流程.md new file mode 100644 index 0000000..4ac11dc --- /dev/null +++ b/端到端主流程.md @@ -0,0 +1,67 @@ +sequenceDiagram +autonumber +actor Admin as Admin(管理员) +participant UI as 前端UI +participant API as 后端API(服务) +participant PG_Task as PostgreSQL(kg_task) +participant Ext as 外部抽取服务 +participant PG_M as PostgreSQL(kg_entity_mention/kg_relation_mention) +participant PG_Cand as PostgreSQL(kg_*_candidate) +participant PG_Conf as PostgreSQL(kg_*_confirm) +participant Audit as PostgreSQL(audit_log) +participant SyncW as 同步Worker +participant Neo4j as Neo4j(投影) + +Note over Admin,PG_Task: 任务创建与门禁(3.1.3.1 / 3.1.3.1.1) +Admin->>UI: 配置任务Schema(ext_entity_codes / ext_relation_codes) +UI->>API: 提交创建任务请求(创建门禁检查) +API->>PG_Task: 创建kg_task(status=created,持久化tenant上下文) +API-->>UI: 返回task信息(external_task_id在触发抽取时获取) + +Note over API,Ext: 任务运行期(status: running → finished/failed) +API->>Ext: 触发抽取(外部异步执行,分配external_task_id) +Ext-->>PG_Task: 任务状态更新(running → finished/failed)(由系统对接,P0仅约束状态口径) + +Note over Ext,API: 抽取结果回调(5.1 回调/导入) +Ext->>API: POST /api/callback/extract(external_task_id, records...) +API->>PG_Task: 基于external_task_id反查kg_task(仅接受status=finished) +API->>PG_Task: 行级锁/门禁(单消费者/重复通知幂等处理) +API->>PG_M: 同事务写入Mention +activate API +API->>API: Schema白名单裁决 + Task生命周期过滤\n→ mention.status=active/invalid(3.2.4) +API->>Audit: 写审计(filtered_by_schema / callback_*) +deactivate API +API-->>Ext: 回调处理结果(成功/冲突) + +Note over Admin,PG_Cand: 候选生成(3.3 / 5.3) +Admin->>UI: 在任务详情发起“由mentions生成candidate” +UI->>API: POST /api/candidates/from-mentions +API->>PG_M: 仅读取status=active 且 task非revoking/revoked 的mentions\n(统一可见性过滤 2.11) +API->>PG_Cand: 单事务聚合去重 + 规范化 + 决策canonical\n→ candidate.status=pending(3.3.4) +API-->>UI: 返回候选数据 + +Note over Admin,PG_Conf: 审核确认至Confirm(3.4 / 5.3) +Admin->>UI: 在候选审核页选择通过(approve) +UI->>API: POST /api/candidates/{id}/approve +API->>PG_Conf: Confirm Upsert(复合键/UID)→ status=CONFIRMED\n统一置 sync_status='PENDING'(3.4/4.3) +API->>PG_Cand: 将被锁定的候选设为locked(locked_by_confirm=true) +API->>Audit: 写审计(review.accept / merge 等) +API-->>UI: 返回审核结果 + +Note over Admin,PG_Conf: 发布(6.1 / 5.4) +Admin->>UI: 发起发布(publish) +UI->>API: POST /api/publish?task_id=...(影响预估/阻断策略) +API->>PG_Conf: 事务内将相关Confirm置 status=PUBLISHED\n统一置 sync_status='PENDING' +API->>Audit: 写审计(publish) +API-->>UI: 返回发布受理结果 + +Note over SyncW,Neo4j: 同步器执行(4.3 指令集) +SyncW->>PG_Conf: 扫描 sync_status IN ('PENDING','FAILED') +SyncW->>PG_Conf: 原子置 SYNCING(加锁避免并发) +alt status=PUBLISHED + SyncW->>Neo4j: 幂等MERGE/SET(节点/关系及属性) +else status=ROLLED_BACK + SyncW->>Neo4j: 物理删除(DETACH DELETE) +end +SyncW->>PG_Conf: 写回 sync_status='SYNCED' 或 'FAILED' +SyncW->>Audit: 写审计(action='sync',记录结果) \ No newline at end of file