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)
|