feat: 初始化孕育无忧全栈项目基础代码结构
完成项目初始搭建,包含后端FastAPI+MongoDB服务、前端React+Vite项目的完整基础结构,添加各类配置文件与依赖清单,涵盖核心业务初始框架。
This commit is contained in:
101
backend/app/routers/calendar.py
Normal file
101
backend/app/routers/calendar.py
Normal file
@@ -0,0 +1,101 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user