修复项: - fix(db): 迁移 149 — 修复 Admin 角色权限绑定被迁移链破坏 (FE-C1) - fix(health): 4 个 handler 添加空名称验证 — Doctor/Article/AlertRule/Tag (API-C1~C4) - fix(health): Stats 仪表盘 new_this_week 查询修复 — SeaORM date_trunc bug (FE-C2) - fix(server): 添加安全响应头 — X-Frame-Options/CSP/XSS-Protection/Referrer-Policy (SEC-H1) - fix(mp): 预约创建契约修复 — notes/reason 字段映射 + 移除 schedule_id (MP-H1) - fix(mp): 咨询会话 subject/last_message 字段改为可选 (MP-H3) - fix(ai): AiConfig Default derive 替代手写 impl (clippy) 测试报告: - 8 维度端到端测试全部完成 (后端 87 用例 / 前端 30 页面 / 小程序 80+ API / 安全 20 项 / 性能 20 端点) - 多角色 7 角色 49 检查 100% 通过 - 综合测试报告 + 专家评估报告
39 lines
1.1 KiB
Rust
39 lines
1.1 KiB
Rust
//! 聚合查询容错工具
|
|
//!
|
|
//! 仪表盘等聚合统计端点通常包含多个独立子查询。
|
|
//! 单个子查询失败不应导致整个接口 500。
|
|
//! `safe_aggregate` 让每个子查询独立容错,失败时返回默认值并记录警告日志。
|
|
|
|
use std::future::Future;
|
|
|
|
/// 执行一个子查询,失败时返回 `T::default()` 并记录警告日志。
|
|
///
|
|
/// # 使用场景
|
|
///
|
|
/// 仪表盘统计 API 聚合多个指标(患者数/咨询数/随访数等),
|
|
/// 任一子查询失败不应阻塞其他指标返回。
|
|
///
|
|
/// # 示例
|
|
///
|
|
/// ```rust,ignore
|
|
/// let patients = safe_aggregate(
|
|
/// stats_service::get_patient_statistics(&state, tenant_id),
|
|
/// "患者统计",
|
|
/// ).await;
|
|
/// ```
|
|
pub async fn safe_aggregate<T: Default, E: std::fmt::Display>(
|
|
fut: impl Future<Output = Result<T, E>>,
|
|
label: &str,
|
|
) -> T {
|
|
match fut.await {
|
|
Ok(v) => {
|
|
tracing::debug!("聚合子查询 [{label}] 成功");
|
|
v
|
|
}
|
|
Err(e) => {
|
|
tracing::warn!("聚合子查询 [{label}] 失败,使用默认值: {e}");
|
|
T::default()
|
|
}
|
|
}
|
|
}
|