{"item":[{"name":"Plan","description":"Планирование - создание рейсов, которые учитывают все заданные ограничения, на основе данных о заказах, исполнителях и транспорте.\n\nЗапросы на планирования возможно выполнять в синхронном (для тестирования) и асинхронном (для основного использования) режимах.\n\nЧтобы получить результат работы очистки исходной задачи воспользуйтесь очисткой данных для планирования.","item":[{"id":"caba5bf7-46b5-5e96-8285-541c009ec9e1","name":"Планирование (ASYNC)","request":{"name":"Планирование (ASYNC)","description":{"content":"Запуск планирования рейсов - после загрузки и проверки данных возвращается идентификатор расчета `process_code`.\n\nС помощью `process_code` можно узнать состояние расчета и получить результат,\na также отменить расчет и удалить временные данные (иначе они автоматически удалятся по ttl, указанному в настройках расчета).","type":"text/plain"},"url":{"path":["universal","plan","calculation-async"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"436941e1-d2dd-58ac-aff7-19fb5b527bb3","name":"Планирование (SYNC)","request":{"name":"Планирование (SYNC)","description":{"content":"Синхронный метод для создания рейсов.\n\nДанный метод рекомендуется только для тестового использования и ручного запуска расчетов на небольшом объеме данных.\n\nДля боевой среды рекомендуется использовать асинхронный метод.","type":"text/plain"},"url":{"path":["universal","plan","calculation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"2f080404-7b88-5ed2-a39b-720bbcf87f3b","name":"Отмена расчета","request":{"name":"Отмена расчета","description":{"content":"Отмена процесса планирования по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","plan","calculation-async",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"debfa6bf-894c-545e-a5be-bbc7ebc2b76c","name":"Состояние расчета","request":{"name":"Состояние расчета","description":{"content":"Получение состояния расчета по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","plan","state",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"e73f18ca-cd6b-58ff-9287-573323564e77","name":"Получение результата","request":{"name":"Получение результата","description":{"content":"Получение результата планирования по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","plan","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"170b719c-3ba1-55bf-8629-006041ff0993","name":"Удаление результата","request":{"name":"Удаление результата","description":{"content":"Удаление результата по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","plan","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"e512924f-02d0-55d0-8ac3-aa98024ef9c0","name":"Валидация данных","request":{"name":"Валидация данных","description":{"content":"Проверка данных для планирования перед использованием.","type":"text/plain"},"url":{"path":["universal","plan","validation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"a953ddcf-203a-5b80-9dcf-d35b0ce6dc4d","name":"Очистка данных","request":{"name":"Очистка данных","description":{"content":"Очистка данных для планирования перед расчетом - из исходного датасета удаляются сущности, которые не могут участвовать в планировании:\n * Локации, на которые никто не ссылается (в зависимости от флага `remove_locations`)\n * Заказы, которые не может выполнить ни один исполнитель\n * Исполнители и транспорт, которые не могут выполнить ни один заказ","type":"text/plain"},"url":{"path":["universal","plan","refine"],"host":["{{baseUrl}}"],"query":[{"key":"remove_locations","value":"true","disabled":true,"description":{"content":"Флаг, отвечающий за удаление локации при очистке данных. Если указан `true` - удаляются локации, на которые не ссылается ни одна сущность в датасете.","type":"text/plain"}}],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"48fa5cac-415a-5c41-8263-905b52f5cc57","name":"Расчет статистики по рейсам","request":{"name":"Расчет статистики по рейсам","description":{"content":"Расчет статистики по существующим рейсам","type":"text/plain"},"url":{"path":["universal","plan","statistics"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}}]},{"name":"Actualize","description":"Актуализация рейсов - обновление планового времени выполнения заказов с учетом фактов и без изменения порядка обьезда.\n\nАктуализация проходит в три этапа - проверка, применение фактов, планирование времен у невыполненных состояний рейсов.\n\nЧтобы получить результат очистки и применения фактов к исходной задаче воспользуйтесь функцией очистки данных.\n\nПолученные в результате актуализации рейсы не меняют исполнителей, транспорт и порядок выполнения заказов, содержат только те работы, которые осталось выполнить.\n\nЗаказы, которые не могут быть выполнены, остаются назначенными на исполнителя и попадают в `waitlist`.\n\nУчет существующих рейсов:\n\n* Рейсы трансформируются в назначения `hardlink` - т.е. назначенные на рейс смены исполнителя и транспорта не могут использоваться в других рейсах.\n* У заявок, которые были запланированы в исходных рейсах, удаляются события-заменители и фиксируется порядок выполнения с помощью `precedence_in_trip`, если у этих заявок уже был указан порядок выполнения - он будет перезаписан.\n\nУчет текущего времени:\n\n* Если текущее время `actualize_settings.current_time` в данных не задано - то используется время получения запроса сервером.\n* Если текущее время больше чем левая граница временных окон всех событий и смен - то левая граница сдвигается до текущего времени.\n* К правой границе временных окон всех событий и смен добавляется допустимое время опоздания `actualize_settings.max_delay_duration`.\n* Мягкие временные окна корректируются только в случае, если длительность заявки не позволяет выполнить заказ внутри мягкого окна.\n\nУчет фактов:\n\n* Учитываются только те факты, которые произошли до `actualize_settings.current_time` (по полю `time`), при этом не важно, насколько раньше текущего времени произошел факт.\n* При наличии нескольких фактов (одного типа и с ссылкой на одинаковые сущности) учитывается только самый поздний по полю `time`.\n* Если список фактов пустой - производится только учет существующих рейсов и текущего времени.\n\nУчет факта о изменения местоположения `NEW_LOCATION`:\n\n* Для учета факта в списке локаций `locations` должна находится локация (существующая или новая), которая описывает новое местоположение исполнителя.\n* Если рейс начался (время факта позже планового времени начала рейса) - транспорт считается в той же локации, что и исполнитель - т.е. изменяются `start_location_key` у исполнителя и транспорта.\n* Если рейс не начался (время факта до планового времени начала рейса) - изменяется только начальная локация исполнителя, локация транспорта остается из исходных данных.\n\nУчет факта о завершении заказа `ORDER_DONE`:\n\n* Из данных для актуализации удаляются заказ, его заявки и связанные с ними локации (если на них не ссылаются другие сущности).\n* Груз считается выгруженным из транспорта.\n\nУчет фактов о начале работ над заявкой `DEMAND_START`:\n\n* На каждый рейс разрешен только один незакрытый факт `DEMAND_START` (закрывается фактом `DEMAND_DONE`) - так как исполнитель может в один момент времени выполнять только одну заявку.\n* Время работы над заявкой сокращается на уже потраченное на нее время (вычисляется как длина промежутка между фактом `DEMAND_START` и `actualize_settings.current_time`).\n* Если есть факт о работе по заявке, которая противоречит плановому порядку в указанном рейсе - будет сперва завершена эта заявка, затем продолжится выполнение рейса согласно запланированному порядку.\n* Факт о заказе имеет больший приоритет, чем факты о заявках по этому заказу (если факты о заявках противоречат факту о заказе - они не будут учтены).\n\nУчет фактов о частичном выполнении заказов `DEMAND_DONE`:\n\n* Если у заказа выполнены все заявки - он считается завершенным (действия аналогичны обработке факта `ORDER_DONE`).\n* Если выполнена заявка с типом `WORK`, то заявка удаляется из заказа.\n* Если выполнена заявка с типом `DROP`, то заявка и ее грузы, а также соответствующая ей заявка с типом `PICKUP` удаляются из заказа.\n* Если выполнена заявка с типом `DROP_FROM_BOX` то заявка и ее груз удаляются из заказа.\n* Если у заказа выполнена заявка с типом `PICKUP`, то соответствующие ей заявки с типом `DROP` будут преобразованы в заявки с типом `DROP_FROM_BOX`.\n* Если выполнена заявка с типом `PICKUP_TO_BOX`, то заявка и груз удаляются и у транспорта уменьшается capacity соответствующего отсека (при это изменения совместимостей не производится).","item":[{"id":"1e344af0-8b31-53de-aa29-5996c959d3d8","name":"Актуализация (ASYNC)","request":{"name":"Актуализация (ASYNC)","description":{"content":"Запуск актуализации существующих рейсов - после загрузки и проверки данных возвращается идентификатор расчета `process_code`.\n\nС помощью `process_code` можно узнать состояние расчета, получить результат,\na также отменить расчет и удалить временные данные (иначе они автоматически удалятся по ttl, указанному в настройках расчета).\n\nЗадачу на актуализацию можно трансформировать в задачу на планирование с помощью переработки данных.","type":"text/plain"},"url":{"path":["universal","actualize","calculation-async"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"458cd94b-548e-5b18-bd85-1f4a4024693d","name":"Актуализация (SYNC)","request":{"name":"Актуализация (SYNC)","description":{"content":"Синхронный метод для актуализации существующих рейсов.\n\nДанный метод рекомендуется только для тестового использования и ручного запуска расчетов на небольшом объеме данных.\n\nДля боевой среды рекомендуется использовать асинхронный метод.","type":"text/plain"},"url":{"path":["universal","actualize","calculation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"92182890-ffed-53d5-9219-94b5335210ce","name":"Отмена расчета","request":{"name":"Отмена расчета","description":{"content":"Отмена процесса актуализации по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","actualize","calculation-async",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"c9a3df97-a0fd-5074-911f-810373393f3e","name":"Состояние расчета","request":{"name":"Состояние расчета","description":{"content":"Получение состояния расчета по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","actualize","state",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"080cc30e-cec5-5a8d-b3ae-77e8422ac315","name":"Получение результата","request":{"name":"Получение результата","description":{"content":"Получение результата актуализации по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","actualize","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"4dcb34cd-dc55-5976-9c44-4aaee53d0124","name":"Удаление результата","request":{"name":"Удаление результата","description":{"content":"Удаление результата по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","actualize","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"2e826319-61e4-5316-be85-a83ca2751f62","name":"Валидация данных","request":{"name":"Валидация данных","description":{"content":"Проверка данных для актуализации перед использованием.","type":"text/plain"},"url":{"path":["universal","actualize","validation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"3c62c08f-dc3b-565f-b6b9-c70a8a62f945","name":"Очистка данных","request":{"name":"Очистка данных","description":{"content":"Очистка данных для актуализации перед расчетом:\n * Из датасета удаляются сущности, на которые не ссылаются входные рейсы - исполнители, транспорт, назначения, заказы, факты.\n * Если на одну сущность ссылается несколько фактов - учитывается только самый поздний по полю time, если время совпадает - учитывается случайный из них.\n * Удаляются все факты, которые произошли позже, чем `actualize_settings.current_time`.\n\nВ результате возвращается задача для планирования.","type":"text/plain"},"url":{"path":["universal","actualize","refine"],"host":["{{baseUrl}}"],"query":[{"key":"remove_locations","value":"true","disabled":true,"description":{"content":"Флаг, отвечающий за удаление локации при очистке данных. Если указан `true` - удаляются локации, на которые не ссылается ни одна сущность в датасете.","type":"text/plain"}}],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}}]},{"name":"Replan","description":"Перепланирование - создание новых рейсов на основе уже существующих рейсов с учетом фактов.\n\nПерепланирование проходит в несколько этапов - проверка, применение фактов и создание ограничений для планирования на базе существующих рейсов, планирование.\n\nЧтобы получить результат очистки и применения фактов к исходной задаче воспользуйтесь переработкой данных.\n\nВ зависимости от настроек перепланирования - задача может быть сведена к планированию (когда все разрешено `reorder: true, plan_new_orders: true, create_new_trips: true`) или к актуализации (когда все запрещено `reorder: false, plan_new_orders: false, create_new_trips: false`).\n\nЗаказы, которые не могут быть выполнены - остаются назначенными на исполнителя и попадают в `waitlist`.\n\nУчет существующих рейсов, текущего времени и порядок применения фактов - используется логика из актуализации с учетом выбранной стратегии:\n\n","item":[{"id":"0ecd2de4-6a73-5d72-b2de-f28176ee5169","name":"Перепланирование (ASYNC)","request":{"name":"Перепланирование (ASYNC)","description":{"content":"Запуск перепланирования рейсов - изменение существующих и создание новых рейсов на основе произошедших фактов и данных о заказах, исполнителях и транспорте.\n \nПосле загрузки и проверки данных возвращается идентификатор расчета `process_code`.\n\nС помощью `process_code` можно узнать состояние расчета и получить результат,\na также отменить расчет и удалить временные данные (иначе они автоматически удалятся по ttl, указанному в настройках расчета).\n\nЗадачу на перепланирование можно трансформировать в задачу на планирование с помощью переработки данных.","type":"text/plain"},"url":{"path":["universal","replan","calculation-async"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"7a134490-690d-57d2-a7a4-679fd56e8165","name":"Перепланирование (SYNC)","request":{"name":"Перепланирование (SYNC)","description":{"content":"Синхронный метод для перепланирования существующих рейсов.\n\nДанный метод рекомендуется только для тестового использования и ручного запуска расчетов на небольшом объеме данных.\n\nДля боевой среды рекомендуется использовать асинхронный метод.","type":"text/plain"},"url":{"path":["universal","replan","calculation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"f780f283-ef0e-581e-9d76-8f33487051fc","name":"Отмена расчета","request":{"name":"Отмена расчета","description":{"content":"Отмена процесса планирования по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","replan","calculation-async",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"161cda38-1696-53c0-8dcc-dd2500ab5afc","name":"Состояние расчета","request":{"name":"Состояние расчета","description":{"content":"Получение состояния расчета по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","replan","state",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"9896d55c-6302-508d-9e28-907719d9ad3e","name":"Получение результата","request":{"name":"Получение результата","description":{"content":"Получение результата перепланирования по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","replan","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"c65bbc2e-eeb9-5891-865b-f3aa70634d81","name":"Удаление результата","request":{"name":"Удаление результата","description":{"content":"Удаление результата перепланирования по идентификатору расчета.","type":"text/plain"},"url":{"path":["universal","replan","result",":process_code"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"11111111-2222-3333-4444-555555555555","key":"process_code","disabled":false,"description":{"content":"(Required) Уникальный идентификатор процесса.","type":"text/plain"}}]},"header":[],"method":"DELETE","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"6c5471b0-14de-53cb-b050-4b707c21a407","name":"Валидация данных","request":{"name":"Валидация данных","description":{"content":"Проверка данных для перепланирования перед использованием.","type":"text/plain"},"url":{"path":["universal","replan","validation"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"65be57db-682d-54bf-b079-cade64268d34","name":"Очистка данных","request":{"name":"Очистка данных","description":{"content":"Очистка данных для перепланирования перед расчетом:\n * Если на одну сущность ссылается несколько фактов - учитывается только самый поздний по полю time, если время совпадает - учитывается случайный из них.\n * Удаляются все факты, которые произошли позже, чем `actualize_settings.current_time`.\n * Если указан `plan_new_orders: false` - из исходной задачи удаляются все заказы, которых нет в указанных рейсах.\n * Если указан `create_new_trips: false` - из исходной задачи удаляются все исполнители и транспорт, которых нет в указанных рейсах, также удаляются незапланированные смены исполнителей и транспорта, которые есть в указанных рейсах.\n * После производится очистка данных для планирования.\n \nВ результате возвращается задача для планирования.","type":"text/plain"},"url":{"path":["universal","replan","refine"],"host":["{{baseUrl}}"],"query":[{"key":"remove_locations","value":"true","disabled":true,"description":{"content":"Флаг, отвечающий за удаление локации при очистке данных. Если указан `true` - удаляются локации, на которые не ссылается ни одна сущность в датасете.","type":"text/plain"}}],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}}]},{"name":"Convert","description":"Конвертация данных.","item":[{"id":"21ddcbd4-3c18-5bac-85d6-b04110dc7803","name":"JSON >> XLSX","request":{"name":"JSON >> XLSX","description":{"content":"Используется для конвертации данных в формат VRt.Universal XLSX.","type":"text/plain"},"url":{"path":["universal","convert","json-to-xlsx"],"host":["{{baseUrl}}"],"query":[{"key":"timezone","value":"3","disabled":true,"description":{"content":"Целевая временная зона данных.","type":"text/plain"}}],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/octet-stream"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"8885c878-cf9f-57b6-be37-2e310f4afdb1","name":"XLSX >> JSON","request":{"name":"XLSX >> JSON","description":{"content":"Используется для конвертации данных из формата VRt.Universal XLSX в формат VRt.Universal JSON.","type":"text/plain"},"url":{"path":["universal","convert","xlsx-to-json"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/octet-stream"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":""},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"2e518c71-ea39-51d2-93e5-ee7203c06f97","name":"JSON >> THRIFT","request":{"name":"JSON >> THRIFT","description":{"content":"Используется для конвертации входных данных в формат THRIFT.","type":"text/plain"},"url":{"path":["universal","convert","json-to-thrift"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"method":"POST","body":{"mode":"raw","raw":"","options":{"raw":{"headerFamily":"json","language":"json"}}},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}}]},{"name":"System","description":"Системные функции.\nВспомогательный функционал, общий для всех сервисов.","item":[{"id":"40721c5a-4e3f-578a-b651-8eed44a85c02","name":"Проверка доступности","request":{"name":"Проверка доступности","description":{"content":"Проверка доступности сервиса.","type":"text/plain"},"url":{"path":["universal","system","check"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"9844d4f0-fb45-5b6c-9fae-f305732913fe","name":"Получение версии сервиса","request":{"name":"Получение версии сервиса","description":{"content":"Получение версии сервиса.","type":"text/plain"},"url":{"path":["universal","system","version"],"host":["{{baseUrl}}"],"query":[],"variable":[]},"header":[{"key":"Accept","value":"application/json"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}},{"id":"ef12ce94-8885-5cb5-8633-7a30f732c107","name":"Получение документации","request":{"name":"Получение документации","description":{"content":"Получение файла с документацией на этот сервис.","type":"text/plain"},"url":{"path":["universal","file",":filename"],"host":["{{baseUrl}}"],"query":[],"variable":[{"type":"any","value":"file_en.html","key":"filename","disabled":false,"description":{"content":"(Required) Название файла.","type":"text/plain"}}]},"header":[{"key":"Accept","value":"text/html"}],"method":"GET","body":{},"auth":null},"response":[],"event":[],"protocolProfileBehavior":{"disableBodyPruning":true}}]}],"auth":{"type":"bearer","bearer":[{"type":"any","value":"{{bearerToken}}","key":"token"}]},"event":[],"variable":[{"key":"baseUrl","value":"https://api.edge7.veeroute.cloud"}],"info":{"_postman_id":"3a36da42-4fd0-59eb-bb95-b1fbc8fb676b","name":"VRt.Universal [UV]","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json","description":{"content":"# Описание\n\nПрограммный интерфейс для универсального планирования рейсов.\n\n## Возможности\n\n* Возможность забора груза из любой локации\n* Возможность разгрузки в любой локации\n* Парные заявки нескольких типов: `PICKUP` (погрузка), `DROP` (выгрузка)\n* Одиночные заявки нескольких типов: `DROP_FROM_BOX` (выгрузка груза, который уже находится в кузове), `PICKUP_TO_BOX` (забор груза в кузов без последующей выгрузки), `WORK` (работа на локации без перемещения груза)\n* Комплексный заказ может состоять из любого числа заявок любых типов\n* Транспорт и исполнители разделены на разные сущности, при планирование происходит оптимальное назначение исполнителя на транспорт\n* У транспорта несколько отсеков - каждый из которых может вмещать груз и обладает собственными характеристиками\n* Учёт совместимости груза с транспортом по параметрам габарита груза (длина, ширина, высота, дополнительные параметры вместимости)\n* Учёт совместимостей груз-отсек транспорта (возможность учесть свойства отсека: холодильник, термо-сумка, крепежи и т.п)\n* Заявки-заменители, т.е. возможность выполнить одну из заявок-заменителей, выбор которой происходит на основе её географического местоположения и временного окна\n\n## Поддержка ограничений\n\nОграничения на **исполнителя**:\n\n* Место старта/финиша\n* Учет передвижения исполнителя до точки старта транспорта\n* График доступности исполнителя - список временных окон, в которые исполнитель может совершать перемещения и совершать работу на локациях\n* Максимальная продолжительность работы исполнителя в течение заданного временного периода\n\nОграничения на **транспорт**:\n\n* Место старта/финиша\n* График доступности транспорта - список временных окон, в которые транспорт может совершать перемещения\n* Максимальная протяженность маршрута\n* Несколько отсеков в транспорте, каждый со своими параметрами\n* Ограничение сверху на суммируемые вместимости (вес, объем, количество заказов, количество заявок)\n\nОграничения на **заказ**:\n\n* Жесткие временные окна\n* Возможность указать разные допустимые окна работы локации и окна желаемого выполнения заявки\n* Учет порядка исполнения заявок в пределах маршрута\n* Список желаемых временных окон выполнения с разными стоимостями для каждого из них\n\n## Используемые совместимости\n\nСущности являются совместимыми, если список свойств одной сущности полностью покрывает список требований другой сущности (наоборот для `performer_blacklist` - списки не должны пересекаться).\n\nПоддерживаемые совместимости:\n\n| Название | Требования | Свойства |\n|-------------------------|----------------------------------|------------------------------|\n| Заказ - Исполнитель | order.performer_restrictions | performer.performer_features |\n| Заказ - Не Исполнитель | order.performer_blacklist | performer.performer_features |\n| Груз - Отсек | order.cargo.box_restrictions | transport.box.box_features |\n| Локация - Транспорт | location.transport_restrictions | transport.transport_features |\n| Транспорт - Исполнитель | transport.performer_restrictions | performer.performer_features |\n| Исполнитель - Транспорт | performer.transport_restrictions | transport.transport_features |\n| Заказ - Заказ | order.order_restrictions | order.order_features |\n| Груз - Груз | cargo.cargo_restrictions | cargo.cargo_features |\n\nПримеры бизнес правил:\n\n| Название | Пример бизнес-правила |\n|-------------------------|---------------------------------------------------------------------------------------|\n| Заказ - Исполнитель | Для выполнения заказа водитель должен иметь особое разрешение |\n| Заказ - Не Исполнитель | Водитель в черном списке |\n| Груз - Отсек | Для перевозки замороженной продукции необходим отсек с особым температурным режимом |\n| Локация - Транспорт | Ограничения на высоту транспорта |\n| Транспорт - Исполнитель | Для грузового транспорта водитель должен иметь категорию `C` |\n| Исполнитель - Транспорт | Водителю разрешено работать только на определенном транспорте |\n| Заказ - Заказ | Нельзя перевозить рыбу и фрукты в одном отсеке |\n| Груз - Груз | Два груза нельзя одновременно размещать в одном отсеке транспорта, по очереди - можно |\n\n## Назначения\n\nМеханизм назначений (`hardlinks`) необходим для указания требований по нахождению заказов, исполнителя и транспорта в одном рейсе.\n\nНазначение гарантирует нахождения сущностей в одном рейсе и не гарантирует факт планирования сущности.\nНапример, если исполнитель не успевает выполнить заказ, то он не запланируется, но назначится на рейс (попадет в `waitlist`).\n\nТакже назначение не отменяет указанные совместимости (и штрафы за нарушение совместимостей).\nНапример, если заказ не может быть выполнен исполнителем, он не запланируется, но назначится на рейс (попадет в `waitlist`).\n\n## Размещение грузов в кузове\n\nСписок способностей объекта вращаться (с шагом в 90 градусов):\n\n* `ALL` - можно поворачивать по любой оси любое количество раз\n* `YAW` - можно повернуть один раз по вертикальной оси (вокруг своей оси)\n* `PITCH` - можно повернуть один раз по поперечной оси (поставить вертикально)\n* `ROLL` - можно повернуть один раз по продольной оси (положить на бок)\n\n## Модель рейса\n\nРейс описывается списком состояний исполнителя, при этом одновременно исполнитель может находится в нескольких состояниях (например быть внутри рабочего временного окна локации и выполнять заказ на этой же локации).\n\nЗначения флагов, отвечающих за географическое положение (одновременно может быть несколько флагов):\n\n* `AROUND_LOCATION` - исполнитель находится рядом с локацией - в процессе парковки или выезда с нее.\n* `INSIDE_LOCATION` - исполнитель находится на локации.\n\nЗначения флагов, отвечающих за нахождения во временных окнах (одновременно может быть несколько флагов):\n\n* `INSIDE_WORKING_WINDOW` - исполнитель находится внутри рабочего временного окна.\n* `INSIDE_LOCATION_WINDOW` - исполнитель находится внутри времени работы локации.\n* `INSIDE_EVENT_HARD_WINDOW` - исполнитель находится внутри жесткого временного окна.\n* `INSIDE_EVENT_SOFT_WINDOW` - исполнитель находится внутри мягкого временного окна.\n\nЗначения флагов, отвечающих за действия (одновременно может быть только один флаг):\n\n* `ON_DEMAND` - исполнитель начал работу над заявкой.\n* `WAITING` - исполнитель начал ожидание.\n* `RELOCATING` - исполнитель начал перемещаться к следующей остановке.\n* `BREAK` - исполнитель начал на перерыв.\n* `REST` - исполнитель начал длительный отдых.\n* `ARRIVAL` - исполнитель начал парковку.\n* `DEPARTURE` - исполнитель завершил выезд с парковки.\n\nЗначения флагов, отвечающих за логическое состояние:\n\n* `DURING_ROUNDTRIP` - исполнитель выполняет кругорейс.\n\n### Пример маршрута с множеством состояний в каждый момент времени\n\n| Время | Набор активных флагов | Локация / Заказ / Заявка / Событие | Комментарий |\n|:------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------|:----------------------------------------------------------------|\n| 10:00 | INSIDE_LOCATION
AROUND_LOCATION | 2 / - / - / - | Стартовая локация |\n| 10:05 | AROUND_LOCATION
DEPARTURE | 2 / - / - / - | Выехали с парковки |\n| 10:10 | RELOCATING
DEPARTURE | 2 / - / - / - | Едем к первому заказу |\n| 10:20 | AROUND_LOCATION
ARRIVAL | 2 / - / - / - | Подъехали к первому заказу |\n| 10:40 | AROUND_LOCATION
INSIDE_LOCATION
WAITING | 2 / - / - / - | Припарковались |\n| 11:00 | AROUND_LOCATION
INSIDE_LOCATION
INSIDE_LOCATION_WINDOW
WAITING
INSIDE_EVENT_HARD_WINDOW | 2 / - / - / - | Дождались начала окна локации и одновременно доступности заказа |\n| 11:25 | AROUND_LOCATION
INSIDE_LOCATION
INSIDE_LOCATION_WINDOW
ON_DEMAND
INSIDE_WORKING_WINDOW
INSIDE_EVENT_HARD_WINDOW | 2 / 1 / 2 / 3 | Дождались смены исполнителя |\n| 11:30 | AROUND_LOCATION
INSIDE_LOCATION
INSIDE_LOCATION_WINDOW
ON_DEMAND
INSIDE_WORKING_WINDOW
INSIDE_EVENT_HARD_WINDOW
INSIDE_EVENT_SOFT_WINDOW | 2 / 1 / 2 / 3 | Пока работали - случилось мягкое окно |\n| 11:40 | AROUND_LOCATION
INSIDE_LOCATION
INSIDE_LOCATION_WINDOW
INSIDE_WORKING_WINDOW | 2 / - / - / - | Закончили работать |\n| 11:45 | AROUND_LOCATION
DEPARTURE
INSIDE_WORKING_WINDOW | 2 / - / - /- | Выехали с парковки |\n| 11:45 | RELOCATING
INSIDE_WORKING_WINDOW | - / - / - / - | Едем на следующий заказ |\n\n## Кругорейсы\n\nРейс состоит из одного или более кругорейсов.\n\nФлаг наличия кругорейса `DURING_ROUNDTRIP` выставляется при начале выполнения работ по заявке и убирается в одном из трёх случаев:\n\n* исполнитель прибыл в очередную локацию, чтобы перестать использовать транспорт\n* исполнитель прибыл в локацию, разделяющую кругорейсы\n* исполнитель перестал использовать транспорт (в локации, не разделяющей кругорейсы, после выполнения какого-то ещё действия)\n\nМежду концом одного кругорейса и началом другого кругорейса не может возникнуть смены локации `RELOCATING`, но могут произойти: ожидание `WAITING`, перерыв исполнителя `BREAK`, отдых исполнителя `REST`.\n\nЛокация разделяет рейс на кругорейсы в одном из двух случаев:\n\n* если у локации задано ограничение пропускной способности `timetable.limits` (в этом случае может быть больше одной локации, разделяющей рейс)\n* если локация одновременно является стартовой и конечной локацией всех исполнителей и транспортов, а также всех заявок с типом `PICKUP` (в это случае будет только одна локация, разделяющая рейс)\n\nПримерами таких локаций (в зависимости от постановки задачи) могут служить:\n\n* распределительные центры при доставке товаров в магазины или склады в задачах дальнемагистральной перевозки\n* магазины или склады при доставке товаров покупателям в задачах последней мили\n* свалки в задачах вывоза мусора\n\n## Конфигурация планирования\n\nДля каждого планирования есть возможность указать конфигурацию планирования, которая определяет целевую функцию, желаемое качество маршрутов и скорость расчета.\n\nНазвание конфигурации планирования передается в поле `trips_settings.configuration`.\n\nОсновные конфигурации:\n\n| Название | Задача |\n|---------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **optimize_distance** | Расставить как можно больше заказов, затем оптимизировать суммарный пробег (количество транспорта выбирается исходя из пробега), используется по умолчанию |\n| **optimize_transports** | Расставить как можно больше заказов, при этом использовать как можно меньше транспорта, при прочих равных оптимизировать время работы исполнителей |\n| **optimize_locality_grouping** | Расставить как можно больше заказов, при этом стремиться оптимизировать визуальную группировку маршрутов, но не их количество |\n| **optimize_cars_then_distance** | Расставить как можно больше заказов, затем оптимизировать количество транспорта, затем пробег |\n| **optimize_time** | Расставить как можно больше заказов, затем оптимизировать суммарное время работы исполнителей |\n| **optimize_cars_then_time** | Расставить как можно больше заказов, затем оптимизировать количество транспорта, затем суммарное время работы исполнителей |\n| **optimize_money** | Оптимизировать величину \"награда за выполнение заказов - затраты\", складывается из наград за заявки и расходов на исполнителей и транспорты (оптимизируемая величина неотрицательна) |\n\nДополнительные конфигурации:\n\n| Название | Задача |\n|-----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **visual_grouping** | Расставить как можно больше заказов, при этом использовать как можно меньше транспорта и маршруты должны быть визуально сгруппированы |\n| **optimize_visual_grouping** | Расставить как можно больше заказов, затем равномерно распределить заказы с учетом зон транспортной доступности (как visual_grouping, но визуальная группировка рассчитывается иначе) |\n| **optimize_cars_then_locality_grouping** | Расставить как можно больше заказов, затем оптимизировать количество транспорта, затем визуальную группировку маршрутов |\n| **optimize_cars_then_single_location_grouping_sequenced** | Расставить как можно больше заказов, затем оптимизировать количество машин, а затем надёжность |\n\nВ дополнение к существующим вариантам планирования возможно создание целевой функции непосредственно под бизнес-процессы клиента (запросить конфигурацию).\n\nДля разработки рекомендуется использовать **optimize_cars_then_distance**, так как данная конфигурация не требует детального подбора тарифов и стоимостей заказов.\n\n## Валидация данных\n\nВалидация входных данных состоит из нескольких этапов, которые описаны ниже.\n\n### 1. Проверка по схеме\n\nЕсли запрос не проходит по схеме, то планирование не запускается целиком и такая ошибка возвращается вместе с кодом 400 в `schema_errors`.\n\nМы рекомендуем проверять запрос по схеме (или yaml-файлу) перед отправкой на сервер.\n\n### 2. Проверка на логические ошибки, которые не позволяют продолжить планирование\n\nКорректные по схеме данные проходят второй этап проверки на возможность запуска планирования.\n\nПример ошибок на данном этапе - ключи, ведущие на пустые сущности, или если все заказы несовместимы со всеми исполнителями, т.е. то, что делает задачу планирования бессмысленной.\n\nДанные ошибки возвращаются вместе с кодом 400 в `logical_errors`.\n\n### 3. Проверка на логические ошибки, которые не позволяют продолжить планирование\n\nНа третьем этапе происходит проверка каждой сущности отдельно.\n\nВсе сущности, которые не прошли проверку - вырезаются из исходной задачи и не отправляются на планирование.\n\nВ зависимости от настройки `treat_warnings_as_errors` результаты данного типа проверки возвращаются в `warnings` вместе с кодом 400, либо вместе с результатом планирования.\n\n### 4. Проверки в процессе планирования\n\nЧасть проверок можно осуществить только в процессе планирования.\n\nНапример - что согласно указанным тарифам и по актуальному прогнозу пробок физически невозможно доехать до определенной точки.\n\nРезультаты данных проверок возвращаются в `warnings` либо вместе с результатом планирования.\n\nContact Support:\n Name: Veeroute Support Team\n Email: support@veeroute.com","type":"text/plain"}}}