from __future__ import annotations import asyncio from dataclasses import dataclass, field from datetime import datetime from typing import List, Optional @dataclass class MeasureSnapshot: result: List[dict] video_left: str video_right: str updated_at: Optional[datetime] = None error: Optional[str] = None raw_prediction_path: Optional[str] = None pred: Optional[float] = None # 最终预测的体重值 star: bool = False # 置信度标记,True 表示计算可信 #: 与 FishMeasure ``test_dgcnn_weight_estimator.py`` 终端输出一致的体重推算过程文本 calculation_log: Optional[str] = None @dataclass class HealthSnapshot: behavior_result: str health_result: str updated_at: Optional[datetime] = None error: Optional[str] = None raw_class_en: str = "" @dataclass class AppState: measure_lock: asyncio.Lock = field(default_factory=asyncio.Lock) action_lock: asyncio.Lock = field(default_factory=asyncio.Lock) # job status for optional polling(业务结果见 SQLite) measure_status: str = "idle" action_status: str = "idle" app_state = AppState()