diff --git a/crates/erp-health/src/service/device_reading_service.rs b/crates/erp-health/src/service/device_reading_service.rs index 6c7cf6d..4ec81a7 100644 --- a/crates/erp-health/src/service/device_reading_service.rs +++ b/crates/erp-health/src/service/device_reading_service.rs @@ -199,11 +199,10 @@ async fn batch_insert_readings( device_model: Option<&str>, readings: &[(&ReadingInput, DateTime)], ) -> HealthResult { - let mut inserted: u64 = 0; - for (r, measured_at) in readings { - let id = Uuid::now_v7(); - let model = device_readings::ActiveModel { - id: Set(id), + let models: Vec = readings + .iter() + .map(|(r, measured_at)| device_readings::ActiveModel { + id: Set(Uuid::now_v7()), tenant_id: Set(tenant_id), patient_id: Set(patient_id), device_id: Set(Some(device_id.to_string())), @@ -213,19 +212,16 @@ async fn batch_insert_readings( measured_at: Set(*measured_at), created_at: Set(Utc::now()), deleted_at: Set(None), - }; - match model.insert(db).await { - Ok(_) => inserted += 1, - Err(e) => { - // 唯一约束冲突(重复数据)→ 跳过 - let err_str = e.to_string(); - if !err_str.contains("duplicate") && !err_str.contains("unique") { - return Err(HealthError::DbError(err_str)); - } - } - } - } - Ok(inserted) + }) + .collect(); + + let count = models.len() as u64; + device_readings::Entity::insert_many(models) + .exec(db) + .await + .map_err(|e| HealthError::DbError(e.to_string()))?; + + Ok(count) } async fn upsert_hourly_aggregates(