Mettre à jour l'inventaire local pour Vertex AI Search pour le commerce

LocalInventory correspond aux informations d'inventaire associées à un lieu spécifique, identifié par son place_id. Par exemple, un LocalInventory peut être créé pour un magasin ou une région où un certain prix est disponible. LocalInventory comporte les champs suivants :

  • LocalInventory.price_info
  • LocalInventory.attributes
  • LocalInventory.fulfillment_types

Les entrées LocalInventory existantes sont visibles via Product.local_inventories (à l'exception de fulfillment_types qui, pour la rétrocompatibilité, est disponible via Product.fulfillment_info). Ce champ est en sortie uniquement. La définition Product.local_inventories pour les API CRUD Product ou SetInventory n'a aucun effet.

Chaque paire (LocalInventory.place_id, LocalInventory.fulfillment_types[...]) pointe vers la même paire (fulfillment_info.place_ids, fulfillment_info.type) mentionnée dans la documentation sur la mise à jour de l'inventaire. fulfillment_types mis à jour par AddLocalInventories et RemoveLocalInventories reflète un mappage de chaque ID de lieu vers une liste des types de fulfillment qu'il prend en charge, tandis que fulfillment_info mis à jour par AddFulfillmentPlaces et RemoveFulfillmentPlaces reflète un mappage de chaque type de fulfillment spécifique vers une liste des ID de lieu qui prennent en charge ce type. Toutefois, les deux types d'API modifient les mêmes informations de traitement sous-jacentes, et l'effet des deux types d'API se reflétera sur Product.fulfillment_info.

Méthodes de mise à jour de l'inventaire en magasin

Les modifications apportées aux informations sur l'inventaire en magasin d'un produit peuvent être beaucoup plus fréquentes que celles apportées à son catalogue. Un ensemble de méthodes spécialisées est fourni pour gérer de grands volumes de mises à jour spécifiques à l'inventaire en magasin. Ces méthodes sont asynchrones en raison des optimisations en aval qui permettent d'accepter des centaines de mises à jour simultanées par produit, sans compromis sur les performances.

AddLocalInventories

AddLocalInventories peut être utilisé pour créer des inventaires locaux dans de nouveaux lieux (représentés par de nouveaux place_id) ou pour mettre à jour des champs existants dans des inventaires locaux existants. Les champs ajoutés ou mis à jour dans la liste des entrées LocalInventory du corps de la requête peuvent être spécifiés via AddLocalInventoriesRequest.add_mask. Les valeurs add_mask possibles sont :

  • price_info : remplace LocalInventory.price_info.
  • attributes : remplace tous les LocalInventory.attributes. Les attributs existants qui ne sont pas mentionnés dans le corps de la requête sont supprimés.
  • attributes.PLACEHOLDER_NAME : remplace uniquement l'attribut personnalisé spécifié. Si le nom d'un attribut existant n'est pas fourni dans la requête, l'attribut est supprimé. Vous pouvez spécifier plusieurs attributes.PLACEHOLDER_NAME, à condition que chaque nom d'attribut soit différent. Toutefois, AddLocalInventoriesRequest.add_mask ne peut pas inclure à la fois les valeurs attributes et attributes.PLACEHOLDER_NAME dans la même requête.
  • fulfillment_types : remplace tous les types de fulfillment compatibles. Les types de fulfillment existants qui ne sont pas mentionnés dans le corps de la requête sont supprimés.

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
}
  

Cet exemple AddLocalInventoriesRequest ajoute ou met à jour deux inventaires en magasin avec les ID de lieu "store1" et "store2" pour le produit spécifié. Si store1 existe et que store2 n'existe pas avant la requête, la requête met à jour les champs de store1 et crée store2 avec les valeurs de champ données.

Ce AddLocalInventoriesRequest.add_mask indique que price_info, un attribut personnalisé unique nommé "attr1" et fulfillment_types doivent être mis à jour à l'aide des valeurs fournies dans AddLocalInventoriesRequest.local_inventories.

attributes sont des attributs associés à un lieu, dont le nom et les valeurs peuvent être personnalisés. Étant donné que LocalInventory de store1 ne fournit pas la valeur de attr1 dans la requête, l'attribut personnalisé attr1 sera supprimé du LocalInventory existant de store1 s'il existe. La valeur de l'attribut attr1 de store2 sera définie sur la valeur textuelle store2_value. Les autres attributs personnalisés existants sur store1 et store2 ne sont pas modifiés.

fulfillment_types représente une liste des disponibilités de traitement pour un Product dans un seul lieu. Il est identique à fulfillment_info.type et accepte les mêmes valeurs. Ce AddLocalInventoriesRequest spécifie que store1 est compatible avec les types de fulfillment pickup-in-store et ship-to-store, tandis que store1 est compatible avec custom-type-1. Les types de fulfillment existant avant cette mise à jour et qui ne sont pas mentionnés dans la demande seront supprimés.

Étant donné que AddLocalInventoriesRequest.allow_missing est défini sur "true", même si le produit n'existe pas déjà, les informations d'inventaire en magasin mises à jour seront stockées pour être utilisées une fois le produit créé. La mise à jour est horodatée par AddLocalInventoriesRequest.add_time afin d'empêcher les mises à jour obsolètes d'ignorer les champs spécifiés pour ces ID de lieu. Pour en savoir plus sur la façon d'éviter les mises à jour obsolètes et de stocker les informations sur l'inventaire en magasin avant la création du produit, consultez Protections d'horodatage pour les mises à jour d'inventaire en magasin et Précharger les informations sur l'inventaire.

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
  }
}
  

Cet exemple AddLocalInventoriesRequest ajoute ou met à jour un seul inventaire en magasin avec l'ID de lieu "store3" pour le produit spécifié. Étant donné que son add_mask contient "attributes", tous les attributs personnalisés existants de store3 sont supprimés et remplacés par attr1 et attr2, comme spécifié dans la requête. Notez que, comme allow_missing n'est pas défini, le produit spécifié doit exister. Dans le cas contraire, une erreur NOT_FOUND est renvoyée.

RemoveLocalInventories

RemoveLocalInventories permet de supprimer les stocks en magasin existants dans les lieux dont les ID de lieu sont spécifiés.

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
}
  

Cet exemple RemoveLocalInventoriesRequest supprime les inventaires en magasin pour les lieux dont les ID sont "store1" et "store2" pour le produit spécifié. La mise à jour est horodatée par RemoveLocalInventoriesRequest.remove_time afin d'empêcher les mises à jour obsolètes d'ignorer la suppression de ces ID de lieu. Pour les ID de lieu spécifiés sans inventaires en magasin existants, la requête enregistre également leur heure de mise à jour sur remove_time. Pour en savoir plus sur les codes temporels de mise à jour, consultez Protections d'horodatage pour les mises à jour d'inventaire en magasin.

Protections d'horodatage pour les mises à jour d'inventaire en magasin

Pour se protéger contre les mises à jour désordonnées, chaque champ d'inventaire local est associé à une heure de dernière mise à jour.

L'heure de dernière mise à jour est enregistrée pour chaque paire de (place_id, price_info), (place_id, attributes[...]) et (place_id, fulfillment_types[...]).

Les méthodes AddLocalInventories et RemoveLocalInventories permettent à l'appelant de spécifier une heure de mise à jour pour le moment où la requête est émise. Cette heure de mise à jour est comparée à l'heure de dernière mise à jour enregistrée pour les champs d'inventaire concernés. La mise à jour n'est validée que si elle est strictement postérieure à l'heure de dernière mise à jour.

Par exemple, supposons que l'ID de lieu "store1" dispose de price_info, avec T comme heure de dernière mise à jour enregistrée. Si RemoveLocalInventoriesRequest.place_ids contient "store1", la requête supprimera price_info de "store1" uniquement si RemoveLocalInventoriesRequest.remove_time est postérieur à T. Il en va de même pour les RemoveLocalInventoriesRequest.

Dans le cadre de la protection des codes temporels, il est possible qu'un RemoveLocalInventoriesRequest ne supprime que certains champs d'un LocalInventory au lieu de la totalité. Supposons qu'un inventaire en magasin avec l'ID de lieu "store1" comporte price_info avec l'heure de dernière mise à jour définie sur T1, et que son seul attribut personnalisé existant porte le nom "attr1" avec l'heure de dernière mise à jour définie sur T2. Si un RemoveLocalInventoriesRequest.place_ids contient "store1" et que remove_time est défini sur T3 (où T1 < T3 < T2), le price_info de store_1 sera supprimé, tandis que son attribut attr1 restera inchangé.

Précharger les informations d'inventaire

Chacune des méthodes de mise à jour de l'inventaire en magasin permet à l'appelant de définir allow_missing dans la requête. Lorsque allow_missing est défini sur "true", une mise à jour de l'inventaire local vers un Product inexistant est traitée comme si l'objet Product existait et conformément aux spécifications de la méthode. Les informations sur l'inventaire local sont conservées pendant deux jours au maximum si la valeur Product correspondante n'est pas créée à l'aide de CreateProduct dans ce délai.