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,
start_time: Option<chrono::NaiveDateTime>,
end_time: Option<chrono::NaiveDateTime>,
energy: Option<f64>,
energy: Option<String>,
}
/// 柜子 IMEI 查询行(用于指令下发)
@ -298,19 +298,19 @@ async fn sum_today_energy(
pool: &sqlx::MySqlPool,
is_super: bool,
org_id: Option<i64>,
) -> Result<f64, AppError> {
) -> Result<i64, AppError> {
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(
"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<i64>,
) -> Result<f64, AppError> {
) -> Result<i64, AppError> {
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<i64> = 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<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
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::<i64>().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!([])),