Внутренний ЛК для консолидации предварительных расчётов мебельных услуг
Краткое описание
Разработал внутренний веб-инструмент для сотрудников, который собирал в одном месте отдельные расчётные файлы по проекту, позволял загрузить их в систему, запустить консолидацию и получить единый итоговый файл для дальнейшей работы. Проект закрывал полный рабочий контур: вход в систему, хранение файлов, запуск обработки, контроль загруженных документов и выдачу результата.
Проект развивался по версиям:
v1- ранняя версия как специализированная страница для пакетной загрузки файлов, запуска обработки и получения сводного результата.v2- более зрелая версия в формате внутреннего личного кабинета с авторизацией, раздельной работой пользователей, реестром файлов, улучшенным интерфейсом и запуском нового алгоритма обработки.
Для чего был нужен проект
Проект был нужен для внутренней консолидации предварительных расчётов по мебельным услугам. Он упрощал работу сотрудников, которым нужно было собрать несколько отдельных расчётов по заказу, передать их в обработку и быстро получить единый итог без ручной работы с большим количеством файлов.
Система:
- принимала расчётные файлы от сотрудников;
- хранила их в рамках пользовательской сессии и рабочего набора;
- предоставляла интерфейс для управления загруженными файлами;
- запускала серверную обработку;
- выдавала готовый файл консолидации на скачивание.
Что делал сам веб-проект
- Реализовывал авторизацию сотрудников и отдельный вход во внутренний кабинет.
- Показывал персональный рабочий экран пользователя с доступом к своим загруженным файлам.
- Поддерживал массовую загрузку файлов через веб-интерфейс с клиентской валидацией формата и размера.
- Загружал файлы поочерёдно с отображением прогресса и статуса по каждому документу.
- Вёл реестр уже загруженных файлов и показывал количество документов в рабочем наборе.
- Позволял удалять отдельные файлы из набора и полностью очищать реестр.
- Разделял рабочие файлы по пользователям через отдельные серверные директории.
- Давал возможность запускать обработку из интерфейса без ручного вмешательства на сервере.
- Поддерживал переключение между старым и новым алгоритмом обработки.
- Передавал пользовательские параметры обработки, например режим пропуска дублей.
- После завершения обработки публиковал ссылку на готовый итоговый файл для скачивания.
Технически со стороны web
- Реализовал веб-часть на PHP с сессионной авторизацией и отдельной точкой входа во внутренний кабинет.
- Разделил сценарии на отдельные обработчики: вход, загрузка файлов, удаление, получение списка загруженных документов, запуск обработки, скачивание результата и выход из системы.
- Построил пользовательский сценарий вокруг файловой обработки: от входа сотрудника в систему до получения готового файла консолидации.
- Настроил раздельную работу пользователей через персональные серверные директории для загружаемых файлов и результатов обработки.
- Реализовал массовую загрузку файлов через AJAX с клиентской валидацией, прогрессом, статусами и последовательной отправкой документов.
- Добавил интерфейсный реестр загруженных файлов с возможностью точечного удаления и полной очистки рабочего набора.
- Связал веб-интерфейс с серверным обработчиком через асинхронный запуск, чтобы пользователь мог запускать обработку прямо из ЛК без ручных действий на сервере.
- Добавил передачу параметров обработки из интерфейса в серверную часть, включая режим пропуска дублей.
- Поддержал переключение между старым и новым контуром обработки, что позволило развивать систему без полного отказа от предыдущего сценария.
- Реализовал защиту служебных обработчиков от прямого доступа и ограничил работу через сессию и внутренние запросы.
- Сделал выдачу результата как отдельный шаг пользовательского сценария: после обработки система публиковала ссылку на готовый файл и позволяла сразу перейти к скачиванию.
Что происходило после запуска обработки
- Система запускала серверную консолидацию данных из загруженных расчётных файлов.
- Поддерживала два контура обработки: старый PHP-алгоритм и новый Python-алгоритм.
- Перед обработкой валидировала входные файлы на соответствие ожидаемому рабочему шаблону.
- Собирала данные из нескольких файлов в единый сводный результат для дальнейшей работы сотрудников.
- Объединяла повторяющиеся позиции в итоговой таблице и поддерживала отдельный режим пропуска дублей внутри одного расчёта.
- Формировала итоговый
.xlsx-файл со сводным результатом консолидации. - Показывала сводку по обработанным файлам, включая количество найденных позиций и итоговые суммы.
- В развитой версии выдавала более детализированный результат для проверки расхождений и контроля качества входных данных.
Технически со стороны Python
- Реализовал отдельный Python-обработчик, который запускался из веб-интерфейса и работал с пользовательской папкой загруженных файлов.
- Настроил отдельные входные и выходные директории по пользователям, включая очистку предыдущих результатов перед новой обработкой.
- Собрал конвейер обработки на
pandas,xlrdиopenpyxl, чтобы разделить чтение данных, агрегацию и финальную сборку итогового файла. - Добавил нормализацию строк и имён материалов: очистку служебных символов, выравнивание пробелов, приведение Unicode-строк и стабилизацию названий для последующего сравнения.
- Реализовал логику адаптации к вариативной структуре расчётных таблиц: обработчик не был жёстко завязан только на одну фиксированную раскладку колонок и умел подстраиваться под сдвинутые заголовки и разные варианты расположения полей.
- Построил внутреннюю карту данных по материалу: группа, единица измерения, цена, коэффициент, расчётное количество, ручное количество, фактическое количество и служебные координаты источника.
- Добавил режим
skip_duplicates, который позволял исключать повторяющиеся позиции внутри одного расчёта и не завышать итог при консолидации. - Реализовал объединение материалов по составному ключу
наименование + единица измерения, чтобы собирать итог из нескольких файлов в одну сводную запись. - Сохранял трассировку происхождения каждой позиции: из какого файла она пришла, сколько раз встретилась и с какими координатами была найдена. Это делало итоговый файл инструментом аудита, а не просто сводной таблицей.
- Добавил отдельную логику для случаев, когда материал участвует в фактических данных, но отсутствует в основной части расчёта: такие позиции не терялись и помечались в результате отдельно.
- Формировал итоговый
all_materials.xlsxчерезpandas, а затем поверх него выполнял вторую фазу постобработки черезopenpyxl. - Во второй фазе генерировал формулы итоговой стоимости, стоимости в изделии, денежные форматы, автоширину колонок, переносы строк, автофильтры и итоговые суммы.
- Реализовал диагностическую подсветку строк по нескольким сценариям: повтор материала в одном файле, расхождение количеств, различие в цене, различие коэффициентов и отсутствие позиции в основной части расчёта.
- Добавил автоматические комментарии в ячейки, чтобы в итоговом
.xlsxможно было сразу увидеть причину расхождения и источник данных без ручного поиска по исходным файлам. - Сформировал в результирующем Excel отдельную легенду подсветки, чтобы итог был понятен сотрудникам без дополнительного объяснения со стороны разработчика.
Как был устроен пользовательский сценарий
- Сотрудник входил во внутренний кабинет.
- Загружал пачку расчётных файлов через веб-форму.
- Видел список уже загруженных документов и мог удалить лишние.
- Запускал нужный вариант обработки.
- Дожидался завершения серверного процесса.
- Скачивал новый итоговый файл консолидации.
Эволюция версий
v1
Первая версия была ближе к прикладной утилите:
- простая страница под задачу консолидации;
- пакетная загрузка файлов;
- запуск обработки и генерация итогового результата;
- вывод промежуточной информации по обработке;
- группировка совпадающих и одиночных позиций в результате обработки.
v2
Во второй версии проект стал именно внутренним ЛК:
- появился отдельный экран входа;
- появилась сессионная авторизация пользователей;
- файлы стали храниться раздельно по пользователям;
- появился реестр загруженных файлов;
- загрузка стала последовательной с прогрессом и более удобным интерфейсом;
- добавились отдельные действия удаления файлов и полной очистки набора;
- запуск нового алгоритма был встроен прямо в интерфейс через асинхронный запрос;
- результат обработки стал выдаваться как понятный следующий шаг внутри пользовательского сценария;
- появился более зрелый слой контроля качества итоговой консолидации.
Технологии
- PHP
- JavaScript / jQuery
- AJAX
- HTML / CSS
- Python как серверный исполнитель обработки
- Сессионная авторизация
- Файловое хранение рабочих наборов
Моя роль
Моя роль была полной: от понимания внутреннего сценария работы сотрудников и проектирования интерфейса до реализации личного кабинета, логики загрузки файлов, серверных обработчиков, связки веб-части с обработчиком и развития проекта от ранней утилиты к более зрелому внутреннему инструменту.
Практическая ценность проекта
Этот кейс показывает опыт:
- разработки внутренних кабинетов и служебных интерфейсов;
- проектирования прикладного сценария работы вокруг файловой обработки;
- организации массовой загрузки файлов через веб-интерфейс;
- интеграции веб-интерфейса с серверной обработкой и генерацией итоговых файлов;
- построения пользовательского сценария от входа в систему до получения результата;
- развития продукта по версиям на основе реального рабочего процесса сотрудников.