收货记录
收货记录——每一个字段、它的类型,以及它在后厨现场意味着什么。
一条收货记录就是一次收货查验:一名员工接收一批订货、记录温度,并决定是否接收 它。这就是食品安全检查员会索取的那份记录。
两个端点都需要在路径里那家餐厅上持有 deliveries:read 权限范围。
收货记录是这里唯一一个手工塑形的资源:一个设计过的对象,一旦记下就不可变,按时间 区间列出。应用记录的其他一切——加热与冷却温度、清洁、标签——都通过 集合提供,它们共用同一个通用信封。
列出收货记录
GET /v1/restaurants/{restaurantId}/deliveries?from=…&to=…&limit=…&cursor=…
返回 { "data": Delivery[], "nextCursor": string | null },最新的在前。区间规则和
游标见分页。
取一条收货记录
GET /v1/restaurants/{restaurantId}/deliveries/{deliveryId}
返回单个 Delivery;如果标识符未知或者密钥对那家餐厅没有授权,则返回 404。
收货记录对象
| 字段 | 类型 | 含义 |
|---|---|---|
id | string | 这条收货记录的稳定标识符,在餐厅内唯一。 |
restaurantId | string | 记录所属的餐厅。与路径中的一致。 |
occurredAt | string | 查验发生的时间,以字符串表示的 Unix 毫秒时间戳。 |
isCompliant | boolean | 员工对整批收货的判定。 |
supplier | object | null | { "id": string, "name": string };记录时没有填供应商则为 null。 |
temperatureRecords | array | 每个被测量的产品一条。见下文。 |
nonComplianceReasons | string[] | 这批货被拒收、或被有保留地接收的原因。由员工自己写的自由文本;合规时为空。 |
correctiveActions | string[] | 为此做了什么。不需要做什么时为空。 |
commentary | string | null | 自由文本备注。常常是 null。 |
imageCount | integer | 附了多少张照片。0 表示照片端点没有东西可返回。 |
temperatureRecords[]
| 字段 | 类型 | 含义 |
|---|---|---|
product | string | 测量的是什么,按员工给它起的名字。绝不为空。 |
value | number | null | 读数。产品在没有测量的情况下被登记时为 null。 |
unit | "C" | 始终是摄氏度。之所以放在这里,是为了让使用方永远不必去假设。 |
lotNumber | string | null | 批号或批次,在它被采集到的时候。 |
正确地读它
isCompliant 是记录,不是计算结果。 它是收货的那个人做出的决定,可能与你只看
温度会得出的结论不一致——一次用表面探针取得的读数、一个有自己阈值的产品、一次
临场判断。请把它呈现为他们的判定。如果你想要自己的判定,把它算在他们的旁边,并
标明那是你的。
自由文本字段就是自由文本。 nonComplianceReasons、correctiveActions 和
product 是员工在营业中打出来的,用的是这家餐厅的语言,带着一个忙碌周二的拼写。
不要拿它们建枚举,不要用它们做连接键,也不要假定它们是法语。
value 可以是 null。 一个产品被登记却没有读数是正常的——它往往是干货。把
null 当作「未测量」,绝不要当作 0。
时间戳是字符串。 occurredAt 是 Unix 毫秒时间戳的十进制字符串,因为整个
BackResto 平台就是这样存时间戳的。Number(occurredAt) 今天是安全的,往后几十万年
也是安全的,但不要让一个 JSON 解析器悄悄把它转成数字,然后再以丢了精度的样子写
回去。
示例
{
"id": "8f2c1b04-0d5a-4b7e-9f31-6ad2c0e77a51",
"restaurantId": "restaurant-1",
"occurredAt": "1787932800000",
"isCompliant": false,
"supplier": { "id": "supplier-7", "name": "Metro Nord" },
"temperatureRecords": [
{ "product": "Poulet fermier", "lotNumber": "L2291", "unit": "C", "value": 6.4 },
{ "product": "Farine T55", "lotNumber": null, "unit": "C", "value": null }
],
"nonComplianceReasons": ["Température trop élevée"],
"correctiveActions": ["Produit refusé", "Fournisseur prévenu"],
"commentary": "Camion en retard, rupture de chaîne du froid probable",
"imageCount": 2
}