//! 家庭成员健康代理 Handler — 同意管理 + 健康摘要查看 use axum::extract::{Json, Path, Query, State}; use axum::Extension; use erp_core::error::AppError; use erp_core::rbac::require_permission; use erp_core::types::{ApiResponse, TenantContext}; use serde::Deserialize; use uuid::Uuid; use crate::dto::patient_dto::*; use crate::service::family_proxy_service; use crate::state::HealthState; #[derive(Debug, Clone, Deserialize)] pub struct VersionQuery { pub version: i32, } /// 授权家庭成员访问健康数据 pub async fn grant_family_access( State(state): State, Extension(ctx): Extension, Path((patient_id, family_member_id)): Path<(Uuid, Uuid)>, Query(params): Query, Json(req): Json, ) -> Result>, AppError> { require_permission(&ctx, "health.patient.manage")?; let result = family_proxy_service::grant_family_access( &state, ctx.tenant_id, patient_id, family_member_id, Some(ctx.user_id), req, params.version, ).await?; Ok(Json(ApiResponse::ok(result))) } /// 撤销家庭成员健康数据访问 pub async fn revoke_family_access( State(state): State, Extension(ctx): Extension, Path((patient_id, family_member_id)): Path<(Uuid, Uuid)>, Query(params): Query, ) -> Result>, AppError> { require_permission(&ctx, "health.patient.manage")?; let result = family_proxy_service::revoke_family_access( &state, ctx.tenant_id, patient_id, family_member_id, Some(ctx.user_id), params.version, ).await?; Ok(Json(ApiResponse::ok(result))) } /// 家庭成员查看关联患者列表 pub async fn list_my_family_patients( State(state): State, Extension(ctx): Extension, ) -> Result>>, AppError> { let result = family_proxy_service::list_family_patients( &state, ctx.tenant_id, ctx.user_id, ).await?; Ok(Json(ApiResponse::ok(result))) } /// 家庭成员查看患者健康摘要 pub async fn get_family_health_summary( State(state): State, Extension(ctx): Extension, Path(patient_id): Path, ) -> Result>, AppError> { let result = family_proxy_service::get_family_health_summary( &state, ctx.tenant_id, ctx.user_id, patient_id, ).await?; Ok(Json(ApiResponse::ok(result))) } /// 绑定家庭成员到系统用户(小程序扫码验证后调用) pub async fn link_family_member_user( State(state): State, Extension(ctx): Extension, Path(family_member_id): Path, ) -> Result>, AppError> { let result = family_proxy_service::link_family_member_user( &state, ctx.tenant_id, family_member_id, ctx.user_id, ).await?; Ok(Json(ApiResponse::ok(result))) }