Чтобы воспользоваться оптимизацией выполнения заявок, используйте order/optimize:
svc=order/optimize¶ms={"itemId":<long>, "orders":[<uint>,{JSON},...], "warehouses":[<uint>], "units":[<uint>], "unitCount":[<uint>], "flags":<uint>, "gis":{ "provider":<uint>, "addPoints":<uint>, "speed":<uint> }, "priority":{<uint>:{<uint>:<uint>},...}, "criterions":{<text>:<uint>,...}, "preference":{<uint>:<uint>,...}}, "prices":{"priceMileage":<uint>,"priceDuration":<uint>,"priceAnyUnit":<uint>,"priceAnyOrder":<uint>} }
Название | Описание |
---|---|
itemId | id ресурса |
orders | массив оптимизируемых заявок (индексы/JSON заявок через запятую) |
warehouses | массив складов |
units | массив объектов, которые будут выполнять заявки |
unitCount | кол-во объектов, опционально, вместо параметра units |
flags | флаги оптимизации |
gis | настройки карт |
provider | источник данных для оптимизации: 0 - нет, 1 - gurtam maps(по умолчанию) |
addPoints | вернуть в ответе трек: 1 - да, 0 - нет |
speed | скорость для оптимизации, км/ч (60 по умолчанию) |
priority | приоритет заявок: {индекс объекта:{индекс заявки:приоритет заявки}} |
criterions | критерии завершения маршрута: max_mileage - максимальный пробег, м; max_duration - максимальная длительность, сек; max_order_count - максимальное количество заявок; max_idling - максимальное время простоя между заявками, сек; split_intervals - если 1, то делить по интервалам (если время выполнения заявки с разгрузкой и переездом, не попадает в коридор следующей) |
preference | приоритет заявки в маршруте, если не задать, то берётся из JSON заявки {«индекс заявки»:«приоритет»,…} |
prices | опционально, расчет стоимости - см ниже описание |
Формат JSON заявки как в запросе Создание/изменение заявки.
Флаг | Описание |
---|---|
0x1 | оптимизировать по расписанию заявки (используются параметры tf и tt) |
0x2 | оптимизировать по времени выполнения всех заявки |
0x20 | учитывать грузоподъемность объекта |
0x40 | учитывать вместимость объекта по объёму |
0x80 | учитывать текущее время |
В случае, если превышены лимиты (criterions): | |
0x100 | маршрут завершается |
0x200 | посещается склад перезагрузки |
0x300 | маршрут разделяется на несколько |
0x400 | маршрут разделяется на несколько, независимо от предыдущих |
0x2000 | назначается ближайший объект, или объект который заканчивает прежний маршрут ближе всего к заданным точкам |
0x4000 | распределение заявок с учетом ближайшего объекта учитывается время проезда от текущего местоположения объекта до первой точки) |
«Создать отдельные маршруты» : для того, чтобы распределить маршруты без объектов вместо параметра units:[] указать unitCount:1, и указать флаг 0x400, в результате маршруты с учетом лимитов, но независимые по времени.
В параметре JSON «prices» можно задать расчет стоимости заявки. Допускаются следующие дробные параметры: priceMileage, priceDuration, priceAnyUnit, priceAnyOrder (опционально, можно указывать не все, или полностью не использовать параметр prices) Например:
"prices":{"priceMileage":0.1,"priceDuration":0.1,"priceAnyUnit":1,"priceAnyOrder":0.5}
Пример полного запроса
http://stal.dev.gurtam.net:8021/wialon/ajax.html?svc=order/optimize&sid=ea479f1cd22eb18a38e02ae48b9af980¶ms={"itemId":436,"orders":[{"y":53.9186706543,"x":27.5084590912,"tf":1609225200,"n":"1","tt":1609232400,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9251899719,"x":27.5082397461,"tf":1609225200,"n":"2","tt":1609232400,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9371109009,"x":27.5800800323,"tf":1609225200,"n":"3","tt":1609232400,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9244995117,"x":27.6651802063,"tf":1609225200,"n":"4","tt":1609232400,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9196014404,"x":27.6999797821,"tf":1609228800,"n":"5","tt":1609236000,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9017181396,"x":27.4098701477,"tf":1609228800,"n":"6","tt":1609236000,"f":0,"r":50,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9213256836,"x":27.4474258423,"tf":1609228800,"n":"7","tt":1609236000,"f":0,"r":100,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.8573875427,"x":27.7043380737,"tf":1609228800,"n":"8","tt":1609236000,"f":0,"r":100,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.8638648987,"x":27.438495636,"tf":1609232400,"n":"9","tt":1609239600,"f":0,"r":100,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.9411354065,"x":27.5648918152,"tf":1609232400,"n":"10","tt":1609239600,"f":0,"r":100,"p":{"ut":600,"rep":true,"w":0,"v":0}},{"y":53.8711547852,"x":27.5484046936,"tf":1609232400,"n":"11","tt":1609239600,"f":0,"r":100,"p":{"ut":600,"rep":true,"w":0,"v":0}}],"warehouses":[],"flags":131,"units":[80768],"gis":{"addPoints":1,"provider":1,"speed":60,"cityJams":1,"countryJams":1},"prices":{"priceMileage":0.1,"priceDuration":0.1,"priceAnyUnit":1,"priceAnyOrder":0.5}}
В ответе будет блок «summary», в котором для каждого объекта и каждого маршрута отдается стоимость по заданным тарифам. Кроме тог даже если стоимости не заданы, там будет countOrders, duration, mileage для каждого маршрута.
"summary":{ "units": { "80768": { "routes": [ { "countOrders": 11, "duration": 12636, "mileage": 79226, "priceDuration": 1263.6, "priceMileage": 7922.6, "priceOrders": 5.5, "priceTotal": 9192.7, "priceUnit": 1 } ] } } }
Также по каждой точке выводится стоимость в параметре «pr» куда суммируется так же как пробег и длительность стоимость с каждой точкой:
{ "id": 10, "ml": 79226, "tm": 1609238057, "p": "", "pr": 9191.7 }
{ "1":{ /* оптимизация для первого объекта */ "orders":[ { "ml":<uint>, /* пробег */ "tm":<uint>, /* время посещения области заявки */ "id":<uint> /* индекс заявки в переданном в запросе массиве (нумерация от 0) */ }, { "ml":<uint>, /* пробег */ "tm":<uint>, /* время посещения области заявки */ "id":<uint> /* индекс заявки в переданном в запросе массиве (нумерация от 0) */ } ] }, "2":{ /* оптимизация для второго объекта (если заданное число объектов больше одного) */ "orders":[ { "ml":<uint>, /* пробег */ "tm":<uint>, /* время посещения области заявки */ "id":<uint> /* индекс заявки в переданном в запросе массиве (нумерация от 0) */ }, { "ml":<uint>, /* пробег */ "tm":<uint>, /* время посещения области заявки */ "id":<uint> /* индекс заявки в переданном в запросе массиве (нумерация от 0) */ } ] }, ..., /* оптимизация для других объектов (если задано большее число объектов) */ "success":<bool> /* статус оптимизации: 1 - успех (есть решение для всех заданных требований), 0 - неудача */ }
Если на объект назначены только заявки склада(флаг 0x4), то он не будет фигурировать в ответе.
Если маршрут разделился на несколько, то в ответе будет массив маршрутов.
|