อัปเดตสถานะจุดแวะ

เอกสารนี้ถือว่าคุณคุ้นเคยกับสิ่งต่อไปนี้

ตามที่ระบุไว้ในงานที่กำหนดเวลาไว้ใน Fleet Engine Essentials คุณจะสร้างงานและเชื่อมโยงกับจุดจอดรถเพื่อจำลองการเชื่อมโยงในชีวิตจริงระหว่างงานกับตำแหน่งที่คาดว่ารถจะหยุดเพื่อให้คนขับทำงานให้เสร็จสมบูรณ์

จากนั้นคุณจัดการความคืบหน้าของงานตลอดวงจรได้โดยการส่งการอัปเดตไปยัง Fleet Engine เพื่อให้ระบบทำการกำหนดเส้นทางและการอัปเดตสถานะตลอดเส้นทางของงานได้ดีที่สุด วิธีหลักอย่างหนึ่งในการทำเช่นนี้คือการอัปเดตป้ายจอดรถเมื่อยานพาหนะเข้าใกล้ มาถึง และออกจากป้ายจอด ซึ่งจะช่วยให้สามารถรายงานและวิเคราะห์เกี่ยวกับความคืบหน้าของงานได้สำหรับทั้งผู้ให้บริการขนส่งและผู้ใช้ การอัปเดตสถานะเหล่านี้มีดังนี้

  • อยู่ระหว่างทาง: รายการ STATE สำหรับ VehicleStop ใช้ ENROUTE เพื่อบ่งบอกว่าป้ายจอดรถถัดไปในรายการสำหรับแผนการเดินทางของยานพาหนะ จากมุมมองของงาน หมายความว่างานใดก็ตามที่เชื่อมโยงกับจุดสิ้นสุดจะอยู่ในรายการถัดไปที่ต้องทำ
  • มาถึงแล้ว: รายการ STATE สำหรับ VehicleStop ใช้ ARRIVED เพื่อระบุว่ายานพาหนะมาถึงป้ายจอดแล้ว จากมุมมองของงาน หมายความว่างานใดก็ตามที่เชื่อมโยงกับการหยุดทำงานนั้นกำลังดำเนินการอยู่
  • เสร็จสิ้น: คุณทำเครื่องหมายจุดจอดรถว่าเสร็จสิ้นโดยนำออกจากรายการจุดจอดรถของยานพาหนะ เมื่อดำเนินการดังกล่าว Fleet Engine จะทําเครื่องหมายงานที่เกี่ยวข้องทั้งหมดเป็น "ปิดแล้ว" โดยอัตโนมัติ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการปิดงานได้ที่หัวข้อสรุปงาน

เอกสารนี้อธิบายวิธีหยุดสถานะการอัปเดตโดยใช้แนวทางฝั่งเซิร์ฟเวอร์ คุณยังดำเนินการนี้จากแอปคนขับได้ด้วยหากให้สิทธิ์คนขับจัดการงานโดยใช้อุปกรณ์ที่เชื่อถือได้ ใช้เพียงวิธีการเดียวเพื่อหลีกเลี่ยงเงื่อนไขการแข่งขันและรักษาแหล่งข้อมูลที่ถูกต้องเพียงแหล่งเดียว

ยานพาหนะกำลังไปยังจุดจอด

ระบบควรแจ้งให้ Fleet Engine ทราบเมื่อยานพาหนะเริ่มนำทางไปยังจุดหมายถัดไป ซึ่งจะช่วยปรับปรุงเวลาถึงโดยประมาณและการคํานวณเส้นทาง

ช่องที่ต้องกรอกสำหรับการหยุดอัปเดต

Fleet Engine จะไม่สนใจช่องอื่นๆ ทั้งหมดในเอนทิตีสำหรับการแจ้งเตือน

ช่องค่า
remainingVehicleJourneySegments รายการจุดจอดรถที่เหลือซึ่งมีสถานะระบุว่า State.NEW

ตัวอย่างเส้นทางที่หยุด

ตัวอย่างต่อไปนี้แสดงวิธีแจ้งให้ Fleet Engine ทราบว่ายานพาหนะกำลังมุ่งหน้าไปยังป้ายจอดรถถัดไป โดยใช้ไลบรารี gRPC ของ Java หรือการเรียก HTTP REST ไปยัง UpdateDeliveryVehicle ระบบจะทําเครื่องหมายป้ายจอดรถอื่นๆ ทั้งหมดว่าใหม่

gRPC

 static final String PROJECT_ID = "my-delivery-co-gcp-project";
 static final String VEHICLE_ID = "vehicle-8241890";

 DeliveryServiceBlockingStub deliveryService =
   DeliveryServiceGrpc.newBlockingStub(channel);

 // Vehicle settings
 DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
     // Next stop marked as ENROUTE
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 1st stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.7749)
                    .setLongitude(122.4194)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
            .setState(VehicleStop.State.ENROUTE)))
     // All other stops marked as NEW
     .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
        .setStop(VehicleStop.newBuilder()
            .setPlannedLocation(LocationInfo.newBuilder()
                .setPoint(LatLng.newBuilder()
                    .setLatitude(37.3382)
                    .setLongitude(121.8863)))
            .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
            .setState(VehicleStop.State.NEW)))
     .build();

 // DeliveryVehicle request
 UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
   UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
       .setName(vehicleName)
       .setDeliveryVehicle(deliveryVehicle)
       .setUpdateMask(FieldMask.newBuilder().addPaths("remaining_vehicle_journey_segments"))
       .build();

 try {
   DeliveryVehicle updatedDeliveryVehicle =
       deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
 } catch (StatusRuntimeException e) {
   Status s = e.getStatus();
   switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
   }
   return;
 }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • <id> คือตัวระบุที่ไม่ซ้ำกันสำหรับงาน
  • ส่วนหัวคำขอต้องมีช่องการให้สิทธิ์ซึ่งมีค่าเป็น Bearer <token> โดยที่ <token> มาจากเซิร์ฟเวอร์ของคุณตามหลักเกณฑ์ที่อธิบายไว้ในบทบาทของบัญชีบริการและโทเค็นเว็บ JSON
  • เนื้อหาของคำขอต้องมีเอนทิตี DeliveryVehicle ดังนี้

ตัวอย่างคำสั่ง curl

 # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
 # environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "remainingVehicleJourneySegments": [
     {
       "stop": {
         "state": "ENROUTE",
         "plannedLocation": {
           "point": {
             "latitude": 37.7749,
             "longitude": -122.084061
           }
         },
         "tasks": [
           {
             "taskId": "${TASK1_ID}"
           }
         ]
       }
     },
     {
       "stop": {
         "state": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

ยานพาหนะมาถึงป้ายจอด

เครื่องยนต์ของกลุ่มรถต้องได้รับการแจ้งเตือนเมื่อยานพาหนะมาถึงป้ายจอด

ฟิลด์ที่ต้องกรอกสำหรับการหยุดอัปเดต

Fleet Engine จะไม่สนใจช่องอื่นๆ ทั้งหมดในเอนทิตีสำหรับการแจ้งเตือน

ช่องค่า
remainingVehicleJourneySegments รายการจุดจอดรถที่เหลือซึ่งมีสถานะระบุว่า State.NEW

ตัวอย่างการมาถึงป้ายจอดรถ

ตัวอย่างต่อไปนี้แสดงวิธีแจ้งให้ Fleet Engine ทราบว่ายานพาหนะมาถึงป้ายจอดแล้ว โดยใช้ไลบรารี gRPC ของ Java หรือการเรียก HTTP REST ไปยัง UpdateDeliveryVehicle ส่วนป้ายจอดรถอื่นๆ ทั้งหมดจะทำเครื่องหมายว่าใหม่

gRPC

  static final String PROJECT_ID = "my-delivery-co-gcp-project";
  static final String VEHICLE_ID = "vehicle-8241890";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Vehicle settings
  String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
  DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
      // Marking the arrival at stop.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.7749)
                     .setLongitude(122.4194)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
             .setState(VehicleStop.State.ARRIVED)))
      // All other remaining stops marked as NEW.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // 2nd stop
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.3382)
                     .setLongitude(121.8863)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
             .setState(VehicleStop.State.NEW))) // Remaining stops must be NEW.
      .build();

  // DeliveryVehicle request
  UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
    UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
        .setName(vehicleName)
        .setDeliveryVehicle(deliveryVehicle)
        .setUpdateMask(FieldMask.newBuilder()
            .addPaths("remaining_vehicle_journey_segments"))
        .build();

  try {
    DeliveryVehicle updatedDeliveryVehicle =
        deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case NOT_FOUND:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

REST

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`
  • <id> คือตัวระบุที่ไม่ซ้ำกันสำหรับงาน
  • ส่วนหัวคำขอต้องมีช่องการให้สิทธิ์ซึ่งมีค่าเป็น Bearer <token> โดยที่ <token> มาจากเซิร์ฟเวอร์ของคุณตามหลักเกณฑ์ที่อธิบายไว้ในบทบาทของบัญชีบริการและโทเค็นเว็บ JSON
  • เนื้อหาของคำขอต้องมีเอนทิตี DeliveryVehicle ดังนี้

ตัวอย่างคำสั่ง curl

  # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
  # environment
  curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
    -H "Content-type: application/json" \
    -H "Authorization: Bearer ${JWT}" \
    --data-binary @- << EOM
  {
    "remainingVehicleJourneySegments": [
      {
        "stop": {
          "state": "ARRIVED",
          "plannedLocation": {
            "point": {
              "latitude": 37.7749,
              "longitude": -122.084061
            }
          },
          "tasks": [
            {
              "taskId": "${TASK1_ID}"
            }
          ]
        }
      },
      {
        "stop": {
          "state": "NEW",
          "plannedLocation": {
            "point": {
              "latitude": 37.3382,
              "longitude": 121.8863
            }
          },
          "tasks": [
            {
              "taskId": "${TASK2_ID}"
            }
          ]
        }
      }
    ]
  }
  EOM

ยานพาหนะหยุดจนเสร็จสมบูรณ์

เครื่องยนต์ของฝูงรถต้องได้รับการแจ้งเตือนเมื่อรถหยุดจนเสร็จสมบูรณ์ ซึ่งจะทำให้งานทั้งหมดที่เชื่อมโยงกับการหยุดทำงานมีสถานะเป็น "ปิด"

ช่องที่ต้องกรอกสำหรับการหยุดอัปเดต

Fleet Engine จะไม่สนใจช่องอื่นๆ ทั้งหมดในเอนทิตีสำหรับการแจ้งเตือน

ช่องค่า
remainingVehicleJourneySegments รายการจุดจอดรถที่เหลือซึ่งมีสถานะระบุว่า State.NEW จุดจอดแรกในรายการต้องมีการทำเครื่องหมายสถานะเป็น State.ENROUTE

แสดงตัวอย่างการหยุด

ตัวอย่างต่อไปนี้แสดงวิธีแจ้งให้ Fleet Engine ทราบว่ายานพาหนะมาถึงป้ายจอดแล้ว โดยใช้ไลบรารี gRPC ของ Java หรือการเรียก HTTP REST ไปยัง UpdateDeliveryVehicle ส่วนป้ายจอดรถอื่นๆ ทั้งหมดจะทำเครื่องหมายว่าใหม่

gRPC

  static final String PROJECT_ID = "my-delivery-co-gcp-project";
  static final String VEHICLE_ID = "vehicle-8241890";

  DeliveryServiceBlockingStub deliveryService =
    DeliveryServiceGrpc.newBlockingStub(channel);

  // Vehicle settings
  String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
  DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
      // This stop has been completed and is commented out to indicate it
      // should be removed from the list of vehicle journey segments.
      // .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()
      //    .setStop(VehicleStop.newBuilder()
      //        .setPlannedLocation(LocationInfo.newBuilder()
      //            .setPoint(LatLng.newBuilder()
      //                .setLatitude(37.7749)
      //                .setLongitude(122.4194)))
      //        .addTasks(TaskInfo.newBuilder().setTaskId(TASK1_ID))
      //        .setState(VehicleStop.State.ARRIVED)))
      // All other remaining stops marked as NEW.
      // The next stop could be marked as ENROUTE if the vehicle has begun
      // its journey to the next stop.
      .addRemainingVehicleJourneySegments(VehicleJourneySegment.newBuilder()  // Next stop
         .setStop(VehicleStop.newBuilder()
             .setPlannedLocation(LocationInfo.newBuilder()
                 .setPoint(LatLng.newBuilder()
                     .setLatitude(37.3382)
                     .setLongitude(121.8863)))
             .addTasks(TaskInfo.newBuilder().setTaskId(TASK2_ID))
             .setState(VehicleStop.State.NEW)))
      .build();

  // DeliveryVehicle request
  UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
    UpdateDeliveryVehicleRequest.newBuilder()  // no need for the header
        .setName(vehicleName)
        .setDeliveryVehicle(deliveryVehicle)
        .setUpdateMask(FieldMask.newBuilder()
            .addPaths("remaining_vehicle_journey_segments"))
        .build();

  try {
    DeliveryVehicle updatedDeliveryVehicle =
        deliveryService.updateDeliveryVehicle(updateDeliveryVehicleRequest);
  } catch (StatusRuntimeException e) {
    Status s = e.getStatus();
    switch (s.getCode()) {
       case NOT_FOUND:
         break;
       case PERMISSION_DENIED:
         break;
    }
    return;
  }

REST

PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`
  • <id> คือตัวระบุที่ไม่ซ้ำกันสำหรับงาน
  • ส่วนหัวคำขอต้องมีช่องการให้สิทธิ์ซึ่งมีค่าเป็น Bearer <token> โดยที่ <token> มาจากเซิร์ฟเวอร์ของคุณตามหลักเกณฑ์ที่อธิบายไว้ในบทบาทของบัญชีบริการและโทเค็นเว็บ JSON
  • เนื้อหาของคำขอต้องมีเอนทิตี DeliveryVehicle ดังนี้

ตัวอย่างคำสั่ง curl

 # Set JWT, PROJECT_ID, VEHICLE_ID, TASK1_ID, and TASK2_ID in the local
 # environment
 curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}?updateMask=remainingVehicleJourneySegments" \
   -H "Content-type: application/json" \
   -H "Authorization: Bearer ${JWT}" \
   --data-binary @- << EOM
 {
   "remainingVehicleJourneySegments": [
     {
       "stop": {
         "state": "NEW",
         "plannedLocation": {
           "point": {
             "latitude": 37.3382,
             "longitude": 121.8863
           }
         },
         "tasks": [
           {
             "taskId": "${TASK2_ID}"
           }
         ]
       }
     }
   ]
 }
 EOM

ขั้นตอนถัดไป