128 lines
4.2 KiB
Python
128 lines
4.2 KiB
Python
"""
|
|
设备操作记录 API
|
|
"""
|
|
import logging
|
|
from typing import Dict, Any, Optional
|
|
from fastapi import APIRouter, HTTPException, Body
|
|
from pydantic import BaseModel, Field
|
|
from services.device_operation_service import get_device_operation_service
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/device_operations", tags=["设备操作"])
|
|
|
|
|
|
class OperationRecordRequest(BaseModel):
|
|
"""设备操作记录请求"""
|
|
system_user_id: int = Field(..., description="系统用户ID")
|
|
context_id: Optional[str] = Field(None, description="会话上下文ID")
|
|
device_type: str = Field(..., description="设备类型")
|
|
device_name: Optional[str] = Field(None, description="设备名称")
|
|
action: str = Field(..., description="执行的操作")
|
|
parameters: Optional[Dict[str, Any]] = Field(default_factory=dict, description="操作参数")
|
|
success: bool = Field(..., description="操作是否成功")
|
|
response: Optional[str] = Field(None, description="操作响应")
|
|
error_message: Optional[str] = Field(None, description="错误信息")
|
|
execution_time: Optional[int] = Field(None, description="执行时间(毫秒)")
|
|
timestamp: Optional[str] = Field(None, description="时间戳")
|
|
|
|
|
|
class OperationQueryRequest(BaseModel):
|
|
"""操作记录查询请求"""
|
|
system_user_id: int = Field(..., description="系统用户ID")
|
|
limit: int = Field(50, description="返回记录数量", ge=1, le=500)
|
|
device_type: Optional[str] = Field(None, description="设备类型过滤")
|
|
|
|
|
|
class StatisticsQueryRequest(BaseModel):
|
|
"""统计查询请求"""
|
|
system_user_id: int = Field(..., description="系统用户ID")
|
|
days: int = Field(7, description="统计天数", ge=1, le=90)
|
|
|
|
|
|
@router.post("/save")
|
|
async def save_operation_record(record: OperationRecordRequest):
|
|
"""
|
|
保存设备操作记录
|
|
|
|
由 Conductor Agent 在执行设备操作后调用,保存操作记录到数据库
|
|
"""
|
|
try:
|
|
service = get_device_operation_service()
|
|
|
|
# 转换为字典
|
|
operation_record = record.model_dump()
|
|
|
|
# 保存记录
|
|
success = service.save_operation_record(operation_record)
|
|
|
|
if success:
|
|
return {
|
|
"success": True,
|
|
"message": "操作记录已保存"
|
|
}
|
|
else:
|
|
raise HTTPException(status_code=500, detail="保存操作记录失败")
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ 保存操作记录失败: {e}", exc_info=True)
|
|
raise HTTPException(status_code=500, detail=f"保存操作记录失败: {str(e)}")
|
|
|
|
|
|
@router.post("/query")
|
|
async def query_operations(request: OperationQueryRequest):
|
|
"""
|
|
查询操作记录
|
|
|
|
根据用户ID和可选的设备类型查询操作记录
|
|
"""
|
|
try:
|
|
service = get_device_operation_service()
|
|
|
|
records = service.get_recent_operations(
|
|
system_user_id=request.system_user_id,
|
|
limit=request.limit,
|
|
device_type=request.device_type
|
|
)
|
|
|
|
return {
|
|
"success": True,
|
|
"count": len(records),
|
|
"records": records
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"❌ 查询操作记录失败: {e}")
|
|
raise HTTPException(status_code=500, detail=f"查询操作记录失败: {str(e)}")
|
|
|
|
|
|
@router.post("/statistics")
|
|
async def get_statistics(request: StatisticsQueryRequest):
|
|
"""
|
|
获取操作统计信息
|
|
|
|
统计指定天数内的设备操作情况
|
|
"""
|
|
try:
|
|
service = get_device_operation_service()
|
|
|
|
statistics = service.get_operation_statistics(
|
|
system_user_id=request.system_user_id,
|
|
days=request.days
|
|
)
|
|
|
|
if "error" in statistics:
|
|
raise HTTPException(status_code=500, detail=statistics["error"])
|
|
|
|
return {
|
|
"success": True,
|
|
"statistics": statistics
|
|
}
|
|
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"❌ 获取操作统计失败: {e}")
|
|
raise HTTPException(status_code=500, detail=f"获取操作统计失败: {str(e)}")
|
|
|