Fritteusen
Die Fritteusen und die Prüfungen ihrer Ölqualität — zwei Collections, und warum der gemessene Wert fehlen kann, die Entscheidung aber nie.
Frittieröl verdirbt mit dem Gebrauch, und ab einem bestimmten Punkt muss es gefiltert oder weggeworfen werden. Das Restaurant prüft es, entscheidet, was zu tun ist, und erfasst beides. Zwei Collections: die Fritteusen und die Kontrollen, die daran gemacht werden.
| Collection | Berechtigung | Was ein Datensatz ist |
|---|---|---|
fryer-equipment | fryer-equipment:read | Eine Fritteuse. |
fryer-checks | fryer-checks:read | Eine Prüfung der Ölqualität an einer von ihnen, und was entschieden wurde. |
Beide teilen sich den Snapshot-Umschlag: id, deleted,
capturedAt, receivedAt, sequence und der Rest stehen neben dem data, das
unten beschrieben ist.
fryer-equipment
Die Fritteusen selbst, so wie das Restaurant sie auflistet. Ein kurzer Datensatz — ein Name, eine Position in der Liste und wo sie steht.
| Feld | Typ | Bedeutung |
|---|---|---|
index | integer, Pflicht | Die Position der Fritteuse in der Liste, so wie die App sie ordnet. |
name | string, Pflicht | Wie das Restaurant sie nennt. |
areaId | string | null | Der Bereich, in dem sie steht. null bei einem Restaurant, das sich nicht in Bereiche aufteilt. |
isDeleted | boolean, Pflicht | Die eigene weiche Löschung der App. Lesen Sie die Anmerkung unten. |
{
"id": "6b1d0f54-8e27-4c93-a7b0-52fd3e1c9a86",
"collection": "fryer-equipment",
"deleted": false,
"capturedAt": "1789598411206",
"receivedAt": "1789598603471",
"sequence": "1",
"data": {
"index": 1,
"name": "Friteuse gauche",
"areaId": "7d2c0b61-4e8a-49f3-9c27-5a1b8e60d3f4",
"isDeleted": false
}
}
Hier gibt es keine Schwellen. Anders als ein Gerät trägt
eine Fritteuse kein min und kein max: Nichts im Datensatz sagt, was ein
guter Ölwert ist. Ob eine Kontrolle in Ordnung war, ist das Urteil des
Restaurants, und die einzige Spur davon ist die Maßnahme, die es ergriffen hat.
isDeleted ist nicht das deleted des Umschlags. Eine Fritteuse, die das
Restaurant entfernt hat, kommt mit isDeleted: true und deleted: false
zurück: weiterhin ein lebender Datensatz, der eine Fritteuse beschreibt, die
nicht mehr im Einsatz ist. Filtern Sie auf beides und behalten Sie die
entfernten — alte Kontrollen zeigen weiterhin auf sie.
fryer-checks
Eine Kontrolle an einer Fritteuse: was die Prüfung ergeben hat und was daraufhin getan wurde.
| Feld | Typ | Bedeutung |
|---|---|---|
timestamp | string, Pflicht | Wann die Kontrolle gemacht wurde, als Zeichenkette mit Millisekunden seit der Epoche. |
testValue | string | null | Was die Prüfung ergeben hat, als Text. null, wenn nichts gemessen wurde. |
action | string, Pflicht | Was über das Öl entschieden wurde — es filtern, es wechseln, es so lassen. |
fryerEquipmentId | string, Pflicht | Die Fritteuse, die geprüft wurde. |
userId | string | null | Der Mitarbeiter, der die Kontrolle gemacht hat, sofern die App einen erfasst hat. |
{
"id": "e07a5c92-4f61-48b8-9d3a-b18c60e5427f",
"collection": "fryer-checks",
"deleted": false,
"capturedAt": "1789777348215",
"receivedAt": "1789777510964",
"sequence": "2",
"data": {
"timestamp": "1789777200000",
"testValue": "18",
"action": "Filtration de l'huile",
"fryerEquipmentId": "6b1d0f54-8e27-4c93-a7b0-52fd3e1c9a86",
"userId": "2774953d-8d9b-4a68-8ec4-1209edd90777"
}
}
testValue ist eine Zeichenkette, keine Zahl. Es ist, was der Teststreifen
oder der Messfühler angezeigt hat, als Text erfasst, und der Datensatz trägt
weder Einheit noch Skala — ein Restaurant mit Teststreifen und eines mit einem
Messgerät für polare Anteile landen beide hier. Behalten Sie es als Text. Es
über Restaurants hinweg in eine Fließkommazahl zu parsen gibt Ihnen eine Spalte,
deren Werte nicht vergleichbar sind.
action ist Freitext in der Sprache des Restaurants. Das Schema schränkt es
nicht ein, lesen Sie den Wert also, statt ihn gegen eine eigene Liste
abzugleichen — und bauen Sie kein Enum aus dem, was Sie in den Daten eines
einzelnen Restaurants sehen.
Was eine Kontrolle ohne Wert bedeutet
testValue darf null sein und action ist Pflicht, und um diese Ungleichheit
herum sollten Sie entwerfen. Eine Kontrolle kann als ergriffene Maßnahme ohne
gemessenen Wert dahinter erfasst werden: Jemand hat das Öl gewechselt, weil es
falsch aussah, weil das Wochenende bevorstand, weil die Fritteuse ohnehin
gereinigt wurde.
Eine Kontrolle ist also keine Messung. Sie ist eine Entscheidung, manchmal mit einer Messung daran. Wenn Sie eine Tabelle der Ölwerte über die Zeit bauen, rechnen Sie mit einem guten Teil Zeilen, in denen die Wertspalte leer ist, und zählen Sie sie, statt sie wegzulassen — eine Maßnahme ohne Wert ist trotzdem eine Kontrolle, die stattgefunden hat.
Damit arbeiten
Verbinden Sie über fryerEquipmentId. Eine Kontrolle benennt ihre Fritteuse
und sonst nichts; der Name der Fritteuse steht in fryer-equipment, das Sie
getrennt durchlaufen. Zwei Durchläufe, auf Ihrer Seite verbunden.
Ordnen Sie nach capturedAt, nicht nach receivedAt. Ein Tablet lädt hoch,
sobald es Empfang findet; eine Kontrolle um 09:00 Uhr kann also um 14:00 Uhr
ankommen. Die Seite zum Umschlag erzählt die ganze
Geschichte.
Abwesenheit beweist nichts. Eine Fritteuse ohne Kontrolle in dieser Woche wurde vielleicht nicht kontrolliert oder liegt auf einem Gerät, das noch nicht hochgeladen hat. Machen Sie aus einer Anzahl davon keine Compliance-Kennzahl — siehe die Anmerkung zur Vollständigkeit.