diff --git a/website/db/enterprise_busi_model/enterprise_busi_model_node_device.py b/website/db/enterprise_busi_model/enterprise_busi_model_node_device.py index 7e36229..56bd315 100644 --- a/website/db/enterprise_busi_model/enterprise_busi_model_node_device.py +++ b/website/db/enterprise_busi_model/enterprise_busi_model_node_device.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from typing import List -from sqlalchemy import Column, Integer, String, DateTime, func +from sqlalchemy import Column, Integer, String, DateTime, func, text from sqlalchemy.ext.declarative import declarative_base -from website.db_mysql import get_session +from website.db_mysql import get_session, to_json_list """ CREATE TABLE `enterprise_busi_model_node_device` ( @@ -26,7 +26,7 @@ Base = declarative_base() class EnterpriseBusiModelNodeDevice(Base): - __tablename__ = 'enterprise_busi_model_node_device' + __tablename__ = "enterprise_busi_model_node_device" id = Column(Integer, primary_key=True) suid = Column(String(10)) @@ -37,7 +37,9 @@ class EnterpriseBusiModelNodeDevice(Base): busi_model_suid = Column(String(10)) device_id = Column(Integer) device_suid = Column(String(10)) - create_time = Column(DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp()) + create_time = Column( + DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp() + ) def __repr__(self): return f"EnterpriseBusiModelNodeDevice(id={self.id}, suid='{self.suid}')" @@ -56,15 +58,24 @@ class EnterpriseBusiModelNodeDeviceRepository(object): session.bulk_insert_mappings(EnterpriseBusiModelNodeDevice, records) session.commit() - def check_deployed(self, node_id: int, busi_model_id: int) -> int: with get_session() as session: count = ( session.query(EnterpriseBusiModelNodeDevice) .filter( - EnterpriseBusiModelNodeDevice.node_id==node_id, - EnterpriseBusiModelNodeDevice.busi_model_id==busi_model_id + EnterpriseBusiModelNodeDevice.node_id == node_id, + EnterpriseBusiModelNodeDevice.busi_model_id == busi_model_id, ) .count() ) - return 1 if count > 0 else 0 \ No newline at end of file + return 1 if count > 0 else 0 + + def get_device_id(self, node_id: int, busi_model_id: int) -> int | None: + with get_session() as session: + sql = text( + "select device_id from enterprise_busi_model_node_device where node_id=:node_id and busi_model_id=:busi_model_id" + ) + res = session.execute( + sql, {"node_id": node_id, "busi_model_id": busi_model_id} + ) + return to_json_list(res) diff --git a/website/db/enterprise_device/enterprise_device.py b/website/db/enterprise_device/enterprise_device.py index 81cb872..f017f69 100644 --- a/website/db/enterprise_device/enterprise_device.py +++ b/website/db/enterprise_device/enterprise_device.py @@ -46,7 +46,7 @@ CREATE TABLE `enterprise_device` ( class EnterpriseDevice(Base): - __tablename__ = 'enterprise_device' + __tablename__ = "enterprise_device" id = Column(Integer, primary_key=True) suid = Column(String(length=10), default="") @@ -80,21 +80,25 @@ class EnterpriseDeviceRepository(object): name = device["name"] with get_session() as session: - existing_device = session.query(EnterpriseDevice) \ - .filter_by(node_id=node_id, name=name, delete=0) \ + existing_device = ( + session.query(EnterpriseDevice) + .filter_by(node_id=node_id, name=name, delete=0) .first() + ) if existing_device: - logging.error(f"Failed to add device: device with node_id={node_id} and name={name} already exists") + logging.error( + f"Failed to add device: device with node_id={node_id} and name={name} already exists" + ) raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备已存在") new_device = EnterpriseDevice(**device) try: # session.execute( # text( - # """INSERT INTO enterprise_device - # (suid, entity_id, entity_suid, node_id, node_suid, classification, name, addr, device_model, param, comment) + # """INSERT INTO enterprise_device + # (suid, entity_id, entity_suid, node_id, node_suid, classification, name, addr, device_model, param, comment) # values (:suid, :entity_id, :entity_suid, :node_id, :node_suid, :classification, :name, :addr, :device_model, :param, :comment)""" - # ), + # ), # device) session.add(new_device) except Exception as e: @@ -107,7 +111,9 @@ class EnterpriseDeviceRepository(object): device_id = device["id"] with get_session() as session: try: - session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update(device) + session.query(EnterpriseDevice).filter( + EnterpriseDevice.id == device_id + ).update(device) except Exception as e: logging.error("Failed to edit device") raise e @@ -117,7 +123,9 @@ class EnterpriseDeviceRepository(object): def delete_device(self, device_id): with get_session() as session: try: - session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update({"delete": 1}) + session.query(EnterpriseDevice).filter( + EnterpriseDevice.id == device_id + ).update({"delete": 1}) except Exception as e: logging.error("Failed to delete device") raise e @@ -127,17 +135,32 @@ class EnterpriseDeviceRepository(object): def list_devices(self, node_id: int, pageNo: int, pageSize: int) -> dict: with get_session() as session: try: - total_count = session.query(EnterpriseDevice) \ - .filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \ + total_count = ( + session.query(EnterpriseDevice) + .filter( + EnterpriseDevice.node_id == node_id, + EnterpriseDevice.delete != 1, + ) .count() - devices = session.query(EnterpriseDevice, - DeviceClassification.name.label("classification_name")) \ - .join(DeviceClassification, EnterpriseDevice.classification == DeviceClassification.suid) \ - .filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \ - .order_by(EnterpriseDevice.id.desc()) \ - .limit(pageSize) \ - .offset((pageNo - 1) * pageSize) \ + ) + devices = ( + session.query( + EnterpriseDevice, + DeviceClassification.name.label("classification_name"), + ) + .join( + DeviceClassification, + EnterpriseDevice.classification == DeviceClassification.suid, + ) + .filter( + EnterpriseDevice.node_id == node_id, + EnterpriseDevice.delete != 1, + ) + .order_by(EnterpriseDevice.id.desc()) + .limit(pageSize) + .offset((pageNo - 1) * pageSize) .all() + ) except Exception as e: logging.error("Failed to list devices") raise e @@ -158,25 +181,26 @@ class EnterpriseDeviceRepository(object): "param": device.param, "comment": device.comment, "delete": device.delete, - "create_time": device.create_time.strftime('%Y-%m-%d %H:%M:%S'), - "update_time": str(device.update_time) + "create_time": device.create_time.strftime("%Y-%m-%d %H:%M:%S"), + "update_time": str(device.update_time), } device_dicts.append(device_dict) # for row in devices: # logging.info(row.name) logging.info(device_dicts) - return { - "devices": device_dicts, - "total_count": total_count - } + return {"devices": device_dicts, "total_count": total_count} - with get_session() as session: def get_device(self, device_id: int) -> dict: + with get_session() as session: try: - device = session.query(EnterpriseDevice) \ - .filter(EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1) \ + device = ( + session.query(EnterpriseDevice) + .filter( + EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1 + ) .first() + ) except Exception as e: logging.error("Failed to get device") raise e @@ -189,7 +213,34 @@ class EnterpriseDeviceRepository(object): "device_model": device.device_model, "param": device.param, "comment": device.comment, - "classification": device.classification + "classification": device.classification, } return device_dict + + def get_devices(self, device_ids: list) -> list: + with get_session() as session: + try: + devices = ( + session.query(EnterpriseDevice) + .filter( + EnterpriseDevice.id.in_(device_ids), + EnterpriseDevice.delete != 1, + ) + .all() + ) + except Exception as e: + logging.error("Failed to get devices") + raise e + device_dicts = [] + for device in devices: + device_dict = { + "id": device.id, + "name": device.name, + "addr": device.addr, + "device_model": device.device_model, + "param": device.param, + "comment": device.comment, + } + device_dicts.append(device_dict) + return device_dicts diff --git a/website/handlers/enterprise_node/handler.py b/website/handlers/enterprise_node/handler.py index 194fe8a..bd0be16 100644 --- a/website/handlers/enterprise_node/handler.py +++ b/website/handlers/enterprise_node/handler.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- - +import json from website import errors from website.handler import APIHandler, authenticated from website.db.enterprise_entity import enterprise_entity as DB_Entity from website.db.enterprise_node import enterprise_node as DB_Node from website.db.enterprise_busi_model import enterprise_busi_model as DB_BusiModel -from website.db.enterprise_busi_model import enterprise_busi_model_node_device as DB_BusiModelNodeDevice +from website.db.enterprise_busi_model import ( + enterprise_busi_model_node_device as DB_BusiModelNodeDevice, +) from website.db.enterprise_device import enterprise_device as DB_Device from website.util import shortuuid @@ -45,18 +47,20 @@ class AddHandler(APIHandler): entity_suid = db_entity.get_entity_suid(entity_id) db_node = DB_Node.EnterpriseNodeRepository() - db_node.insert_node({ - "suid": shortuuid.ShortUUID().random(length=10), - "entity_id": entity_id, - "entity_suid": entity_suid, - "name": name, - "parent": parent, - "addr": addr, - "lola": lola, - "contact": contact, - "phone": phone, - "comment": comment - }) + db_node.insert_node( + { + "suid": shortuuid.ShortUUID().random(length=10), + "entity_id": entity_id, + "entity_suid": entity_suid, + "name": name, + "parent": parent, + "addr": addr, + "lola": lola, + "contact": contact, + "phone": phone, + "comment": comment, + } + ) self.finish() @@ -92,16 +96,18 @@ class EditHandler(APIHandler): raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") db_node = DB_Node.EnterpriseNodeRepository() - db_node.update_node({ - "node_id": node_id, - "name": name, - "parent": parent, - "addr": addr, - "lola": lola, - "contact": contact, - "phone": phone, - "comment": comment - }) + db_node.update_node( + { + "node_id": node_id, + "name": name, + "parent": parent, + "addr": addr, + "lola": lola, + "contact": contact, + "phone": phone, + "comment": comment, + } + ) self.finish() @@ -115,7 +121,7 @@ class TreeHandler(APIHandler): >- name, string, 搜索内容 - 返回值: ``` - { + { "data":[ { "id": 123, @@ -129,7 +135,7 @@ class TreeHandler(APIHandler): "id": 123, "name": "xxx" }, - + ] }, ... @@ -137,7 +143,7 @@ class TreeHandler(APIHandler): }, ... ] - + } ``` """ @@ -151,9 +157,7 @@ class TreeHandler(APIHandler): db_node = DB_Node.EnterpriseNodeRepository() nodes = db_node.select_tree(entity_id, name) - self.finish({ - "data": nodes - }) + self.finish({"data": nodes}) class InfoHandler(APIHandler): @@ -225,13 +229,14 @@ class BusimodelHandler(APIHandler): } ``` """ + @authenticated def post(self): - node_id = self.get_int_argument('node_id') - pageNo = self.get_int_argument('pageNo', 1) - pageSize = self.get_int_argument('pageSize', 20) + node_id = self.get_int_argument("node_id") + pageNo = self.get_int_argument("pageNo", 1) + pageSize = self.get_int_argument("pageSize", 20) if not node_id: - raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空') + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不能为空") db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() @@ -240,15 +245,18 @@ class BusimodelHandler(APIHandler): count = busi_models["count"] models = busi_models["data"] - db_mode_node_device = DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() + db_mode_node_device = ( + DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() + ) for busi_model in models: - deployed = db_mode_node_device.check_deployed(node_id, busi_model["busi_model_id"]) + deployed = db_mode_node_device.check_deployed( + node_id, busi_model["busi_model_id"] + ) busi_model["deployed"] = deployed self.finish({"count": count, "data": models}) - class BusimodelInfoHandler(APIHandler): """ - 描述:企业节点,业务模型部署 -> 业务模型信息 @@ -272,9 +280,42 @@ class BusimodelInfoHandler(APIHandler): } ``` """ + @authenticated def post(self): - self.finish() + node_id = self.get_int_argument("node_id") + busi_model_id = self.get_int_argument("busi_model_id") + + if not node_id or not busi_model_id: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") + + db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository() + busi_model = db_busi_model.get_busi_model_by_id(busi_model_id) + busi_model_name = busi_model.name + busi_model_comment = busi_model.comment + base_models = json.loads(busi_model.base_models) + base_model_names = ",".join([base_model["name"] for base_model in base_models]) + + db_mode_node_device = ( + DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() + ) + device_ids = db_mode_node_device.get_device_id(node_id, busi_model_id) + device_ids = list(set([item["device_id"] for item in device_ids])) + db_device = DB_Device.EnterpriseDeviceRepository() + devices = db_device.get_devices(device_ids) + + devices_return = [ + {"device_id": item["id"], "device_name": item["name"]} for item in devices + ] + + self.finish( + { + "busi_model_name": busi_model_name, + "busi_model_comment": busi_model_comment, + "base_models": base_model_names, + "devices": devices_return, + } + ) class BusimodelDeployHandler(APIHandler): @@ -287,17 +328,18 @@ class BusimodelDeployHandler(APIHandler): > - device_ids, string, 设备id, 多个id逗号分割 - 返回值:无 """ + @authenticated def post(self): - node_id = self.get_int_argument('node_id') - busi_model_id = self.get_int_argument('busi_model_id') - device_ids = self.get_escaped_argument('device_ids', '') + node_id = self.get_int_argument("node_id") + busi_model_id = self.get_int_argument("busi_model_id") + device_ids = self.get_escaped_argument("device_ids", "") if not node_id or not busi_model_id: - raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '参数错误') + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") db_node = DB_Node.EnterpriseNodeRepository() node = db_node.get_node_by_id(node_id) if not node: - raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '节点不存在') + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "节点不存在") node_suid = node["suid"] db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository() @@ -306,24 +348,28 @@ class BusimodelDeployHandler(APIHandler): entity_suid_row = db_node.get_entity_suid_by_node_id(node_id) if not entity_suid_row: - raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不存在') - + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不存在") + records = [] - for device_id in device_ids.split(','): + for device_id in device_ids.split(","): device = DB_Device.EnterpriseDeviceRepository().get_device(int(device_id)) if not device: - raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备不存在') - - records.append({ - "suid": shortuuid.ShortUUID.random(length=10), - "entity_suid": entity_suid_row["entity_suid"], - "node_id": node_id, - "node_suid": node_suid, - "busi_model_id": busi_model_id, - "busi_model_suid": busi_model_suid, - "device_id": int(device_id), - "device_suid": device["suid"] - }) - DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(records) - - self.finish() \ No newline at end of file + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备不存在") + + records.append( + { + "suid": shortuuid.ShortUUID.random(length=10), + "entity_suid": entity_suid_row["entity_suid"], + "node_id": node_id, + "node_suid": node_suid, + "busi_model_id": busi_model_id, + "busi_model_suid": busi_model_suid, + "device_id": int(device_id), + "device_suid": device["suid"], + } + ) + DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record( + records + ) + + self.finish()