Files
muyingbaogaojiedu/后端-孕期报告解读-api/app/routers/calendar.py
shutiaozhao127-boop cfdeeb5e41 chore: 初始化项目结构并添加基础配置文件
添加后端API和前端项目的初始目录结构,包括应用层模块、工具模块和模型定义
配置前后端的.dockerignore文件以排除开发环境文件
添加前端样式文件,包括字体、Tailwind CSS和主题配置
初始化Python虚拟环境中的类型标记文件
2026-04-01 16:55:24 +08:00

102 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from datetime import datetime, timezone
from fastapi import APIRouter, Depends, HTTPException
from app.middleware.auth import get_current_user
from app.models.checkup import CheckupPlan, CheckupItem
from app.models.user import User
router = APIRouter()
# 标准产检计划
STANDARD_CHECKUPS = [
CheckupItem(title="首次产检", week=6, items=["B超确认宫内孕", "血常规", "尿常规", "肝功能", "肾功能"], preparations=["空腹", "带身份证和医保卡"], notes="确认怀孕和预产期", importance="high"),
CheckupItem(title="NT检查", week=12, items=["NT超声筛查", "血清学筛查", "血压", "体重"], preparations=["不需要空腹", "需憋尿"], notes="筛查唐氏综合征风险", importance="high"),
CheckupItem(title="唐氏筛查", week=16, items=["唐氏筛查抽血", "血压", "体重", "宫高腹围"], preparations=["空腹抽血"], notes="评估胎儿染色体异常风险", importance="high"),
CheckupItem(title="大排畸检查", week=22, items=["四维彩超", "血压", "体重", "宫高腹围"], preparations=["不需要空腹", "提前预约"], notes="全面筛查胎儿结构畸形", importance="high"),
CheckupItem(title="糖耐量检查", week=24, items=["OGTT糖耐量试验", "血压", "体重"], preparations=["空腹8-14小时", "检查前3天正常饮食"], notes="筛查妊娠期糖尿病", importance="high"),
CheckupItem(title="常规产检", week=28, items=["血常规", "尿常规", "血压", "体重", "胎心监护"], preparations=["空腹"], notes="进入孕晚期,增加产检频率", importance="medium"),
CheckupItem(title="常规产检", week=30, items=["B超评估胎儿发育", "血压", "体重", "胎心监护"], preparations=[], notes="评估胎儿生长发育", importance="medium"),
CheckupItem(title="常规产检", week=32, items=["血常规", "尿常规", "血压", "体重", "胎心监护", "B超"], preparations=["空腹"], notes="观察胎位", importance="medium"),
CheckupItem(title="GBS筛查", week=36, items=["B族链球菌筛查", "血压", "体重", "胎心监护", "内检"], preparations=[], notes="预防新生儿感染", importance="high"),
CheckupItem(title="每周产检", week=37, items=["胎心监护", "血压", "体重", "宫高腹围"], preparations=[], notes="每周一次,准备待产", importance="medium"),
CheckupItem(title="每周产检", week=38, items=["胎心监护", "B超评估", "血压", "体重"], preparations=[], notes="评估分娩时机", importance="medium"),
CheckupItem(title="每周产检", week=39, items=["胎心监护", "血压", "体重", "宫颈评估"], preparations=[], notes="关注产兆", importance="high"),
CheckupItem(title="预产期产检", week=40, items=["胎心监护", "B超", "血压", "体重", "催产评估"], preparations=[], notes="超过预产期需密切监护", importance="high"),
]
@router.get("/plan")
async def get_checkup_plan(user: User = Depends(get_current_user)):
"""获取产检计划"""
plan = await CheckupPlan.find_one(CheckupPlan.user_id == user.id)
if not plan:
# Generate default plan
plan = CheckupPlan(user_id=user.id, checkups=STANDARD_CHECKUPS)
await plan.insert()
# Mark completed checkups based on current week
current_week = user.pregnancy_week or 0
checkups = []
for c in plan.checkups:
status = c.status
if c.week < current_week and status == "upcoming":
status = "missed"
checkups.append({
**c.model_dump(),
"status": status,
})
# Find next checkup
next_checkup = None
for c in checkups:
if c["status"] == "upcoming":
next_checkup = c
break
return {
"checkups": checkups,
"next_checkup": next_checkup,
"current_week": current_week,
}
@router.put("/plan/{week}/complete")
async def complete_checkup(week: int, user: User = Depends(get_current_user)):
"""标记产检已完成"""
plan = await CheckupPlan.find_one(CheckupPlan.user_id == user.id)
if not plan:
raise HTTPException(status_code=404, detail="产检计划不存在")
for checkup in plan.checkups:
if checkup.week == week:
checkup.status = "completed"
break
plan.updated_at = datetime.now(timezone.utc)
await plan.save()
return {"message": "已标记完成"}
async def link_report_to_checkup(user_id, report_id: str, pregnancy_week: int):
"""将报告自动关联到最近的产检(±2周窗口),并标记该产检为已完成"""
plan = await CheckupPlan.find_one(CheckupPlan.user_id == user_id)
if not plan:
return
best = None
best_diff = 999
for c in plan.checkups:
diff = abs(c.week - pregnancy_week)
if diff <= 2 and diff < best_diff:
best = c
best_diff = diff
if best:
if report_id not in best.report_ids:
best.report_ids.append(report_id)
best.status = "completed"
plan.updated_at = datetime.now(timezone.utc)
await plan.save()