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)
对。fulfillment_types
由 AddLocalInventories
和 RemoveLocalInventories
更新,反映了从每个地点 ID 到其支持的 fulfillment 类型列表的映射;而 fulfillment_info
由 AddFulfillmentPlaces
和 RemoveFulfillmentPlaces
更新,反映了从每个特定 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
相同,并接受相同的值。此 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
,则本地商品目录信息将最多保留两天。