From 6b31a6138770ff03b47ff97fcbdb154334bb3a36 Mon Sep 17 00:00:00 2001 From: 12451 <12451@example.com> Date: Fri, 3 Jul 2026 10:20:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20H5=20decimal=20=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=20-=20energy=20=E7=94=A8=20String=20?= =?UTF-8?q?=E6=8E=A5=E6=94=B6=E9=81=BF=E5=85=8D=20DECIMAL=20=E8=A7=A3?= =?UTF-8?q?=E7=A0=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- software/api-server/src/routes/h5.rs | 37 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/software/api-server/src/routes/h5.rs b/software/api-server/src/routes/h5.rs index a0b2a97..cdbab82 100644 --- a/software/api-server/src/routes/h5.rs +++ b/software/api-server/src/routes/h5.rs @@ -87,7 +87,7 @@ struct ChargeRecordBriefRow { id: i64, start_time: Option, end_time: Option, - energy: Option, + energy: Option, } /// 柜子 IMEI 查询行(用于指令下发) @@ -298,19 +298,19 @@ async fn sum_today_energy( pool: &sqlx::MySqlPool, is_super: bool, org_id: Option, -) -> Result { +) -> Result { if !is_super && org_id.is_none() { - return Ok(0.0); + return Ok(0); } - let energy: Option = if is_super { + let energy: Option = if is_super { sqlx::query_scalar( - "SELECT CAST(SUM(energy) AS DECIMAL(10,2)) FROM charge_records WHERE DATE(start_time) = CURDATE()", + "SELECT COALESCE(SUM(energy), 0) FROM charge_records WHERE DATE(start_time) = CURDATE()", ) .fetch_one(pool) .await? } else { sqlx::query_scalar( - r#"SELECT CAST(SUM(cr.energy) AS DECIMAL(10,2)) FROM charge_records cr + r#"SELECT COALESCE(SUM(cr.energy), 0) FROM charge_records cr INNER JOIN cabinets cab ON cr.cabinet_id = cab.id INNER JOIN projects p ON cab.project_id = p.id WHERE DATE(cr.start_time) = CURDATE() AND p.organization_id = ?"#, @@ -319,20 +319,20 @@ async fn sum_today_energy( .fetch_one(pool) .await? }; - Ok(energy.unwrap_or(0.0)) + Ok(energy.unwrap_or(0)) } -/// 今日充电时长(小时,带组织隔离) +/// 今日充电时长(秒,带组织隔离) async fn sum_today_charge_hours( pool: &sqlx::MySqlPool, is_super: bool, org_id: Option, -) -> Result { +) -> Result { if !is_super && org_id.is_none() { - return Ok(0.0); + return Ok(0); } // 计算总秒数(未结束的记录用 NOW() 代替 end_time) - let total_seconds: f64 = if is_super { + let total_seconds: Option = if is_super { sqlx::query_scalar( r#"SELECT COALESCE(SUM( TIMESTAMPDIFF(SECOND, start_time, COALESCE(end_time, NOW())) @@ -354,8 +354,7 @@ async fn sum_today_charge_hours( .fetch_one(pool) .await? }; - // 秒转小时,保留1位小数 - Ok((total_seconds / 3600.0 * 10.0).round() / 10.0) + Ok(total_seconds.unwrap_or(0)) } /// 获取故障告警列表(返回项目名+柜名+通道号,带组织隔离) @@ -794,7 +793,7 @@ pub async fn get_compartment_detail( // 查询最近充电记录 let records: Vec = sqlx::query_as::<_, ChargeRecordBriefRow>( - r#"SELECT id, start_time, end_time, CAST(energy AS DOUBLE) AS energy + r#"SELECT id, start_time, end_time, energy FROM charge_records WHERE compartment_id = ? ORDER BY start_time DESC LIMIT 10"#, @@ -810,7 +809,7 @@ pub async fn get_compartment_detail( "id": r.id, "start_time": r.start_time.map(|t| t.to_string()), "end_time": r.end_time.map(|t| t.to_string()), - "energy_kwh": r.energy.unwrap_or(0.0), + "energy_kwh": r.energy.unwrap_or_default().parse::().unwrap_or(0), "cost": 0, }) }) @@ -823,10 +822,10 @@ pub async fn get_compartment_detail( "channel_id": channel_id, "status": status, "cabin_board_id": cabin_board_id, - "voltage": realtime.get("voltage").and_then(|v| v.as_f64()).unwrap_or(0.0), - "current": realtime.get("current").and_then(|v| v.as_f64()).unwrap_or(0.0), - "power": realtime.get("power").and_then(|v| v.as_f64()).unwrap_or(0.0), - "energy": realtime.get("energy").and_then(|v| v.as_f64()).unwrap_or(0.0), + "voltage": realtime.get("voltage").and_then(|v| v.as_i64()).unwrap_or(0), + "current": realtime.get("current").and_then(|v| v.as_i64()).unwrap_or(0), + "power": realtime.get("power").and_then(|v| v.as_i64()).unwrap_or(0), + "energy": realtime.get("energy").and_then(|v| v.as_i64()).unwrap_or(0), "soc": realtime.get("soc").and_then(|v| v.as_i64()).unwrap_or(0), "soh": realtime.get("soh").and_then(|v| v.as_i64()).unwrap_or(0), "cell_voltages": realtime.get("cell_voltages").cloned().unwrap_or(json!([])),