Оптимизировать выполнение заявок

Чтобы воспользоваться оптимизацией выполнения заявок, используйте order/optimize:

svc=order/optimize&params={"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&params={"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), то он не будет фигурировать в ответе.
:!: Если маршрут разделился на несколько, то в ответе будет массив маршрутов.

Follow us on Facebook Gurtam Wialon Twitter Gurtam Wialon info@gurtam.com   |   Copyright © 2002-2024 Gurtam