rappiRescueComment top-level constant

String const rappiRescueComment

Введение

  1. Описание: Контроллер TriggerStatusController предоставляет конечную точку API для изменения статуса заказа.
  2. Маршруты: Обрабатываются POST-запросы по маршрутам /trigger/status_change.

Формат запроса

Тело нового и старого заказа содержится в словаре new, old: JSON-объект, содержащий данные заказа, описан в классе TriggerOrderCreateDto.

{
  "headers": [
    {
      "name": "Content-Type",
      "value": "application/json"
    },
    {
      "name": "User-Agent",
      "value": "hasura-graphql-engine/v2.36.0"
    }
  ],
  "payload": {
    "created_at": "2025-02-20T14:57:10.516881",
   "delivery_info": {
      "current_retry": 0,
      "max_retries": 0
    },
    "event": {
      "data": {
        "new": {
          "clientID": 985656,
          "comment": "comment",
          "createdAt": "2025-02-19T09:51:18.679796+00:00",
          "deliveredDate": null,
          "deliveryPrice": 0,
          "departmentId": 4,
          "discountId": null,
          "discounts": [],
          "districtId": "CL_5",
          "driverID": "6964cc22-c639-4bfd-88fd-6d408d88f9c1",
          "driverRefuseReasonId": null,
          "externalKey": null,
          "externalKey_vendorDatalinkId": null,
          "externalStatus": null,
          "id": 982277,
          "important": null,
          "isRescheduled": false,
          "isReturned": false,
          "isSaved": false,
          "operatorRefuseReasonId": null,
          "paymentExpirationDate": null,
          "paymentType": null,
          "paymentUrl": null,
          "plannedDate": "2025-02-19T09:51:18.679796+00:00",
          "plannedDateDuration": 90,
          "positionsToBeSent": false,
          "reasonRefusal": null,
          "resale": false,
          "rescheduleCount": 0,
          "shipmentId": null,
          "shortCode": "TEST-PUSH-NOT",
          "statusName": "DriverAssigned",
          "statusUpdatedAt": "2025-02-19T10:01:21.744935+00:00",
          "system": "amabuyer",
          "telegramUserEmail": null,
          "test": false,
          "totalCents": 300,
          "umbrellaID": null,
          "updatedAt": "2025-02-19T12:55:19.765799+00:00",
          "vendorDatalinkId": 5,
          "warehouseID": null
        },
        "old": {
          "clientID": 985656,
          "comment": "comment",
          "createdAt": "2025-02-19T09:51:18.679796+00:00",
          "deliveredDate": null,
          "deliveryPrice": 0,
          "departmentId": 4,
          "discountId": null,
          "discounts": [],
          "districtId": "CL_5",
          "driverID": "6964cc22-c639-4bfd-88fd-6d408d88f9c1",
          "driverRefuseReasonId": null,
          "externalKey": null,
          "externalKey_vendorDatalinkId": null,
          "externalStatus": null,
          "id": 982277,
          "important": null,
          "isRescheduled": false,
          "isReturned": false,
          "isSaved": false,
          "operatorRefuseReasonId": null,
          "paymentExpirationDate": null,
          "paymentType": null,
          "paymentUrl": null,
          "plannedDate": "2025-02-19T09:51:18.679796+00:00",
          "plannedDateDuration": 90,
          "positionsToBeSent": false,
          "reasonRefusal": null,
          "resale": false,
          "rescheduleCount": 0,
          "shipmentId": null,
          "shortCode": "TEST-PUSH-NOT",
          "statusName": "Recall",
          "statusUpdatedAt": "2025-02-19T10:01:21.744935+00:00",
          "system": "amabuyer",
          "telegramUserEmail": null,
          "test": false,
          "totalCents": 300,
          "umbrellaID": null,
          "updatedAt": "2025-02-19T12:55:19.765799+00:00",
          "vendorDatalinkId": 5,
          "warehouseID": null
        }
      },
      "op": "MANUAL",
     "session_variables": {
        "x-hasura-role": "admin"
     },
      "trace_context": {
        "sampling_state": "1",
        "span_id": "7a50df8f6ef5dde5",
        "trace_id": "8a33d6b0c66033c93f642a7fbcc1d1e5"
     }
    },
    "id": "33d0b4e1-b7a9-4611-a5cb-fe15d3663124",
    "table": {
      "name": "order",
      "schema": "public"
    },
    "trigger": {
      "name": "order_created"
    }
  },
  "version": "2"
}

Валидация и преобразование данных

Основная логика

Контроллер последовательно обрабатывает статусы заказа.

  1. Создание отгрузки для заказа со статусом PickedAndSent:
    • Получение заказа из Hasure
    • .
    • Получение склада по департаменту
    • .
    • Создание новой отгрузки в Hasura
    • .
    • Обновление заказа для новой отгрузки
    • .
  2. Новый статус PickedAndSent, а старый ReturnedStock: создание документа поступления продуктов заказа для склада.
    • Получение заказа из Hasure
    • .
    • Получение склада по департаменту
    • .
    • Создание документа поступления
    • .
  3. Новый статус DriverAssigned, а старый пустой и не Recall: обновляет расписание CRM и отправляет уведомление водителю о заказе.
    • Получение клиента
    • .
    • Обновляем расписание в CRM при условии, что у клиента есть назначенный districtId и plannedDate не превышает 5 дней от текущей даты
    • .
    • Отправляем уведомления водителю в приложение
    • .
  4. Новый статус DriverConfirmed, а старый не пустой и Recall: помечает флаг спасения isSaved=true.
  5. Новый статус Recall: создаём Task в Umbrella.
    • Проверяем корректность driverRefuseReasonId
    • .
    • Получаем комментарии заказа
    • .
    • Создаём task
    • .
  6. Новый статус RescheduleOnDelivering этот фрагмент автоматически меняет статус заказа из RescheduleOnDelivering на:
    • Recall, если plannedDate=null
    • .
    • DriverConfirmed, если plannedDate заполнен
    • .
  7. Новый статус ReturnOnDelivering этот фрагмент автоматически меняет статус заказа из ReturnOnDelivering на Recall

Взаимодействие с микросервисами

  1. Hasura: Получение данных по заказу, пользователю и т.д.
  2. Umbrella Partner: Запрос для проверки есть ли расписание у района.
  3. FCM: Отправка уведомлений водителю.

Ответы сервера

  1. Ошибки обработки: Возможны различные ошибки, такие как.
    1. Некорректный статус отмены. Ожидаемый статус - 400 badRequest.
    2. Неудачное создание shipment . Ожидаемый статус - 500 internalServerError.
    3. Неудачное создание incoming . Ожидаемый статус - 500 internalServerError.
    4. Неудачная отправка уведомлений водителю . Ожидаемый статус - 500 internalServerError.
    5. Неудачное создание task в umbrella. Ожидаемый статус - 500 internalServerError.
    6. Неудачное изменение статуса в пункте 6, 7. Ожидаемый статус - 500 internalServerError.
    7. Инные ошибки. Ожидаемый статус - 500 internalServerError.
  2. Успешные операции:
    1. Удачное создание shipment - 200 OK.
    2. Удачное создание incoming - 200 OK.
    3. Удачная отправка уведомлений водителю - 200 OK.
    4. Удачное создание task в umbrella - 200 OK.
    5. Удачное изменение статуса в пункте 6, 7 - 200 OK.

Implementation

const rappiRescueComment = 'Rappi order send to recall by system';