58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
"""
|
||
会员生日手动补录路由。
|
||
|
||
- POST /api/member-birthday — 助教提交会员生日(UPSERT)
|
||
"""
|
||
|
||
import logging
|
||
|
||
from fastapi import APIRouter, HTTPException, status
|
||
|
||
from app.database import get_connection
|
||
from app.schemas.member_birthday import MemberBirthdaySubmit
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
router = APIRouter(prefix="/api", tags=["会员生日"])
|
||
|
||
|
||
@router.post("/member-birthday")
|
||
async def submit_member_birthday(body: MemberBirthdaySubmit):
|
||
"""
|
||
助教提交会员生日(UPSERT)。
|
||
|
||
同一 (member_id, assistant_id) 组合重复提交时,
|
||
更新 birthday_value 和 recorded_at,保留其他助教的记录。
|
||
"""
|
||
sql = """
|
||
INSERT INTO member_birthday_manual
|
||
(member_id, birthday_value, recorded_by_assistant_id, recorded_by_name, site_id)
|
||
VALUES (%s, %s, %s, %s, %s)
|
||
ON CONFLICT (member_id, recorded_by_assistant_id)
|
||
DO UPDATE SET
|
||
birthday_value = EXCLUDED.birthday_value,
|
||
recorded_at = NOW()
|
||
"""
|
||
conn = get_connection()
|
||
try:
|
||
with conn.cursor() as cur:
|
||
cur.execute(sql, (
|
||
body.member_id,
|
||
body.birthday_value,
|
||
body.assistant_id,
|
||
body.assistant_name,
|
||
body.site_id,
|
||
))
|
||
conn.commit()
|
||
except Exception:
|
||
conn.rollback()
|
||
logger.exception("会员生日 UPSERT 失败: member_id=%s", body.member_id)
|
||
raise HTTPException(
|
||
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
||
detail="生日提交失败,请稍后重试",
|
||
)
|
||
finally:
|
||
conn.close()
|
||
|
||
return {"status": "ok"}
|