Files
contracts/history/block-diagram.md
T

2.1 KiB

Блок-схема сервиса Contracts

Полный пайплайн обработки допника

flowchart TD
    A["📄 POST /api/contracts/{id}/supplements\n(file.docx)"] --> B["💾 documents.original_bytes\n(status=uploaded)"]
    B --> C["🔧 parser.parse()\nbytes → elements JSON"]
    C --> D["📝 textify.to_text()\nelements → линейный текст"]
    D --> E["📄 documents.parsed_text\n(status=parsed)"]
    E --> F["🤖 extractor.extract()\nтекст → LLM → строки JSON"]
    F --> G["📊 spec_rows\n(row_num, name, price, qty, sum, date)"]
    G --> H["🔄 differ.diff()\nсравнение с пред. допником"]
    H --> I["📋 spec_history\n(added/changed/deleted/unchanged)"]
    I --> J["✅ ответ API\n{rows, diff_summary}"]

Архитектура слоёв

flowchart LR
    subgraph "Внешний мир"
        USER["👤 Пользователь"]
    end

    subgraph "Flask"
        APP["app.py\nсборка"]
        API["api.py\n/contracts"]
        UPL["upload.py\n/upload"]
        TEST["test_routes.py\n/test"]
    end

    subgraph "Бизнес-логика"
        PARSER["parser.py\nbytes→JSON"]
        TEXTIFY["textify.py\nJSON→текст"]
        LLM["llm_client.py\nHTTP/2→LLM"]
        EXTRACT["extractor.py\nтекст→строки"]
        DIFF["differ.py\nсравнение"]
    end

    subgraph "Данные"
        DB["db.py\nconnect/query"]
        SCH["schema.py\nDDL"]
        PG[("PostgreSQL\n5 таблиц")]
    end

    USER -->|"POST docx"| API
    USER -->|"GET /test"| TEST
    API --> PARSER
    PARSER --> TEXTIFY
    TEXTIFY --> EXTRACT
    EXTRACT --> LLM
    EXTRACT --> DIFF
    API --> DB
    DB --> PG
    APP --> SCH
    SCH --> DB

Цепочка данных

flowchart LR
    A["docx\n(байты)"] -->|parser| B["elements\nJSON"]
    B -->|textify| C["текст\nстрока"]
    C -->|extractor + LLM| D["spec_rows\nJSON"]
    D -->|differ| E["changes\nJSON"]
    E -->|api| F["ответ\nпользователю"]