Способ взаимодействия с ПО
Для обращения необходимо использовать: `POST /api/pack`
Заголовки
Необходимо использовать заголовки:
- Authorization: Bearer `<token>`
- Content-Type: application/json
Пример запроса
Ниже показан пример запроса
curl --location 'https://i.eroutes.ru/api/pack' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '<JSON запрос>'
Ошибка при использовании неподдерживаемых методов.
Если используется метод, отличный от `POST`, а также в случае некорректных данных и других случаев в которые предполагают ошибки или некорректную обработку API возвращает следующий ответ:
{
"message": "Метод не поддерживается"}
Формат данных
Запрос
Запрос содержит два массива: `bins` и `items`.
Формат контейнера (bin)
Каждый объект в массиве `bins` должен содержать следующие поля:
- `name`: строка, уникальное название контейнера
- `length`: число, длина контейнера
- `breadth`: число, ширина контейнера
- `height`: число, высота контейнера
- `weight`: число, максимальный возможный вес содержимого контейнера
- `price`: число, цена контейнера
- `count`: число, доступное для использования количество контейнеров
Формат товара (item).
Каждый объект в массиве `items` должен содержать следующие поля:
- `name`: строка, уникальное название/артикул товара
- `length`: число, длина товара
- `breadth`: число, ширина товара
- `height`: число, высота товара
- `weight`: число, вес товара
- `count`: число, количество товаров с таким названием
Пример данных запроса
{
"bins": [
{
"name": "Sapiens",
"length": 20,
"breadth": 20,
"height": 20,
"weight": 1,
"price": 10,
"count": 100
},
{
"name": "NTree",
"length": 50,
"breadth": 50,
"height": 50,
"weight": 10,
"price": 22,
"count": 100
},
{
"name": "MPaw",
"length": 40,
"breadth": 50,
"height": 50,
"weight": 10,
"price": 20,
"count": 100
},
{
"name": "Moneyball",
"length": 40,
"breadth": 30,
"height": 30,
"weight": 5,
"price": 25,
"count": 100
},
{
"name": "TckMini",
"length": 15,
"breadth": 15,
"height": 10,
"weight": 0.5,
"price": 5,
"count": 100
},
{
"name": "Womp",
"length": 30,
"breadth": 50,
"height": 50,
"weight": 10,
"price": 30,
"count": 100
}
],
"items": [
{
"name": "1",
"length": 15,
"breadth": 10,
"height": 10,
"weight": 0.1,
"count": 2
},
{
"name": "2",
"length": 15,
"breadth": 20,
"height": 20,
"weight": 1,
"count": 1
},
{
"name": "3",
"length": 10,
"breadth": 5,
"height": 20,
"weight": 0.3,
"count": 2
},
{
"name": "4",
"length": 25,
"breadth": 12,
"height": 7,
"weight": 1,
"count": 4
},
{
"name": "5",
"length": 15,
"breadth": 10,
"height": 10,
"weight": 0.5,
"count": 1
}
]
}
Ответ
Ответ содержит два массива: `bins` с размещенными товарами и `unpacked` с названиями неразмещенных товаров.
Формат контейнера в ответе
Каждый объект в массиве `bins` содержит следующие поля:
- `name`: строка, уникальное название контейнера
- `itemsweight`: число, общий вес размещенных товаров
- `items`: массив объектов, каждый из которых содержит:
- `name`: строка, название товара
- `position`: объект с координатами размещения товара
- `x`: число, координата по оси X
- `y`: число, координата по оси Y
- `z`: число, координата по оси Z
- `rotation`: строка, ориентация товара
Пример данных ответа
{
"bins": [
{
"name": "MPaw",
"itemsweight": 6.3,
"items": [
{
"name": "2",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": "ZXY"
},
{
"name": "4",
"position": {
"x": 0,
"y": 15,
"z": 0
},
"rotation": "ZXY"
},
{
"name": "4",
"position": {
"x": 0,
"y": 40,
"z": 0
},
"rotation": "YZX"
},
{
"name": "4",
"position": {
"x": 0,
"y": 0,
"z": 20
},
"rotation": "ZXY"
},
{
"name": "4",
"position": {
"x": 0,
"y": 25,
"z": 20
},
"rotation": "ZYX"
},
{
"name": "1",
"position": {
"x": 0,
"y": 40,
"z": 25
},
"rotation": "ZYX"
},
{
"name": "1",
"position": {
"x": 0,
"y": 0,
"z": 32
},
"rotation": "ZXY"
},
{
"name": "5",
"position": {
"x": 0,
"y": 15,
"z": 32
},
"rotation": "ZYX"
},
{
"name": "3",
"position": {
"x": 0,
"y": 15,
"z": 12
},
"rotation": "ZXY"
},
{
"name": "3",
"position": {
"x": 0,
"y": 25,
"z": 12
},
"rotation": "ZXY"
}
]
}
],
"unpacked": []
}
Суть вычислений
В основу алгоритма размещения товаров в контейнерах положен метод 3D бин-пэкинга. Основная задача алгоритма заключается в оптимальном размещении товаров различных размеров и веса в ограниченном количестве контейнеров.
Принципы вычислений следующие:
Инициализация контейнеров и товаров. Сначала происходит инициализация контейнеров и товаров, которые должны быть размещены.
Сортировка товаров и контейнеров: Товары и контейнеры сортируются по размеру, весу и другим параметрам, чтобы оптимизировать процесс размещения.
Алгоритм размещения: Алгоритм пытается разместить каждый товар в контейнер таким образом, чтобы минимизировать свободное пространство и распределить вес равномерно. В процессе учитываются все возможные ориентации товара для наиболее эффективного использования объема контейнера.
Обработка оставшихся товаров: Если какие-то товары не могут быть размещены в текущем наборе контейнеров, они добавляются в список `unpacked` для дальнейшей обработки.