from __future__ import annotations import uuid from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_cra_site_scope, is_system_admin from app.core.project_permissions import role_has_api_permission from app.crud import ae as ae_crud from app.crud import member as member_crud from app.crud import monitoring_visit_issue as monitoring_issue_crud from app.services import notification_service async def sync_project_reminders(db: AsyncSession, study_id: uuid.UUID, user) -> None: membership = await member_crud.get_member(db, study_id, user.id) if not is_system_admin(user) and (not membership or not membership.is_active): return role = membership.role_in_study if membership else "" can_read_aes = is_system_admin(user) or await role_has_api_permission( db, study_id, role, "subject_aes:read" ) can_read_monitoring = is_system_admin(user) or await role_has_api_permission( db, study_id, role, "monitoring_issues:read" ) overdue_aes = 0 if can_read_aes: cra_scope = await get_cra_site_scope(db, study_id, user) items = await ae_crud.list_ae( db, study_id, overdue=True, site_ids=cra_scope[0] if cra_scope else None, ) overdue_aes = len(items) await notification_service.sync_aggregate_notification( db, study_id=study_id, recipient_id=user.id, category="RISK_OVERDUE_AE", priority="HIGH", title="逾期 AE 待处理", message=f"当前有 {overdue_aes} 条逾期 AE 需要跟进", action_path="/risk-issues/sae", source_type="RISK_OVERDUE_AE", source_id=str(study_id), count=overdue_aes if can_read_aes else 0, ) overdue_monitoring = 0 if can_read_monitoring: overdue_monitoring = len(await monitoring_issue_crud.list_issues( db, study_id, overdue=True, limit=2000, )) await notification_service.sync_aggregate_notification( db, study_id=study_id, recipient_id=user.id, category="RISK_OVERDUE_MONITORING", priority="HIGH", title="监查问题已逾期", message=f"当前有 {overdue_monitoring} 条监查问题已超过计划解决日期", action_path="/risk-issues/monitoring-visits", source_type="RISK_OVERDUE_MONITORING", source_id=str(study_id), count=overdue_monitoring if can_read_monitoring else 0, ) await db.commit()