feat(ingest+поиск): приём ZIP через интерфейс, регистронезависимый поиск, чистка очереди
- Загрузка архива (§4.1): POST /ingest распаковывает ZIP, дораспознаёт и догружает прайсы в базу (append). Виджет в админке. Кэш эмбеддингов справочника (dict_emb.npy) — догрузка считает только новый файл, эмбеддинги best-effort с откатом на fuzzy при сбое Gemini. - Поиск по name_norm (lowercase): «УЗИ» и «узи» дают одинаковый результат — SQLite LIKE не сворачивает регистр для кириллицы. - Фильтр названий: код-мнемоники («МОЗО.15») больше не попадают в очередь. - /stats считается из базы — цифры на дашборде обновляются после загрузки. - Деплой через Dockerfile (зависимости в образе, код монтируется томом). - ruff: ядро и весь репозиторий проходят проверку. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
"""Прогон извлечения по всему архиву: сколько позиций берёт каждый формат."""
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
@@ -14,11 +15,15 @@ for path in files:
|
||||
total += len(doc.rows)
|
||||
tiers = sorted({t for row in doc.rows for t in row.prices})
|
||||
print(f"\n{'=' * 68}")
|
||||
print(f"{path.name} [{doc.file_format}] партнёр='{doc.partner_name}' дата={doc.effective_date}")
|
||||
print(
|
||||
f"{path.name} [{doc.file_format}] партнёр='{doc.partner_name}' дата={doc.effective_date}"
|
||||
)
|
||||
print(f" позиций: {len(doc.rows)} | тарифы: {tiers}")
|
||||
if doc.parse_log:
|
||||
print(f" лог: {doc.parse_log[:2]}")
|
||||
for row in doc.rows[:3]:
|
||||
print(f" код={row.service_code_source!r} «{row.service_name_raw[:40]}» {row.prices} секц={row.section!r}")
|
||||
print(
|
||||
f" код={row.service_code_source!r} «{row.service_name_raw[:40]}» {row.prices} секц={row.section!r}"
|
||||
)
|
||||
|
||||
print(f"\n{'=' * 68}\nИТОГО позиций по архиву: {total}")
|
||||
|
||||
Reference in New Issue
Block a user