Skip to content

Bestellungen & Befehle abrufen (Polling)

Nach dem Empfang eines message-Ereignisses im SSE-Stream ruft der Client GET /orders/location auf, um alle ausstehenden Bestellungen und Befehle abzurufen. Dieser Endpunkt gibt sowohl normale Bestellungen als auch Befehlsobjekte in einer einzigen Antwort zurück.

Endpunkt

text
GET https://{host}/orders/location

Header:

HeaderErforderlichBeschreibung
api_keyJaAPI-Schlüssel des Service-Geräts

Query-Parameter:

ParameterTypStandardBeschreibung
orderNumberlong0Nur Bestellungen mit einer Nummer größer als dieser Wert zurückgeben
commandNumberlong0Nur Befehle mit einer ID größer als dieser Wert zurückgeben

Antwort: 200 OK mit Body ExternalOrder[] (JSON-Array)

Antwort-Schema

Der Endpunkt gibt ein JSON-Array von ExternalOrder-Objekten zurück. Jedes Objekt kann entweder eine Speise-/Getränkebestellung oder einen Befehl darstellen (z. B. Tischstatus lesen, Rechnung anfordern, Daten exportieren).

ExternalOrder

json
{
  "number": 12345,
  "orderTime": "10:30:00",
  "tableNumber": 12,
  "userNumber": 5,
  "togo": null,
  "guestCount": 1,
  "moveTableTo": null,
  "readTableState": null,
  "paymentNumber": null,
  "receipt": null,
  "exportMainData": null,
  "paymentDiscount": null,
  "customer": null,
  "rows": [
    {
      "category": {
        "order": 1,
        "id": 1,
        "description": "Beverages"
      },
      "itemType": "MENU_ITEM",
      "name": "Espresso",
      "number": 1,
      "factor": 2,
      "price": 3.50,
      "priceTogo": null,
      "discount": null,
      "subrows": null
    }
  ],
  "state": "PLACED"
}

Felder der obersten Ebene

FeldTypBeschreibung
numberlongEindeutige Bestell-/Befehls-ID. Für Idempotenz und Offset-Verfolgung verwenden
orderTimestringZeitpunkt der Bestellung, Format HH:mm:ss
tableNumberlong oder nullTischnummer
userNumberlong oder nullBenutzernummer des Bestellers
togoint oder nullKennzeichen für Mitnahme
guestCountint oder nullAnzahl der Gäste
moveTableToint oder nullWenn gesetzt, repräsentiert dieses Objekt einen Tisch verschieben Befehl
readTableStateboolean oder nullWenn true, repräsentiert dieses Objekt einen Tischstatus lesen Befehl
paymentNumberint oder nullWenn gesetzt, repräsentiert dieses Objekt einen Rechnung anfordern Befehl
receiptboolean oder nullWenn true, repräsentiert dieses Objekt einen Quittung drucken Befehl
exportMainDataboolean oder nullWenn true, repräsentiert dieses Objekt einen Hauptdaten exportieren / Remote-Menü abrufen Befehl
paymentDiscountarray oder nullArray von Rabattobjekten, die auf die Bestellung angewendet wurden
customerobject oder nullKundeninformationen (für Rechnungsbestellungen)
rowsarray oder nullBestellpositionen. null bei Befehlen
statestring oder nullBestellstatus. null oder "PLACED" bei Befehlen

OrderRow

FeldTypBeschreibung
categoryobject oder nullProduktkategorie mit order, id und description
itemTypestringArtikeltyp (MENU_ITEM, FOOD, TAKEOUT, CONDIMENTS, BEVERAGES, ARRANGEMENT)
namestringProduktname
infotextstring oder nullBesondere Anweisungen oder Hinweise
numberintZeilennummer
factorintMenge
pricenumber oder nullEinzelpreis
priceTogonumber oder nullMitnahmepreis, falls abweichend
discountarray oder nullRabatte, die auf diese Zeile angewendet wurden
subrowsarray oder nullUnterpositionen (Modifikatoren, Beilagen)

Category

FeldTypBeschreibung
orderintSortierreihenfolge
idintKategorie-ID
descriptionstring oder nullKategoriename

Unterscheidung zwischen Bestellungen und Befehlen

Das Antwort-Array enthält eine Mischung aus normalen Bestellungen und Befehlen. Verwenden Sie die isCommand()-Logik zur Unterscheidung. Ein ExternalOrder ist ein Befehl, wenn eines dieser Felder gesetzt ist:

  • readTableState ist true
  • moveTableTo ist nicht null
  • exportMainData ist true
  • paymentNumber ist nicht null

Erkennungs-Pseudocode:

javascript
function isCommand(item) {
  return item.readTableState === true
      || item.moveTableTo !== null
      || item.exportMainData === true
      || item.paymentNumber !== null;
}

function processResponse(items) {
  for (const item of items) {
    if (isCommand(item)) {
      handleCommand(item);
    } else {
      handleOrder(item);
    }
  }
}

Befehlstypen

ErkennungsfeldBefehlstypWas zu tun ist
readTableState: trueTischstatus lesenIhren lokalen Tischstatus abfragen und Antwort an /commands/{id}/response senden
moveTableTo: <int>Tisch verschiebenPositionen zur angegebenen Tischnummer verschieben
exportMainData: trueRemote-Menü abrufen / Daten exportierenIhre Menüdaten exportieren (z. B. für Vectron-Integration)
paymentNumber: <int>Rechnung anfordernDie Rechnung für die angegebene Zahlungsnummer senden

OrderState-Enum

Das Feld state bei Bestellungen verwendet diese Werte:

text
SELECTING  — Kunde wählt noch Artikel aus (noch nicht aufgegeben)
NEW        — Bestellung wurde gerade von einer Client-Anwendung erstellt
PLACED     — Kunde hat die Bestellung aufgegeben, bereit zur Verarbeitung
ABORTED    — Bestellung wurde storniert (z. B. Sitzung geschlossen)
FAILED     - Bestellverarbeitung im Backend fehlgeschlagen
COMPLETED  — Bestellung wurde erfolgreich abgeschlossen

Beim Polling gibt der Endpunkt Bestellungen mit dem Status PLACED zurück. Befehle haben immer den Status PLACED.

Polling-Hinweise

  1. Bei SSE message-Ereignis abrufen — Wenn der SSE-Stream ein message-Ereignis sendet, diesen Endpunkt sofort aufrufen.
  2. Fallback-Intervall-Polling — Als Sicherheitsnetz in einem angemessenen Intervall (alle 5 Sekunden) abrufen, auch ohne SSE-Benachrichtigungen.
  3. Bestell-Offset verwenden — Die höchste verarbeitete number verfolgen und als orderNumber übergeben, um bereits verarbeitete Bestellungen zu vermeiden.
  4. Befehls-Offset verwenden — Ebenso die höchste Befehls-ID verfolgen und als commandNumber übergeben.
  5. Stapelverarbeitung — Sie können mehrere Bestellungen in einer Antwort erhalten. Diese nacheinander verarbeiten und den Status für jede aktualisieren.

Curl-Beispiele

Erfolgsantwort mit mehreren Bestellungen

bash
curl -i -H "api_key: abc123-def456-ghi789" \
  "https://{host}/orders/location"

Antwort:

http
HTTP/1.1 200 OK
Content-Type: application/json

[
  {
    "number": 12345,
    "orderTime": "10:30:00",
    "tableNumber": 12,
    "userNumber": 5,
    "rows": [
      {
        "category": { "order": 1, "id": 1, "description": "Beverages" },
        "itemType": "MENU_ITEM",
        "name": "Espresso",
        "number": 1,
        "factor": 2,
        "price": 3.50
      }
    ],
    "state": "PLACED"
  },
  {
    "number": 12346,
    "orderTime": "10:32:00",
    "tableNumber": 5,
    "userNumber": 3,
    "rows": [
      {
        "category": { "order": 2, "id": 3, "description": "Main Course" },
        "itemType": "FOOD",
        "name": "Caesar Salad",
        "number": 1,
        "factor": 1,
        "price": 12.90
      }
    ],
    "state": "PLACED"
  }
]

Mit Offset-Parametern (nach der Verarbeitung)

bash
curl -i -H "api_key: abc123-def456-ghi789" \
  "https://{host}/orders/location?orderNumber=12346&commandNumber=42"

Leere Antwort (keine ausstehenden Elemente)

bash
curl -i -H "api_key: abc123-def456-ghi789" \
  "https://{host}/orders/location"

Antwort:

http
HTTP/1.1 200 OK
Content-Type: application/json

[]

Antwort mit einem Befehl

bash
curl -i -H "api_key: abc123-def456-ghi789" \
  "https://{host}/orders/location"

Antwort:

json
[
  {
    "number": 99,
    "orderTime": "11:05:00",
    "readTableState": true,
    "tableNumber": 12,
    "state": "PLACED"
  }
]

Dies ist ein Tischstatus lesen Befehl für Tisch 12. Das Feld readTableState: true zeigt an, dass es sich um einen Befehl handelt, nicht um eine Bestellung.

Fehlerbehandlung

StatusBedeutung
200Erfolg (kann leeres Array [] zurückgeben)
401Nicht autorisiert (ungültiger oder abgelaufener API-Schlüssel)
500Interner Serverfehler (mit Backoff wiederholen)

Nächste Schritte