fix:修复因数据库缺少 working_hours 列导致 ROI 配置失败的问题。
- 手动执行 SQL:ALTER TABLE rois ADD COLUMN working_hours TEXT - 确保现有 SQLite 数据库(security_monitor.db)结构与模型定义一致 - 避免因字段缺失引发 API 或算法读取异常
This commit is contained in:
26
api/roi.py
26
api/roi.py
@@ -29,9 +29,10 @@ class CreateROIRequest(BaseModel):
|
||||
rule_type: str
|
||||
direction: Optional[str] = None
|
||||
stay_time: Optional[int] = None
|
||||
threshold_sec: int = 360
|
||||
confirm_sec: int = 30
|
||||
return_sec: int = 5
|
||||
threshold_sec: int = 300
|
||||
confirm_sec: int = 10
|
||||
return_sec: int = 30
|
||||
working_hours: Optional[List[dict]] = None
|
||||
|
||||
|
||||
class UpdateROIRequest(BaseModel):
|
||||
@@ -45,6 +46,7 @@ class UpdateROIRequest(BaseModel):
|
||||
threshold_sec: Optional[int] = None
|
||||
confirm_sec: Optional[int] = None
|
||||
return_sec: Optional[int] = None
|
||||
working_hours: Optional[List[dict]] = None
|
||||
|
||||
|
||||
def _invalidate_roi_cache(camera_id: int):
|
||||
@@ -70,6 +72,7 @@ def list_rois(camera_id: int, db: Session = Depends(get_db)):
|
||||
"threshold_sec": roi.threshold_sec,
|
||||
"confirm_sec": roi.confirm_sec,
|
||||
"return_sec": roi.return_sec,
|
||||
"working_hours": json.loads(roi.working_hours) if roi.working_hours else None,
|
||||
}
|
||||
for roi in roi_configs
|
||||
]
|
||||
@@ -93,6 +96,7 @@ def get_roi(camera_id: int, roi_id: int, db: Session = Depends(get_db)):
|
||||
"threshold_sec": roi.threshold_sec,
|
||||
"confirm_sec": roi.confirm_sec,
|
||||
"return_sec": roi.return_sec,
|
||||
"working_hours": json.loads(roi.working_hours) if roi.working_hours else None,
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +106,10 @@ def add_roi(
|
||||
request: CreateROIRequest,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
import json
|
||||
|
||||
working_hours_json = json.dumps(request.working_hours) if request.working_hours else None
|
||||
|
||||
roi = create_roi(
|
||||
db,
|
||||
camera_id=camera_id,
|
||||
@@ -115,6 +123,7 @@ def add_roi(
|
||||
threshold_sec=request.threshold_sec,
|
||||
confirm_sec=request.confirm_sec,
|
||||
return_sec=request.return_sec,
|
||||
working_hours=working_hours_json,
|
||||
)
|
||||
|
||||
_invalidate_roi_cache(camera_id)
|
||||
@@ -126,7 +135,13 @@ def add_roi(
|
||||
"type": roi.roi_type,
|
||||
"points": request.points,
|
||||
"rule": roi.rule_type,
|
||||
"direction": roi.direction,
|
||||
"stay_time": roi.stay_time,
|
||||
"enabled": roi.enabled,
|
||||
"threshold_sec": roi.threshold_sec,
|
||||
"confirm_sec": roi.confirm_sec,
|
||||
"return_sec": roi.return_sec,
|
||||
"working_hours": request.working_hours,
|
||||
}
|
||||
|
||||
|
||||
@@ -137,6 +152,9 @@ def modify_roi(
|
||||
request: UpdateROIRequest,
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
import json
|
||||
working_hours_json = json.dumps(request.working_hours) if request.working_hours else None
|
||||
|
||||
roi = update_roi(
|
||||
db,
|
||||
roi_id=roi_id,
|
||||
@@ -149,6 +167,7 @@ def modify_roi(
|
||||
threshold_sec=request.threshold_sec,
|
||||
confirm_sec=request.confirm_sec,
|
||||
return_sec=request.return_sec,
|
||||
working_hours=working_hours_json,
|
||||
)
|
||||
if not roi:
|
||||
raise HTTPException(status_code=404, detail="ROI不存在")
|
||||
@@ -163,6 +182,7 @@ def modify_roi(
|
||||
"points": json.loads(roi.points),
|
||||
"rule": roi.rule_type,
|
||||
"enabled": roi.enabled,
|
||||
"working_hours": json.loads(roi.working_hours) if roi.working_hours else None,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user