修复项目配置草稿原子保存逻辑

This commit is contained in:
Cheng Zhou
2026-05-11 11:03:06 +08:00
parent 8d061a1520
commit 20d45cfdfe
6 changed files with 333 additions and 59 deletions
@@ -3,7 +3,12 @@ from types import SimpleNamespace
from fastapi import HTTPException
from app.api.v1.studies import _apply_project_publish_snapshot_to_study, _validate_setup_data
from app.api.v1.studies import (
_apply_project_publish_snapshot_to_study,
_build_default_setup_config_from_study,
_resolve_setup_project_snapshot,
_validate_setup_data,
)
from app.schemas.study_setup_config import ProjectPublishSnapshot, StudySetupConfigData
@@ -172,6 +177,78 @@ def test_project_info_is_part_of_setup_config_payload():
assert payload["enrollmentPlan"]["totalTarget"] == 120
def test_default_setup_config_includes_project_info_snapshot():
study = SimpleNamespace(
code="PRJ-DEFAULT",
name="默认项目",
project_full_name="默认项目全称",
sponsor="申办方",
protocol_no="PROTO-DEFAULT",
lead_unit="组长单位",
principal_investigator="PI",
main_pm="PM",
research_analysis="III期",
research_product="研究药物",
control_product="对照药物",
indication="适应症",
research_population="研究人群",
research_design="随机双盲",
plan_start_date=date(2026, 6, 1),
plan_end_date=date(2026, 12, 31),
planned_site_count=8,
planned_enrollment_count=120,
enrollment_monthly_goal_note="",
enrollment_stage_breakdown="",
status="ACTIVE",
visit_schedule=[
{
"visit_code": "V1",
"baseline_offset_days": 7,
"window_before_days": 1,
"window_after_days": 2,
}
],
)
draft = _build_default_setup_config_from_study(study, [])
assert draft.projectInfo.code == "PRJ-DEFAULT"
assert draft.projectInfo.name == "默认项目"
assert draft.projectInfo.planned_enrollment_count == 120
assert draft.projectInfo.visit_schedule[0].visit_code == "V1"
def test_empty_project_info_does_not_fallback_to_study_snapshot():
study = SimpleNamespace(
code="PRJ-MASTER",
name="主表项目",
project_full_name="",
sponsor="",
protocol_no="",
lead_unit="",
principal_investigator="",
main_pm="",
research_analysis="",
research_product="",
control_product="",
indication="",
research_population="",
research_design="",
plan_start_date=None,
plan_end_date=None,
planned_site_count=None,
planned_enrollment_count=None,
status="DRAFT",
visit_schedule=[],
)
draft = StudySetupConfigData()
snapshot = _resolve_setup_project_snapshot(draft, study)
assert snapshot.code == ""
assert snapshot.name == ""
def test_apply_project_publish_snapshot_updates_formal_study_fields():
study = SimpleNamespace(
code="PRJ-001",