From 2a8c707f6d627db58c8ee31cad16a9a9beb1e12f Mon Sep 17 00:00:00 2001 From: iven Date: Sat, 25 Apr 2026 22:52:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai):=20AnalysisService=20=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=20list/get=20=E6=9F=A5=E8=AF=A2=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/erp-ai/src/service/analysis.rs | 48 ++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/crates/erp-ai/src/service/analysis.rs b/crates/erp-ai/src/service/analysis.rs index 0c5187f..3a3f5ec 100644 --- a/crates/erp-ai/src/service/analysis.rs +++ b/crates/erp-ai/src/service/analysis.rs @@ -1,8 +1,9 @@ use futures::Stream; -use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, Set}; +use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect, Set}; use sha2::{Digest, Sha256}; use std::pin::Pin; use uuid::Uuid; +use erp_core::types::Pagination; use crate::dto::{AnalysisType, GenerateRequest}; use crate::entity::ai_analysis; @@ -142,6 +143,51 @@ impl AnalysisService { hex::encode(hasher.finalize()) } + /// 分页查询分析记录 + pub async fn list_analysis( + &self, + tenant_id: Uuid, + patient_id: Option, + analysis_type: Option, + pagination: &Pagination, + ) -> AiResult<(Vec, u64)> { + let mut query = ai_analysis::Entity::find() + .filter(ai_analysis::Column::TenantId.eq(tenant_id)) + .filter(ai_analysis::Column::DeletedAt.is_null()); + + if let Some(pid) = patient_id { + query = query.filter(ai_analysis::Column::PatientId.eq(pid)); + } + if let Some(at) = &analysis_type { + query = query.filter(ai_analysis::Column::AnalysisType.eq(at.as_str())); + } + + let total = query.clone().count(&self.db).await?; + let items = query + .order_by_desc(ai_analysis::Column::CreatedAt) + .offset(pagination.offset()) + .limit(pagination.limit()) + .all(&self.db) + .await?; + Ok((items, total)) + } + + /// 获取单条分析记录 + pub async fn get_analysis( + &self, + id: Uuid, + tenant_id: Uuid, + ) -> AiResult { + let model = ai_analysis::Entity::find_by_id(id) + .one(&self.db) + .await? + .ok_or_else(|| AiError::AnalysisNotFound(id.to_string()))?; + if model.tenant_id != tenant_id { + return Err(AiError::AnalysisNotFound(id.to_string())); + } + Ok(model) + } + async fn create_analysis_record( &self, id: Uuid,