Files
FishServer/fish_api/app/routers/biomass.py

102 lines
3.0 KiB
Python
Raw Normal View History

from __future__ import annotations
from fastapi import APIRouter, Depends
from starlette.responses import JSONResponse
from app.db import pop_next_health, pop_next_measure
from app.settings import Settings, get_settings
router = APIRouter(prefix="/api/v1/biomass", tags=["biomass"])
# 是否有新快照被本次 GET 消费1/0body 保持与客户端约定字段一致,不写入 has_new。
HEADER_BIOMASS_NEW = "X-Fish-Biomass-New"
def _new_headers(has_new: bool) -> dict[str, str]:
return {HEADER_BIOMASS_NEW: "1" if has_new else "0"}
@router.get("/real/camera/")
async def get_real_camera(settings: Settings = Depends(get_settings)):
"""双目实时结果:每次 GET 投递下一条未消费的 FishMeasure 快照SQLite 游标)。"""
m, has_new, _ = pop_next_measure(settings)
if not has_new:
return JSONResponse(
content={
"code": 200,
"msg": "成功",
"data": {
"result": [],
"video_left": "",
"video_right": "",
},
},
headers=_new_headers(False),
)
if m.error:
return JSONResponse(
content={
"code": 500,
"msg": m.error,
"data": {
"result": [],
"video_left": "",
"video_right": "",
},
},
headers=_new_headers(True),
)
return JSONResponse(
content={
"code": 200,
"msg": "成功",
"data": {
"result": m.result,
"video_left": m.video_left,
"video_right": m.video_right,
},
},
headers=_new_headers(True),
)
@router.get("/health/result/")
async def get_health_result(settings: Settings = Depends(get_settings)):
"""行为 / 健康结果:每次 GET 投递下一条未消费的 FishAction 快照SQLite 游标)。"""
h, has_new, _ = pop_next_health(settings)
if not has_new:
return JSONResponse(
content={
"code": 200,
"msg": "成功",
"data": {
"behavior_result": "",
"health_result": "",
},
},
headers=_new_headers(False),
)
if h.error:
return JSONResponse(
content={
"code": 500,
"msg": h.error,
"data": {
"behavior_result": "",
"health_result": "",
},
},
headers=_new_headers(True),
)
return JSONResponse(
content={
"code": 200,
"msg": "成功",
"data": {
"behavior_result": h.behavior_result,
"health_result": h.health_result,
},
},
headers=_new_headers(True),
)