Update API service to use raw_waiting_time table

- Change RawOpdCheckpoint model to RawWaitingTime
- Update schema from FeedCheckpointIn to FeedWaitingTimeIn
- Switch to rawdata.raw_waiting_time table
- Keep existing /feed/checkpoint endpoint
- Add new fields: vn, txn, name, doctor_code, doctor_name, location_code, location_name, step_name, time
- Update permission to feed.waiting-time:write
This commit is contained in:
Gamegame101
2026-02-24 16:34:34 +07:00
parent bd7b658a6b
commit 9abd1f272c
25 changed files with 551 additions and 41 deletions

View File

@@ -1,21 +1,22 @@
from __future__ import annotations
from typing import Annotated
from datetime import datetime
from zoneinfo import ZoneInfo
from fastapi import APIRouter, Depends
from sqlalchemy.dialects.postgresql import insert
from sqlalchemy.orm import Session
from app.api.v1.schemas import FeedCheckpointIn
from app.api.v1.schemas import FeedWaitingTimeIn
from app.core.config import settings
from app.db.models import RawOpdCheckpoint
from app.db.models import RawWaitingTime
from app.security.dependencies import get_db, require_permission
router = APIRouter(prefix="/api/v1")
PERM_FEED_CHECKPOINT_WRITE = "feed.checkpoint:write"
PERM_FEED_WAITING_TIME_WRITE = "feed.waiting-time:write"
def _to_tz(dt):
@@ -28,8 +29,8 @@ def _to_tz(dt):
@router.post("/feed/checkpoint")
def upsert_feed_checkpoint(
payload: list[FeedCheckpointIn],
_: Annotated[object, Depends(require_permission(PERM_FEED_CHECKPOINT_WRITE))],
payload: list[FeedWaitingTimeIn],
_: Annotated[object, Depends(require_permission(PERM_FEED_WAITING_TIME_WRITE))],
db: Annotated[Session, Depends(get_db)],
):
rows = []
@@ -37,30 +38,36 @@ def upsert_feed_checkpoint(
rows.append(
{
"id": item.id,
"hn": item.hn,
"vn": item.vn,
"location": item.location,
"type": item.type,
"timestamp_in": _to_tz(item.timestamp_in),
"timestamp_out": _to_tz(item.timestamp_out),
"waiting_time": item.waiting_time,
"bu": item.bu,
"txn": item.txn,
"hn": item.hn,
"name": item.name,
"doctor_code": item.doctor_code,
"doctor_name": item.doctor_name,
"location_code": item.location_code,
"location_name": item.location_name,
"step_name": item.step_name,
"time": _to_tz(item.time),
"updated_at": datetime.now(ZoneInfo(settings.TIMEZONE)),
}
)
stmt = insert(RawOpdCheckpoint).values(rows)
stmt = insert(RawWaitingTime).values(rows)
update_cols = {
"hn": stmt.excluded.hn,
"vn": stmt.excluded.vn,
"location": stmt.excluded.location,
"type": stmt.excluded.type,
"timestamp_in": stmt.excluded.timestamp_in,
"timestamp_out": stmt.excluded.timestamp_out,
"waiting_time": stmt.excluded.waiting_time,
"bu": stmt.excluded.bu,
"txn": stmt.excluded.txn,
"hn": stmt.excluded.hn,
"name": stmt.excluded.name,
"doctor_code": stmt.excluded.doctor_code,
"doctor_name": stmt.excluded.doctor_name,
"location_code": stmt.excluded.location_code,
"location_name": stmt.excluded.location_name,
"step_name": stmt.excluded.step_name,
"time": stmt.excluded.time,
"updated_at": stmt.excluded.updated_at,
}
stmt = stmt.on_conflict_do_update(index_elements=[RawOpdCheckpoint.id], set_=update_cols)
stmt = stmt.on_conflict_do_update(index_elements=[RawWaitingTime.id], set_=update_cols)
result = db.execute(stmt)
db.commit()