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

LocalInventory correspond aux informations d'inventaire associées à un lieu donné, 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 des raisons de rétrocompatibilité, est disponible via Product.fulfillment_info). Ce champ n'est qu'en sortie. Définir 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 décrit ci-dessous reflète un mappage de chaque ID de lieu à une liste de types de traitement compatibles, tandis que fulfillment_info mis à jour par AddFulfillmentPlaces et RemoveFulfillmentPlaces reflète un mappage de chaque type de traitement spécifique à une liste d'ID de lieu compatibles avec ce type de produit. Cependant, les deux types d'API modifient les mêmes informations de traitement sous-jacentes, et leur effet se répercutera sur Product.fulfillment_info.

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

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

AddLocalInventories

AddLocalInventories permet de créer des inventaires en magasin pour de nouveaux lieux (représentés par de nouveaux place_id) ou de mettre à jour les champs existants sur des inventaires en magasin existants. Les champs ajoutés ou mis à jour dans la liste des entrées LocalInventory dans le corps de la requête peuvent être spécifiés via AddLocalInventoriesRequest.add_mask. Les valeurs valides pour add_mask sont les suivantes:

  • 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 aucun nom d'attribut existant n'est 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: écrase tous les types de traitement compatibles. Les types de traitement 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 de 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, celle-ci met à jour les champs de store1 et crée store2 avec les valeurs de champ données.

Ce AddLocalInventoriesRequest.add_mask spécifie que price_info, un attribut personnalisé unique portant le nom "attr1", et fulfillment_types doit être mis à jour à l'aide des valeurs fournies dans le AddLocalInventoriesRequest.local_inventories.

Les attributes sont des attributs associés à un lieu avec un nom et des valeurs personnalisables. Étant donné que LocalInventory de store1 ne fournit pas la valeur de attr1 dans la requête, l'attribut personnalisé attr1 sera supprimé de l'LocalInventory existant de store1, le cas échéant. La valeur de l'attribut attr1 de store2 sera définie sur une valeur textuelle store2_value. Les autres attributs personnalisés existants de store1 et store2 ne sont pas modifiés.

fulfillment_types représente une liste de disponibilités de traitement pour un Product à un seul endroit. Il est identique et accepte les mêmes valeurs que fulfillment_info.type. Ce AddLocalInventoriesRequest spécifie que store1 accepte les types de traitement pickup-in-store et ship-to-store, tandis que store1 accepte custom-type-1. Les types de traitement existants avant cette mise à jour et qui ne sont pas mentionnés dans la requête 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 mises à jour sur l'inventaire en magasin seront stockées lorsque le produit sera créé. La mise à jour est horodatée avec AddLocalInventoriesRequest.add_time pour éviter que les mises à jour obsolètes remplacent les champs spécifiés de ces ID de lieu. Pour savoir comment éviter les mises à jour obsolètes et stocker les informations de l'inventaire en magasin avant la création du produit, consultez Protections d'horodatage pour les mises à jour de l'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 de AddLocalInventoriesRequest ajoute ou met à jour un seul inventaire en magasin avec l'ID de lieu "store3" pour le produit spécifié. Comme 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. Sinon, une erreur NOT_FOUND est générée.

RemoveLocalInventories

RemoveLocalInventories permet de supprimer des inventaires en magasin existants de lieux associés à des ID de lieu donné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 de RemoveLocalInventoriesRequest supprime les inventaires en magasin pour les lieux ayant les ID de lieu "store1" et "store2" pour le produit spécifié. La mise à jour est horodatée avec RemoveLocalInventoriesRequest.remove_time pour éviter que les mises à jour obsolètes n'annulent la suppression de ces ID de lieu. Pour les ID de lieu spécifiés sans inventaire en magasin existant, la requête enregistre également leur date de mise à jour dans remove_time. Pour en savoir plus sur les codes temporels de mise à jour, consultez Protections de l'horodatage pour les mises à jour de l'inventaire en magasin.

Protections de l'horodatage pour les mises à jour de l'inventaire en magasin

Pour éviter les mises à jour non ordonnées, chaque champ d'inventaire en magasin est associé à une heure de mise à jour la plus récente.

L'heure de la dernière mise à jour est enregistrée pour chaque paire (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 à la dernière heure de mise à jour enregistrée pour les champs d'inventaire concernés. La mise à jour n'est validée que si et seulement si l'heure de mise à jour est strictement postérieure à l'heure de la dernière mise à jour.

Par exemple, supposons que l'ID de lieu "store1" ait price_info, et que l'heure de la dernière mise à jour enregistrée soit définie sur T. Si RemoveLocalInventoriesRequest.place_ids contient "store1", la requête ne supprime price_info de "store1" que si RemoveLocalInventoriesRequest.remove_time est postérieure à l'heure T. Il en va de même pour les RemoveLocalInventoriesRequest.

Dans le cadre de la protection par horodatage, il est possible qu'une RemoveLocalInventoriesRequest ne supprime que certains champs d'une LocalInventory, et non la totalité. Supposons qu'un inventaire en magasin avec l'ID de lieu "store1" présente une valeur price_info dont l'heure de dernière mise à jour enregistrée est T1 et que son seul attribut personnalisé existant portant le nom "attr1" est associé à l'heure de la dernière mise à jour enregistrée à T2. Si un RemoveLocalInventoriesRequest.place_ids contient "store1" et que remove_time est défini sur T3 (où T1 < T3 < T2), l'élément price_info de store_1 sera supprimé, tandis que son attribut attr1 ne sera pas modifié.

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 en magasin pour un Product inexistant est traitée comme si l'Product existait conformément aux spécifications de la méthode. Les informations sur l'inventaire en magasin sont conservées pendant deux jours maximum si l'Product correspondant n'est pas créé via CreateProduct au cours de cette période.