Путь документа от загрузки до результата¶
На этой странице описан полный жизненный цикл документа в системе --- от момента загрузки исходного файла до получения итоговой таблицы совпадений с реестром.
Общая последовательность¶
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) через экран «Архив» или импортирует файлы с Яндекс.Диска.
Что происходит внутри:
- Серверная часть принимает файл и сохраняет его в хранилище MinIO (корзина
uploads). - В базе данных MongoDB (коллекция
archive_files) создаётся запись о файле с указанием пути в хранилище, имени, размера и состояния. - Если загружен ZIP-архив, серверная часть распаковывает его и обрабатывает каждый PDF отдельно.
Этап 2: создание задания¶
Для каждого загруженного PDF создаётся задание (коллекция jobs). Задание проходит через следующие состояния:
pending--- ожидает своей очереди.processing--- находится в работе.completed--- успешно обработано.error--- обработка завершилась с ошибкой.
Серверная часть запускает задания последовательно, чтобы не перегружать системные ресурсы и не превышать ограничения внешнего распознавателя.
Этап 3: разбор PDF на страницы¶
Модуль pdf_processor.py выполняет следующие действия:
- Скачивает исходный PDF из хранилища MinIO.
- Преобразует каждую страницу в изображение (растеризация) с заданным разрешением (DPI).
- При необходимости поворачивает страницу для правильной ориентации.
- Извлекает текст со страницы с помощью оптического распознавания символов (OCR).
- Сохраняет полученные изображения страниц в хранилище MinIO (корзина
previews).
Количество страниц, обрабатываемых одновременно, определяется параметром OCR_WORKERS.
Этап 4: распознавание и классификация¶
Изображения страниц отправляются внешнему распознавателю Claude (модуль claude_client.py). В одном запросе Claude выполняет сразу несколько действий:
- Сегментация --- определяет, где заканчивается один документ и начинается другой (один PDF может содержать несколько документов).
- Классификация --- определяет тип каждого документа (договор, акт, счёт, накладная и другие).
- Извлечение данных --- находит ключевые поля: номер, дату, сумму, наименование контрагента.
- Поиск месторождений --- ищет в тексте названия месторождений по ключевым словам из настроек.
В пакетном режиме (batch) запросы к Claude накапливаются в партию (размер партии задаётся параметром BATCH_SIZE) и отправляются группой. Специальный фоновый процесс (batch_worker.py) периодически проверяет готовность результатов.
Этап 5: сохранение документов¶
После получения результатов распознавания серверная часть:
- Создаёт записи в коллекции
documents--- по одной на каждый распознанный документ. - Сохраняет извлечённые поля: тип, номер, дату, сумму, контрагента, месторождение.
- Связывает документ с исходным файлом и номерами страниц.
- Обновляет состояние задания на
completed.
Этап 6: группировка¶
Модуль grouping.py автоматически объединяет связанные документы в группы. Алгоритм присваивает баллы за совпадения между парами документов:
- совпадение по номеру договора --- наибольший вес;
- совпадение по дате --- средний вес;
- совпадение по контрагенту --- средний вес;
- соседство по страницам в исходном файле --- небольшой дополнительный балл.
Если сумма баллов превышает пороговое значение, документы объединяются в одну группу. Подробнее об алгоритме --- в разделе «Внутренние механизмы» (система баллов).
Этап 7: сверка с реестром¶
Пользователь загружает таблицу Excel (реестр) и настраивает правила сопоставления через мастер настройки. После этого запускается поиск совпадений:
- Строки реестра импортируются в коллекцию
registry_rows(модульregistry_import.py). - Для каждой строки строится набор приведённых значений с учётом всех возможных толкований неоднозначных дат (модуль
date_utils.py). - По приведённым значениям формируются указатели для быстрого поиска (модуль
registry_search.py). - Фоновый обработчик Celery перебирает строки реестра и ищет совпадения среди документов по заданным правилам (модуль
matching.py). - Для каждого найденного совпадения записываются балл и использованное правило.
Этап 8: итоговая таблица¶
Пользователь видит результаты на экране «Результаты по реестру»:
- каждая строка реестра показана с найденными совпадениями;
- рядом с каждым совпадением указан балл и название правила;
- пользователь может подтвердить, отклонить или изменить совпадение вручную;
- итоговую таблицу можно выгрузить в файл Excel.