Задача поиска варианта(ов) заправки автомобиля с учетом разных цен на заправках, расхода бензина на маршрут туда и обратно, необходимого объема заправки в литрах и лимита времени у водителя. Входные данные: Данные о заправак и ценах на них на разное топливо. Данные о пользователях, их автомобилях, типе и среднем расходе топлива на 100 км (проводим упращенные расчеты с паспортной величиной среднего расхода) Данные о дистанциях до заправок от текущей позиции пользователя в километрах. Предполагаем, что эти данные нам готовит другой модуль. Скорость берем среднюю в 30 км/ч.
Вводные данные (или константы для упрощенного вида): Необходимый объем заправки в литрах. Лимит времени на всю операцию в часах.
Условия: Реализовать структуру данных. Реализовать код поиска заправки (заправок) Желательно: Предусмотреть возможность переиспользования кода (несколько стартовых точек, изменение времени...) и более реалистичных данных Предусмотреть негативные сценарии
==========================
Сервис с использованием Flask В коде стоят комментарии по процессу расчетов структура базы данных и некоторые тестовые данные заполняются из миграций sqlalchemy, в рабочей среде по хорошему надо делать ендпоинты импорта заправок/пользователей/автомобилей или получать их из какойнибудь шины, например через rabbitmq
Реализовать вызов с многими точками, можно добавить ещё ендпоинт который будет группировать запрос и отдавать массивом результаты (не успел немного реализовать)
Сервис расчетов реализовон отдельным классом и его можно довольно легко вынести из микросервиса в виде отдельной библиотеки Сервис запроса данных по расстояниям также выделен отдельным классом и легко переключается на какойнибудь requests, для запроса наружу, сейчас там заглушка
В сервисе могут ещё быть ошибки, поскольку писать пришлось быстро
=========================== Запуск напрямую: для данного примера НЕОБХОДИМА БАЗА PGSQL, пустая
export FLASK_ENV=development export DATABASE_URL=DATABASE_URL=postgres://postgres:test@localhost/svs flask db upgrade flask run
Запуск через docker
docker-compose up
сервис будет доступен по:
http://localhost:5000/api/v1/fuel/stations
Ендпоинты: GET "/api/v1/fuel/stations" user_id - Идентификатор пользователя (для удобства предзаполнено из миграции 1,2,3) (можно использовать вместо car_id) car_ id - Идентификатор автомобиля (для удобства предзаполнено из миграции 1,2,3) (можно использовать вместо user_id) car_fuel_level - имеющийся объем топлива (обязательно) required_fuel - требуемый объем заправки (обязательно) time_limit - ограничение по времени в часах (дробное) (необязвательно) avail_money - органичение по деньгам (необязательно) avg_speed - средняя скорость (необязательно, по умолчанию 30) -- также тут должены быть координаты авто в виде lat/lon для передачи в сервис запроса расстояний, но пока это не нужно
Ответ:
{
"status": True, # Если удачно то True
"data": {
"data":{
"id": идентификатор заправки,
"distance": расстояние до заправки,
"cost": Стоимость литра топлива
}
}
}