Gönderim Takibi için Fleet Engine'i kullanmaya başlayın

Fleet Engine Deliveries API ile teslimatların ilk ve son aşaması için filo faaliyetlerinizi modelleyin. Bu API'yi Android ve iOS için Sürücü SDK'sını kullanarak veya doğrudan HTTP REST ya da gRPC çağrılarını kullanarak kullanabilirsiniz.

İlk kurulum

Fleet Engine Deliveries API'yi Google Cloud Console'da yapılandırırsınız.

Ayarlarınızı doğrulama

Servis hesapları oluşturduktan sonra kurulumunuzun tamamlandığını doğrulayın ve teslimat aracı oluşturabilirsiniz. Kurulumunuzu hemen doğrulamak, projenizi oluştururken ortaya çıkabilecek yaygın yetkilendirme sorunlarını gidermiş olmanızı sağlar. Ayarlarınızı doğrulamanın iki yolu vardır:

İstemci Kitaplıkları

Ham gRPC veya REST üzerinde daha iyi bir geliştirici deneyimi için birkaç yaygın programlama dilindeki istemci kitaplıklarını kullanın. Sunucu uygulamanız için istemci kitaplıklarını nasıl edineceğinizle ilgili talimatlar için İstemci Kitaplıkları bölümüne bakın.

Bu belgedeki Java örneklerinde gRPC hakkında bilgi sahibi olduğunuz varsayılmıştır.

Veri yapıları

Fleet Engine Deliveries API, gönderilerin teslim alma ve teslim sürecini modellemek için iki veri yapısı kullanır:

  • Gönderiyi taşımak için kullanılan teslimat aracı.
  • Sevkiyatın teslim alma ve teslimat görevleri.

Gün boyunca sürücü molalarını ve planlanan durakları modellemek için de görevleri kullanırsınız.

Teslimat araçları

Teslimat araçları, gönderileri bir depodan teslimat konumuna ve bir teslim alma konumundan depoya taşır. Bazı durumlarda bir gönderiyi doğrudan teslim alma konumundan teslimat konumuna da taşıyabilirler.

Fleet Engine'de DeliveryVehicle nesnesi oluşturmak ve gönderim ile filo takibi amacıyla konum güncellemeleri göndermek için Driver SDK'sını kullanın.

Görevler

Bir aracın gün içinde yaptığı işlemler için görevleri işlem türüne göre atarsınız:

  • Teslim alma ve teslimatlar için Gönderim görevleri atayın.
  • Sürücülerin gerekli molalar gibi müsait olmadığı zamanlar için Kullanılamayan mola görevleri atayın.
  • Açılır kutularda veya müşteri konumlarında sürüş yapılmayan görevler için Planlanmış durdurma görevleri atayın.

Atadığınız her görevin benzersiz bir görev kimliği olmalıdır ancak görevler aynı izleme kimliğini paylaşabilir. Fleet Engine her görev için GMR aralıklarını hesaplarken tahminlerde bulunmak için tüm görevleri ve planlandıkları sırayı kullanır. Görev kimlikleri hakkında daha fazla bilgi için Görev kimliği yönergeleri bölümüne bakın.

Fleet Engine'de görev oluşturmak için Driver SDK'sı Görev Yöneticisi'ni kullanın.

Gönderim görevleri

Bir gönderinin hem teslim alınması hem de teslim edilmesi için gönderim görevleri oluşturun ve aşağıdaki bilgileri ekleyin:

  • Teslim alma veya teslimat konumu.
  • Takip numarası veya kimliği.
  • Görevi tamamlamak, park yeri aramak veya teslimat konumuna yürümek için gereken ek süreyi hesaba katmak üzere bekleme süresi.
  • Benzersiz bir görev kimliği. Görev kimliği yönergeleri başlıklı makaleyi inceleyin.

Daha fazla bilgi için aşağıdaki konulara bakın:

Android

iOS

Görevlerin kullanılamaması

Kullanılamayan görevler, bir aracın teslim alma veya teslimat için uygun olmadığı zamanları (ör. araca yakıt doldurma molaları veya sürücü molaları) dahil eder.

Aşağıdaki bilgilerle bir kullanılamazlık görevi oluşturun:

  • Aranın uzunluğu.
  • İsteğe bağlı olarak, aranın konumu. Belirli bir konum sağlamanız gerekmez, ancak bunu yapmanız gün boyunca daha doğru TVS aralıkları sağlar.

Daha fazla bilgi için aşağıdaki konulara bakın:

Android

iOS

Planlanmış durdurma görevleri

Teslimat aracının yapması gereken durakları modellemek için planlı durdurma görevleri oluşturun. Örneğin, aynı konumdaki diğer teslimatlardan veya teslim alma işlemlerinden bağımsız olarak belirli bir konumdaki günlük planlanmış bir toplama durağı için planlanmış bir durdurma görevi oluşturun. Ayrıca açılır kutulardan gelen tahsilatlar için veya hizmet merkezleri ve hizmet noktalarındaki besleyici-araç aktarımlarını ya da duraklarını modellemek üzere planlı durdurma görevleri de oluşturabilirsiniz.

Daha fazla bilgi için aşağıdaki konulara bakın:

Android

iOS

Görev kimliği kuralları

Görev kimlikleri oluştururken aşağıdaki içerik ve biçim yönergelerini izleyin:

  • Benzersiz görev kimlikleri oluşturma
  • Kimliği tanımlayabilecek bilgiler (PII) veya net metin verileri açığa çıkarmayın.
  • Geçerli Unicode dizeleri kullanın.
  • En fazla 64 karakter kullanın.
  • Şu ASCII karakterlerini eklemeyin: "/", ":", "\", "?" veya "#".
  • Unicode Normalleştirme Formu C'ye göre normalleştirin.

Aşağıda, uygun Görev Kimliği örnekleri verilmiştir:

  • 566c33d9-2a31-4b6a-9cd4-80ba1a0c643b
  • e4708eabcfa39bf2767c9546c9273f747b4626e8cc44e9630d50f6d129013d38
  • NTA1YTliYWNkYmViMTI0ZmMzMWFmOWY2NzNkM2Jk

Aşağıdaki tabloda desteklenmeyen Görev Kimliği örnekleri gösterilmektedir:

Desteklenmeyen Görev Kimlikleri Neden
8/31/2019-20:48-46.70746,-130.10807,-85.17909,61.33680 Kimliği tanımlayabilecek bilgiler (PII) ve karakter gereksinimlerini (virgül, nokta, iki nokta üst üste ve eğik çizgi) ihlal ediyor.
JohnDoe-577b484da26f-Cupertino-SantaCruz Kimliği tanımlayabilecek bilgiler (PII) gereksinimlerini ihlal ediyor.
4R0oXLToF"112 Yaz Dr. East Hartford, CT06118"577b484da26f8a Kimliği tanımlayabilecek bilgiler (PII) ve karakter gereksinimlerini (boşluk, virgül ve tırnak işareti) ihlal ediyor. 64 karakterden uzun

Daha fazla kaynak

Her bir veri yapısında yer alan belirli alanları görmek için DeliveryVehicle (gRPC, REST) ve Task (gRPC, REST) API Referans belgelerini inceleyin.

Bir aracın ömrü

DeliveryVehicle nesnesi, bir ilk veya son kilometre teslimat aracını temsil eder. Şunu kullanarak bir DeliveryVehicle nesnesi oluşturabilirsiniz:

  • Fleet Engine API'lerini çağırmak için kullanılan hizmet hesabını içeren Google Cloud projesinin proje kimliği.
  • Müşteriye ait araç kimliği.

Her araç için benzersiz araç kimlikleri kullanın. Orijinal araç için aktif görev yoksa araç kimliğini yeniden kullanmayın.

Fleet Engine, UpdateDeliveryVehicle kullanılarak güncellenmemiş DeliveryVehicle nesneyi yedi gün sonra otomatik olarak siler. Bir aracın olup olmadığını öğrenmek için:

  1. UpdateDeliveryVehicle numaralı telefonu arayın.
  2. NOT_FOUND hatası alırsanız aracı yeniden oluşturmak için CreateDeliveryVehicle numaralı telefonu arayın. Çağrı bir araç döndürürse araç yine de güncellenebilir.

Araç türleri

VehicleType varlığı, isteğe bağlı bir VehicleType alanını içerir. Bu alan, AUTO, TWO_WHEELER, BICYCLE veya PEDESTRIAN olarak belirtebileceğiniz bir Category enum'u içerir. Bu alanı ayarlamazsanız varsayılan olarak AUTO olur.

Araçlar için tüm rotalarda, araç türüne karşılık gelen RouteTravelMode kullanılır.

Araç özellikleri

DeliveryVehicle varlığı, tekrarlanan bir DeliveryVehicleAttribute alanı içeriyor. ListDeliveryVehicles API, döndürülen DeliveryVehicle varlıklarını belirtilen özelliklere sahip olanlarla sınırlayabilen bir filter alanı içerir. DeliveryVehicleAttribute, Fleet Engine yönlendirme davranışını etkilemez.

Özelliklere kimlik bilgileri (PII) veya hassas bilgiler eklemeyin; çünkü bu alan kullanıcılar tarafından görülebilecektir.

Bir görevin ömrü

Deliveries API gRPC veya REST arayüzlerini kullanarak Fleet Engine'de görev oluşturabilir, güncelleyebilir ve sorgulayabilirsiniz.

Bir Task nesnesinin, yaşam döngüsü boyunca ilerlemesini izlemek için kullanabileceği bir durum alanı vardır. Değerler OPEN'dan CLOSED'a taşınır. Yeni görevler AÇIK durumunda oluşturulur. Bu durum şunlardan birini gösterir:

  • Görev henüz bir teslimat aracına atanmadı.
  • Teslimat aracı, görevin atanmış araç durağını henüz geçmedi.

Görev yönergeleri

Bir araca yalnızca AÇIK durumunda olan görev atayabilirsiniz.

Bir görevi, araç durakları listesinden kaldırarak iptal edersiniz ve görev durumu otomatik olarak KAPATILDI'ya ayarlanır.

Görevin aracı görevin araç durdurma işlemini tamamladığında:

  1. Görevin sonuç alanını BAŞARILI veya BAŞARISIZ olarak güncelleyin.

  2. Etkinliğin zaman damgasını belirtin.

    JavaScript Gönderim İzleme kitaplığı, görevin sonucunu belirtir ve görev durumu otomatik olarak KAPATILDI olarak ayarlanır. Daha fazla bilgi için JavaScript Kargo Takibi kitaplığıyla Gönderiminizi takip etme bölümünü inceleyin.

Araçlarda olduğu gibi, Fleet Engine yedi gün sonra güncellenmemiş görevleri siler ve zaten mevcut olan bir kimliğe sahip bir görev oluşturmaya çalışırsanız hata döndürür.

Not: Fleet Engine, görevlerin açıkça silinmesini desteklemez. Hizmet, görevleri güncelleme olmadan yedi gün sonra otomatik olarak siler. Görev verilerini yedi günden daha uzun süre saklamak istiyorsanız bu yeteneği kendiniz uygulamanız gerekir.

Görev özellikleri

Task varlığı, şu 3 türden birinden bir değere sahip olabilen tekrarlanan bir TaskAttribute alanı içeriyor: dize, sayı ve bool. ListTasks API, döndürülen Task varlıklarını belirtilen özelliklere sahip öğelerle sınırlandırabilen bir filter alanı içerir. Görev özellikleri, Fleet Engine yönlendirme davranışını etkilemez.

Bu özellikler kullanıcılar tarafından görülebileceğinden, özelliklere kimliği tanımlayabilecek bilgiler (PII) veya diğer hassas bilgiler eklemeyin.

Araçları ve görevlerin yaşam döngüsünü yönetin

Hatırlatma: Dahili sisteminiz, Fleet Engine Deliveries API'nin sizin adınıza artırdığı verilerin güvenilir kaynağı olarak görev yapar.

Sisteminizdeki araç ve görev yaşam döngülerini yönetmek amacıyla, araçlarınızı ve ilgili görevleri oluşturmak, güncellemek ve takip etmek için Fleet Engine Deliveries API'yi kullanın.

Sürücü uygulaması aynı zamanda cihaz konumu ve rota bilgilerini güncellemek için doğrudan Fleet Engine ile iletişim kurar. Bu model, Fleet Engine'in gerçek zamanlı konumu verimli bir şekilde yönetmesine olanak tanır. Konumu doğrudan izleme kitaplığına gönderir. Daha sonra bunu tüketicilere siparişlerinin durumu hakkında güncellemek için kullanabilirsiniz.

Örneğin, aşağıdaki senaryonuzun olduğunu varsayalım:

  • Teslimat durağına yaklaşan bir sürücü. Sürücü uygulaması, konumunu Fleet Engine'e gönderir.
  • Fleet Engine, cihaz konumunu izleme kitaplığına gönderir. İzleme kitaplığı, tüketici uygulamanızın bu kitaplığı kullanarak tüketiciyi paketlerinin yakınlığıyla ilgili olarak uyarması için kullanılır.
  • Sürücü, gönderimi tamamladıktan sonra sürücü uygulamasındaki "Gönderim teslim edildi" düğmesini tıklar.
  • "Gönderim teslim edildi" işlemi, bilgileri arka uç sisteminize gönderir ve bu sistemde gerekli işletme doğrulaması ve doğrulama adımlarını gerçekleştirir.
  • Sisteminiz, görevi SUCCEEDED olarak onaylar ve Deliveryies API'yi kullanarak Fleet Engine'i günceller.

Aşağıdaki diyagramda bu işlemler genel bir düzeyde gösterilmiştir. Ayrıca sisteminiz, istemciniz ve Fleet Engine arasındaki standart ilişkiyi de gösterir.

Deliveries API'yi kullanma

Müşteri jetonlarını yönet

Sürücü uygulamasından gelen ve doğrudan Fleet Engine'e gönderilen konum güncellemeleri, yetkilendirme jetonları gerektirir. İstemciden Fleet Engine'e gelen güncellemeleri ele almak için önerilen yaklaşım aşağıda verilmiştir:

  1. Fleet Engine Delivery Untrusted Driver User (Fleet Motoru Teslimatı Güvenilmeyen Sürücü Kullanıcısı) hizmet hesabı rolünü kullanarak jetonu oluşturun.

  2. Sürücü uygulamasına sınırlı kapsamlı bir jeton sağlayın. Bu kapsam, yalnızca Fleet Engine'de cihaz konumunu güncellemesine izin verir.

Bu yaklaşım, mobil cihazlardan (düşük güven düzeyine sahip olarak değerlendirilen ortamlar) gelen çağrıların en az ayrıcalık ilkesine uymasını sağlar.

Diğer hizmet hesabı rolleri

Sürücü uygulamalarına, Güvenilmeyen Sürücü rolüyle sınırlı olanların dışında, doğrudan Fleet Motoru güncellemeleri yapma yetkisi vermek isterseniz (örneğin, belirli görev güncellemeleri için), Güvenilir Sürücü rolünü kullanabilirsiniz. Güvenilir Sürücü rolünü kullanan bir model hakkında bilgi için Güvenilir Sürücü modeli'ne bakın.

Güvenilmeyen ve güvenilir sürücü rollerinin kullanımları hakkında daha fazla bilgi için Cloud projesi kurulumu başlıklı makaleyi inceleyin.

Bir iş günü modeli oluşturun

Aşağıdaki tabloda, bir teslimat ve lojistik şirketinde ilk veya son kilometre sürücüleri için bir iş gününün nasıl göründüğü açıklanmaktadır. Şirketiniz ayrıntılarda farklılık gösterebilir ancak bir iş günü için model oluşturmayı görebilirsiniz.

SaatEtkinlikModelleme
Günün başlangıcından itibaren 24 saat içinde Sevk görevlisi, gönderileri teslimat araçlarına veya rotalarına atar. Fleet Engine'de gönderi teslimatları, teslim alma, ara verme ve diğer görevleri önceden belirleyebilirsiniz. Örneğin, bir gönderim teslim alma görevi, gönderim teslim görevi, planlanmış stok durumu bilgisi veya zamanlanmış durdurma oluşturabilirsiniz.

Teslimat paketi grubu ve bunların teslim edilme sırası tamamlandığında araca görevler atayın.
Gün başlangıcı Sürücü, Sürücü uygulamasına giriş yaparak güne depoda başlar. Delivery Driver API'yi ilk kullanıma hazırlayın. Gerektiğinde Fleet Engine'de teslimat aracını oluşturun.
Sürücü, sevkiyatları tarayarak teslimat aracına yüklüyor. Gönderim teslimat görevleri önceden oluşturulmamışsa tarama sırasında gönderim teslimat görevleri oluşturun.
Sürücü, gerçekleştirilecek görevlerin sırasını onaylıyor. Önceden oluşturulmamışsa gönderim teslim görevleri, planlı stok durumu özelliği ve planlanmış duraklar oluşturun.
Sürücü depodan ayrılır ve tamamlanacak sonraki görev sayısına başlar. Tamamlama sırasını taahhüt ederek araca tüm görevleri veya bir görev alt kümesini atayın.
Sürücü bir gönderi teslim ediyor. Teslimat durağına vardıktan sonra durağa ulaşan bir araç ile ilgili işlemler yapın. Gönderimi teslim ettikten sonra teslimat görevini kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri ekleyin. Duraktaki tüm görevleri tamamladıktan sonra, bir sonraki durağa doğru yola çıkmadan önce araç durağı tamamlama ve araç bir sonraki durağa giden yolda ilerleme ile ilgili işlemler yapın.
Sürücü, ek sevkiyatları teslimat aracına aktarmak için besleyici araçla buluşuyor. Besleyici ile teslimat araçları arasındaki aktarım için buluşma noktası, planlanmış durak olarak modellenmelidir.

Gönderimleri aktarıp taradıktan sonra daha önce oluşturulmamışsa teslimat görevleri oluşturun. Ardından görevleri bir araca atayarak ve görev sıralamasını güncelleyerek görev tamamlama sırasını güncelleyin.
Sürücü, bir teslim alma isteğiyle ilgili bildirim alır. Teslim alma isteğini kabul ettikten sonra bir gönderim teslim alma görevi oluşturun. Ardından görevleri bir araca atayarak ve görev sıralamasını güncelleyerek görev yürütme sırasını güncelleyin.
Öğle Sürücü öğle molası veriyor. Bir konum, kullanılamama göreviyle ilişkilendirilmişse bunu diğer görevler gibi ele alın. Durağa gelen, araç durağı tamamlayan ve araç bir sonraki durağa giden araçla ilgili işlemleri gerçekleştirin.

Aksi takdirde, aranın sonuna kadar başka bir işlem yapmanız gerekmez. Sonraki ve kalan görevleri onaylayıp görev sıralamasını güncelleyerek görevi kaldırın.
Sürücü bir gönderiyi alıyor. Bu, tıpkı bir teslimat durağı gibi modellenir. Durağa gelen bir araç, bir görevi kapatma ve isteğe bağlı olarak gönderim durumunu ve diğer meta bilgileri saklama ile ilgili işlemler gerçekleştirin. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın. Not: Faturalandırmanın doğru olmasını sağlamak için tüm teslim alma işlemleriyle ilgili bir teslimat görevi olmalıdır. Teslim alma, o gün sürücüyle aynı rotadaki başka bir konuma teslim edilecekse bu teslimat görevinin rotadaki diğer herhangi bir teslimat göreviyle aynı şekilde modellenmesini öneririz. Sürücü, teslim alma işlemini tekrar depoya getiriyorsa depo hedefinde bir teslimat görevi oluşturmanızı öneririz.
Sürücü, gönderimleri bir teslim alma kutusundan almak için planlı bir duraklama yapıyor. Bu, tıpkı diğer teslim alma durakları gibi modellenir. durağa gelen bir araç ve bir görevi kapatma ile ilgili işlemler gerçekleştirin. Duraktaki tüm görevleri tamamlayıp bir sonraki durağa doğru sürmeye başladıktan sonra, araç bir durak tamamladığında ve araç bir sonraki durağa gidene kadar ile ilgili işlemler gerçekleştirin.
Sürücü, kargonun alternatif bir konuma yönlendirildiğine dair bildirim alır. Orijinal gönderim teslimat görevi durumunu TAMAMLANDI olarak ayarlayın ve yeni teslimat konumu için yeni bir gönderim teslimat görevi oluşturun. Daha fazla bilgi için Bir gönderimi yeniden yönlendirme bölümünü inceleyin.
Sürücü bir paket teslim etmeye çalıştı, ancak başaramadı. Bu, başarılı bir teslimat durağına benzer şekilde modellenir ve teslimat görevi tamamlandı olarak işaretlenir. Durağa gelen bir araç ile ilgili işlemler gerçekleştirin. Gönderimi teslim edemediyseniz görevi kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri kapatın. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın.
Sürücüye bir gönderiyi bekletmesi (teslim etmemesi) bildirildi. Bildirim alınıp onaylandıktan sonra görev durumunu TAMAMLANDI olarak ayarlayın.
Sürücüye, taahhüt edilen teslimat siparişinde değişiklik yapılması için bir sonraki gönderiyi teslim etmesi gerektiği bildirildi. Görev sıralamasını güncelleyin.
Sıra dışı bir gönderi teslim etmeyi seçen sürücü. Görev sıralamasını güncelleyin ve ardından normal şekilde devam edin.
Sürücü, tek bir konuma birden fazla gönderim teslim ediyor. Bu, tek bir gönderim teslimat durağına benzer şekilde modellenir. Durağa vardıktan sonra, durağa ulaşan bir araç ile ilgili işlemler yapın. Her gönderimi teslim ettikten sonra her görevi kapatın ve isteğe bağlı olarak mağaza gönderim durumu ile diğer meta bilgileri kapatın. Duraktaki tüm görevleri tamamladıktan sonra ve bir sonraki durağa doğru yola çıkmadan önce araç bir durak tamamlar ve araç bir sonraki durağa giden yolda ile ilgili işlemler yapın.
Gün sonu Sürücü depoya geri dönüyor. Sürücü, rotası sırasında teslim alınan gönderimlerle depoya geri dönerse doğru faturalandırma sağlamak için her paketi teslimat görevi olarak oluşturup kapatmanız gerekir. Bunu, depoyu diğer teslimat durakları gibi modelleyerek yapabilirsiniz. Depo, teslimat durağı olarak kullanılmıyorsa isteğe bağlı olarak depoyu planlanan durak olarak modelleyebilirsiniz. Durağın modellenmesi, sürücülerinizin depoya geri giden rotayı ve tahmini varış sürelerini görebilmelerini sağlar.

Konum güncellemelerinin işleyiş şekli

Fleet Engine ile en iyi performansı elde etmek için sisteme araç konumu güncellemeleri akışı sağlayın. Bu güncellemeleri sağlamak için aşağıdaki yöntemlerden birini kullanın:

  1. Sürücü SDK'sını (Android, iOS) kullanın.
  2. Özel kod kullanın. Konumlar arka ucunuz üzerinden aktarılıyorsa veya Android ya da iOS dışında cihazlar kullanıyorsanız kullanışlıdır.

Araç konum güncellemelerini nasıl sağladığınızdan bağımsız olarak arka ucunuz, bir teslimat aracı durağa doğru yola çıktığında (depo dahil) ve durağa geldiğinde Fleet Engine'i güncellemekten sorumludur. Fleet Engine bu olayları otomatik olarak algılamaz.

Araç durakları ve teslimat konumları

Araç durağı, teslimat aracının bir gönderim görevini veya başka bir görevi tamamladığı yerdir. Bu, yükleme yuvası veya yola yerleştirilmiş bir konum gibi bir erişim noktasıdır.

Teslimat konumu, kargonun teslim edildiği veya teslim alındığı yerdir. Teslimat konumuna giderken araç durağından yürüyerek ulaşmak gerekebilir.

Örneğin, bir sürücü alışveriş merkezindeki bir mağazaya ürün teslim ederken teslimat aracı, alışveriş merkezinin en yakın girişinin yakınındaki park yerinde durur. Burası araç durağı. Sürücü, daha sonra araç durağından mağazanın bulunduğu alışveriş merkezi konumuna doğru yürür. Bu, teslimat konumudur.

Kullanıcılarınıza en iyi kargo takibi deneyimini sunmak için, sevkiyat görevlerinin araç duraklarına nasıl atandığını düşünün ve gönderim görevlerinde kalan araç duraklarının sayısının kullanıcıya bildirildiğini unutmayın. Bu sayede, gönderimin ilerleme durumunu görüntüleyebilir.

Örneğin, bir sürücü tek bir ofis binasına çok sayıda teslimat yapıyorsa tüm teslimat görevlerini tek bir araç durağına atamak iyi bir fikir olabilir. Her teslimat görevi kendi araç durağına atanmışsa kargo takibi deneyiminiz kullanıcılarınız için daha az faydalı olur. Bunun nedeni, aracın varış noktasına başlamadan önce sınırlı sayıda durakta bulunması durumunda takip edilebilmesidir. Kısa süre içinde çok sayıda araç durağının tamamlanması, kullanıcıya teslimatın ilerleme durumunu izlemek için fazla zaman vermez.

Mobil SDK'ları kullanın

Sürücü SDK'sına herhangi bir çağrı yapmadan önce onu başlattığınızdan emin olun.

Delivery Driver API'yi ilk kullanıma hazırlama

Sürücü SDK'sında Delivery Driver API'yi başlatmadan önce Navigasyon SDK'sını başlattığınızdan emin olun. Ardından Delivery Driver API'yi aşağıdaki örnekte gösterildiği gibi başlatın:

static final String PROVIDER_ID = "provider-1234";
static final String VEHICLE_ID = "vehicle-8241890";

NavigationApi.getNavigator(
   this, // Activity.
   new NavigatorListener() {
     @Override
     public void onNavigatorReady(Navigator navigator) {
       DeliveryDriverApi.createInstance(DriverContext.builder(getApplication())
         .setNavigator(navigator)
         .setProviderId(PROVIDER_ID)
         .setVehicleId(VEHICLE_ID)
         .setAuthTokenFactory((context) -> "JWT") // AuthTokenFactory returns JWT for call context.
         .setRoadSnappedLocationProvider(NavigationApi.getRoadSnappedLocationProvider(getApplication()))
         .setNavigationTransactionRecorder(NavigationApi.getNavigationTransactionRecorder(getApplication()))
         .setStatusListener((statusLevel,statusCode,statusMsg) -> // Optional, surfaces polling errors.
             Log.d("TAG", String.format("New status update. %s, %s, %s", statusLevel, statusCode, statusMsg)))
         .build));
     }
     @Override
     public void onError(int errorCode) {
       Log.e("TAG", String.format("Error loading Navigator instance: %s", errorCode));
     }
   });

Kullanım alanları

Bu bölümde, yaygın kullanım alanlarını modellemek için Deliveries API'nin nasıl kullanılacağı açıklanmaktadır.

Benzersiz varlık tanımlayıcıları

REST çağrılarında kullanılan benzersiz varlık tanımlayıcılarının biçimi ve değeri Fleet Engine için opaktır. Otomatik olarak artan kimlikler kullanmaktan kaçının ve tanımlayıcının sürücünün telefon numarası gibi kimliği tanımlayabilecek bilgiler (PII) içermediğinden emin olun.

Araç oluşturma

Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından araç oluşturabilirsiniz.

gRPC

Yeni bir araç oluşturmak için Fleet Engine'e CreateDeliveryVehicle çağrısı yaparsınız. Yeni teslimat aracının özelliklerini tanımlamak için CreateDeliveryVehicleRequest nesnesini kullanın. Name alanı için belirtilen tüm değerlerin, kullanıcı tarafından belirtilen kimlikler için API kılavuzu uyarınca yok sayılacağını unutmayın. Aracın kimliğini ayarlamak için DeliveryVehicleId alanını kullanmalısınız.

İsteğe bağlı olarak, DeliveryVehicle oluştururken şu alanları belirtebilirsiniz:

  • Özellikler
  • LastLocation
  • Tür

Başka alan ayarlamayın. Bunu yaparsanız Fleet Engine bir hata döndürür, çünkü bu alanlar salt okunur olur veya yalnızca UpdateDeliveryVehicle çağrısıyla güncellenebilir.

İsteğe bağlı alan ayarlamadan araç oluşturmak için CreateDeliveryVehicleRequest içerisinde DeliveryVehicle alanını ayarlanmamış olarak bırakabilirsiniz.

Aşağıdaki örnekte, araç oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String VEHICLE_ID = "vehicle-8241890"; // Avoid auto-incrementing IDs.

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Vehicle settings
    String parent = "providers/" + PROJECT_ID;
    DeliveryVehicle vehicle = DeliveryVehicle.newBuilder()
      .addAttributes(DeliveryVehicleAttribute.newBuilder()
        .setKey("route_number").setValue("1"))  // Opaque to the Fleet Engine
      .build();

    // Vehicle request
    CreateDeliveryVehicleRequest createVehicleRequest =
      CreateDeliveryVehicleRequest.newBuilder()  // No need for the header
          .setParent(parent)
          .setDeliveryVehicleId(VEHICLE_ID)     // Vehicle ID assigned by the Provider
          .setDeliveryVehicle(vehicle)
          .build();

    // Error handling
    // If Fleet Engine does not have vehicle with that ID and the credentials of the
    // requestor pass, the service creates the vehicle successfully.

    try {
      DeliveryVehicle createdVehicle =
        deliveryService.createDeliveryVehicle(createVehicleRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

Sunucu ortamından araç oluşturmak için CreateDeliveryVehicle öğesine HTTP REST çağrısı yapın:

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles?deliveryVehicleId=<id>

<id>, filonuzdaki bir teslimat aracının benzersiz tanımlayıcısıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

POST gövdesi, oluşturulacak DeliveryVehicle varlığını temsil eder. Aşağıdaki isteğe bağlı alanları belirtebilirsiniz:

  • attributes
  • lastLocation
  • tür

Örnek curl komutu:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
--data-binary @- << EOM
{
  "attributes": [{"key": "model", "value": "sedan"}],
  "lastLocation": {"location": {"latitude": 12.1, "longitude": 14.5}}
}
EOM

Fleet Engine, kullanıcı tarafından belirtilen kimlikler için API kılavuzu başına DeliveryVehicle varlığının name alanını yoksayar. Başka alan ayarlamayın. Bunu yaparsanız Fleet Engine bir hata döndürür, çünkü bu alanlar salt okunur olur veya yalnızca UpdateDeliveryVehicle çağrısı kullanılarak güncellenebilir.

Herhangi bir alan ayarlamadan araç oluşturmak için POST isteğinin gövdesini boş bırakın. Daha sonra yeni oluşturulan araç, POST URL'sindeki deliveryVehicleId parametresinden bir araç kimliği çıkarır.

Örnek curl komutu:

# Set $JWT, $PROJECT_ID, and $VEHICLE_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?deliveryVehicleId=${VEHICLE_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}"

Gönderim teslim alma görevi oluşturma

Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bir gönderi teslim alma görevi oluşturabilirsiniz.

gRPC

Aşağıdaki örnekte, bir gönderim teslim alma görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have a task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Sunucu ortamından gönderi teslim alma görevi oluşturmak için CreateTask öğesine HTTP REST çağrısı yapın:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id>, görev için benzersiz bir tanımlayıcıdır. Bu, gönderimin takip numarası olmamalıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    tür Type.PICKUP
    state State.OPEN
    trackingId Bir gönderimi takip etmek için kullandığınız numara veya tanımlayıcı.
    plannedLocation Görevin tamamlanacağı konum (bu örnekte, gönderimin teslim alınacağı konum).
    taskDuration Gönderimi teslim alma konumunda teslim almak için geçen saniye cinsinden beklenen süre.

  • İsteğe bağlı alanlar:

    AlanDeğer
    targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu durum, yönlendirme davranışını etkilemez.
    attributes Özel Görev özelliklerinin listesi. Her özelliğin benzersiz bir anahtarı olmalıdır.

Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstek atanmış bir deliveryVehicleId içeriyorsa Fleet Engine bir istisna atar. Görevleri UpdateDeliveryVehicleRequest kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.

Örnek curl komutu:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "PICKUP",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

Gönderim teslimat görevi oluşturma

Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bir gönderim teslim görevi oluşturun.

gRPC

Aşağıdaki örnekte, gönderim teslim görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("my-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .setTargetTimeWindow(
    TimeWindow.newBuilder()
      .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
      .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
  .addAttributes(TaskAttribute.newBuilder().setKey("foo").setStringValue("value"))
  .addAttributes(TaskAttribute.newBuilder().setKey("bar").setNumberValue(10))
  .addAttributes(TaskAttribute.newBuilder().setKey("baz").setBoolValue(false))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

gRPC veya REST kullanarak bir sunucu ortamından gönderim teslim görevi oluşturmak için CreateTask öğesine bir HTTP REST çağrısı yapın:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id>, görev için benzersiz bir tanımlayıcıdır. Bu, gönderimin takip numarası olmamalıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    tür Type.DELIVERY
    state State.OPEN
    trackingId Bir gönderimi takip etmek için kullandığınız numara veya tanımlayıcı.
    plannedLocation Görevin tamamlanacağı konum, bu durumda bu gönderimin teslimat konumu.
    taskDuration Gönderinin teslimat konumunda bırakılması için gereken tahmini süre (saniye cinsinden).

  • İsteğe bağlı alanlar:

    AlanDeğer
    targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu durum, yönlendirme davranışını etkilemez.
    attributes Özel Görev özelliklerinin listesi. Her özelliğin benzersiz bir anahtarı olmalıdır.

Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.

Örnek curl komutu:

# Set $JWT, $PROJECT_ID, $TRACKING_ID, and $TASK_ID in the local
# environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "type": "DELIVERY",
  "state": "OPEN",
  "trackingId": "${TRACKING_ID}",
  "plannedLocation": {
     "point": {
        "latitude": -6.195139,
        "longitude": 106.820826
     }
  },
  "taskDuration": "90s",
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

Toplu Görev Oluşturma

gRPC veya REST kullanarak bir sunucu ortamından toplu görev oluşturabilirsiniz.

gRPC

Aşağıdaki örnekte, biri teslimat diğeri de aynı yerden teslim alma için olmak üzere iki görev oluşturmak üzere Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Delivery Task settings
Task deliveryTask = Task.newBuilder()
  .setType(Task.Type.DELIVERY)
  .setState(Task.State.OPEN)
  .setTrackingId("delivery-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Delivery Task request
CreateTaskRequest createDeliveryTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8312508")  // Task ID assigned by the Provider
      .setTask(deliveryTask)      // Initial state
      .build();

// Pickup Task settings
Task pickupTask = Task.newBuilder()
  .setType(Task.Type.PICKUP)
  .setState(Task.State.OPEN)
  .setTrackingId("pickup-tracking-id")
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Pickup Task request
CreateTaskRequest createPickupTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header or parent fields
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTask(pickupTask)        // Initial state
      .build();

// Batch Create Tasks settings
String parent = "providers/" + PROJECT_ID;

// Batch Create Tasks request
BatchCreateTasksRequest batchCreateTasksRequest =
  BatchCreateTasksRequest.newBuilder()
      .setParent(parent)
      .addRequests(createDeliveryTaskRequest)
      .addRequests(createPickupTaskRequest)
      .build();

// Error handling
// If Fleet Engine does not have any task(s) with these task ID(s) and the
// credentials of the requestor pass, the service creates the task(s)
// successfully.

try {
  BatchCreateTasksResponse createdTasks = deliveryService.batchCreateTasks(
    batchCreateTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Sunucu ortamından teslimat ve teslim alma görevi oluşturmak için BatchCreateTasks öğesine HTTP REST çağrısı yapın:

POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks:batchCreate

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir BatchCreateTasksRequest varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    istek Dizi<CreateTasksRequest>

  • İsteğe bağlı alanlar:

    AlanDeğer
    başlık "deliveryRequestHeader"

parent ve header alanlarının isteğe bağlı olması dışında requests içindeki her CreateTasksRequest öğesi, bir CreateTask isteğiyle aynı doğrulama kurallarını geçmelidir. Ayarlanırsa üst düzeydeki BatchCreateTasksRequest ilgili alanlarıyla aynı olmalıdırlar. Her birine özel doğrulama kuralları için gönderim teslim alma görevi oluşturma ve gönderim teslimatı görevi oluşturma konularına bakın.

Daha fazla bilgi için BatchCreateTasks API Referansı belgelerine (gRPC, REST) bakın.

Örnek curl komutu:

# Set $JWT, $PROJECT_ID, $DELIVERY_TRACKING_ID, $DELIVERY_TASK_ID,
# $PICKUP_TRACKING_ID, and $PICKUP_TASK_ID in the local environment
curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks:batchCreate" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "requests" : [
    {
      "taskId": "${DELIVERY_TASK_ID}",
      "task" : {
        "type": "DELIVERY",
        "state": "OPEN",
        "trackingId": "${DELIVERY_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    },
    {
      "taskId": "${PICKUP_TASK_ID}",
      "task" : {
        "type": "PICKUP",
        "state": "OPEN",
        "trackingId": "${PICKUP_TRACKING_ID}",
        "plannedLocation": {
          "point": {
              "latitude": -6.195139,
              "longitude": 106.820826
          }
        },
        "taskDuration": "90s"
      }
    }
  ]
}
EOM

Planlanan kullanım dışı kalma

Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından, kullanılabilir olmadığını belirten bir görev (örneğin, sürücü kırılmaları veya araçta yakıt doldurma) oluşturabilirsiniz. Planlanmış bir kullanılamama görevi, izleme kimliği içermemelidir. İsteğe bağlı olarak bir yer de girebilirsiniz.

gRPC

Aşağıdaki örnekte, kullanılamayan bir görev oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String parent = "providers/" + PROJECT_ID;
    Task task = Task.newBuilder()
      .setType(Task.Type.UNAVAILABLE)
      .setState(Task.State.OPEN)
      .setTaskDuration(
        Duration.newBuilder().setSeconds(60 * 60))  // 1hr break
      .build();

    // Task request
    CreateTaskRequest createTaskRequest =
      CreateTaskRequest.newBuilder()  // No need for the header
          .setParent(parent)          // Avoid using auto-incrementing IDs for the taskId
          .setTaskId("task-8241890")  // Task ID assigned by the Provider
          .setTask(task)              // Initial state
          .build();

    // Error handling
    // If Fleet Engine does not have task with that ID and the credentials of the
    // requestor pass, the service creates the task successfully.

    try {
      Task createdTask = deliveryService.createTask(createTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case ALREADY_EXISTS:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

Bir sunucu ortamından kullanılamaz hale gelme görevi oluşturmak için CreateTask hedefine HTTP REST çağrısı yapın:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id>, görev için benzersiz bir tanımlayıcıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    tür Type.UNAVAILABLE
    state State.OPEN
    taskDuration Saniye cinsinden ara uzunluğu.

  • İsteğe bağlı alanlar:

    AlanDeğer
    plannedLocation Belirli bir konumda alınması gerekiyorsa aranın bulunduğu yer.

Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.

Örnek curl komutu:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "UNAVAILABLE",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "300s"
    }
    EOM

Planlanan aktarmalar

Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından zamanlanmış bir durdurma görevi oluşturabilirsiniz. Zamanlanmış bir durdurma görevi izleme kimliği içermeyebilir.

gRPC

Aşağıdaki örnekte, zamanlanmış bir durdurma görevi oluşturmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String parent = "providers/" + PROJECT_ID;
Task task = Task.newBuilder()
  .setType(Task.Type.SCHEDULED_STOP)
  .setState(Task.State.OPEN)
  .setPlannedLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .setTaskDuration(
    Duration.newBuilder().setSeconds(2 * 60))
  .build();

// Task request
CreateTaskRequest createTaskRequest =
  CreateTaskRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setTaskId("task-8241890")  // Task ID assigned by the Provider
      .setTrip(task)              // Initial state
      .build();

// Error handling
// If Fleet Engine does not have task with that ID and the credentials of the
// requestor pass, the service creates the task successfully.

try {
  Task createdTask = deliveryService.createTask(createTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case ALREADY_EXISTS:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Bir sunucu ortamından zamanlanmış durdurma görevi oluşturmak için CreateTask hedefine bir HTTP REST çağrısı yapın:

`POST https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks?taskId=<id>`

<id>, görev için benzersiz bir tanımlayıcıdır. Sisteminizde görev kimlikleri yoksa evrensel olarak benzersiz bir tanımlayıcı (UUID) oluşturabilirsiniz.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    tür Type.SCHEDULED_STOP
    state State.OPEN
    plannedLocation Durağın konumu.
    taskDuration Saniye cinsinden tahmini durak süresi.

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, oluşturma işlemi için yoksayılır. İstekte atanmış bir deliveryVehicleId varsa Fleet Engine bir istisna oluşturur. Görevleri UpdateDeliveryVehicleRequest kullanarak atarsınız. Daha fazla bilgi için Bir araca görev atama ve UpdateDeliveryVehicleRequest'i inceleyin.

Örnek curl komutu:

    # Set $JWT, $PROJECT_ID, and $TASK_ID in the local environment
    curl -X POST "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?taskId=${TASK_ID}" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "type": "SCHEDULED_STOP",
      "state": "OPEN",
      "plannedLocation": {
         "point": {
            "latitude": -6.195139,
            "longitude": 106.820826
         }
      },
      "taskDuration": "600s"
    }
    EOM

Hedef zaman aralığı ayarlayın

Hedef zaman aralığı, görevin tamamlanması gereken TimeWindow'dur. Örneğin, teslimat alıcılarına bir teslimat süresi aralığı bildirirseniz bu zaman aralığını yakalamak ve uyarılar oluşturmak veya alanı kullanarak gezi sonrası performansı analiz etmek için görev hedef zaman aralığını kullanabilirsiniz.

Hedef zaman aralığı, bir başlangıç ve bitiş zamanından oluşur ve herhangi bir görev türü için ayarlanabilir. Hedef zaman aralığı, yönlendirme davranışını etkilemez.

gRPC

Aşağıdaki örnekte, görev süresi aralığı belirlemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

    static final String PROJECT_ID = "my-delivery-co-gcp-project";
    static final String TASK_ID = "task-8241890";

    DeliveryServiceBlockingStub deliveryService =
      DeliveryServiceGrpc.newBlockingStub(channel);

    // Task settings
    String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
    Task task = Task.newBuilder()
      .setName(taskName)
      .setTargetTimeWindow(
        TimeWindow.newBuilder()
          .setStartTime(Timestamp.newBuilder().setSeconds(1680123600))
          .setEndTime(Timestamp.newBuilder().setSeconds(1680130800)))
      .build();

    // Task request
    UpdateTaskRequest updateTaskRequest =
      UpdateTaskRequest.newBuilder()  // No need for the header
          .setTask(task)
          .setUpdateMask(FieldMask.newBuilder().addPaths("targetTimeWindow"))
          .build();

    try {
      Task updatedTask = deliveryService.updateTask(updateTaskRequest);
    } catch (StatusRuntimeException e) {
      Status s = e.getStatus();
      switch (s.getCode()) {
         case NOT_FOUND:
           break;
         case PERMISSION_DENIED:
           break;
      }
      return;
    }

REST

HTTP kullanarak görev süresi ayarlamak için UpdateTask çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=targetTimeWindow`

<id>, görev için benzersiz bir tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    targetTimeWindow Görevin tamamlanması gereken zaman aralığı. Bu ayar, yönlendirme davranışını etkilemez

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=targetTimeWindow" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "targetTimeWindow": {
    "startTime": "2023-03-29T21:00:00Z",
    "endTime": "2023-03-29T23:00:00Z"
  }
}
EOM

Görev izleme görünürlük yapılandırmasını ayarla

Kargo Takibi kitaplığındaki verilerin ve GetTaskTrackingInfo çağrısından döndürülen verilerin görünürlüğü, görev için TaskTrackingViewConfig ayarlanarak görev bazında kontrol edilebilir. Daha fazla bilgi için Etkin araç görevleri bölümüne bakın. Bunu görev oluştururken veya güncellerken yapabilirsiniz. Aşağıda, görevi bu yapılandırmayla güncellemeyle ilgili bir örnek verilmiştir:

gRPC

Aşağıdaki örnekte, görev izleme görünümü yapılandırmasını ayarlamak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskTrackingViewConfig(
    TaskTrackingViewConfig.newBuilder()
      .setRoutePolylinePointsVisibility(
        VisibilityOption.newBuilder().setRemainingStopCountThreshold(3))
      .setEstimatedArrivalTimeVisibility(
        VisibilityOption.newBuilder().remainingDrivingDistanceMetersThreshold(5000))
      .setRemainingStopCountVisibility(
        VisibilityOption.newBuilder().setNever(true)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("taskTrackingViewConfig"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
        break;
      case PERMISSION_DENIED:
        break;
  }
  return;
}

REST

Görev izleme görünümünün yapılandırma penceresini HTTP kullanarak ayarlamak için UpdateTask çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskTrackingViewConfig`

<id>, görev için benzersiz bir tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    taskTrackingViewConfig Son kullanıcılara hangi veri öğelerinin hangi koşullarda görünür olacağını belirten görev izleme yapılandırmasıdır.

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskTrackingViewConfig" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskTrackingViewConfig": {
    "routePolylinePointsVisibility": {
      "remainingStopCountThreshold": 3
    },
    "estimatedArrivalTimeVisibility": {
      "remainingDrivingDistanceMetersThreshold": 5000
    },
    "remainingStopCountVisibility": {
      "never": true
    }
  }
}
EOM

Bir araca görev atama

Bir araç için görev sıralamasını güncelleyerek görevleri bir teslimat aracına atarsınız. Bir aracın görev sıralaması, teslimat aracı için araç duraklarının listesine göre belirlenir ve her araç durağına bir veya daha fazla görev atayabilirsiniz. Ayrıntılar için Görev sıralamasını güncelleme bölümünü inceleyin.

Bir gönderiyi bir araçtan diğerine taşımak için orijinal görevi kapatın ve yeni araca atamadan önce görevi yeniden oluşturun. Halihazırda farklı bir araca atanmış bir görev için görev sıralamasını güncellerseniz bir hata alırsınız.

Görev sıralamasını güncelleme

Bir araca atanan sipariş görevlerini, Sürücü SDK'sından veya sunucu ortamından güncelleyebilirsiniz. Irk koşullarından kaçınmak ve tek bilgi kaynağı sağlamak için her iki yöntemi de kullanmayın.

Bir araç için görev sıralamasını güncellediğinizde, araç şunları da yapar:

  • Araç için yeni görevler atanır.
  • Araca daha önce atanmış ancak güncel sıralamada olmayan tüm görevleri kapatır.

Bir gönderiyi bir araçtan diğerine geçirmek için orijinal görevi kapatın ve yeni araca atamadan önce görevi yeniden oluşturun. Halihazırda farklı bir araca atanmış bir görev için görev sıralamasını güncellerseniz bir hata alırsınız.

Görev sıralamasını istediğiniz zaman güncelleyebilirsiniz.

gRPC

Aşağıdaki örnekte, aracın görev sıralamasını güncellemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String VEHICLE_ID = "vehicle-8241890";
static final String TASK1_ID = "task-756390";
static final String TASK2_ID = "task-849263";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle settings
String vehicleName = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
DeliveryVehicle deliveryVehicle = DeliveryVehicle.newBuilder()
    .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.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 updateDeliveryRequest =
  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

Sunucu ortamından bir araç için görev sıralamasını güncellemek üzere UpdateDeliveryVehicle öğesine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id>, filonuzdaki bir teslimat aracının görev sıralamasını güncellemeyi düşündüğünüz benzersiz bir tanımlayıcıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir DeliveryVehicle varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    remainingVehicleJourneySegments Görevlere ilişkin yolculuk segmentlerinin, yürütülmeleri gereken sırayla listesi. Önce listedeki ilk görev yürütülür.
    kalanAraçYolculuğuSegmentleri[i].durdurma Listedeki i görevinin durağı.
    kalanAraçJourneySegmentleri[i].stop.plannedLocation Durak için planlanan konum.
    kalanAraçJourneySegmentleri[i].durdurma.görevleri Bu araç durağında gerçekleştirilecek görevlerin listesi.
    remainingVehicleJourneySegments[i].stop.state State.NEW

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

# 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.7749,
            "longitude": -122.084061
          }
        },
        "tasks": [
          {
            "taskId": "${TASK1_ID}"
          }
        ]
      }
    },
    {
      "stop": {
        "state": "NEW",
        "plannedLocation": {
          "point": {
            "latitude": 37.3382,
            "longitude": 121.8863
          }
        },
        "tasks": [
          {
            "taskId": "${TASK2_ID}"
          }
        ]
      }
    }
  ]
}
EOM

Araç bir sonraki durağa gidiyor

Araç bir duraktan ayrıldığında veya navigasyona başladığında Fleet Engine bilgilendirilmelidir. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından bildirim gönderebilirsiniz. Irkların çatışmalardan kaçınmak ve tek bilgi kaynağını tutmak için her iki yöntemi de kullanmayın.

gRPC

Aşağıdaki örnekte, bir aracın bir sonraki durağına gitmek üzere yola çıktığını Fleet Engine'e bildirmek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.

    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

Fleet Engine'e bir aracın sunucu ortamından gelen bir sonraki durağın yolunda olduğunu bildirmek için UpdateDeliveryVehicle öğesine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir DeliveryVehicle varlığı bulunmalıdır:

  • Zorunlu alan:

    AlanDeğer
    remainingVehicleJourneySegments Durumları Eyalet.YENİ olarak işaretlenmiş kalan araç duraklarının listesi. Listedeki ilk durağın durumu State.ENROUTE olarak işaretlenmiş olmalıdır.

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar bildirim için yoksayılır.

Örnek curl komutu:

# 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

Aracın konumunu güncelleyin

Aracın konumunu güncellemek için Sürücü SDK'sını kullanmıyorsanız aracın konumuyla Fleet Engine'e doğrudan çağrı yapabilirsiniz. Fleet Engine, etkin araçlar için en az dakikada bir, en fazla 5 saniyede bir konum güncellemesi yapılmasını bekler.

gRPC

Aşağıdaki örnekte, Fleet Engine'de bir aracın konumunu güncellemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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 myDeliveryVehicle = DeliveryVehicle.newBuilder()
    .setLastLocation(DeliveryVehicleLocation.newBuilder()
        .setSupplementalLocation(LatLng.newBuilder()
            .setLatitude(37.3382)
            .setLongitude(121.8863))
        .setSupplementalLocationTime(now())
        .setSupplementalLocationSensor(DeliveryVehicleLocationSensor.CUSTOMER_SUPPLIED_LOCATION)
        .setSupplementalLocationAccuracy(DoubleValue.of(15.0)))  // Optional
    .build();

// DeliveryVehicle request
UpdateDeliveryVehicleRequest updateDeliveryVehicleRequest =
  UpdateDeliveryVehicleRequest.newBuilder()  // No need for the header
      .setName(vehicleName)
      .setDeliveryVehicle(myDeliveryVehicle)
      .setUpdateMask(FieldMask.newBuilder()
          .addPaths("last_location"))
      .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

HTTP REST'i kullanarak Fleet Engine'de bir aracın konumunu güncellemek için UpdateDeliveryVehicle numaralı telefona çağrı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=last_location`

<id>, filonuzdaki veya konumu güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir DeliveryVehicle varlığı bulunmalıdır:

  • Zorunlu alan:

    AlanDeğer
    lastLocation.supplementalLocation Aracın konumu.
    lastLocation.supplementalLocationTime Aracın bu konumda olduğu bilinen son zaman damgası.
    lastLocation.supplementalLocationSensor CUSTOMER_SUPPLIED_LOCATION ile doldurulmalıdır.

  • İsteğe bağlı alanlar:

    AlanDeğer
    lastLocation.supplementalLocationAccuracy Sağlanan konumun metre cinsinden doğruluğu.

Örnek curl komutu:

# 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
{
  "lastLocation": {
    "supplementalLocation": {"latitude": 12.1, "longitude": 14.5},
    "supplementalLocationTime": "$(date -u --iso-8601=seconds)",
    "supplementalLocationSensor": "CUSTOMER_SUPPLIED_LOCATION",
    "supplementalLocationAccuracy": 15
  }
}
EOM

Araç durağa iniyor

Araç durağa geldiğinde Fleet Engine'e bildirilmelidir. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bildirim gönderebilirsiniz. Irkların çatışmalardan kaçınmak ve tek bilgi kaynağını tutmak için her iki yöntemi de kullanmayın.

gRPC

Aşağıdaki örnekte, bir aracın durağa geldiği konusunda Fleet Engine'e bildirimde bulunmak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

Fleet Engine'e bir aracın sunucu ortamındaki bir duraktan indiğini bildirmek için UpdateDeliveryVehicle öğesine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remainingVehicleJourneySegments`

<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir DeliveryVehicle varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    remainingVehicleJourneySegments Durumu State.ARRIVED olarak ayarlanmış halde vardığınız durak ve ardından, durumu Eyalet olarak işaretlenmiş kalan araç duraklarının listesi.

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

# 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

Araç bir durağı tamamlar

Bir araç durağı tamamladığında Fleet Engine'e bildirilmelidir. Bu, durakla ilişkili tüm görevlerin KAPALI durumuna ayarlanmasına neden olur. Fleet Engine'e Sürücü SDK'sından veya gRPC ya da REST kullanan bir sunucu ortamından bildirim gönderebilirsiniz. Irk koşullarından kaçınmak ve tek bilgi kaynağını korumak için her iki yöntemi de kullanmayın.

gRPC

Aşağıdaki örnekte, bir aracın durdurma işlemini tamamladığını Fleet Engine'e bildirmek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.

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

Fleet Engine'e, sunucu ortamından bir durdurma işleminin tamamlandığını bildirmek için UpdateDeliveryVehicle hedefine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<id>?updateMask=remaining_vehicle_journey_segments`

<id>, filonuzdaki görev sıralamasını güncellemeyi düşündüğünüz teslimat aracının benzersiz bir tanımlayıcısıdır. Aracı oluştururken belirttiğiniz tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir DeliveryVehicle varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    remaining_vehicle_journey_segments Tamamladığınız durak, artık kalan araç durakları listesinde yer almamalıdır.

  • İsteğe bağlı alanlar:

    • Yok

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

    # 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

Görev güncelleme

Çoğu görev alanı sabittir. Bununla birlikte, görev varlığını doğrudan güncelleyerek durumu, görev sonucunu, görev sonuç süresini, görev sonuç konumunu ve özellikleri değiştirebilirsiniz. Örneğin, bir araca görevin atanmadığı durumlarda, durumu doğrudan güncelleyerek görevi kapatabilirsiniz.

gRPC

Bu, gRPC aracılığıyla bir görev güncelleme örneğidir.

REST

Bu, görevleri REST üzerinden güncelleme örneğidir.

Görevi kapatma

Bir araca atanmış bir görevi kapatmak için Fileet Engine'e görevin gerçekleştiği yerde aracın durağını tamamladığını bildirin veya aracı durak listesinden kaldırın. Bunu yapmak için, bir araç için görev sıralamasını güncellerken olduğu gibi kalan araç duraklarının listesini de ayarlayabilirsiniz.

Bir görev için henüz araç atanmamışsa ve kapatılması gerekiyorsa görevi KAPAT olarak güncelleyin. Ancak KAPATILDI bir görevi yeniden açamazsınız.

Bir görevin kapatılması, başarılı ya da başarısız olduğunu göstermez. Görevin artık devam eden olmadığını belirtir. Gönderim takibinde, teslimat sonucunun gösterilebilmesi için bir görevin gerçek sonucunu belirtmek önemlidir.

gRPC

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setState(Task.State.CLOSED) // You can only directly CLOSE a
  .build();                    // task that is NOT assigned to a vehicle.

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("state"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Bir görevi sunucu ortamından kapalı olarak işaretlemek için UpdateTask hedefine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=state`

<id>, görev için benzersiz bir tanımlayıcıdır.

İstek başlığınız, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İstek gövdesine bir Task varlığı eklemeniz gerekir:

  • Zorunlu alanlar:

    AlanDeğer
    state State.CLOSED

  • İsteğe bağlı alanlar:

    AlanDeğer
    taskOutcome Sonuç.SUCCEEDED veya Sonuç.BAŞARISIZ
    taskOutcomeTime Görevin tamamlandığı zaman.
    taskOutcomeLocation Görevin tamamlandığı konum. Fleet Engine, sağlayıcı tarafından manuel olarak geçersiz kılınmadığı sürece bu alanı varsayılan olarak son araç konumuna ayarlar.

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=state,taskOutcome,taskOutcomeTime" \
      -H "Content-type: application/json" \
      -H "Authorization: Bearer ${JWT}" \
      --data-binary @- << EOM
    {
      "state": "CLOSED",
      "taskOutcome": "SUCCEEDED",
      "taskOutcomeTime": "$(date -u --iso-8601=seconds)"
    }
    EOM

Görevin sonucunu ve sonucun konumunu belirleme

Bir görevin kapatılmasının başarılı ya da başarısız olduğunu değil, görevin artık devam eden olarak kabul edilmediğini belirtir. Gönderim takibinde bir görevin gerçek sonucunu belirtmek önemlidir. Böylece teslimat sonucunun gösterilebilmesini ve hizmetler için uygun faturalandırmanın yapılabilmesini sağlar. Ayarlandıktan sonra görev sonucunu değiştiremezsiniz. Bununla birlikte, görev sonuç zamanını ve görev sonucu konumunu, belirlendikten sonra değiştirebilirsiniz.

KAPALI durumdaki görevlerin sonucu BAŞARILI veya BAŞARISIZ olarak ayarlanabilir. Fleet Engine, yalnızca SUCCEEDED durumundaki teslimat görevleri için ücret alır.

Fleet Engine, bir görevin sonucu işaretlerken görev sonucu konumunu, bilinen son araç konumuyla otomatik olarak doldurur. Bu davranışı geçersiz kılabilirsiniz.

gRPC

Sonucu ortaya çıkardığınızda görevin sonucunu görevi belirleyebilirsiniz. Konumun ayarlanması, Fleet Engine'in konumu son araç konumu olarak varsayılan değere ayarlamasını engeller. Daha sonra, Fleet Engine'in belirlediği görev sonucu konumunun üzerine de yazabilirsiniz. Fleet Engine, sağladığınız görev sonucu konumunun üzerine hiçbir zaman yazmaz. Bir görev sonucu belirlenmemiş bir görev için görev sonucu konumu belirleyemezsiniz. Aynı istek içinde hem görev hem de görev sonucu konumunu belirleyebilirsiniz.

Aşağıdaki örnekte, SUCCEEDED olarak bir görev sonucu ayarlamak ve görevin tamamlandığı konumu ayarlamak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8241890";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task settings
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
Task task = Task.newBuilder()
  .setName(taskName)
  .setTaskOutcome(TaskOutcome.SUCCEEDED)
  .setTaskOutcomeTime(now())
  .setTaskOutcomeLocation(               // Grand Indonesia East Mall
    LocationInfo.newBuilder().setPoint(
      LatLng.newBuilder().setLatitude(-6.195139).setLongitude(106.820826)))
  .build();

// Task request
UpdateTaskRequest updateTaskRequest =
  UpdateTaskRequest.newBuilder()  // No need for the header
      .setTask(task)
      .setUpdateMask(FieldMask.newBuilder().addPaths("task_outcome", "task_outcome_time", "task_outcome_location"))
      .build();

try {
  Task updatedTask = deliveryService.updateTask(updateTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;
     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Bir görevi sunucu ortamından tamamlandı olarak işaretlemek için UpdateTask sitesine HTTP REST çağrısı yapın:

`PATCH https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<id>?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation`

<id>, görev için benzersiz bir tanımlayıcıdır.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İsteğin gövdesinde bir Task varlığı bulunmalıdır:

  • Zorunlu alanlar:

    AlanDeğer
    taskOutcome Sonuç.SUCCEEDED veya Sonuç.BAŞARISIZ
    taskOutcomeTime Görevin sonucunun ayarlandığı zamanın zaman damgası (sağlayıcıdan). Bu, görevin tamamlandığı zamandır.

  • İsteğe bağlı alanlar:

    AlanDeğer
    taskOutcomeLocation Görevin tamamlandığı konum. Fleet Engine, sağlayıcı tarafından manuel olarak geçersiz kılınmadığı sürece bu alanı varsayılan olarak son araç konumuna ayarlar.

Varlıktaki diğer tüm alanlar, güncelleme için yoksayılır.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and TASK_ID in the local environment
curl -X PATCH "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}?updateMask=taskOutcome,taskOutcomeTime,taskOutcomeLocation" \
  -H "Content-type: application/json" \
  -H "Authorization: Bearer ${JWT}" \
  --data-binary @- << EOM
{
  "taskOutcome": "SUCCEEDED",
  "taskOutcomeTime": "$(date -u --iso-8601=seconds)",
  "taskOutcomeLocation": {
    "point": {
      "latitude": -6.195139,
      "longitude": 106.820826
    }
  }
}
EOM

Gönderimi yeniden yönlendirme

Gönderim görevi oluşturulduktan sonra planlanan konumu değiştirilemez. Bir gönderiyi yeniden yönlendirmek için bir sonuç belirlemeden gönderim görevini kapatın ve ardından güncellenmiş planlanan konumla yeni bir görev oluşturun. Yeni görevi oluşturduktan sonra aynı araca atayın. Daha fazla bilgi için gönderim görevini kapatma ve görevi atama bölümünü inceleyin.

Besleyici ve teslimat araçlarını kullanın

Gönderileri gün boyunca teslimat araçlarına taşımak için besleyici araçlar kullanıyorsanız sevkiyatların transferini teslimat aracı için planlanmış bir duraklama görevi olarak modelleyin. Doğru konum takibini sağlamak için yalnızca teslimat aracına yüklendikten sonra aktarılan bir gönderime gönderim teslimat görevi atayın. Daha fazla bilgi edinmek için zamanlanmış duraklama bölümünü inceleyin.

Mağaza gönderim durumu ve diğer meta bilgiler

Bir sevkiyat görevi tamamlandığında görev durumu ve sonucu göreve kaydedilir. Ancak, gönderime özel diğer meta bilgileri güncellemek isteyebilirsiniz. Fleet Engine hizmetinin dışında başvurabileceğiniz diğer meta bilgileri depolamak için görevle ilişkilendirilen tracking_id değerini harici bir tabloda anahtar olarak kullanın.

Daha fazla bilgi için Bir görevin ömrü bölümüne bakın.

Araç arama

Sürücü SDK'sından veya gRPC ya da REST kullanarak bir sunucu ortamından araç arayabilirsiniz.

gRPC

Aşağıdaki örnekte, araç aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Vehicle request
String name = "providers/" + PROJECT_ID + "/deliveryVehicles/" + VEHICLE_ID;
GetDeliveryVehicleRequest getVehicleRequest = GetDeliveryVehicleRequest.newBuilder()  // No need for the header
    .setName(name)
    .build();

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

REST

Sunucu ortamından araç aramak için GetVehicle öğesine HTTP REST çağrısı yapın:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles/<vehicleId>`

<id>, görev için benzersiz bir tanımlayıcıdır.

<vehicleId>, aranacak aracın kimliğidir.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İstek metni boş olmalıdır.

Arama başarılı olursa yanıt gövdesi, bir araç varlığı içerir.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles/${VEHICLE_ID}"

Görev arama

gRPC veya REST kullanarak bir sunucu ortamından görev arayabilirsiniz. Sürücü SDK'sı görev aramayı desteklemez.

gRPC

Aşağıdaki örnekte, görev aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir:

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TASK_ID = "task-8597549";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Task request
String taskName = "providers/" + PROJECT_ID + "/tasks/" + TASK_ID;
GetTaskRequest getTaskRequest = GetTaskRequest.newBuilder()  // No need for the header
    .setName(taskName)
    .build();

try {
  Task task = deliveryService.getTask(getTaskRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Sunucu ortamından görev aramak için GetTask öğesine HTTP REST çağrısı yapın:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks/<taskId>`

<id>, görev için benzersiz bir tanımlayıcıdır.

<taskId>, aranacak görevin kimliğidir.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

İstek metni boş olmalıdır.

Arama başarılı olursa yanıt gövdesi, bir görev varlığı içerir.

Örnek curl komutu:

    # Set JWT, PROJECT_ID, and TASK_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks/${TASK_ID}"

Gönderim görevi bilgilerini izleme kimliğine göre ara

Gönderim görevi bilgilerini aşağıdaki şekillerde arayabilirsiniz. Bu yöntemlerin her birinin ayrı bir amacı vardır:

  • görev kimliğiyle: görev verilerinin tam görünümüne erişimi olan filo operatörleri gibi kullanıcılar tarafından kullanılır.
  • izleme kimliğiyle: İstemci yazılımınız tarafından son kullanıcıya sınırlı bilgi sağlamak için (örneğin, evinde bir paket olması gerektiği zaman) kullanılır.

Bu bölümde, görev bilgilerini izleme kimliğine göre arama konusu ele alınmaktadır. Bir görevi görev kimliğine göre aramak istiyorsanız Görev arama bölümüne gidin.

Bilgileri izleme kimliğine göre aramak için aşağıdakilerden birini kullanabilirsiniz:

Arama gereksinimleri

  • Takip kimliği ile sağlanan gönderim bilgileri, Takip edilen konumların görünürlüğünü kontrol etme bölümünde belirtilen görünürlük kurallarına uyar.

  • Gönderim bilgilerini izleme kimliğine göre aramak için Fleet Engine'i kullanın. Sürücü SDK'sı, izleme kimliğine dayalı bilgi aramalarını desteklemez. Fleet Engine ile bunu yapmak için bir sunucu veya tarayıcı ortamı kullanırsınız.

  • Güvenlik risklerini sınırlandırmak için mümkün olan en küçük jetonu kullanın. Örneğin, Delivery Consumer Token kullanıyorsanız tüm Fleet Engine Deliveries API çağrıları yalnızca son kullanıcıyla alakalı bilgileri (ör. kargo şirketi veya kargonun alıcısı) döndürür. Yanıtlardaki diğer tüm bilgiler çıkartılır. Jetonlar hakkında daha fazla bilgi edinmek için Yetkilendirme için JSON Web Jetonu (JWT) oluşturma bölümüne bakın.

gRPC kullanarak Java ile aramalar

Aşağıdaki örnekte, bir gönderim göreviyle ilgili bilgileri izleme kimliğine göre aramak için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir.

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
GetTaskTrackingInfoRequest getTaskTrackingInfoRequest = GetTaskTrackingInfoRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setTrackingId(TRACKING_ID)
    .build();

try {
  TaskTrackingInfo taskTrackingInfo = deliveryService.getTaskTrackingInfo(getTaskTrackingInfoRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

HTTP kullanarak aramalar

Tarayıcıdan gönderim görevi aramak için GetTaskTrackingInfo öğesine HTTP REST çağrısı yapın:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/taskTrackingInfo/<tracking_id>`

<tracking_id>, görevle ilişkilendirilen izleme kimliğidir.

İstek başlığı, hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, Fire Engine jeton fabrikası tarafından verilen bir jetondur.

Arama başarılı olursa yanıt gövdesi bir taskTrackingInfo varlığı içerir.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and TRACKING_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/taskTrackingInfo/${TRACKING_ID}"

Görevleri listeleyin

Bir sunucu veya tarayıcı ortamındaki görevleri listeleyebilirsiniz. Sürücü SDK'sı, görevleri listelemeyi desteklemez.

Görevleri listelemek, görevlere geniş kapsamlı erişim gerektirir. Görevleri listelemek yalnızca güvenilir kullanıcılara yöneliktir. Liste görevleri isteğinde bulunurken Teslimat Filo Okuyucu veya Teslimat Süper Kullanıcı Kimlik Doğrulama Jetonları kullanın.

Listedeki görevlerde aşağıdaki alanlar çıkartılır:

  • VehicleStop.planned_location
  • VehicleStop.state
  • VehicleStop.TaskInfo.taskId

Listedeki görevler, çoğu görev özelliğine göre filtrelenebilir. Filtre sorgusu söz dizimi için AIP-160 sayfasına bakın. Aşağıdaki listede filtreleme için kullanabileceğiniz geçerli görev özellikleri gösterilmektedir:

  • attributes
  • delivery_vehicle_id
  • state
  • planned_location
  • task_duration
  • task_outcome
  • task_outcome_location
  • task_outcome_location_source
  • task_outcome_time
  • tracking_id
  • tür

Google API İyileştirme Tekliflerine dayalı olarak aşağıdaki alan biçimlerini kullanın:

Alan Türü Biçim Örnek
Zaman damgası RFC-3339 task_outcome_time = 2022-03-01T11:30:00-08:00
Süre Saniye sayısı ve ardından s task_duration = 120s
Enum Dize state = CLOSED AND type = PICKUP
Konum point.latitude ve point.longitude planned_location.point.latitude > 36.1 AND planned_location.point.longitude < -122.0

Filtre sorgu operatörlerinin tam listesi için AIP-160 sayfasına bakın.

Herhangi bir filtre sorgusu belirtilmezse tüm görevler listelenir.

Görev listeleri sayfalara ayrılır. Sayfa boyutu, liste görevleri isteklerinde belirtilebilir. Sayfa boyutu belirtilirse döndürülen görevlerin sayısı belirtilen sayfa boyutundan büyük olmaz. Hiçbir sayfa boyutu yoksa makul bir varsayılan kullanılır. İstenen sayfa boyutu dahili bir maksimum değeri aşarsa dahili maksimum değer kullanılır.

Bir görev listesi, sonraki sonuç sayfasını okumak için bir jeton içerebilir. Sonraki görev sayfasını almak için, önceki istekle aynı olan bir istekle sayfa jetonunu kullanın. Döndürülen sayfa jetonu boş olduğunda, almak için başka görev kullanılamaz.

gRPC

Aşağıdaki örnekte deliveryVehicleId ve görev özelliklerinin listelenmesi için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir. Başarılı bir yanıt hâlâ boş olabilir. Boş yanıt, sağlanan deliveryVehicleId ile herhangi bir görevin ilişkilendirilmediğini gösterir.

static final String PROJECT_ID = "my-delivery-co-gcp-project";
static final String TRACKING_ID = "TID-7449w087464x5";

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListTasksRequest listTasksRequest = ListTasksRequest.newBuilder()  // No need for the header
    .setParent(parent)
    .setFilter("delivery_vehicle_id = 123 AND attributes.foo = true")
    .build();

try {
  ListTasksResponse listTasksResponse = deliveryService.listTasks(listTasksRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
     case NOT_FOUND:
       break;

     case PERMISSION_DENIED:
       break;
  }
  return;
}

REST

Tarayıcıdan görevleri listelemek için ListTasks öğesine HTTP REST çağrısı yapın:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/tasks`

Listelenen görevlere filtre uygulamak için değeri olarak URL çıkışlı filtre sorgusu içeren bir "filter" URL parametresi ekleyin.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

Arama başarılı olursa yanıt gövdesi, aşağıdaki yapıyla birlikte verileri içerir:

    // JSON representation
    {
      "tasks": [
        {
          object (Task)
        }
      ],
      "nextPageToken": string,
      "totalSize": integer
    }

Başarılı bir yanıt hâlâ boş olabilir. Boş yanıt, belirtilen filtre kriterlerini karşılayan hiçbir görevin bulunamadığını gösterir.

Örnek curl komutu:

    # Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
    curl -H "Authorization: Bearer ${JWT}" \
      "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/tasks?filter=state%20%3D%20OPEN%20AND%20delivery_vehicle_id%20%3D%20${VEHICLE_ID}"

Teslim araçlarını listeleme

Teslim araçlarını bir sunucu veya tarayıcı ortamından listeleyebilirsiniz. Sürücü SDK'sı, teslimat araçlarının listelenmesini desteklemez.

Teslimat araçlarının listelenmesi, teslimat araçlarına geniş kapsamlı erişim gerektirir ve yalnızca güvenilir kullanıcılara yöneliktir. Teslimat araçları listesini gönderirken Filo Okuyucu veya Teslimat Süper Kullanıcı Kimlik Doğrulama Jetonları kullanın.

Listelenen teslimat araçları, yanıt boyutu üzerindeki etkileri nedeniyle aşağıdaki alanlar çıkartılır:

  • CurrentRouteSegment
  • RemainingVehicleJourneySegments

Teslimat araçlarını attributes mülklerine göre filtreleyebilirsiniz. Örneğin, my_key anahtarı ve my_value değerine sahip bir özelliği sorgulamak için attributes.my_key = my_value değerini kullanın. Birden çok özelliği sorgulamak için sorguları attributes.key1 = value1 AND attributes.key2 = value2'teki gibi mantıksal AND ve OR operatörlerini kullanarak birleştirin. Filtre sorgusu söz diziminin tam açıklaması için AIP-160 sayfasına bakın.

Listelenen teslimat araçlarını viewport istek parametresini kullanarak konuma göre filtreleyebilirsiniz. viewport istek parametresi, görüntü alanlarını iki sınır koordinatı kullanarak tanımlar: high (kuzeydoğu) ve low (güneybatı) enlem ve boylam koordinat çifti. Coğrafi olarak düşük enlemden daha aşağıda olan bir yüksek enlemi içeren istekler reddedilir.

Yayınlama aracı listeleri, varsayılan olarak makul bir sayfa boyutu kullanılarak sayfalara ayrılır. Bir sayfa boyutu belirtirseniz istek, yalnızca sınır tarafından belirtilen araç sayısını veya daha azını döndürür. İstenen sayfa boyutu dahili bir maksimum değeri aşarsa dahili maksimum değer kullanılır. Varsayılan ve maksimum sayfa boyutları 100 araçtır.

Teslimat araçları listesi, sonuçların sonraki sayfasını okumak için bir jeton içerebilir. Sayfa jetonu yalnızca, daha fazla teslimat aracı sayfası alınmaya hazır olduğunda yanıtta mevcut olur. Sonraki görev sayfasını almak için sayfa jetonunu önceki istekle aynı olan bir istekle kullanın.

gRPC

Aşağıdaki örnekte, belirli bir bölgedeki teslimat araçlarını belirli bir özelliğe sahip listelemek için Java gRPC kitaplığının nasıl kullanılacağı gösterilmektedir. Başarılı bir yanıt yine de boş olabilir. Bu durum, belirtilen özelliğe sahip araçların zaten belirtilen görüntü alanında bulunmadığı anlamına gelir.

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

DeliveryServiceBlockingStub deliveryService =
  DeliveryServiceGrpc.newBlockingStub(channel);

// Tasks request
String parent = "providers/" + PROJECT_ID;
ListDeliveryVehiclesRequest listDeliveryVehiclesRequest =
  ListDeliveryVehiclesRequest.newBuilder()  // No need for the header
      .setParent(parent)
      .setViewport(
            Viewport.newBuilder()
              .setHigh(LatLng.newBuilder()
                  .setLatitude(37.45)
                  .setLongitude(-122.06)
                  .build())
              .setLow(LatLng.newBuilder()
                  .setLatitude(37.41)
                  .setLongitude(-122.11)
                  .build())
      .setFilter("attributes.my_key = my_value")
      .build();

try {
  ListDeliveryVehiclesResponse listDeliveryVehiclesResponse =
      deliveryService.listDeliveryVehicles(listDeliveryVehiclesRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
      case NOT_FOUND:
          break;

      case PERMISSION_DENIED:
          break;
  }
  return;
}

REST

Tarayıcıdan görevleri listelemek için ListDeliveryVehicles öğesine HTTP REST çağrısı yapın:

`GET https://fleetengine.googleapis.com/v1/providers/<project_id>/deliveryVehicles`

Listelenen görevlere filtre uygulamak için değeri olarak URL çıkışlı filtre sorgusu içeren bir "filtre" URL parametresi ekleyin.

İstek başlığı, Hamiline ait <jeton> değerine sahip bir Yetkilendirme alanı içermelidir. Buradaki <jeton>, bir Fleet Engine jeton fabrikası tarafından verilen bir jetondur.

Arama başarılı olursa yanıt gövdesi, aşağıdaki yapıyla birlikte verileri içerir:

// JSON representation
{
  "deliveryVehicles": [
    {
      object (DeliveryVehicle)
    }
  ],
  "nextPageToken": string,
  "totalSize": integer
}

Başarılı bir yanıt hâlâ boş olabilir. Bu durum, belirtilen filtre sorgusu ve görüntü alanını karşılayan yayınlama araçlarının bulunmadığı anlamına gelir.

Örnek curl komutu:

# Set JWT, PROJECT_ID, and VEHICLE_ID in the local environment
curl -H "Authorization: Bearer ${JWT}" \
  "https://fleetengine.googleapis.com/v1/providers/${PROJECT_ID}/deliveryVehicles?filter=attributes.my_key%20%3D%20my_value%20&viewport.high.latitude=37.45&viewport.high.longitude=-122.06&viewport.low.latitude=37.41&viewport.low.longitude=-122.11"

Gönderim takibi

Gönderim takibini etkinleştirmek için Fleet Engine Deliveries API'yi iki şekilde kullanabilirsiniz:

  • Tercih edilen: JavaScript Gönderim İzleme kitaplığını kullanın. Kitaplık, Fleet Engine'de takip edilen araçların konumunu ve önemli konumları görselleştirmenize olanak tanır. Standart bir google.maps.Map nesnesinin yerine kullanılabilen JavaScript harita bileşeni ve Fleet Engine'e bağlanacak veri bileşenleri içerir. Bu bileşen, web veya mobil uygulamanızdan özelleştirilebilir, animasyonlu bir kargo takibi deneyimi sunmanıza olanak tanır.

  • Fleet Engine Deliveries API'ye ek olarak kendi gönderi takipinizi uygulayın.

Önemli olan, gönderim görevlerini izleme kimliğine göre aramaktır.

Delivery Consumer Rolü kullanıyorsanız tüm Fleet Engine Deliveries API çağrıları, yalnızca bir gönderici veya alıcıyla ilgili bilgileri döndürür. Yanıtlardaki diğer tüm bilgiler çıkartılır. Son kullanıcıların kimliklerini doğrulamaktan siz sorumlusunuz. Ayrıca konum bilgileri halihazırda yapılmakta olan göreve göre filtrelenir. Kullanılamama görevi sırasında son kullanıcıyla herhangi bir konum bilgisi paylaşılmaz.

Günlük Kaydı

Fleet Engine'i, RPC günlüklerini Cloud Logging'e gönderecek şekilde ayarlayabilirsiniz. Daha fazla bilgi için Günlük Kaydı bölümüne bakın.

Yetkilendirme Rolleri ve Jetonları

Araç ve görev yaşam döngüsünü yönetme bölümünde ve bireysel kullanım alanları ile ilgili yetkilendirme notlarında açıklandığı gibi, Fleet Engine'e çağrı yapmak için hizmet hesabı kimlik bilgileri kullanılarak imzalanmış JSON Web Jetonları ile kimlik doğrulama gerekir. Bu jetonları yayınlamak için kullanılan hizmet hesapları, her bir rol farklı bir izin grubu veren bir veya daha fazla role sahip olabilir.

Daha fazla bilgi için Kimlik Doğrulama ve Yetkilendirme bölümüne bakın.

Sık karşılaşılan sorunları giderme

Herhangi bir sorun yaşarsanız yardım için aşağıdaki bölümleri kontrol edin.

Esneklik

Fleet Engine, bilgi kaynağı olarak kabul edilmez. Gerekirse sisteminizin durumunu Fleet Engine'e güvenmeden geri yüklemek sizin sorumluluğunuzdadır.

Fleet Engine'de kayıp durum

Fleet Engine ile çalışırken istemcileri uygulayarak hata olması durumunda sistemin kendi kendini iyileştirmesini sağlayın. Örneğin, Fleet Engine bir aracı güncellemeye çalıştığında aracın mevcut olmadığını belirten bir hata mesajı verebilir. Ardından istemci, aracı yeni durumuna getirmelidir. Bu sorun nadiren yaşansa da sisteminizin bunu kaldırabilecek kadar dayanıklı olduğundan emin olun.

Fleet Engine'in ciddi ölçüde başarısız olduğu son derece düşük bir senaryoda, araçların ve görevlerin çoğunu veya tümünü yeniden oluşturmanız gerekebilir. Hizmet reddi (DOS) saldırılarından kaçınmak için kota kontrolleri yapıldığından, oluşturma hızı çok yükselirse kota sorunları nedeniyle bazı istekler tekrar başarısız olabilir. Bu durumda, yeniden denemeler için bir geri yükleme stratejisi kullanarak yeniden oluşturma oranını yavaşlatın.

Sürücü uygulamasında kayıp durumu

Sürücü uygulaması kilitlenirse uygulamanın, Sürücü SDK'sı içinde geçerli durumu yeniden oluşturması gerekir. Uygulama, görevlerin var olduğundan emin olmak ve mevcut durumlarını geri yüklemek için görevleri yeniden oluşturmaya çalışmalıdır. Uygulama ayrıca Sürücü SDK'sı için durak listesini yeniden oluşturmalı ve açıkça ayarlamalıdır.

SSS

Bir sürücü belli bir işi tamamlamak için durursa ne olur?

Bu durumda önce görevlerin sırasını güncelleyin, sonra normal şekilde devam edin. Durağa varışı, görevin tamamlanmasını ve diğer ayrıntıları işaretleyin. Bunu yapmazsanız sistem tutarsız hale gelebilir, GMR'ler hatalı olabilir ve beklenmedik hatalar raporlanabilir.