Перейти к содержанию

Путь документа от загрузки до результата

На этой странице описан полный жизненный цикл документа в системе --- от момента загрузки исходного файла до получения итоговой таблицы совпадений с реестром.

Общая последовательность

graph LR
    A["Загрузка<br/>файла"] --> B["Создание<br/>задания"]
    B --> C["Разбор PDF<br/>на страницы"]
    C --> D["Распознавание<br/>и классификация"]
    D --> E["Сохранение<br/>документов"]
    E --> F["Группировка"]
    F --> G["Сверка<br/>с реестром"]
    G --> H["Итоговая<br/>таблица"]

Этап 1: загрузка файла

Пользователь загружает PDF-файл (или ZIP-архив с несколькими PDF) через экран «Архив» или импортирует файлы с Яндекс.Диска.

Что происходит внутри:

  1. Серверная часть принимает файл и сохраняет его в хранилище MinIO (корзина uploads).
  2. В базе данных MongoDB (коллекция archive_files) создаётся запись о файле с указанием пути в хранилище, имени, размера и состояния.
  3. Если загружен ZIP-архив, серверная часть распаковывает его и обрабатывает каждый PDF отдельно.

Этап 2: создание задания

Для каждого загруженного PDF создаётся задание (коллекция jobs). Задание проходит через следующие состояния:

  1. pending --- ожидает своей очереди.
  2. processing --- находится в работе.
  3. completed --- успешно обработано.
  4. error --- обработка завершилась с ошибкой.

Серверная часть запускает задания последовательно, чтобы не перегружать системные ресурсы и не превышать ограничения внешнего распознавателя.

Этап 3: разбор PDF на страницы

Модуль pdf_processor.py выполняет следующие действия:

  1. Скачивает исходный PDF из хранилища MinIO.
  2. Преобразует каждую страницу в изображение (растеризация) с заданным разрешением (DPI).
  3. При необходимости поворачивает страницу для правильной ориентации.
  4. Извлекает текст со страницы с помощью оптического распознавания символов (OCR).
  5. Сохраняет полученные изображения страниц в хранилище MinIO (корзина previews).

Количество страниц, обрабатываемых одновременно, определяется параметром OCR_WORKERS.

Этап 4: распознавание и классификация

Изображения страниц отправляются внешнему распознавателю Claude (модуль claude_client.py). В одном запросе Claude выполняет сразу несколько действий:

  1. Сегментация --- определяет, где заканчивается один документ и начинается другой (один PDF может содержать несколько документов).
  2. Классификация --- определяет тип каждого документа (договор, акт, счёт, накладная и другие).
  3. Извлечение данных --- находит ключевые поля: номер, дату, сумму, наименование контрагента.
  4. Поиск месторождений --- ищет в тексте названия месторождений по ключевым словам из настроек.

В пакетном режиме (batch) запросы к Claude накапливаются в партию (размер партии задаётся параметром BATCH_SIZE) и отправляются группой. Специальный фоновый процесс (batch_worker.py) периодически проверяет готовность результатов.

Этап 5: сохранение документов

После получения результатов распознавания серверная часть:

  1. Создаёт записи в коллекции documents --- по одной на каждый распознанный документ.
  2. Сохраняет извлечённые поля: тип, номер, дату, сумму, контрагента, месторождение.
  3. Связывает документ с исходным файлом и номерами страниц.
  4. Обновляет состояние задания на completed.

Этап 6: группировка

Модуль grouping.py автоматически объединяет связанные документы в группы. Алгоритм присваивает баллы за совпадения между парами документов:

  • совпадение по номеру договора --- наибольший вес;
  • совпадение по дате --- средний вес;
  • совпадение по контрагенту --- средний вес;
  • соседство по страницам в исходном файле --- небольшой дополнительный балл.

Если сумма баллов превышает пороговое значение, документы объединяются в одну группу. Подробнее об алгоритме --- в разделе «Внутренние механизмы» (система баллов).

Этап 7: сверка с реестром

Пользователь загружает таблицу Excel (реестр) и настраивает правила сопоставления через мастер настройки. После этого запускается поиск совпадений:

  1. Строки реестра импортируются в коллекцию registry_rows (модуль registry_import.py).
  2. Для каждой строки строится набор приведённых значений с учётом всех возможных толкований неоднозначных дат (модуль date_utils.py).
  3. По приведённым значениям формируются указатели для быстрого поиска (модуль registry_search.py).
  4. Фоновый обработчик Celery перебирает строки реестра и ищет совпадения среди документов по заданным правилам (модуль matching.py).
  5. Для каждого найденного совпадения записываются балл и использованное правило.

Этап 8: итоговая таблица

Пользователь видит результаты на экране «Результаты по реестру»:

  • каждая строка реестра показана с найденными совпадениями;
  • рядом с каждым совпадением указан балл и название правила;
  • пользователь может подтвердить, отклонить или изменить совпадение вручную;
  • итоговую таблицу можно выгрузить в файл Excel.