向量入库
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]