70 lines
2.1 KiB
Markdown
70 lines
2.1 KiB
Markdown
# Блок-схема сервиса Contracts
|
|
|
|
## Полный пайплайн обработки допника
|
|
|
|
```mermaid
|
|
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}"]
|
|
```
|
|
|
|
## Архитектура слоёв
|
|
|
|
```mermaid
|
|
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
|
|
```
|
|
|
|
## Цепочка данных
|
|
|
|
```mermaid
|
|
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пользователю"]
|
|
```
|