LocalInventory
是与特定地点关联的商品目录信息,由其 place_id
标识。例如,您可以为提供特定价格的商店或区域创建 LocalInventory
。LocalInventory
具有以下字段:
LocalInventory.price_info
LocalInventory.attributes
LocalInventory.fulfillment_types
现有的 LocalInventory
条目可通过 Product.local_inventories
查看(fulfillment_types
除外,fulfillment_types
可通过 Product.fulfillment_info
获取,以实现向后兼容性)。此字段仅用于输出。为 Product
CRUD API 或 SetInventory
设置 Product.local_inventories
没有任何影响。
每个 (LocalInventory.place_id,
LocalInventory.fulfillment_types[...])
对都指向目录更新文档中提及的相同 (fulfillment_info.place_ids, fulfillment_info.type)
对。由 AddLocalInventories
和 RemoveLocalInventories
(如下所述)更新的 fulfillment_types
反映了将每个地点 ID 映射到其支持的 fulfillment 类型列表的映射,而由 AddFulfillmentPlaces
和 RemoveFulfillmentPlaces
更新的 fulfillment_info
反映了将每个具体 fulfillment 类型映射到支持此类型的地点 ID 列表的映射。不过,这两种 API 都会修改相同的底层执行信息,并且这两种 API 的影响都会反映在 Product.fulfillment_info
中。
本地商品目录更新方法
更改商品的本地商品目录信息的频率要比更改清单信息的频率高得多。我们提供了一套专门的方法来处理大量特定于本地商品目录的更新。这些方法是异步的,因为下游优化支持对每个商品同时执行数百个更新,而不会影响性能。
AddLocalInventories
AddLocalInventories
可用于在新地点(用新的 place_id
表示)创建本地商品目录,或更新现有本地商品目录中的现有字段。您可以通过 AddLocalInventoriesRequest.add_mask
指定在请求正文中的 LocalInventory
条目列表中添加或更新的字段。有效的 add_mask
值包括:
price_info
:覆盖LocalInventory.price_info
。attributes
:覆盖所有LocalInventory.attributes
。系统会移除请求正文中未提及的现有属性。attributes.PLACEHOLDER_NAME
:仅覆盖指定的自定义属性。如果请求中未提供现有属性名称,系统会删除该属性。可以指定多个attributes.PLACEHOLDER_NAME
,但每个属性名称必须不同。不过,AddLocalInventoriesRequest.add_mask
在同一请求中不能同时包含attributes
值和attributes.PLACEHOLDER_NAME
值。fulfillment_types
:覆盖所有受支持的执行方式类型。请求正文中未提及的现有执行方式类型将被移除。
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" local_inventories: { place_id: "store1" price_info: { currency_code: "USD" price: 100 original_price: 110 cost: 95 } fulfillment_types: "pickup-in-store" fulfillment_types: "ship-to-store" } local_inventories: { place_id: "store2" price_info: { currency_code: "USD" price: 200 original_price: 210 cost: 195 } attributes: { key: "attr1", value: { text: "store2_value" } } fulfillment_types: "custom-type-1" } add_mask: { paths: "price_info" paths: "attributes.attr1" paths: "fulfillment_types" } add_time: { seconds: 100 nanos: 100 } allow_missing: true }
此示例 AddLocalInventoriesRequest
会为指定商品添加或更新两个具有放置 ID "store1"
和 "store2"
的本地商品目录。如果在请求之前 store1
存在,而 store2
不存在,则请求会更新 store1
的字段,并使用给定的字段值创建 store2
。
此 AddLocalInventoriesRequest.add_mask
指定应使用 AddLocalInventoriesRequest.local_inventories
中提供的值更新 price_info
(一个名为 "attr1"
的单个自定义属性)和 fulfillment_types
。
attributes
是与地点相关联的属性,具有可自定义的名称和值。由于 store1
的 LocalInventory
未在请求中提供 attr1
的值,因此系统会从 store1
的现有 LocalInventory
(如果存在)中删除自定义属性 attr1
。store2
的属性 attr1
的值将设置为文本值 store2_value
。store1
和 store2
上的其他现有自定义属性保持不变。
fulfillment_types
表示单个地点的 Product
履单服务可用性列表。它与 fulfillment_info.type
相同,并接受与 fulfillment_info.type
相同的值。此 AddLocalInventoriesRequest
指定 store1
支持 pickup-in-store
和 ship-to-store
执行方式,而 store1
支持 custom-type-1
。在此更新之前存在但未在请求中提及的履单类型将被删除。
由于 AddLocalInventoriesRequest.allow_missing
设置为 true,因此即使商品尚不存在,系统也会存储更新后的本地商品目录信息,以供最终创建商品时使用。更新带有 AddLocalInventoriesRequest.add_time
时间戳,以防止过时更新覆盖这些地点 ID 的指定字段。如需详细了解如何在商品创建之前防止更新过时以及存储本地商品目录信息,请参阅针对本地商品目录更新的时间戳保护措施和预加载商品目录信息。
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" local_inventories: { place_id: "store3" attributes: { key: "attr1", value: { text: "attr1_value" } } attributes: { key: "attr2", value: { numbers: 123 } } } add_mask: { paths: "attributes" } add_time: { seconds: 100 nanos: 100 } }
此示例 AddLocalInventoriesRequest
会为指定商品添加或更新一个地点 ID 为 "store3"
的本地商品目录。由于其 add_mask
包含 "attributes"
,因此 store3
的所有现有自定义属性都会被删除,并替换为请求中指定的 attr1
和 attr2
。请注意,由于未设置 allow_missing
,因此需要指定的商品存在。否则,系统会抛出 NOT_FOUND
错误。
RemoveLocalInventories
RemoveLocalInventories
可用于移除具有给定地点 ID 的地点的现有本地商品目录。
Proto
{ product: "projects/123/locations/global/catalogs/default_catalog/branches/default_branch/products/p123" place_ids: "store1" place_ids: "store2" remove_time: { seconds: 100 nanos: 100 } allow_missing: true }
此示例 RemoveLocalInventoriesRequest
会移除指定商品的放置 ID 为 "store1"
和 "store2"
的放置点的本地商品目录。更新带有 RemoveLocalInventoriesRequest.remove_time
时间戳,以防止过时更新覆盖这些地点 ID 的删除操作。对于没有现有本地商品目录的指定地点 ID,该请求还会将其更新时间记录为 remove_time
。如需详细了解更新时间戳,请参阅本地商品目录更新的时间戳保护措施
本地商品目录更新的时间戳保护措施
为了防止出现无序更新,每个本地商品目录字段都与最新的更新时间相关联。
系统会记录每个 (place_id, price_info)
、(place_id, attributes[...])
和 (place_id, fulfillment_types[...])
对的最新更新时间。
调用 AddLocalInventories
和 RemoveLocalInventories
方法可让调用方指定请求发出的更新时间。系统会将此更新时间与为相关商品目录字段记录的最新更新时间进行比较;当更新时间完全晚于最新更新时间时,才会提交更新。
例如,假设地点 ID "store1"
具有 price_info
,并且上次记录的更新时间设置为 T
。如果 RemoveLocalInventoriesRequest.place_ids
包含 "store1"
,则只有当 RemoveLocalInventoriesRequest.remove_time
晚于 T
时,请求才会从 "store1"
中移除 price_info
。RemoveLocalInventoriesRequest
也是如此。
在时间戳保护下,RemoveLocalInventoriesRequest
可能会仅移除 LocalInventory
的某些字段,而不是全部字段。假设地点 ID 为 "store1"
的本地商品目录包含 price_info
,其上次记录的更新时间设置为 T1
,并且其唯一现有自定义属性的名称为 "attr1"
,上次记录的更新时间为 T2
。如果 RemoveLocalInventoriesRequest.place_ids
包含 "store1"
,并且 remove_time
已设为 T3
(其中 T1 < T3 < T2
),则 store_1
的 price_info
将被移除,而其属性 attr1
将保持不变。
预加载商品目录信息
每种本地商品目录更新方法都允许调用者在请求中设置 allow_missing
。将 allow_missing
设置为 true 时,将按照方法规范处理对不存在的 Product
的本地商品目录更新,就像存在 Product
一样。如果未在此时间范围内通过 CreateProduct
创建相应的 Product
,则本地商品目录信息将最多保留两天。