feat: initialize Nuanji (Warm Notes) project
- Base platform from base.git (ERP base: auth, core, config, message, workflow, plugin) - Created erp-diary module skeleton (lib.rs, dto.rs, error.rs, event.rs, state.rs) - Integrated erp-diary into workspace and erp-server - Added DiaryModule registration in main.rs - Added DiaryState FromRef in state.rs - Diary routes mounted (empty routes, ready for implementation) - Product design spec v1.2 preserved in docs/ - Implementation plan preserved in plans/ Cargo check: OK Cargo test: OK (78+ base tests passing)
This commit is contained in:
38
crates/erp-core/src/aggregate.rs
Normal file
38
crates/erp-core/src/aggregate.rs
Normal file
@@ -0,0 +1,38 @@
|
||||
//! 聚合查询容错工具
|
||||
//!
|
||||
//! 仪表盘等聚合统计端点通常包含多个独立子查询。
|
||||
//! 单个子查询失败不应导致整个接口 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()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user