// 超时检查框架 // // TimeoutChecker 定期扫描 tasks 表中已超时但仍处于 pending 状态的任务, // 以便触发自动完成或升级逻辑(后续迭代实现)。 use chrono::Utc; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter}; use uuid::Uuid; use crate::entity::task; use crate::error::WorkflowResult; /// 超时检查服务。 pub struct TimeoutChecker; impl TimeoutChecker { /// 查询指定租户下已超时但未完成的任务列表。 /// /// 返回 due_date < now 且 status = 'pending' 的任务 ID。 pub async fn find_overdue_tasks( tenant_id: Uuid, db: &sea_orm::DatabaseConnection, ) -> WorkflowResult> { let now = Utc::now(); let overdue = task::Entity::find() .filter(task::Column::TenantId.eq(tenant_id)) .filter(task::Column::Status.eq("pending")) .filter(task::Column::DueDate.lt(now)) .filter(task::Column::DeletedAt.is_null()) .all(db) .await .map_err(|e| crate::error::WorkflowError::Validation(e.to_string()))?; Ok(overdue.iter().map(|t| t.id).collect()) } /// 查询所有租户中已超时但未完成的任务列表。 /// /// 返回 due_date < now 且 status = 'pending' 的任务 ID。 /// 用于后台定时任务的全量扫描。 pub async fn find_all_overdue_tasks( db: &sea_orm::DatabaseConnection, ) -> WorkflowResult> { let now = Utc::now(); let overdue = task::Entity::find() .filter(task::Column::Status.eq("pending")) .filter(task::Column::DueDate.lt(now)) .filter(task::Column::DeletedAt.is_null()) .all(db) .await .map_err(|e| crate::error::WorkflowError::Validation(e.to_string()))?; Ok(overdue.iter().map(|t| t.id).collect()) } }