79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
from mysql.connector import Error as MySQLError
|
||
|
||
from ds.db import db
|
||
from schema.device_danger_schema import DeviceDangerCreateRequest, DeviceDangerResponse
|
||
|
||
|
||
# ------------------------------
|
||
# 内部工具方法 - 检查设备是否存在(复用设备表逻辑)
|
||
# ------------------------------
|
||
def check_device_exist(client_ip: str) -> bool:
|
||
"""
|
||
检查指定IP的设备是否在devices表中存在
|
||
|
||
:param client_ip: 设备IP地址
|
||
:return: 存在返回True、不存在返回False
|
||
"""
|
||
if not client_ip:
|
||
raise ValueError("设备IP不能为空")
|
||
|
||
conn = None
|
||
cursor = None
|
||
try:
|
||
conn = db.get_connection()
|
||
cursor = conn.cursor(dictionary=True)
|
||
|
||
cursor.execute("SELECT id FROM devices WHERE client_ip = %s", (client_ip,))
|
||
return cursor.fetchone() is not None
|
||
except MySQLError as e:
|
||
raise Exception(f"检查设备存在性失败: {str(e)}") from e
|
||
finally:
|
||
db.close_connection(conn, cursor)
|
||
|
||
|
||
# ------------------------------
|
||
# 内部工具方法 - 创建设备危险记录(核心插入逻辑)
|
||
# ------------------------------
|
||
def create_danger_record(danger_data: DeviceDangerCreateRequest) -> DeviceDangerResponse:
|
||
"""
|
||
内部工具方法:向device_danger表插入新的危险记录
|
||
|
||
:param danger_data: 危险记录创建请求数据
|
||
:return: 创建成功的危险记录模型对象
|
||
"""
|
||
# 先检查设备是否存在
|
||
if not check_device_exist(danger_data.client_ip):
|
||
raise ValueError(f"IP为 {danger_data.client_ip} 的设备不存在、无法创建危险记录")
|
||
|
||
conn = None
|
||
cursor = None
|
||
try:
|
||
conn = db.get_connection()
|
||
cursor = conn.cursor(dictionary=True)
|
||
|
||
# 插入危险记录(id自增、时间自动填充)
|
||
insert_query = """
|
||
INSERT INTO device_danger
|
||
(client_ip, type, result, created_at, updated_at)
|
||
VALUES (%s, %s, %s, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
||
"""
|
||
cursor.execute(insert_query, (
|
||
danger_data.client_ip,
|
||
danger_data.type,
|
||
danger_data.result
|
||
))
|
||
conn.commit()
|
||
|
||
# 获取刚创建的记录(用自增ID查询)
|
||
danger_id = cursor.lastrowid
|
||
cursor.execute("SELECT * FROM device_danger WHERE id = %s", (danger_id,))
|
||
new_danger = cursor.fetchone()
|
||
|
||
return DeviceDangerResponse(**new_danger)
|
||
except MySQLError as e:
|
||
if conn:
|
||
conn.rollback()
|
||
raise Exception(f"插入危险记录失败: {str(e)}") from e
|
||
finally:
|
||
db.close_connection(conn, cursor)
|