diff --git a/crates/erp-ai/src/service/usage.rs b/crates/erp-ai/src/service/usage.rs index 1c20d4b..644631d 100644 --- a/crates/erp-ai/src/service/usage.rs +++ b/crates/erp-ai/src/service/usage.rs @@ -1,7 +1,7 @@ -use sea_orm::ActiveModelTrait; -use sea_orm::Set; +use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, FromQueryResult, QueryFilter, QuerySelect, Set}; use uuid::Uuid; +use crate::entity::ai_analysis; use crate::entity::ai_usage; use crate::error::AiResult; @@ -42,4 +42,46 @@ impl UsageService { }; Ok(active.insert(&self.db).await?) } + + /// 用量概览 + pub async fn get_overview(&self, tenant_id: Uuid) -> AiResult { + let result = ai_analysis::Entity::find() + .filter(ai_analysis::Column::TenantId.eq(tenant_id)) + .filter(ai_analysis::Column::Status.eq("completed")) + .filter(ai_analysis::Column::DeletedAt.is_null()) + .select_only() + .column_as(ai_analysis::Column::Id.count(), "total_count") + .into_model::() + .one(&self.db) + .await? + .unwrap_or(UsageOverview { total_count: 0 }); + Ok(result) + } + + /// 按分析类型统计 + pub async fn get_by_type(&self, tenant_id: Uuid) -> AiResult> { + let result = ai_analysis::Entity::find() + .filter(ai_analysis::Column::TenantId.eq(tenant_id)) + .filter(ai_analysis::Column::Status.eq("completed")) + .filter(ai_analysis::Column::DeletedAt.is_null()) + .select_only() + .column(ai_analysis::Column::AnalysisType) + .column_as(ai_analysis::Column::Id.count(), "count") + .group_by(ai_analysis::Column::AnalysisType) + .into_model::() + .all(&self.db) + .await?; + Ok(result) + } +} + +#[derive(Debug, FromQueryResult)] +pub struct UsageOverview { + pub total_count: i64, +} + +#[derive(Debug, FromQueryResult)] +pub struct TypeCount { + pub analysis_type: String, + pub count: i64, }