Tyras
Система, на которой работает компания по экспорту автомобилей: каждая машина от аукционного лота до судна и каждая бумага, которую по дороге спросит порт.
Заказ, контейнер, бумаги и деньги.
Заказ
Каждая машина начинается как заказ: лот, на котором её купили, VIN, номер покупателя, куда она едет. Тринадцать состояний ведут её от новой до завершённой, а те, что важнее всего — принята на площадке, отправлена на доставку, погружена на экспорт — ставит сама система, а не человек руками.
Контейнер
Машины собираются в контейнеры на двадцать, сорок или сорок пять футов, у каждого своя тара, свой порт погрузки и своя судоходная линия. Контейнер знает, что у него внутри и что за него спросит порт.
Бумаги
Из системы выходит пятнадцать документов: коносамент, в варианте для Монреаля и для Ванкувера; декларация на опасный груз; инструкции по погрузке; подтверждение отправки; и счета от трёх компаний.
Деньги
Счета в канадских долларах, долларах США и евро, с GST и квебекским QST. Курс берётся у Банка Канады и замораживается на счёте, поэтому документ полугодовой давности воспроизводится в точности.
От аукционного лота до бумаг, которые пишутся сами.
-
1
Машину купили, и она становится заказом
Номер лота, VIN, аукцион. С этой минуты у машины есть адрес в системе, и все, кто к ней прикасается — диспетчер, водитель, грузчик на площадке, перевозчик — видят один и тот же.
-
2
Фотография двигает заказ дальше
Водитель получает задание карточкой в Telegram, с картой и прямой ссылкой. Он делает работу, открывает приложение и загружает фотографии. Группа, в которую он их кладёт, и есть состояние заказа: принята на площадке, доставлена, погружена на экспорт. Статус никто не печатает.
-
3
Бумаги пишутся сами
Когда контейнер готов, документы выходят уже заполненными: коносамент для нужного порта, декларация на опасный груз с нужным номером ООН для батарей внутри, инструкции по погрузке с каждым VIN и его фотографией.
Машину вводят один раз, на аукционе. Всё, что дальше — площадка, контейнер, судно и каждая бумага, которую спросит порт — это одна и та же запись в движении.
Интерфейс, сервисы, данные, и как уходят документы.
Интерфейс
Тридцать семь экранов: заказ, контейнер, бумаги и деньги — для того, кто вошёл в систему.
- TypeScript
- React 18
- Vite
- PrimeReact
- TanStack Query
Сервисы
Реактивные Java-сервисы за единым входом через Keycloak, общим для всех семи ролей.
- Java
- Spring Boot (WebFlux)
- Keycloak
Данные
MongoDB для заказов и контейнеров, PostgreSQL для людей, которые работают в системе, и объектное хранилище для самих документов.
- MongoDB
- PostgreSQL
- S3
Документы и развёртывание
Пятнадцать документов, собранных как PDF и таблицы, задание, уходящее водителям в Telegram, и каждая часть, поставляемая в своём контейнере.
- iText 7
- JasperReports
- fastexcel
- Docker
- GitLab CI
- Telegram
Трудное здесь — это бумаги, батареи и деньги.
Бумаги, которые примет порт
Коносамент — это не PDF с логотипом; это официальный бланк, в котором каждое поле стоит там, где его ждёт перевозчик. Почти двенадцать тысяч строк существуют только для того, чтобы расставить текст по страницам — восемьсот из них на один вариант для Ванкувера, и ещё один для Монреаля, потому что два порта спрашивают разное.
Батарея решает, какими будут бумаги
Электромобиль — это опасный груз. Декларация читает список машин в контейнере и подставляет нужный номер ООН — ООН 3556 для электрических, ООН 3166 для гибридов — чтобы бланк совпадал с тем, что на самом деле в ящике.
Деньги, которые воспроизводятся
Суммы хранятся в точных десятичных числах, никогда в плавающей запятой. Курс берётся у Банка Канады и записывается прямо на счёт, поэтому повторная печать документа полугодовой давности даёт те же числа, а не сегодняшние.
Выпускаем новое, два года спустя.
Тридцать месяцев, с февраля 2024 года, и работа продолжается. В истории появляются двенадцать имён; шесть человек; четверо тянули его на себе.
Два года спустя — и мы всё ещё выпускаем новое.
Есть идея для проекта? Запросите предложение!
Есть проект? Напишите нам, если хотите поработать вместе над чем-то интересным. Или вам нужна наша помощь? Не стесняйтесь обращаться к нам.