ShipmentModel

運送模型包含一組運送作業,必須由一組車輛執行,同時盡可能降低整體成本,也就是下列項目的總和:

  • 車輛路線的費用 (所有車輛的總交通時間、平均交通時間、固定費用)。
  • 未完成出貨的處罰。
  • 運送作業全球作業期間的成本
JSON 表示法
{
  "shipments": [
    {
      object (Shipment)
    }
  ],
  "vehicles": [
    {
      object (Vehicle)
    }
  ],
  "globalStartTime": string,
  "globalEndTime": string,
  "globalDurationCostPerHour": number,
  "durationDistanceMatrices": [
    {
      object (DurationDistanceMatrix)
    }
  ],
  "durationDistanceMatrixSrcTags": [
    string
  ],
  "durationDistanceMatrixDstTags": [
    string
  ],
  "transitionAttributes": [
    {
      object (TransitionAttributes)
    }
  ],
  "shipmentTypeIncompatibilities": [
    {
      object (ShipmentTypeIncompatibility)
    }
  ],
  "shipmentTypeRequirements": [
    {
      object (ShipmentTypeRequirement)
    }
  ],
  "precedenceRules": [
    {
      object (PrecedenceRule)
    }
  ],
  "maxActiveVehicles": integer
}
欄位
shipments[]

object (Shipment)

模型中必須執行的運送作業集合。

vehicles[]

object (Vehicle)

可用於執行拜訪的車輛組合。

globalStartTime

string (Timestamp format)

模型的全球開始和結束時間:系統不會將範圍外的時間視為有效時間。

模型的時間跨度不得超過一年,也就是 globalEndTimeglobalStartTime 之間的時間差不得超過 31536000 秒。

使用 cost_per_*hour 欄位時,建議您將這個時間範圍設為較短的間隔,藉此提升成效 (舉例來說,如果為一天建立作業,請將全域時間限制設為該日)。如未設定,1970 年 1 月 1 日 00:00:00 (世界標準時間) 將預設為 0,nanos: 0。

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

globalEndTime

string (Timestamp format)

如果未設定,系統會使用 1971 年 1 月 1 日 00:00:00 世界標準時間 (即秒數:31536000,奈秒:0) 做為預設值。

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。例如 "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

globalDurationCostPerHour

number

整體企劃書的「全球時間長度」是所有車輛最早有效開始時間和最晚有效結束時間的差距。使用者可以為該數量指派每小時成本,以便盡早完成工作。這個成本必須與 Shipment.penalty_cost 使用相同的單位。

durationDistanceMatrices[]

object (DurationDistanceMatrix)

指定模型中使用的持續時間和距離矩陣。如果這個欄位空白,系統會根據 useGeodesicDistances 欄位的值,改用 Google 地圖或測地距離。如果不是空白,useGeodesicDistances 就不會是 true,且 durationDistanceMatrixSrcTagsdurationDistanceMatrixDstTags 都不能為空白。

使用範例:

  • 有兩個位置:locA 和 locB。
  • 1 輛車從 locA 開始行駛,並於 locA 結束。
  • 1 個位於 locB 的取件造訪要求。
model {
  vehicles { startTags: "locA"  endTags: "locA" }
  shipments { pickups { tags: "locB" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixDstTags: "locA"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrices {
    rows {  # from: locA
      durations { seconds: 0 }   meters: 0    # to: locA
      durations { seconds: 100 } meters: 1000 # to: locB
    }
    rows {  # from: locB
      durations { seconds: 102 } meters: 990 # to: locA
      durations { seconds: 0 }   meters: 0   # to: locB
    }
  }
}
  • 其中有三個位置:locA、locB 和 locC。
  • 1 輛車輛從 locA 開始路線,並在 locB 結束,使用矩陣「fast」。
  • 1 輛車以 locB 開始路線,並於 locB 結束,使用矩陣「慢速」。
  • 1 輛車以 locB 起點開始路線,並使用「快速」矩陣於 locB 結束。
  • 1 個位於 locC 的取貨要求。
model {
  vehicles { startTags: "locA" endTags: "locB" startTags: "fast" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "slow" }
  vehicles { startTags: "locB" endTags: "locB" startTags: "fast" }
  shipments { pickups { tags: "locC" } }
  durationDistanceMatrixSrcTags: "locA"
  durationDistanceMatrixSrcTags: "locB"
  durationDistanceMatrixSrcTags: "locC"
  durationDistanceMatrixDstTags: "locB"
  durationDistanceMatrixDstTags: "locC"
  durationDistanceMatrices {
    vehicleStartTag: "fast"
    rows {  # from: locA
      durations { seconds: 1000 } meters: 2000 # to: locB
      durations { seconds: 600 }  meters: 1000 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }   meters: 0    # to: locB
      durations { seconds: 700 } meters: 1200 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 702 } meters: 1190 # to: locB
      durations { seconds: 0 }   meters: 0    # to: locC
    }
  }
  durationDistanceMatrices {
    vehicleStartTag: "slow"
    rows {  # from: locA
      durations { seconds: 1800 } meters: 2001 # to: locB
      durations { seconds: 900 }  meters: 1002 # to: locC
    }
    rows {  # from: locB
      durations { seconds: 0 }    meters: 0    # to: locB
      durations { seconds: 1000 } meters: 1202 # to: locC
    }
    rows {  # from: locC
      durations { seconds: 1001 } meters: 1195 # to: locB
      durations { seconds: 0 }    meters: 0    # to: locC
    }
  }
}
durationDistanceMatrixSrcTags[]

string

定義時間長度和距離矩陣的來源的標記;durationDistanceMatrices(i).rows(j) 透過標記 durationDistanceMatrixSrcTags(j) 定義與矩陣中其他造訪的持續時間和距離。

標記會對應至 VisitRequest.tagsVehicle.start_tags。給定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;同樣地,VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空字串。如果這個欄位不為空白,durationDistanceMatrices 就必須非空白。

durationDistanceMatrixDstTags[]

string

定義時間和距離矩陣目的地的標記;durationDistanceMatrices(i).rows(j).durations(k) (resp. durationDistanceMatrices(i).rows(j).meters(k)) 會定義矩陣 i 中,從標記為 durationDistanceMatrixSrcTags(j) 的造訪轉換為標記為 durationDistanceMatrixDstTags(k) 的造訪所需的時間 (或距離)。

標記會對應至 VisitRequest.tagsVehicle.start_tags。給定的 VisitRequestVehicle 必須與這個欄位中的一個標記完全相符。請注意,Vehicle 的來源、目的地和矩陣標記可能相同;同樣地,VisitRequest 的來源和目的地標記也可能相同。所有標記都必須不同,且不得為空白字串。如果這個欄位不為空白,durationDistanceMatrices 就必須非空白。

transitionAttributes[]

object (TransitionAttributes)

新增至模型的轉場屬性。

shipmentTypeIncompatibilities[]

object (ShipmentTypeIncompatibility)

不相容的 shipment_types 組合 (請參閱 ShipmentTypeIncompatibility)。

shipmentTypeRequirements[]

object (ShipmentTypeRequirement)

shipmentType 需求集 (請參閱 ShipmentTypeRequirement)。

precedenceRules[]

object (PrecedenceRule)

模型中必須強制執行的優先順序規則集。

maxActiveVehicles

integer

限制有效車輛數量上限。如果路線至少執行一次貨運,表示車輛正在行駛中。當車隊少於車輛,且車隊屬於異質時,這項功能可用來限制路線數量。最佳化功能會選擇最適合使用的車輛組合。必須是正數。

運送地址

運送單一商品 (從任一取件到出貨)為了讓系統將運送作業視為已完成,一輛車輛必須先前往其中一個取貨地點 (並相應減少其備用容量),然後再前往其中一個送達地點 (並相應重新增加其備用容量)。

JSON 表示法
{
  "displayName": string,
  "pickups": [
    {
      object (VisitRequest)
    }
  ],
  "deliveries": [
    {
      object (VisitRequest)
    }
  ],
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "allowedVehicleIndices": [
    integer
  ],
  "costsPerVehicle": [
    number
  ],
  "costsPerVehicleIndices": [
    integer
  ],
  "pickupToDeliveryAbsoluteDetourLimit": string,
  "pickupToDeliveryTimeLimit": string,
  "shipmentType": string,
  "label": string,
  "ignore": boolean,
  "penaltyCost": number,
  "pickupToDeliveryRelativeDetourLimit": number
}
欄位
displayName

string

使用者定義的運送作業顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

pickups[]

object (VisitRequest)

與出貨相關的取貨替代選項組合。如果未指定,車輛只需前往與送貨地點相對應的位置即可。

deliveries[]

object (VisitRequest)

與出貨相關的提交替代方案。如果未指定,車輛只需前往與乘客上車地點相對應的位置即可。

loadDemands

map (key: string, value: object (Load))

貨物負載 (例如重量、體積、棧板數量等)。圖中的鍵應為說明對應負載類型的 ID,最好也包含單位。例如:「weight_kg」、「volume_gallons」、「pallet_count」等。如果指定索引鍵未顯示在地圖上,則對應載入作業會視為空值。

allowedVehicleIndices[]

integer

可能執行這項運送作業的車輛組合。如果留空,則所有車輛都可能執行該動作。車輛會以 ShipmentModelvehicles 清單中的索引提供。

costsPerVehicle[]

number

指定每輛車出貨時的運費。指定的變數必須包含 EITHER:

  • 等同 costsPerVehicleIndices 的元素數量。costsPerVehicle[i] 對應模型的車輛 costsPerVehicleIndices[i]
  • 與模型中車輛數量相同的元素數量第 i 個元素對應至模型的車輛 #i。

這些費用必須與 penaltyCost 使用相同的單位,且不得為負值。如果沒有這類費用,請將這個欄位留白。

costsPerVehicleIndices[]

integer

costsPerVehicle 適用的車輛索引。如果為非空白,則元素數量必須與 costsPerVehicle 相同。車輛索引只能指定一次。如果車輛從 costsPerVehicleIndices 中排除,其費用為零。

pickupToDeliveryAbsoluteDetourLimit

string (Duration format)

指定相較於從上車地點到送達地點的最短路徑,最多可繞行的絕對時間。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。

舉例來說,假設 t 是從所選取的取貨替代方案直接前往所選取的送貨替代方案所需的最短時間。接著,設定 pickupToDeliveryAbsoluteDetourLimit 會強制執行以下操作:

startTime(delivery) - startTime(pickup) <=
t + pickupToDeliveryAbsoluteDetourLimit

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。自 2017 年 10 月起,系統只會在行程時間不受車輛影響時支援繞道。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

pickupToDeliveryTimeLimit

string (Duration format)

指定從商品開始取件到開始送達的時間長度上限。若有指定,其必須為非負數,且運送必須包含至少一項取貨和送貨服務。這不會影響取貨方式,或選擇取貨和送貨的替代地點,以及車輛速度。您可以同時指定這項限制和最大繞行限制:解決方案會遵循這兩項規格。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

shipmentType

string

非空白字串,指定此出貨的「類型」。這項功能可用於定義 shipment_types 之間的不相容或需求 (請參閱 ShipmentModel 中的 shipmentTypeIncompatibilitiesshipmentTypeRequirements)。

與單次造訪指定的 visitTypes 不同:同一運送的所有取貨/配送都共用相同的 shipmentType

label

string

指定此貨品的標籤。這個標籤會在對應 ShipmentRoute.VisitshipmentLabel 回應中回報。

ignore

boolean

如果為 True,則略過這項出貨作業,但不會套用 penaltyCost

如果模型中含有任何 shipmentTypeRequirements,忽略出貨作業就會導致驗證錯誤。

系統允許忽略在 injectedFirstSolutionRoutesinjectedSolutionConstraint 中執行的運送作業;解決程序會從執行路線中移除相關的取貨/送貨拜訪。如果 precedenceRules 參照忽略的運送資訊,系統也會予以忽略。

penaltyCost

number

如果貨運未完成,則罰則會計入路線總金額。如果運送員前往其中一個提貨和送貨地點,系統就會將該筆訂單視為完成。費用可以使用模型中所有其他費用相關欄位使用的單位來表示,且必須為正值。

重要事項:如果未指定這項處罰,系統會視為無限期,也就是必須完成出貨。

pickupToDeliveryRelativeDetourLimit

number

指定從上車地點到貨品送達的最短路徑,最長的相對繞路時間。如果指定了這個值,則必須為非負值,且運送作業至少必須包含一個取件和一個送達作業。

舉例來說,如果從選定的取貨替代服務直接改為配送至所選配送方式,最早需要多久時間才能處理完畢。接著設定 pickupToDeliveryRelativeDetourLimit 會強制執行:

startTime(delivery) - startTime(pickup) <=
std::ceil(t * (1.0 + pickupToDeliveryRelativeDetourLimit))

如果同一運送屬性同時指定了相對和絕對限制,則每個取貨/外送組合使用的限制越多。自 2017 年 10 月起,系統只會在行程時間不受車輛影響時支援繞道。

VisitRequest

可透過車輛完成的訪問要求:包含一個或兩個地理位置 (請參閱下方說明)、以時間窗口表示的開始和結束時間,以及服務時間長度 (車輛抵達取貨或送貨地點所需的時間)。

JSON 表示法
{
  "arrivalLocation": {
    object (LatLng)
  },
  "arrivalWaypoint": {
    object (Waypoint)
  },
  "departureLocation": {
    object (LatLng)
  },
  "departureWaypoint": {
    object (Waypoint)
  },
  "tags": [
    string
  ],
  "timeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "duration": string,
  "cost": number,
  "loadDemands": {
    string: {
      object (Load)
    },
    ...
  },
  "visitTypes": [
    string
  ],
  "label": string
}
欄位
arrivalLocation

object (LatLng)

車輛執行此 VisitRequest 時抵達的地理位置。如果運送模型包含持續時間距離矩陣,則不得指定 arrivalLocation

arrivalWaypoint

object (Waypoint)

執行這個 VisitRequest 時,車輛抵達的路線點。如果運送模型含有時間距離矩陣,請勿指定 arrivalWaypoint

departureLocation

object (LatLng)

完成這個 VisitRequest 後車輛出發的地理位置。如果與 arrivalLocation 相同,則可省略。如果運送模型含有時間距離矩陣,請勿指定 departureLocation

departureWaypoint

object (Waypoint)

完成這個 VisitRequest 後車輛出發的路線點。如果與 arrivalWaypoint 相同,可以省略。如果運送模型包含持續時間距離矩陣,則不得指定 departureWaypoint

tags[]

string

指定附加至造訪要求的標記。字串不得留空或重複。

timeWindows[]

object (TimeWindow)

限制造訪到達時間的時間區間。請注意,車輛可能會於抵達時間之外出發,也就是說,抵達時間 + 所需時間不一定要在時間範圍之內。如果車輛在 TimeWindow.start_time前抵達,就需要等待時間。

如果沒有 TimeWindow,表示車輛可隨時執行這項拜訪。

時段不得不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依遞增順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

duration

string (Duration format)

行程時間,也就是車輛從抵達到離開之間的時間 (會加入可能的等候時間;請參閱 timeWindows)。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

cost

number

針對車輛路線提出造訪要求的費用。你可以使用這項功能,為每項貨物的替代取貨或配送服務支付不同的費用。這個成本必須與 Shipment.penalty_cost 相同單位,且不得為負數。

loadDemands

map (key: string, value: object (Load))

載入此造訪要求的需求。這與 Shipment.load_demands 欄位類似,差別在於其只會套用至這個 VisitRequest,而非整個 Shipment。這裡列出的請求會加入 Shipment.load_demands 中列出的請求。

visitTypes[]

string

指定造訪的類型,這項資訊可用於分配車輛完成這次拜訪所需的額外時間 (請參閱 Vehicle.extra_visit_duration_for_visit_type)。

一個類型只能出現一次。

label

string

指定這個 VisitRequest 的標籤。這個標籤會在回應中以對應的 ShipmentRoute.Visit 中的 visitLabel 回報。

LatLng

代表經緯度組合的物件。以一對雙精準數表示經度度數和緯度度數。除非另有指定,否則這個物件必須符合 WGS84 標準。此外,值必須在正規化範圍內。

JSON 表示法
{
  "latitude": number,
  "longitude": number
}
欄位
latitude

number

緯度度數,必須介於 [-90.0, +90.0] 的範圍之間。

longitude

number

經度度數,必須介於 [-180.0, +180.0] 的範圍之間。

途經點

封裝路線控點。路線控點會標示 VisitRequests 的抵達和出發地點,以及車輛的起點和終點。

JSON 表示法
{
  "sideOfRoad": boolean,

  // Union field location_type can be only one of the following:
  "location": {
    object (Location)
  },
  "placeId": string
  // End of list of possible types for union field location_type.
}
欄位
sideOfRoad

boolean

選用設定。表示這個路線控點的位置,是為了讓車輛偏好停靠在道路的特定側邊。設定這個值後,路線就會通過位置,這樣車輛就能在路側停靠,該位置是從道路中心偏離位置。這個選項不適用於「WALKING」交通方式。

聯集欄位 location_type。表示位置的方式有很多種。location_type 只能是下列其中一項:
location

object (Location)

使用地理座標指定的點,包含選擇性的方向。

placeId

string

與路標相關聯的 POI 地點 ID。

位置

封裝位置 (地理點和選用的標題)。

JSON 表示法
{
  "latLng": {
    object (LatLng)
  },
  "heading": integer
}
欄位
latLng

object (LatLng)

航點的地理座標。

heading

integer

與流量方向相關的指南針方位。這個值用於指定上車和下車地點的道路邊。標題值可以介於 0 到 360 之間,其中 0 可指定為正北的方向,90 則指定往東方向的方向等。

TimeWindow

時間窗可限制事件的時間,例如造訪的抵達時間,或車輛的開始和結束時間。

硬時間範圍邊界 (startTimeendTime) 會強制執行事件的最早和最晚時間,例如 startTime <= event_time <= endTime。電子時間範圍下限 softStartTime 表示在 softStartTime 當天或之後發生事件的偏好,其費用會與 softStartTime 事件發生前的時間長度按比例計算。電子時間範圍上限 softEndTime 表示在 softEndTime 當天或之前發生事件的偏好,其費用與 softEndTime 事件發生後的時間長度成正比。startTimeendTimesoftStartTimesoftEndTime 應在全球時間限制內 (請參閱 ShipmentModel.global_start_timeShipmentModel.global_end_time),並應遵守下列規定:

  0 <= `startTime` <= `endTime` and
  0 <= `startTime` <= `softStartTime` and
  0 <= `softEndTime` <= `endTime`.
JSON 表示法
{
  "startTime": string,
  "endTime": string,
  "softStartTime": string,
  "softEndTime": string,
  "costPerHourBeforeSoftStartTime": number,
  "costPerHourAfterSoftEndTime": number
}
欄位
startTime

string (Timestamp format)

硬性時段開始時間。如果未指定,則會設為 ShipmentModel.global_start_time

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

endTime

string (Timestamp format)

硬性時間範圍結束時間。如果未指定,則會設為 ShipmentModel.global_end_time

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

softStartTime

string (Timestamp format)

時間範圍的正規開始時間。

RFC3339 世界標準時間「Zulu」格式的時間戳記,精確度達奈秒單位,最多九個小數位數。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

softEndTime

string (Timestamp format)

時間範圍的虛假結束時間。

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。例如 "2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

costPerHourBeforeSoftStartTime

number

如果事件發生在 softStartTime 前,模型中其他費用的每小時費用,計算方式如下:

   max(0, softStartTime - t.seconds)
                          * costPerHourBeforeSoftStartTime / 3600,
t being the time of the event.

費用必須為正數,且必須先設定 softStartTime 才能設定欄位。

costPerHourAfterSoftEndTime

number

如果事件發生在 softEndTime 之後,系統會將每小時費用加進模型中的其他費用,計算方式如下:

   max(0, t.seconds - softEndTime.seconds)
                    * costPerHourAfterSoftEndTime / 3600,
t being the time of the event.

費用必須為正數,且只有在已設定 softEndTime 的情況下才能設定這個欄位。

車輛

模擬運送問題中的車輛。解決運送問題時,系統會建立從 startLocation開始到 endLocation 這輛車的路線。路線是指一連串的造訪記錄 (請參閱 ShipmentRoute)。

JSON 表示法
{
  "displayName": string,
  "travelMode": enum (TravelMode),
  "routeModifiers": {
    object (RouteModifiers)
  },
  "startLocation": {
    object (LatLng)
  },
  "startWaypoint": {
    object (Waypoint)
  },
  "endLocation": {
    object (LatLng)
  },
  "endWaypoint": {
    object (Waypoint)
  },
  "startTags": [
    string
  ],
  "endTags": [
    string
  ],
  "startTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "endTimeWindows": [
    {
      object (TimeWindow)
    }
  ],
  "unloadingPolicy": enum (UnloadingPolicy),
  "loadLimits": {
    string: {
      object (LoadLimit)
    },
    ...
  },
  "costPerHour": number,
  "costPerTraveledHour": number,
  "costPerKilometer": number,
  "fixedCost": number,
  "usedIfRouteIsEmpty": boolean,
  "routeDurationLimit": {
    object (DurationLimit)
  },
  "travelDurationLimit": {
    object (DurationLimit)
  },
  "routeDistanceLimit": {
    object (DistanceLimit)
  },
  "extraVisitDurationForVisitType": {
    string: string,
    ...
  },
  "breakRule": {
    object (BreakRule)
  },
  "label": string,
  "ignore": boolean,
  "travelDurationMultiple": number
}
欄位
displayName

string

使用者定義的車輛顯示名稱。長度上限為 63 個半形字元,可以使用 UTF-8 字元。

travelMode

enum (TravelMode)

行駛模式會影響車輛可行駛的道路和速度。另請參閱 travelDurationMultiple

routeModifiers

object (RouteModifiers)

一組滿足條件,會影響系統為特定車輛計算路線的方式。

startLocation

object (LatLng)

車輛在接受任何貨物前開始的地理位置。如未指定,車輛會在第一個上車地點開始行駛。如果運送模型包含時間長度和距離矩陣,則不得指定 startLocation

startWaypoint

object (Waypoint)

路線點代表車輛在接受任何貨物前開始的地理位置。如果未指定 startWaypointstartLocation,車輛會在首次上車時開始。如果運送模型包含時間長度和距離矩陣,則不得指定 startWaypoint

endLocation

object (LatLng)

車輛完成最後一次 VisitRequest 後的終點地理位置。如未指定,車輛的 ShipmentRoute 會在車輛完成最後一個 VisitRequest 時立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 endLocation

endWaypoint

object (Waypoint)

路線點代表車輛在最後一次完成 VisitRequest 後結束的地理位置。如果未指定 endWaypointendLocation,車輛的 ShipmentRoute 會在完成最後一次 VisitRequest 後立即結束。如果運送模型包含時間長度和距離矩陣,則不得指定 endWaypoint

startTags[]

string

指定車輛路線起點所附加的標記。

字串不得留空或重複。

endTags[]

string

指定附加在車輛路線結尾的標記。

不得使用空字串或重複的字串。

startTimeWindows[]

object (TimeWindow)

車輛可能從起點出發的時間範圍。必須在全球時間限制範圍內 (請參閱 ShipmentModel.global_* 欄位)。如果未指定,則除了全球時間限制以外,其他時間限制也沒有限制。

屬於相同重複欄位的時間範圍必須不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

endTimeWindows[]

object (TimeWindow)

車輛可能抵達終點的時間範圍。必須在全球時間限制範圍內 (請參閱 ShipmentModel.global_* 欄位)。如未指定,則除了這些全球時間限制外,沒有其他限制。

屬於相同重複欄位的時間範圍必須不連貫,也就是說,時間範圍不得與其他時段重疊或相鄰,而且必須依時間順序排列。

只有在單一時間範圍內,才能設定 costPerHourAfterSoftEndTimesoftEndTime

unloadingPolicy

enum (UnloadingPolicy)

車輛的卸載政策。

loadLimits

map (key: string, value: object (LoadLimit))

車輛的容量 (例如重量、體積、貨架數量)。對應中的鍵是載入類型的 ID,與 Shipment.load_demands 欄位的鍵一致。如果這個對應表中沒有特定鍵,則系統會將對應容量視為無限。

costPerHour

number

車輛費用:所有費用都會加總,且必須與 Shipment.penalty_cost 位於同一單位。

車輛路線的每小時費用。這筆費用適用於該路線總共花費的時間,而且包含交通時間、等待時間和造訪時間。使用 costPerHour 而非僅使用 costPerTraveledHour 可能會產生額外的延遲時間。

costPerTraveledHour

number

車輛路線的每行駛時數。這項費用只會套用在路線的行程時間 (即 ShipmentRoute.transitions 中回報的時間),不包括等候時間和造訪時間。

costPerKilometer

number

車輛行駛路線的每公里費用。這筆費用適用於 ShipmentRoute.transitions 中回報的距離,不適用於從 arrivalLocation 間接行駛到單一 VisitRequestdepartureLocation 的任何距離。

fixedCost

number

如果這輛車輛用於處理出貨作業,就會收取這筆固定費用。

usedIfRouteIsEmpty

boolean

這個欄位只會套用至路線未提供任何貨運服務的車輛。用於說明車輛是否應視為「二手」或在這個案例中否。

如果為 true,即使車輛沒有運送任何貨物,也會從起點前往終點,且會考量從起點到終點的時間和距離成本。

否則,車輛就不會從起點移動到終點,且系統不會為該車輛安排 breakRule 或延遲 (從 TransitionAttributes 開始)。在這種情況下,車輛的 ShipmentRoute 只包含車輛索引和標籤,不含其他資訊。

routeDurationLimit

object (DurationLimit)

這個限制適用於車輛路線的總行車時間。在特定 OptimizeToursResponse 中,車輛的路線時間長度是 vehicleEndTimevehicleStartTime 的差異。

travelDurationLimit

object (DurationLimit)

這個限制適用於車輛路線的交通時間。在特定 OptimizeToursResponse 中,路線行程時間是所有 transitions.travel_duration 的總和。

routeDistanceLimit

object (DistanceLimit)

套用至車輛路線總距離的限制。在指定的 OptimizeToursResponse 中,路線距離是所有 transitions.travel_distance_meters 的總和。

extraVisitDurationForVisitType

map (key: string, value: string (Duration format))

指定 VisitTypes 字串到 times 的對應。時間長度是指在指定 visitTypes 的造訪中,除了 VisitRequest.duration 之外所需的時間。如果指定 costPerHour,這段額外的造訪時間會增加費用。金鑰 (即 visitTypes) 不得為空白字串。

如果造訪要求包含多種類型,地圖會為每種類型新增時間長度。

breakRule

object (BreakRule)

說明要對這輛車輛強制執行的休息時間表。如果為空白,則不會為這輛車輛安排休息時間。

label

string

指定這輛車的標籤。這個標籤會在回應中以對應 ShipmentRoutevehicleLabel 回報。

ignore

boolean

如果設為 true,usedIfRouteIsEmpty 就必須為 false,且這輛車不會使用。

如果在 injectedFirstSolutionRoutes 中,運送作業是由已略過的車輛執行,則系統會在第一個解決方案中略過該作業,但可在回應中執行。

如果運送作業是由 injectedSolutionConstraint 中遭到忽略的車輛執行,且任何相關的接送/送達作業都受到限制,必須留在車輛上 (也就是未放寬至 RELAX_ALL_AFTER_THRESHOLD 層級),系統會在回應中略過該作業。如果運送單有非空白的 allowedVehicleIndices 欄位,且所有允許的車輛都遭到忽略,系統就會在回應中略過該運送單。

travelDurationMultiple

number

指定可用於增加或減少此車輛行駛時間的乘數。舉例來說,如果將此值設為 2.0,表示這輛車輛的速度較慢,且行駛時間是標準車輛的兩倍。(多次不會影響造訪時間長度)。但如果指定 costPerHourcostPerTraveledHour,則會影響費用。必須介於 [0.001, 1000.0] 之間。如果未設定,則車輛為標準車輛,且這個倍數會視為 1.0。

警告:套用這個數倍數後,交通時間會四捨五入至最接近的秒數,但在執行任何數值運算之前,整數值可能會導致精確度降低。

另請參閱下方的 extraVisitDurationForVisitType

TravelMode

車輛可使用的交通方式。

這些應屬於 Google 地圖平台路徑首選 API 交通模式的子集,詳情請參閱:https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode

列舉
TRAVEL_MODE_UNSPECIFIED 未指定的交通方式,等同於 DRIVING
DRIVING 與行車路線 (汽車、...) 對應的交通模式。
WALKING 步行路線對應的交通方式。

RouteModifiers

封裝計算車輛路線時要滿足的一組選用條件。這與 Google 地圖平台 Routes Preferred API 中的 RouteModifiers 類似,詳情請參閱:https://developers.google.com/maps/documentation/routes/reference/rest/v2/RouteModifiers

JSON 表示法
{
  "avoidTolls": boolean,
  "avoidHighways": boolean,
  "avoidFerries": boolean,
  "avoidIndoor": boolean
}
欄位
avoidTolls

boolean

指定是否要在合理情況下避開收費道路。系統會優先選擇不含收費道路的路線。僅適用於機動交通方式。

avoidHighways

boolean

指定是否要在合理情況下避開高速公路。針對不含高速公路的路線,我們會優先處理。僅適用於機動運輸模式。

avoidFerries

boolean

指定是否要在合理情況下避開渡輪。系統會優先提供不含渡輪的路線。僅適用於機動運輸模式。

avoidIndoor

boolean

選用設定。指定是否要避免在合理範圍內導航。系統會優先採用不含室內導航的路線。僅適用於 WALKING 交通方式。

UnloadingPolicy

車輛卸載方式相關政策。僅適用於提供自取和外送的出貨商品。

其他商品在路線上的任何地點皆可自由運送,與 unloadingPolicy 無關。

列舉
UNLOADING_POLICY_UNSPECIFIED 未指定卸貨政策;必須在相應的接送後才會進行。
LAST_IN_FIRST_OUT 必須以相反的順序進行配送
FIRST_IN_FIRST_OUT 配送訂單的訂單必須與取貨地點相同

LoadLimit

定義套用至車輛的負載限制,例如「這輛卡車只能承載 3500 公斤」。詳情請參閱《loadLimits》。

JSON 表示法
{
  "softMaxLoad": string,
  "costPerUnitAboveSoftMax": number,
  "startLoadInterval": {
    object (Interval)
  },
  "endLoadInterval": {
    object (Interval)
  },
  "maxLoad": string,
  "costPerKilometer": {
    object (LoadCost)
  },
  "costPerTraveledHour": {
    object (LoadCost)
  }
}
欄位
softMaxLoad

string (int64 format)

對負載的輕微限制。詳情請參閱《costPerUnitAboveSoftMax》。

costPerUnitAboveSoftMax

number

如果車輛沿途的負載量超過 softMaxLoad,須支付以下的罰金 (每輛車一次):(載入 - softMaxLoad) * costPerUnitAboveSoftMax。所有費用加總起來,且必須與 Shipment.penalty_cost 使用相同的單位。

startLoadInterval

object (Interval)

車輛在路線起點的允許載客量間隔。

endLoadInterval

object (Interval)

路線終點的車輛可接受的負載間隔。

maxLoad

string (int64 format)

可接受的最大負載量。

costPerKilometer

object (LoadCost)

這輛車輛運送一單位貨物超過一公里的費用。這可做為燃料耗量的替代工具:如果負載是體重 (以牛頓為單位),那麼負載*公里應該有能量尺寸。

costPerTraveledHour

object (LoadCost)

這輛車在 1 小時內載運 1 個單位的費用。

時間間隔

可接受的負載量的時間間隔。

JSON 表示法
{
  "min": string,
  "max": string
}
欄位
min

string (int64 format)

可接受的最低負載。必須大於或等於 0。如果同時指定兩者,min 值必須 ≤ max

max

string (int64 format)

可接受的負載上限。必須大於或等於 0。如果未指定,則此訊息不會限制最大負載。如果同時指定這兩個值,min 必須小於或等於 max

LoadCost

Transition 期間移動一個單位的費用。就負載量而言,成本是以下兩個部分的總和:

  • min(load, loadThreshold) * costPerUnitBelowThreshold
  • max(0, load - loadThreshold) * costPerUnitAboveThreshold

以這種成本來看,解決方案偏好優先滿足高需求,或同等的高需求自取量。舉例來說,如果車輛有

load_limit {
  key: "weight"
  value {
    costPerKilometer {
      loadThreshold: 15
      costPerUnitBelowThreshold: 2.0
      costPerUnitAboveThreshold: 10.0
    }
  }
}

路徑為 start,pickup,pickup,delivery,delivery,end,其中包含轉換:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 20 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

則這個 LoadCost 產生的費用為 (cost_below * load_below * kilometers + cost_above * load_above * kms)

  • 轉換 0:0.0
  • 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉換 2:2.0 * 15 * 1.0 + 10.0 * (20 - 15) * 1.0 = 80.0
  • 轉場效果 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉場 4:0.0

因此,路線上的 LoadCost 為 120.0。

不過,如果路線起點、上車、外送、上車、外送及轉場:

transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 10 }
             travelDistanceMeters: 1000.0 }
transition { vehicle_load['weight'] { amount: 0 }
             travelDistanceMeters: 1000.0 }

則這個 LoadCost 產生的費用為

  • 轉換 0:0.0
  • 轉換 1:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉場效果 2:0.0
  • 轉場效果 3:2.0 * 10 * 1.0 + 10.0 * 0 * 1.0 = 20.0
  • 轉場效果 4:0.0

路線上的 LoadCost 為 40.0,

LoadCost 讓具有大量載入轉換的解決方案所費不貲。

JSON 表示法
{
  "loadThreshold": string,
  "costPerUnitBelowThreshold": number,
  "costPerUnitAboveThreshold": number
}
欄位
loadThreshold

string (int64 format)

超過此值的負載量,負載單位的移動費用會從 costPerUnitBelowThreshold 變更為 costPerUnitAboveThreshold。必須大於或等於 0。

costPerUnitBelowThreshold

number

移動單位的成本,每個單位介於 0 至門檻之間。必須是有限值,且大於等於 0。

costPerUnitAboveThreshold

number

移動單位成本 (高於門檻的每個單位)。在特殊情況下,如果閾值 = 0,則這是每個單位的固定成本。必須是有限值,且 >= 0。

DurationLimit

用於定義車輛路線最長行駛時間的限制。挑戰可以是困難或輕微。

定義軟性上限欄位時,必須一併定義軟性上限門檻及其相關費用。

JSON 表示法
{
  "maxDuration": string,
  "softMaxDuration": string,
  "quadraticSoftMaxDuration": string,
  "costPerHourAfterSoftMax": number,
  "costPerSquareHourAfterQuadraticSoftMax": number
}
欄位
maxDuration

string (Duration format)

硬性限制將持續時間限制在 maxDuration 內。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

softMaxDuration

string (Duration format)

軟性限制不會強制執行時間長度上限,但違反規定時會導致路線產生費用。這項費用會與模型中定義的其他費用相加,並使用相同的單位。

如果已定義,softMaxDuration 必須為非負數。如果一併定義 maxDuration,則 softMaxDuration 必須小於 maxDuration。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

quadraticSoftMaxDuration

string (Duration format)

非強制執行的持續時間上限並未強制執行時間上限,但如果違反,路徑會在這段時間內產生二次費用。這筆費用會與模型中定義的其他費用相加,且單位相同。

如果已定義,quadraticSoftMaxDuration 不得為負數。如果也定義了 maxDuration,則 quadraticSoftMaxDuration 必須小於 maxDuration,且差值不得超過一天:

maxDuration - quadraticSoftMaxDuration <= 86400 seconds

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

costPerHourAfterSoftMax

number

違反 softMaxDuration 門檻會產生的每小時費用。如果時間長度低於門檻,額外費用為 0,否則費用取決於時間長度,如下所示:

  costPerHourAfterSoftMax * (duration - softMaxDuration)

費用必須為正數。

costPerSquareHourAfterQuadraticSoftMax

number

違反 quadraticSoftMaxDuration 門檻時產生的每平方小時費用。

如果時間長度低於門檻,額外費用為 0,否則費用取決於時間長度,如下所示:

  costPerSquareHourAfterQuadraticSoftMax *
  (duration - quadraticSoftMaxDuration)^2

費用必須為非負值。

DistanceLimit

定義可行駛的最大距離。挑戰可以是困難或輕微。

如果定義軟性限制,softMaxMeterscostPerKilometerAboveSoftMax 都必須定義且為非負值。

JSON 表示法
{
  "maxMeters": string,
  "softMaxMeters": string,
  "costPerKilometerBelowSoftMax": number,
  "costPerKilometerAboveSoftMax": number
}
欄位
maxMeters

string (int64 format)

硬性限制,限制距離不得超過 maxMeters。限制值不得為負數。

softMaxMeters

string (int64 format)

軟性限制不會強制執行最大距離限制,但如果違反限制,則會產生費用,並與模型中定義的其他費用相加,單位相同。

如果已定義,softMaxMeters 必須小於 maxMeters,且必須為非負值。

costPerKilometerBelowSoftMax

number

每公里產生的費用,最高可達 softMaxMeters,以下公式為:

  min(distanceMeters, softMaxMeters) / 1000.0 *
  costPerKilometerBelowSoftMax.

此費用不適用於routeDistanceLimit

costPerKilometerAboveSoftMax

number

如果距離超過 softMaxMeters 上限,則會產生每公里費用。如果距離小於限制,額外費用會是 0,否則用於計算費用的公式如下:

  (distanceMeters - softMaxMeters) / 1000.0 *
  costPerKilometerAboveSoftMax.

費用必須為正數。

BreakRule

產生車輛休息時間的規則 (例如午餐休息時間)。休息是指車輛在目前位置保持閒置狀態的連續期間,且無法進行任何巡訪。可能會發生中斷的情況如下:

  • 或在車輛發動前 (車輛可能不會在休息期間發動),這不會影響車輛發動時間。
  • 或在車輛行程結束後 (同樣地,請提供車輛行程結束時間)。
JSON 表示法
{
  "breakRequests": [
    {
      object (BreakRequest)
    }
  ],
  "frequencyConstraints": [
    {
      object (FrequencyConstraint)
    }
  ]
}
欄位
breakRequests[]

object (BreakRequest)

廣告插播序列。請參閱 BreakRequest 訊息。

frequencyConstraints[]

object (FrequencyConstraint)

可能會套用多個 FrequencyConstraint。他們必須滿足這個 BreakRuleBreakRequest。請參閱 FrequencyConstraint

BreakRequest

您必須事先得知每輛車的休息順序 (即數量和順序)。重複的 BreakRequest 會定義該序列,並按照必須發生的順序排列。兩者的時間範圍 (earliestStartTime / latestStartTime) 可能會重疊,但必須與訂單相容 (系統會檢查這項條件)。

JSON 表示法
{
  "earliestStartTime": string,
  "latestStartTime": string,
  "minDuration": string
}
欄位
earliestStartTime

string (Timestamp format)

必要欄位。休息時間開始時間的下限 (包含在內)。

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

latestStartTime

string (Timestamp format)

必要欄位。休息時間開始的上限 (包含在內)。

RFC3339 世界標準時間「Zulu」格式的時間戳記,解析度以奈秒為單位,小數點後最多 9 位。範例:"2014-10-02T15:01:23Z""2014-10-02T15:01:23.045123456Z"

minDuration

string (Duration format)

必要欄位。廣告插播的時間長度下限。必須為正數。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

FrequencyConstraint

您可以進一步限制上述指定的插播廣告頻率和時間長度,例如強制設下最小插播廣告頻率,例如「每 12 小時至少要插播 1 次廣告」。假設這個值可解讀為「在 12 小時的任何滑動時間範圍內,至少要有一個廣告插播時段至少一小時」,則範例會轉譯為下列 FrequencyConstraint

{
   minBreakDuration { seconds: 3600 }         # 1 hour.
   maxInterBreakDuration { seconds: 39600 }  # 11 hours (12 - 1 = 11).
}

除了 BreakRequest 中已指定的時間區間和最短時間長度外,解決方案中的中斷時間和時間長度都會遵循所有這類限制。

FrequencyConstraint 可能在練習時適用於不連續的休息時間。例如,下列排程遵循「每 12 小時 1 小時」範例:

  04:00 vehicle start
   .. performing travel and visits ..
  09:00 1 hour break
  10:00 end of the break
   .. performing travel and visits ..
  12:00 20-min lunch break
  12:20 end of the break
   .. performing travel and visits ..
  21:00 1 hour break
  22:00 end of the break
   .. performing travel and visits ..
  23:59 vehicle end
JSON 表示法
{
  "minBreakDuration": string,
  "maxInterBreakDuration": string
}
欄位
minBreakDuration

string (Duration format)

必要欄位。這項限制的最短廣告插播長度。正數。請參閱 FrequencyConstraint 的說明。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

maxInterBreakDuration

string (Duration format)

必要欄位。路線中任何時間間隔的上限,至少不包含部分 duration >= minBreakDuration 的中斷。必須為正數。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

DurationDistanceMatrix

指定從造訪、車輛起點位置和車輛終點位置之間的時間長度和距離矩陣。

JSON 表示法
{
  "rows": [
    {
      object (Row)
    }
  ],
  "vehicleStartTag": string
}
欄位
rows[]

object (Row)

指定時間長度和距離矩陣的資料列。必須包含與 ShipmentModel.duration_distance_matrix_src_tags 一樣的元素數量。

vehicleStartTag

string

標記定義這個時間長度和距離矩陣適用於哪些車輛。如果留空,則會套用至所有車輛,且只能有單一矩陣。

每輛車起點都必須與一個矩陣相符,也就是說,只有其中一個 startTags 欄位必須與矩陣的 vehicleStartTag (且僅限該矩陣) 相符。

所有矩陣都必須有不同的 vehicleStartTag

指定時間長度和距離矩陣的資料列。

JSON 表示法
{
  "durations": [
    string
  ],
  "meters": [
    number
  ]
}
欄位
durations[]

string (Duration format)

指定資料列的持續時間值。必須包含與 ShipmentModel.duration_distance_matrix_dst_tags 一樣的元素數量。

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

meters[]

number

特定資料列的距離值。如果沒有任何費用或限制是指模型中的距離,則可留空,否則包含的元素數量必須與 durations 一樣。

TransitionAttributes

指定路徑上兩次連續造訪之間的轉換屬性。同一個轉換可能會套用多個 TransitionAttributes:在這種情況下,所有額外費用會相加,並套用最嚴格的限制或上限 (遵循自然的「AND」語義)。

JSON 表示法
{
  "srcTag": string,
  "excludedSrcTag": string,
  "dstTag": string,
  "excludedDstTag": string,
  "cost": number,
  "costPerKilometer": number,
  "distanceLimit": {
    object (DistanceLimit)
  },
  "delay": string
}
欄位
srcTag

string

定義一組 (src->dst) 轉場效果的標記,會套用至這些屬性。

來源造訪或車輛啟動活動的 VisitRequest.tagsVehicle.start_tags 必須包含 srcTag,或不包含 excludedSrcTag (視這兩個欄位是否為空白而定),才能與來源造訪或車輛啟動活動相符。

excludedSrcTag

string

詳情請參閱 srcTagsrcTagexcludedSrcTag 中必須有一個值不為空白。

dstTag

string

如果目的地或車輛的 VisitRequest.tagsVehicle.end_tags 包含 dstTag 或不含 excludedDstTag (視這兩個欄位中的哪一個非空白),就會符合目的地造訪或車輛終點。

excludedDstTag

string

詳情請參閱 dstTagdstTagexcludedDstTag 中不得空白。

cost

number

指定執行此轉換作業的費用。此值的單位與模型中的所有其他成本相同,且不得為負數。這筆費用會加上所有現有費用。

costPerKilometer

number

指定在執行這項轉換作業時,以每公里為單位的費用套用於行駛的距離。加總在車輛上指定的 Vehicle.cost_per_kilometer 最多。

distanceLimit

object (DistanceLimit)

指定執行此轉場效果時的行駛距離限制。

自 2021 年 6 月起,我們只支援軟性限制。

delay

string (Duration format)

指定執行這項轉換時的延遲時間。

這類延遲是指在完成來源造訪「之後」,以及開始目的地造訪「之前」

持續時間以秒為單位,最多 9 個小數位數,結尾為「s」。例如:"3.5s"

ShipmentTypeIncompatibility

根據出貨類型,指定不同運送方式間的不相容問題。系統會根據不相容模式,限制在同一路線上顯示不相容的貨件。

JSON 表示法
{
  "types": [
    string
  ],
  "incompatibilityMode": enum (IncompatibilityMode)
}
欄位
types[]

string

不相容類型的清單。兩件出貨各有不同的 shipment_types 為「不相容」。

incompatibilityMode

enum (IncompatibilityMode)

模式套用至不相容。

IncompatibilityMode

定義同一條路線上不相容貨運外觀的限制方式。

列舉
INCOMPATIBILITY_MODE_UNSPECIFIED 未指定相容模式。請一律不要使用這個值。
NOT_PERFORMED_BY_SAME_VEHICLE 在此模式下,如果兩件不相容的運送方式不相容,則無法同一輛車共享。
NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY

針對兩種不相容的類型隨附 NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY 不相容模式:

  • 如果兩者均為「只能自取 (無法外送) 或外送」(不提供取貨服務),就無法共乘同一輛車。
  • 如果其中一項貨品已出貨,另一個則由使用者自行取件,只要雙方先出貨再收到第二件貨品,雙方就可以共乘。

ShipmentTypeRequirement

根據 shipmentType 指定不同出貨之間的規定。需求的具體內容則由需求模式定義。

JSON 表示法
{
  "requiredShipmentTypeAlternatives": [
    string
  ],
  "dependentShipmentTypes": [
    string
  ],
  "requirementMode": enum (RequirementMode)
}
欄位
requiredShipmentTypeAlternatives[]

string

dependentShipmentTypes 要求的替代運送類型清單。

dependentShipmentTypes[]

string

所有在 dependentShipmentTypes 欄位中類型為 dependentShipmentTypes 的貨件,都必須在同一路線中至少有一個 requiredShipmentTypeAlternatives 類型的貨件。

注意:系統不允許要求鏈結,例如 shipmentType 依附自身。

requirementMode

enum (RequirementMode)

為需求套用的模式。

RequirementMode

定義路線上依附貨件外觀的模式。

列舉
REQUIREMENT_MODE_UNSPECIFIED 未指定需求模式。請一律不要使用這個值。
PERFORMED_BY_SAME_VEHICLE 在此模式下,所有「相依」貨物運送時都必須與至少一項「必要」貨物共乘同一輛車。
IN_SAME_VEHICLE_AT_PICKUP_TIME

IN_SAME_VEHICLE_AT_PICKUP_TIME 模式下,所有「從屬」貨件在取件時,至少需要有一個「必要」貨件。

因此「相依」運送取貨必須符合以下條件:

  • 此後路線僅會「必填」運送,或者
  • 訂單之前會收取「必要」貨品,如果「必要」運送資訊確實有貨,則此交付必須在「依附」運送包裹取件後處理。
IN_SAME_VEHICLE_AT_DELIVERY_TIME 與先前相同,除非「相依」運送作業在交貨時需要將車輛按「必要」出貨。

PrecedenceRule

兩個事件之間的優先順序規則 (每個事件為自取或貨物交付):「第二個」事件開始後,至少須在 offsetDuration 開始。

不過,有些優先順序可代表相同 (或相關) 事件,例如:「B 送貨後取貨」和「從 B 取件後到貨 (C) 發生」。

此外,優先順序只會在兩次運送作業都執行時才會套用,否則會遭到忽略。

JSON 表示法
{
  "firstIsDelivery": boolean,
  "secondIsDelivery": boolean,
  "offsetDuration": string,
  "firstIndex": integer,
  "secondIndex": integer
}
欄位
firstIsDelivery

boolean

指出「first」事件是否為放送事件。

secondIsDelivery

boolean

指出「第二」事件是否為提交事件。

offsetDuration

string (Duration format)

「第一個」和「第二個」事件之間的偏移。可以是負值。

時間長度以秒為單位,最多可有 9 個小數位數,並應以「s」結尾,例如:"3.5s"

firstIndex

integer

「first」事件的出貨索引。必須指定這個欄位。

secondIndex

integer

「second」事件的出貨索引。必須指定此欄位。