flowchart TD
A[插件系统触发<br/>AI数据入库]
--> B[读取 config.json]
B --> C[main = gemain.py]
C --> D[GEMain frame]
D --> E[frame.get_app_option<br/>读取AI配置]
E --> F[frame.get_case_id<br/>读取案件ID cid]
F --> G[frame.get_evidence_id<br/>读取检材ID eid]
G --> H[asyncio.run<br/>parse_with_ges]
H --> I[初始化 Settings]
I --> J[写入案件配置<br/>cid / eids / backend_base_url]
J --> K[写入 Embedding 配置<br/>base_url / api_key / model / dimension]
K --> L[写入 Qdrant 配置<br/>host / port / api_key / collection]
L --> M[设置 tree.pkl 路径<br/>res/vector_search/tree.pkl]
M --> N[读取任务参数<br/>frame.getTaskParams]
N --> O{是否 really=true}
O -- 是 --> P[进入重新入库模式<br/>reimport=true]
O -- 否 --> Q[读取历史任务结果<br/>frame.get_task_result]
Q --> R{Embedding模型是否变化}
R -- 是 --> P
R -- 否 --> S[进入增量入库模式<br/>读取 DoneNodeTids]
P --> T[settings.tids = 空列表]
S --> U[settings.tids = 已完成TID列表]
T --> V[创建 VectorizationPipelineRunner]
U --> V
V --> W[runner.initialize]
W --> X[初始化 EmbeddingClient]
X --> Y[测试 Embedding 服务]
Y --> Z{Embedding服务是否可用}
Z -- 否 --> ZA[frame.update_status failed<br/>任务失败返回]
Z -- 是 --> ZB[初始化 QdrantStorage]
ZB --> ZC[初始化 VectorizationPipeline]
ZC --> ZD[runner.run]
ZD --> ZE[run_full_pipeline]
ZE --> ZF[完成后更新任务结果<br/>frame.update_result]
flowchart TD
A[run_full_pipeline]
--> B[构建虚拟树 Tree.build]
B --> C[保存 tree.pkl]
C --> D[遍历叶子节点 travel_leaves]
D --> E[初始化 Qdrant collection]
E --> F{是否重新入库}
F -- 是 --> G[清空 Qdrant collection]
F -- 否 --> H[保留已有 Qdrant 数据]
G --> I[创建 DocumentGenerator]
H --> I
I --> J[开始处理数据流]
J --> K[DataFetcher 批量读取叶子节点数据]
K --> L[并发处理每个叶子节点]
L --> M[生成 Document 文档]
M --> N[调用 Embedding 服务生成向量]
N --> O[缓存 documents + vectors]
O --> P{批次达到 batch_size?}
P -- 是 --> Q[写入 Qdrant]
P -- 否 --> R[继续处理下一个批次]
Q --> R
R --> S{所有叶子节点完成?}
S -- 否 --> K
S -- 是 --> T[写入剩余批次]
T --> U[记录统计信息]
U --> V[返回 PipelineStats]
flowchart TD
A[Tree.build]
--> B[_initialize_tree]
B --> C[获取检材信息<br/>/internal/v1/evidence/cid]
C --> D[从根节点开始 BFS]
D --> E[获取业务数据节点<br/>/api/v1/data/node]
E --> F[插入检材层<br/>insert_evidence_layer]
F --> G[插入文件系统层<br/>insert_filesystem]
G --> H[插入位置信息层<br/>insert_location]
H --> I[移除文件系统冗余层]
I --> J[初始化实体映射器<br/>EntityMapper]
J --> K[返回被屏蔽节点TID]