diff --git a/software/api-server/src/routes/cabinets.rs b/software/api-server/src/routes/cabinets.rs index 9e0b50b..4132f37 100644 --- a/software/api-server/src/routes/cabinets.rs +++ b/software/api-server/src/routes/cabinets.rs @@ -620,12 +620,29 @@ pub async fn get_cabinet_detail( None }; + // 柜级**最新电表读数**(协议 §5.3 `status_post.cabinet.meter`,单位 Wh,柜级累计电能)。 + // 已按协议"平台原样存库"落库(`cabinets.meter_wh`/`meter_at`,变化留痕见 `workers/meter.rs`)。 + // ⚠️ `NULL` = **从未上报过**,与"读数为 0"是两回事 —— 前端必须区分(别渲染成 0 度)。 + // 查询失败降级为 None,不让详情接口整体失败(与上面 `project_name` 同口径)。 + let meter: Option<(Option, Option)> = + sqlx::query_as("SELECT meter_wh, meter_at FROM cabinets WHERE id = ?") + .bind(id) + .fetch_optional(db) + .await + .ok() + .flatten(); + let (meter_wh, meter_at) = meter.unwrap_or((None, None)); + Ok(Json(json!({ "code": 0, "data": { "id": cabinet.id, "project_id": cabinet.project_id, "project_name": project_name, + // 整柜累计电能(电表读数,Wh)。`null` = 从未上报过(**不是 0**) + "meter_wh": meter_wh, + // 该读数的收到时刻 + "meter_at": meter_at, "abstract_id": cabinet.abstract_id, "imei": cabinet.imei, "iccid": cabinet.iccid,