未知(继上次中断)

This commit is contained in:
Cheng Zhou
2026-02-04 10:52:34 +08:00
parent 8e258d21a7
commit 737f84bf54
99 changed files with 5497 additions and 2143 deletions
+27 -4
View File
@@ -2,7 +2,7 @@ import uuid
from datetime import date, timedelta
from typing import Sequence
from sqlalchemy import select, update as sa_update
from sqlalchemy import or_, select, update as sa_update
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.ae import AdverseEvent
@@ -11,10 +11,20 @@ from app.models.subject import Subject
from app.schemas.ae import AECreate, AEUpdate
def _seriousness_rank(value: str | None) -> int | None:
if not value:
return None
normalized = str(value).strip().upper()
roman_map = {"I": 1, "II": 2, "III": 3, "IV": 4, "V": 5}
legacy_map = {"SERIOUS": 5, "NON_SERIOUS": 1}
return roman_map.get(normalized) or legacy_map.get(normalized)
def _calc_due_date(onset: date | None, seriousness: str) -> date | None:
if onset is None:
return None
delta = 1 if seriousness == "SERIOUS" else 7
rank = _seriousness_rank(seriousness)
delta = 1 if rank and rank >= 3 else 7
return onset + timedelta(days=delta)
@@ -54,8 +64,8 @@ async def create_ae(
term=ae_in.term,
onset_date=ae_in.onset_date,
resolution_date=None,
seriousness=ae_in.seriousness,
severity=ae_in.severity,
seriousness=str(ae_in.seriousness),
severity=str(ae_in.seriousness),
causality=ae_in.causality,
action_taken=None,
outcome=ae_in.outcome,
@@ -84,8 +94,19 @@ async def list_ae(
site_id: uuid.UUID | None = None,
subject_id: uuid.UUID | None = None,
overdue: bool | None = None,
site_ids: set[uuid.UUID] | None = None,
) -> Sequence[AdverseEvent]:
stmt = select(AdverseEvent).where(AdverseEvent.study_id == study_id)
if site_ids is not None:
if not site_ids:
return []
subject_site_ids = select(Subject.id).where(Subject.site_id.in_(site_ids))
stmt = stmt.where(
or_(
AdverseEvent.site_id.in_(site_ids),
AdverseEvent.subject_id.in_(subject_site_ids),
)
)
if status:
stmt = stmt.where(AdverseEvent.status == status)
if seriousness:
@@ -104,6 +125,8 @@ async def list_ae(
async def update_ae(db: AsyncSession, study_id: uuid.UUID, ae: AdverseEvent, ae_in: AEUpdate) -> AdverseEvent:
update_data = ae_in.model_dump(exclude_unset=True)
if "seriousness" in update_data:
update_data["seriousness"] = str(update_data["seriousness"])
if "subject_id" in update_data:
await _validate_site_subject(db, study_id, None, update_data["subject_id"])
if "onset_date" in update_data or "seriousness" in update_data: