Événements de l'instantané d'inventaire V2

Les événements d'instantanés d'inventaire sont déclenchés lorsqu'un instantané d'inventaire est capturé dans la gestion des stocks en magasin à un moment donné. En utilisant Inventory snapshot events V2, vous pouvez avoir plusieurs messages de vos données capturées.

Pour utiliser de manière fiable les messages d'instantanés d'inventaire V2, il est important de comprendre comment identifier et traiter correctement les données d'instantanés par le biais de messages d'instantanés individuels. Vous pouvez créer un calendrier de cette activité quotidienne et utiliser cette fonction pour prendre un instantané des données d'inventaire à ce moment précis.

Key identifiers

Ces combinaisons permettent d'identifier chaque cliché unique d'un magasin :
  • tenantId
  • storeId
  • timestamp

Cette combinaison correspond à une adresse uniquebatchId, qui est utilisée pour suivre tous les messages instantanés appartenant à cet instantané de magasin spécifique.

Processing snapshot messages

Séquencement
  • Chaque message d'instantané comprend une adresse messageSequence indiquant sa position dans le flux d'instantanés.
  • Le dernier message du lot comprend un champ totalMessages , qui représente le nombre total de messages instantanés uniques attendus. Dans ce dernier message, le champ de données est vide. Le message final indique que l'instantané est terminé.
  • Ce champ est vide dans tous les messages précédents.
Livraison en cas de rupture de stock
  • Les messages instantanés peuvent arriver dans le désordre.
  • Votre système doit suivre les valeurs de messageSequence par batchId pour s'assurer que tous les messages attendus ont été reçus.
  • Un instantané est considéré comme complet lorsque le nombre de valeurs uniques messageSequence correspond au champ totalMessages dans le message final.
Dédoublonnage
  • Un message instantané peut être publié plusieurs fois, ce qui entraîne des doublons.
  • Si deux messages partagent le même messageSequence et un horodatage identique pour un batchId particulier, ils sont considérés comme des doublons.
  • Vous pouvez vous débarrasser de l'un d'entre eux en toute sécurité.
Préférence pour l'horodatage le plus récent
  • Parfois, plusieurs messages instantanés peuvent arriver avec le même messageSequence mais des horodatages différents pour le même magasin.
  • Dans ce cas, vous devez conserver et traiter le message dont l'horodatage est le plus récent.
  • Les anciennes versions de cette séquence peuvent être éliminées en toute sécurité.

Cette séquence d'étapes permet de s'assurer que votre système reflète l'état le plus récent de l'instantané.

Exemple de flux
Store1 - Traitement des messages en double (même horodatage)

Un instantané est généré pour Store1. Le système reçoit :

Snapshot Message 1: messageSequence = 1, totalMessages = "", timestamp = 2024-10-10T08:00Z
 
Snapshot Message 2: messageSequence = 2, totalMessages = "", timestamp = 2024-10-10T08:00Z
Snapshot Message 3: messageSequence = 2, totalMessages = "", timestamp = 2024-10-10T08:00Z ← Duplicate
 
Snapshot Message 4: messageSequence = 3, totalMessages = "3", timestamp = 2024-10-10T08:00Z
 

Les messages 2 et 3 sont des doublons. Puisque les deux ont la même séquence et le même horodatage, écartez-en un.

Store2 - Utilisation de la préférence pour l'horodatage le plus récent

Un instantané est généré pour Store2. Le système reçoit :

Snapshot Message 1: messageSequence = 1, totalMessages = "", timestamp = 2024-10-10T08:00Z
Snapshot Message 2: messageSequence = 2, totalMessages = "", timestamp = 2024-10-10T08:00Z
Snapshot Message 3: messageSequence = 1, totalMessages = "", timestamp = 2024-10-10T08:10Z
 
Snapshot Message 4: messageSequence = 2, totalMessages = "", timestamp = 2024-10-10T08:10Z 
Snapshot Message 5: messageSequence = 3, totalMessages = "3", timestamp = 2024-10-10T08:10Z
 

Utilisez ici les messages instantanés les plus récents (messages 3, 4 et 5). Les messages les plus anciens (messages 1 et 2) ne sont pas pris en compte car ils sont obsolètes.

Les messages instantanés peuvent arriver dans le désordre. En raison de cette action, votre système doit suivre et valider chaque message d'instantané par son numéro de séquence et les métadonnées batchId avant de marquer un instantané comme complet.

L'exemple JSON suivant montre un événement publié qui est généré lorsqu'un instantané d'inventaire est capturé. L'application encode et ajoute les données de l'événement au chemin JSON de messages[].data .
{
"messages": [
{
"data": [
{
"productId": "100001",
"unitOfMeasure": "EACH",
"inventoryStatus": "GOOD",
"productClass": "",
"segmentType": "",
"segment": "",
"tagNo": "",
"batchNo": "",
"lotNo": "",
"manufacturedDate": "",
"locationId": "Bin1",
"quantity": 9.0
},
{
"productId": "100002",
"unitOfMeasure": "EACH",
"inventoryStatus": "GOOD",
"productClass": "",
"segmentType": "",
"segment": "",
"tagNo": "",
"batchNo": "",
"lotNo": "",
"manufacturedDate": "",
"locationId": "FoH",
"quantity": -1.0
}
],
"attributes": {
"code": "inventorySnapshotV2",
"timestamp": "2024-10-10T08:00Z[Etc/UTC]",
"messageId": "17d03402-7176-49df-9dc5-b0c25c22f310",
"batchId": "1692ae82-25f9-4943-b4d6-79458077925e",
"totalMessages": "1",
"messageSequence": "1",
"storeId": "Store1",
"groupBy": ""
}
}
]
}
 
L'exemple suivant montre la spécification du schéma JSON qui définit la structure des données JSON publiées sur l'événement inventorySnapshotV2 .
{
"properties": {
"messages": {
"type": "array",
"description": "Array containing the message details",
"items": {
"type": "object",
"properties": {
"data": {
  "type": "array",
  "description": "Array containing the inventory details",
  "items": {
    "type": "object",
    "properties": {
      "productId": {
        "type": "string",
        "description": "Unique identifier of the product"
      },
      "unitOfMeasure": {
        "type": "string",
        "description": "Unit of measure for the product"
      },
      "inventoryStatus": {
        "type": "string",
        "description": "Status of the inventory (e.g., GOOD)"
      },
      "productClass": {
        "type": "string",
        "description": "Classification of the product"
      },
      "segmentType": {
        "type": "string",
        "description": "Type of segment for the product"
      },
      "segment": {
        "type": "string",
        "description": "Segment details of the product"
      },
      "tagNo": {
        "type": "string",
        "description": "Tag number for the product"
      },
      "batchNo": {
        "type": "string",
        "description": "Batch number for the product"
      },
      "lotNo": {
        "type": "string",
        "description": "Lot number for the product"
      },
      "manufacturedDate": {
        "type": "string",
        "description": "Manufacturing date of the product"
      },
      "locationId": {
        "type": "string",
        "description": "Location identifier where the product is stored"
      },
      "quantity": {
        "type": "number",
        "description": "Quantity of the product in stock"
      }
    }
  }
},
"attributes": {
  "type": "object",
  "description": "Object containing the event attributes",
  "properties": {
    "code": {
      "type": "string",
      "description": "Code representing the event"
    },
    "timestamp": {
      "type": "string",
      "description": "The exact time when the snapshot was taken"
    },
    "messageId": {
      "type": "string",
      "format": "uuid",
      "description": "A unique identifier for the event message"
    },
    "batchId": {
      "type": "string",
      "format": "uuid",
      "description": "Unique identifier of a store batch"
    },
    "totalMessages": {
      "type": "string",
      "description": "The total number of messages for this store (for pagination)"
    },
    "messageSequence": {
      "type": "string",
      "description": "Page number of the current message"
    },
    "storeId": {
      "type": "string",
      "description": "Unique identifier of the store"
    },
    "groupBy": {
      "type": "string",
      "description": "Attribute used for grouping the data"
    }
  }
}
}
}
}
}
}
 

Pour plus d'informations, voir l'API Créer un instantané d'inventaire programmé pour les points de vente associés.