Web / SaaS-платформы

Жалюзи-сетки

Закрытый личный кабинет производителя оконных систем, в котором дилеры и партнеры самостоятельно собирают индивидуальные изделия по параметрам, мгновенно видят их стоимость и отправляют заказ в производство, а вся дальнейшая логистика статусов и расчетов автоматически синхронизируется с учетной системой 1С. Веб-приложение объединяет три продуктовые линии (москитные сетки, рулонные шторы и горизонтальные жалюзи), движок динамического ценообразования, полностью самоуправляемый каталог и многоязычный интерфейс.
ASP.NET Core C#

Задача

Производственная компания работала по медленной и ошибкоемкой схеме: дилеры присылали заказы в свободной форме, менеджеры вручную считали стоимость каждого изделия по бумажным прайсам, повторно вбивали позиции в 1С, отслеживали готовность и оплату по телефону и пересылали счета вручную. Требовалось:
  • дать дилерам инструмент самостоятельной сборки изделий с точным расчетом цены в реальном времени;
  • исключить ручной перенос заказов между сайтом и 1С, при том что учетная система не имеет открытого HTTP-API и обменивается данными только через файлы;
  • позволить самой компании менять прайсы, состав каталога и языки интерфейса без обращения к разработке;
  • обеспечить прозрачную воронку статусов заказа от создания до выдачи с автоматической рассылкой счетов.

Решение

Построена единая система личного кабинета, которая закрывает весь путь заказа от конфигурации изделия до выдачи и оплаты.
Конфигуратор изделий с живым расчетом цены. Для каждой продуктовой линии реализован отдельный параметрический калькулятор. Дилер выбирает систему, задает ширину, высоту, цвет, ткань, тип крепления и дополнительные опции, а стоимость пересчитывается на лету при каждом изменении поля. Формула учитывает базовую цену, надбавки по ширине и высоте, площадную стоимость полотна, доплаты за атрибуты и минимальный порог по площади, поэтому итог совпадает с заводским прайсом до копейки.
Двусторонняя интеграция с 1С через файловый обмен. Вместо несуществующего API спроектирован надежный обмен через FTP-каталоги: подтвержденные заказы выгружаются в JSON, фоновый планировщик каждые 15 минут забирает встречные файлы статусов и счетов, проставляет номер документа 1С, дату приемки, признак оплаты, переводит заказ по статусам готовности и выдачи, переносит PDF-счет в кабинет и автоматически отправляет дилеру ссылку на оплату по email.
Самоуправляемый каталог и прайс. Администратор компании через интерфейс кабинета заводит типы изделий, параметры, атрибуты и их ценовые надбавки, редактирует ценовые матрицы, копирует готовые конфигурации. Любое изменение прайса или состава продукции выполняется силами заказчика без участия программиста и без выкладки новой версии.
Динамическая многоязычность. Реализована система локализации, в которой каждый язык это отдельная колонка таблицы переводов. Добавление нового языка из админки на лету расширяет схему, недостающие строки перевода создаются автоматически при первом обращении, а интерфейс переключения опирается на набор из более чем 250 локалей. Язык определяется по профилю пользователя, cookie и заголовку браузера.

Архитектура и сложности

  • Чистое разделение слоев. Приложение построено на ASP.NET Core MVC с тонким базовым слоем: общий базовый контроллер с авторизацией, локализацией и сессиями, репозиторий доменной логики и ценообразования, выделенный хаб реального времени на SignalR. Доменная модель насчитывает около двадцати сущностей с раздельными ветками каталога под каждую продуктовую линию.
  • Интеграция без API. Главная инженерная сложность состояла в надежном обмене с 1С через файлы. Планировщик на Quartz обрабатывает каждый входящий файл в изолированном блоке, поэтому один поврежденный документ не ломает весь цикл синхронизации. Идемпотентность достигнута через маркер номера документа и отметку выгрузки, что исключает повторную отправку и дубли заказов.
  • Эволюция схемы под нагрузкой. За время эксплуатации схема данных прошла более двадцати последовательных миграций без простоя сервиса, включая переход на новую мажорную версию платформы, что подтверждает устойчивость выбранной архитектуры к долгому развитию.
  • Изменяемость без релизов. Ценообразование, каталог и языки вынесены в данные, а не в код. Это сместило рутинные изменения на сторону бизнеса и сократило нагрузку на поддержку.
  • Реальное время и UX. Обновление аватара, уведомления и часть интерфейсных событий идут через постоянное соединение SignalR, а сам конфигуратор работает на быстрых AJAX-вызовах без перезагрузки страницы.

Результат

  • Полный цикл заказа переведен в самообслуживание: дилер собирает изделие, видит точную цену и отправляет его в производство без участия менеджера.
  • Ручной перенос заказов в 1С и ручной пересчет стоимости устранены, а статусы готовности, оплаты и счета поступают в кабинет автоматически с задержкой не более 15 минут.
  • Управление прайсом, каталогом и языками полностью передано на сторону компании, добавление нового языка или продукта больше не требует участия разработки и публикации обновления.
  • Система остается в продуктивной эксплуатации более пяти лет, обслуживает три продуктовые линии и продолжает развиваться на актуальной версии платформы, что подтверждает ее надежность и ремонтопригодность.

Стек

C#, .NET 8, ASP.NET Core MVC, Entity Framework Core, MS SQL Server, SignalR, Quartz.NET, MailKit (SMTP), HtmlAgilityPack, Newtonsoft.Json, интеграция с 1С через файловый обмен, аутентификация по cookie с хешированием паролей HMAC-SHA512, jQuery, Quill, верстка с динамической локализацией. 
Сюда Туда