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)