Files
AILab/bbit_ai/app/routers/Sentinel.py
T
2026-02-04 13:58:18 +08:00

193 lines
6.0 KiB
Python

from uuid import UUID
from fastapi import Depends, APIRouter
from config.httpClient import HttpClient
from config.minIO import get_temp_url
from config.redis import redis_client
from config.security import get_user_id_from_token
from db.postgres import get_dept_ids_by_user_id, get_dept_id_by_user_id
from db.postgres.sentinel import *
from models.BaseResponse import BaseResponse
# -------------------- 设备接口 --------------------
sentinel_router = APIRouter()
@sentinel_router.get("/record/list")
async def get_sentinel_record_list(
page: int = 1,
page_size: int = 10,
id: str | None = None,
license_plate: str | None = None,
vehicle_type: str | None = None,
is_inspected: int | None = None,
livestock_type: str = None,
livestock_source: str | None = None,
start_time: str | None = None,
end_time: str | None = None,
user_id: UUID = Depends(get_user_id_from_token),
):
if not user_id:
return {"error": "userId is required"}
dept_ids = get_dept_ids_by_user_id(user_id)
print(dept_ids) # 输出所有部门的 dept_id 列表
records, total = get_sentinel_record_list_db_page(
page,
page_size,
id,
license_plate,
vehicle_type,
is_inspected,
livestock_source,
livestock_type,
dept_ids,
start_time,
end_time,
)
return BaseResponse(data={"list": records, "total": total})
@sentinel_router.post("/record")
async def create_sentinel_record(
data: dict, user_id: UUID = Depends(get_user_id_from_token)
):
if not user_id:
return {"error": "userId is required"}
dept_id = get_dept_id_by_user_id(user_id)
new_id = insert_sentinel_record(data, dept_id)
return BaseResponse(data={"id": new_id})
@sentinel_router.put("/record/{id}")
async def update_sentinel_record(
id: str, data: dict, user_id: UUID = Depends(get_user_id_from_token)
):
if not user_id:
return {"error": "userId is required"}
count = update_sentinel_record_db(id, data)
if count == 0:
return BaseResponse(status=False, message="记录不存在", data=None)
return BaseResponse(data=True)
@sentinel_router.patch("/record/{id}")
async def patch_sentinel_record(
id: str, data: dict, user_id: UUID = Depends(get_user_id_from_token)
):
if not user_id:
return {"error": "userId is required"}
count = patch_sentinel_record_db(id, data)
if count == 0:
return BaseResponse(status=False, message="记录不存在", data=None)
return BaseResponse(data=True)
@sentinel_router.delete("/record/{id}")
async def delete_sentinel_record(
id: str, user_id: UUID = Depends(get_user_id_from_token)
):
if not user_id:
return {"error": "userId is required"}
deleted = delete_sentinel_record_db(id)
if deleted == 0:
return BaseResponse(status=False, message="记录不存在", data=None)
return BaseResponse(data=True)
@sentinel_router.get("/monitor/promotional/list")
async def get_sentinel_monitor_promotional_list(
user_id: UUID = Depends(get_user_id_from_token),
):
if not user_id:
return {"error": "userId is required"}
return BaseResponse(
data=[
{
"id": 1,
"remark": "人员公示及岗位职责",
"url": get_temp_url("sentinel", "promotional/promotional (2).jpg"),
},
{
"id": 2,
"remark": "入川动物监督检查工作流程图",
"url": get_temp_url("sentinel", "promotional/promotional (1).jpg"),
},
{
"id": 3,
"remark": "四川省人民政府关于设立人川动物运输指定通道的通告",
"url": get_temp_url("sentinel", "promotional/promotional (3).jpg"),
},
]
)
http_client = HttpClient()
@sentinel_router.get("/monitor/list")
async def get_sentinel_monitor_list(
user_id: UUID = Depends(get_user_id_from_token),
):
if not user_id:
return {"error": "userId is required"}
# 尝试从 Redis 获取 accessToken
access_token = redis_client.get_value("ys7:access_token")
if not access_token:
url = "https://open.ys7.com/api/lapp/token/get"
payload = {
"appKey": "c85e53559223457f90f06cd215513c3d",
"appSecret": "9424419da5292707eff2007e9ae37f0d",
}
result = await http_client.post(url, data=payload)
access_token = result["data"]["accessToken"]
redis_client.set_value(
"ys7:access_token", access_token, expire=7 * 24 * 60 * 60 # 7天过期
)
url = "https://open.ys7.com/api/lapp/v2/live/address/get"
# device_serials = ["BG2493625"]
device_serials = ["BG2493625", "GH3713250", "GH3714496", "GH3714497"]
video_expire_time = 25 * 24 * 60 * 60 # 25 天
res = []
for device_serial in device_serials:
live_key = f"ys7:live:{device_serial}"
cached_live = redis_client.get_value(live_key)
if cached_live:
video_id = cached_live.get("id")
video_url = cached_live.get("url")
else:
payload = {
"accessToken": access_token,
"deviceSerial": device_serial,
"protocol": 4, # 流播放协议,1-ezopen、2-hls、3-rtmp、4-flv,默认为1
"expireTime": video_expire_time, # 25天
"supportH265": 0,
"quality": 2,
}
result = await http_client.post(url, data=payload)
video_id = result["data"]["id"]
video_url = result["data"]["url"]
# 存到 Redis,自动序列化为 JSON,过期 25天
redis_client.set_value(
live_key,
{"id": video_id, "url": video_url},
expire=video_expire_time,
)
res.append(
{
"id": video_id,
"url": video_url,
}
)
return BaseResponse(data=res)