Задание
|
Предыдущий урок
Реализация статусов и списков
|
3 из 4 уроков
Необходимо выполнить задание
|
Следующий урок
Оценка качества проверки ДЗ
|
Время выполнения задания: ~1.5-2 часа
Сложность: ⭐️⭐️⭐️ (максимум ⭐️⭐️⭐️⭐️⭐️)
Бонусы: 300
На вашем счету сейчас: 1 бонуса/ов
Use Case
микросервиса Delivery
На схеме показана Use Case диаграмма микросервиса Delivery. Нажмите на схему для увеличения.
Use Case микросервиса Delivery
Use Cases
Данное описание дано исключительно для понимания системы. В задании ориентируйтесь на бизнес-правила, указанные в самом задании.
Basket ->Создать заказ
Сервис Delivery создаёт заказ, вследствие оформления корзины. Сообщение "Корзина оформлена" будет приходить из Kafka, как только мы реализуем интеграцию с Basket.
Delivery -> Переместить курьеров
Разные курьеры имеют разную скорость перемещения. К примеру, если у курьера скорость равна 4, то за 1 такт курьер проходит 4 клетки, по X или Y, но суммарно не больше 4ех. В реальной системе мы бы получали координаты о самих курьеров. В нашей же системе будет Job, который имеет такт 1 секунду и при срабатывании такта - все курьеры перемещаются на сторону заказа с учетом их скорости.
Если курьер доставил заказ (=дошёл до точки), то в рамках этого же Use Case мы завершаем заказ, а курьер снова свободен и может брать новые заказы.
Этот Use Case мы будем запускать с помощью Job в 8 модуле.
Delivery -> Назначить заказ на курьера
Система сама распределяет заказы, она берёт первый по списку неназначенный заказ и ищет самого подходящего курьера. Основными критериями выбора являются:
- Время доставки курьером (расстояние от курьера до заказа деленное на скорость транспорта)
- Наличие свободных мест хранения, с учетом обьема заказа.
Этот Use Case мы будем запускать с помощью Job в 8 модуле.
Менеджер -> Получить всех курьеров
В любое время менеджер может отслеживать на карте местоположение курьеров, которые выполняют заказ. Он делает это в web-приложении Backoffice.
Менеджер -> Получить все незавершенные заказы (в статусе Created и Assigned)
В любое время менеджер может отслеживать на карте местоположение заказов. Он делает это в web-приложении Backoffice.
Domain Model
микросервиса Delivery
На схеме показана показана доменная модель микросервиса Delivery. Нажмите на схему для увеличения.
В этом модуле достаточно много кода. Основной упор мы сделаем на разработку агрегата Courier. Order будет играть не такую важную роль. Чтобы ускорить кодирование предлагаются заготовки для Order и OrderStatus. Можете брать их за основу и модифицировать на свое усмотрение.
Задание
Легенда
Вы отвечаете за разработку микросервиса Delivery (доставка)
Подготовка
- Вы работаете в своем Git репозитории "delivery"
- Создайте ветку module-4
- Выполните задание в ней
Задача
- Перейдите в папку domain/model/order и создайте в ней файл order.go
Перейдите в папку domain/model/courier и создайте в ней файл courier.go
- Реализуйте в файлах необходимые Aggregate в соответствии с бизнес-правилами
- Скомпилируйте приложение
- Реализуйте Unit Test в достаточном количестве
Бизнес-правила Order Status
Может быть:
- Created
- Assigned
- Completed
Бизнес-правила Order
- Order - это заказ, он состоит из:
- Id (uuid, идентификатор)
- CourierId (uuid, Id назначенного курьера), если заказ еще не назначен, то может быть nil
- Location (Location, местоположение, куда нужно доставить заказ)
- Volume (int, объем заказа)
- Status (OrderStatus, статус заказа)
- Заказ может быть создан:
- При создании нужно передать Id, Location, volume (Id передается на вход, так как основой для заказа будет являться Id корзины. Поэтому мы не генерируем Id, а получаем на вход)
- При создании заказа проставляется статус Created (создан)
- Заказ может быть назначен на курьера. При этом:
- Заказ переходит в статус Assigned (назначен)
- В заказе проставляем ID назначенного курьера
- Заказ можно завершить. При этом:
- Заказ переходит в статус Completed (завершен)
- Завершить можно только назначенный ранее заказ
Бизнес-правила Courier
- Courier - это курьер, он состоит из:
- Id (uuid, идентификатор)
- Name (string, имя курьера)
- Speed (int, скорость курьера)
- Location (Location, местоположение курьера)
- StoragePlaces ([]StoragePlaces, места хранения курьера)
- Курьер может быть создан:
- Нужно передать Name , Speed, Location
- Каждый курьер владеет местом хранения "Сумка" объемом 10 литров
- Курьер может добавить себе новое место хранения, указав название и его объем
- Курьер должен уметь проверять, "может ли он взять заказ?" Может, если в одном из его мест хранения есть место
- Курьер может взять заказ, если предыдущее условие выполняется. В место хранения при этом устанавливается ID заказа.
- Курьер может завершить заказ. При этом место хранения очищается.
- Курьер должен уметь возвращать количество шагов, которое он потенциально затратит на путь до локации заказа. При расчете нужно учесть скорость курьера. К примеру:
- Курьер имеет скорость 2 (к примеру, велосипед)
- Курьер находится в точке (1,1)
- Заказ находится в точке (5,5)
- Курьеру надо пройти 4 клетки по горизонтали и 4 по вертикали, чтобы оказаться в точке доставки заказа. Суммарная дистанция равна - 8 клеток
- Курьер перемещается со скоростью 2 клетки за 1 такт
- Итого - курьеру нужно 4 такта, чтобы доставить заказ
- Курьер может переместиться на один шаг в сторону Location заказа. При этом его Location меняется. Если вы ограниченны во времени, то можете взять алгоритм из примера
Критерии оценивания
- Сущности соответствуют паттерну Aggregate
- Приложение компилируется и запускается
- Исходный код залит в Git репозиторий
- Сущности покрыты Unit Test'ами
По любым вопросам обращайтесь в комментариях к уроку или в Telegram
Если вы обнаружили ошибку или неточность в данном уроке, сообщите о ней в комментариях к данному уроку. Это поможет сделать курс лучше.