Compare commits

...

3 Commits

3 changed files with 19 additions and 16 deletions

View File

@@ -1,7 +1,8 @@
from datetime import datetime
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query
from fastapi import APIRouter, Depends, HTTPException, Query, Body
from pydantic import BaseModel
from sqlalchemy.orm import Session
from db.crud import (
@@ -16,6 +17,12 @@ from inference.pipeline import get_pipeline
router = APIRouter(prefix="/api/alarms", tags=["告警管理"])
class AlarmUpdateRequest(BaseModel):
llm_checked: Optional[bool] = None
llm_result: Optional[str] = None
processed: Optional[bool] = None
@router.get("", response_model=List[dict])
def list_alarms(
camera_id: Optional[int] = None,
@@ -72,12 +79,10 @@ def get_alarm(alarm_id: int, db: Session = Depends(get_db)):
@router.put("/{alarm_id}")
def update_alarm_status(
alarm_id: int,
llm_checked: Optional[bool] = None,
llm_result: Optional[str] = None,
processed: Optional[bool] = None,
request: AlarmUpdateRequest = Body(...),
db: Session = Depends(get_db),
):
alarm = update_alarm(db, alarm_id, llm_checked=llm_checked, llm_result=llm_result, processed=processed)
alarm = update_alarm(db, alarm_id, llm_checked=request.llm_checked, llm_result=request.llm_result, processed=request.processed)
if not alarm:
raise HTTPException(status_code=404, detail="告警不存在")
return {"message": "更新成功"}

View File

@@ -64,18 +64,15 @@ def get_camera(camera_id: int, db: Session = Depends(get_db)):
@router.post("", response_model=dict)
def add_camera(
name: str,
rtsp_url: str,
fps_limit: int = 30,
process_every_n_frames: int = 3,
request: CameraUpdateRequest = Body(...),
db: Session = Depends(get_db),
):
camera = create_camera(
db,
name=name,
rtsp_url=rtsp_url,
fps_limit=fps_limit,
process_every_n_frames=process_every_n_frames,
name=request.name,
rtsp_url=request.rtsp_url,
fps_limit=request.fps_limit or 30,
process_every_n_frames=request.process_every_n_frames or 3,
)
if camera.enabled:

View File

@@ -64,7 +64,8 @@ const Dashboard: React.FC = () => {
const res = await axios.get('/api/pipeline/status');
const cameras = Object.entries(res.data.cameras || {}).map(([id, info]) => ({
id,
...info as any,
is_running: (info as any).is_running || false,
fps: (info as any).fps || 0,
}));
setCameraStatus(cameras);
} catch (err) {
@@ -163,8 +164,8 @@ const Dashboard: React.FC = () => {
title={`摄像头 ${cam.id}`}
description={
<Space>
<Tag color={cam.running ? 'green' : 'red'}>
{cam.running ? '运行中' : '已停止'}
<Tag color={cam.is_running ? 'green' : 'red'}>
{cam.is_running ? '运行中' : '已停止'}
</Tag>
<span>{cam.fps?.toFixed(1) || 0} FPS</span>
</Space>