fix: H5 decimal 类型兼容 - energy 用 String 接收避免 DECIMAL 解码错误

This commit is contained in:
12451 2026-07-03 10:20:29 +08:00
parent 4765fc9ead
commit 6b31a61387

View File

@ -87,7 +87,7 @@ struct ChargeRecordBriefRow {
id: i64, id: i64,
start_time: Option<chrono::NaiveDateTime>, start_time: Option<chrono::NaiveDateTime>,
end_time: Option<chrono::NaiveDateTime>, end_time: Option<chrono::NaiveDateTime>,
energy: Option<f64>, energy: Option<String>,
} }
/// 柜子 IMEI 查询行(用于指令下发) /// 柜子 IMEI 查询行(用于指令下发)
@ -298,19 +298,19 @@ async fn sum_today_energy(
pool: &sqlx::MySqlPool, pool: &sqlx::MySqlPool,
is_super: bool, is_super: bool,
org_id: Option<i64>, org_id: Option<i64>,
) -> Result<f64, AppError> { ) -> Result<i64, AppError> {
if !is_super && org_id.is_none() { if !is_super && org_id.is_none() {
return Ok(0.0); return Ok(0);
} }
let energy: Option<f64> = if is_super { let energy: Option<i64> = if is_super {
sqlx::query_scalar( 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) .fetch_one(pool)
.await? .await?
} else { } else {
sqlx::query_scalar( 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 cabinets cab ON cr.cabinet_id = cab.id
INNER JOIN projects p ON cab.project_id = p.id INNER JOIN projects p ON cab.project_id = p.id
WHERE DATE(cr.start_time) = CURDATE() AND p.organization_id = ?"#, WHERE DATE(cr.start_time) = CURDATE() AND p.organization_id = ?"#,
@ -319,20 +319,20 @@ async fn sum_today_energy(
.fetch_one(pool) .fetch_one(pool)
.await? .await?
}; };
Ok(energy.unwrap_or(0.0)) Ok(energy.unwrap_or(0))
} }
/// 今日充电时长(小时,带组织隔离) /// 今日充电时长(,带组织隔离)
async fn sum_today_charge_hours( async fn sum_today_charge_hours(
pool: &sqlx::MySqlPool, pool: &sqlx::MySqlPool,
is_super: bool, is_super: bool,
org_id: Option<i64>, org_id: Option<i64>,
) -> Result<f64, AppError> { ) -> Result<i64, AppError> {
if !is_super && org_id.is_none() { if !is_super && org_id.is_none() {
return Ok(0.0); return Ok(0);
} }
// 计算总秒数(未结束的记录用 NOW() 代替 end_time // 计算总秒数(未结束的记录用 NOW() 代替 end_time
let total_seconds: f64 = if is_super { let total_seconds: Option<i64> = if is_super {
sqlx::query_scalar( sqlx::query_scalar(
r#"SELECT COALESCE(SUM( r#"SELECT COALESCE(SUM(
TIMESTAMPDIFF(SECOND, start_time, COALESCE(end_time, NOW())) TIMESTAMPDIFF(SECOND, start_time, COALESCE(end_time, NOW()))
@ -354,8 +354,7 @@ async fn sum_today_charge_hours(
.fetch_one(pool) .fetch_one(pool)
.await? .await?
}; };
// 秒转小时保留1位小数 Ok(total_seconds.unwrap_or(0))
Ok((total_seconds / 3600.0 * 10.0).round() / 10.0)
} }
/// 获取故障告警列表(返回项目名+柜名+通道号,带组织隔离) /// 获取故障告警列表(返回项目名+柜名+通道号,带组织隔离)
@ -794,7 +793,7 @@ pub async fn get_compartment_detail(
// 查询最近充电记录 // 查询最近充电记录
let records: Vec<ChargeRecordBriefRow> = sqlx::query_as::<_, ChargeRecordBriefRow>( let records: Vec<ChargeRecordBriefRow> = 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 FROM charge_records
WHERE compartment_id = ? WHERE compartment_id = ?
ORDER BY start_time DESC LIMIT 10"#, ORDER BY start_time DESC LIMIT 10"#,
@ -810,7 +809,7 @@ pub async fn get_compartment_detail(
"id": r.id, "id": r.id,
"start_time": r.start_time.map(|t| t.to_string()), "start_time": r.start_time.map(|t| t.to_string()),
"end_time": r.end_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::<i64>().unwrap_or(0),
"cost": 0, "cost": 0,
}) })
}) })
@ -823,10 +822,10 @@ pub async fn get_compartment_detail(
"channel_id": channel_id, "channel_id": channel_id,
"status": status, "status": status,
"cabin_board_id": cabin_board_id, "cabin_board_id": cabin_board_id,
"voltage": realtime.get("voltage").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_f64()).unwrap_or(0.0), "current": realtime.get("current").and_then(|v| v.as_i64()).unwrap_or(0),
"power": realtime.get("power").and_then(|v| v.as_f64()).unwrap_or(0.0), "power": realtime.get("power").and_then(|v| v.as_i64()).unwrap_or(0),
"energy": realtime.get("energy").and_then(|v| v.as_f64()).unwrap_or(0.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), "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), "soh": realtime.get("soh").and_then(|v| v.as_i64()).unwrap_or(0),
"cell_voltages": realtime.get("cell_voltages").cloned().unwrap_or(json!([])), "cell_voltages": realtime.get("cell_voltages").cloned().unwrap_or(json!([])),