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/0);body 保持与客户端约定字段一致,不写入 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), )