feat: derive subject status from visits

This commit is contained in:
Cheng Zhou
2026-05-21 14:47:42 +08:00
parent 9305ced664
commit da6f2f2d41
6 changed files with 125 additions and 26 deletions
+3 -1
View File
@@ -98,6 +98,7 @@ async def create_visit(
base_date=visit_in.planned_date,
visit_schedule=study.visit_schedule,
)
subject = await subject_crud.sync_subject_status(db, subject)
await audit_crud.log_action(
db,
study_id=study_id,
@@ -147,7 +148,6 @@ async def create_early_termination(
db,
subject,
SubjectUpdate(
status="DROPPED",
completion_date=termination_in.termination_date,
drop_reason=reason,
),
@@ -192,6 +192,7 @@ async def update_visit(
if visit_in.actual_date and visit.window_end and visit_in.actual_date > visit.window_end:
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="实际访视日期不能晚于访视窗口结束日期")
updated = await visit_crud.update_visit(db, visit, visit_in)
await subject_crud.sync_subject_status(db, subject)
detail = None
if visit_in.status:
detail = f"访视 {visit.visit_code} {visit.status} -> {visit_in.status}"
@@ -226,6 +227,7 @@ async def delete_visit(
if not visit or visit.subject_id != subject_id or visit.study_id != study_id:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="访视不存在")
await visit_crud.delete_visit(db, visit)
await subject_crud.sync_subject_status(db, subject)
await audit_crud.log_action(
db,
study_id=study_id,