use axum::Extension; use axum::extract::{FromRef, Json, Path, Query, State}; use erp_core::error::AppError; use erp_core::rbac::require_permission; use erp_core::types::{ApiResponse, PaginatedResponse, TenantContext}; use crate::service::action_inbox_service::{ self, ActionInboxQuery, ActionItem, NursePatientSummary, TeamOverview, ThreadResponse, WorkbenchStats, }; use crate::state::HealthState; pub async fn list_action_inbox( State(state): State, Extension(ctx): Extension, Query(query): Query, ) -> Result>>, AppError> where HealthState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "health.action-inbox.list")?; let user_id = if query.assigned_to_me.unwrap_or(false) { Some(ctx.user_id) } else { None }; let result = action_inbox_service::list_action_items(&state.db, ctx.tenant_id, user_id, &query).await?; Ok(Json(ApiResponse::ok(result))) } pub async fn get_action_thread( State(state): State, Extension(ctx): Extension, Path(source_ref): Path, ) -> Result>, AppError> where HealthState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "health.action-inbox.list")?; let result = action_inbox_service::get_action_thread(&state.db, ctx.tenant_id, &source_ref).await?; match result { Some(resp) => Ok(Json(ApiResponse::ok(resp))), None => Err(crate::error::HealthError::Validation("行动项未找到".into()).into()), } } pub async fn get_workbench_stats( State(state): State, Extension(ctx): Extension, Query(params): Query, ) -> Result>, AppError> where HealthState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "health.action-inbox.list")?; let user_id = if params.assigned_to_me.unwrap_or(false) { Some(ctx.user_id) } else { None }; let result = action_inbox_service::get_workbench_stats(&state.db, ctx.tenant_id, user_id).await?; Ok(Json(ApiResponse::ok(result))) } #[derive(Debug, serde::Deserialize)] pub struct WorkbenchStatsQuery { pub assigned_to_me: Option, } pub async fn get_team_overview( State(state): State, Extension(ctx): Extension, ) -> Result>, AppError> where HealthState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "health.action-inbox.team")?; let result = action_inbox_service::get_team_overview(&state.db, ctx.tenant_id).await?; Ok(Json(ApiResponse::ok(result))) } /// 获取护士班次患者列表 — 今日分配给当前护士的患者 pub async fn get_nurse_patients( State(state): State, Extension(ctx): Extension, ) -> Result>>, AppError> where HealthState: FromRef, S: Clone + Send + Sync + 'static, { require_permission(&ctx, "health.action-inbox.list")?; let result = action_inbox_service::get_nurse_patients(&state.db, ctx.tenant_id, ctx.user_id).await?; Ok(Json(ApiResponse::ok(result))) }