diff --git a/website/db/enterprise_busi_model/enterprise_busi_model.py b/website/db/enterprise_busi_model/enterprise_busi_model.py index 092a6cd..a9497d9 100644 --- a/website/db/enterprise_busi_model/enterprise_busi_model.py +++ b/website/db/enterprise_busi_model/enterprise_busi_model.py @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- -import json import copy +import json import logging -from sqlalchemy.ext.declarative import declarative_base +from typing import Any, Dict, List, Optional + from sqlalchemy import Column, Integer, String, DateTime, func -from typing import Any, Dict, List, Optional, Tuple, Union +from sqlalchemy.ext.declarative import declarative_base -from website.db_mysql import get_session -from website.util import shortuuid +from website.db.alg_model import alg_model as DB_alg_model from website.db.enterprise_entity.enterprise_entity import EnterpriseEntityRepository from website.db.enterprise_node import enterprise_node as DB_Node -from website.db.alg_model import alg_model as DB_alg_model +from website.db_mysql import get_session +from website.util import shortuuid Base = declarative_base() @@ -66,6 +67,7 @@ class EnterpriseBusiModel(Base): def __repr__(self): return f"EnterpriseBusiModel(id={self.id}, suid='{self.suid}', name='{self.name}')" + class EnterpriseBusiModelNode(Base): __tablename__ = 'enterprise_busi_model_node' @@ -77,6 +79,7 @@ class EnterpriseBusiModelNode(Base): node_id = Column(Integer) node_suid = Column(String(10)) create_time = Column(DateTime, default=func.current_timestamp()) + def __repr__(self): return f'<EnterpriseBusiModelNode(id={self.id}, suid={self.suid})>' @@ -84,11 +87,10 @@ class EnterpriseBusiModelNode(Base): class EnterpriseBusiModelRepository(object): def get_by_id(self, id: int) -> Optional[EnterpriseBusiModel]: - with get_session() as session: + with get_session() as session: model = session.query(EnterpriseBusiModel).filter(EnterpriseBusiModel.id == id).first() return model - - + def insert_busi_model(self, data: Dict): entity_suid = EnterpriseEntityRepository().get_entity_suid(data['entity_id']) data['suid'] = shortuuid.ShortUUID().random(10) @@ -104,7 +106,7 @@ class EnterpriseBusiModelRepository(object): 'id': base_model_id, 'suid': base_model_info.suid, 'name': base_model_info.name, - }) + }) data['base_models'] = json.dumps(base_model) new_data = copy.copy(data) @@ -114,7 +116,7 @@ class EnterpriseBusiModelRepository(object): session.commit() return model.id, model.suid - + def edit_busi_model(self, data: Dict): base_model_ids = [int(model_id) for model_id in data['basemodel_ids'].split(',')] base_model_db = DB_alg_model.ModelRepositry() @@ -124,8 +126,8 @@ class EnterpriseBusiModelRepository(object): base_model.append({ 'id': base_model_id, 'suid': base_model_suid - }) - + }) + data['base_models'] = json.dumps(base_model) with get_session() as session: try: @@ -136,13 +138,11 @@ class EnterpriseBusiModelRepository(object): return - def get_busi_model_by_id(self, id: int) -> Optional[EnterpriseBusiModel]: with get_session() as session: model = session.query(EnterpriseBusiModel).filter(EnterpriseBusiModel.id == id).first() return model - - + def list_enterprise_busi_model(self, entity_id: int, page_no: int, page_size: int) -> Dict[Any, Any]: """ 获取企业部署的业务模型列表 @@ -155,9 +155,10 @@ class EnterpriseBusiModelRepository(object): Returns: dict: 包含总数和数据列表的字典 """ - with get_session() as session: - total_count = session.query(func.count(EnterpriseBusiModel.id)).filter(EnterpriseBusiModel.entity_id == entity_id).scalar() - + with get_session() as session: + total_count = session.query(func.count(EnterpriseBusiModel.id)).filter( + EnterpriseBusiModel.entity_id == entity_id).scalar() + models = ( session.query( EnterpriseBusiModel.id.label("model_id"), @@ -169,7 +170,7 @@ class EnterpriseBusiModelRepository(object): .limit(page_size) .all() ) - + return { "count": total_count, "data": [ @@ -182,10 +183,11 @@ class EnterpriseBusiModelRepository(object): ] } + class EnterpriseBusiModelNodeRepository(object): # def get_by_id(self, id: int) -> Optional[EnterpriseBusiModelNode]: # return self.db.query(EnterpriseBusiModelNode).filter(EnterpriseBusiModelNode.id == id).first() - + def insert_busi_model_nodes(self, data: Dict): data['suid'] = shortuuid.ShortUUID().random(10) link_node_ids = [int(node_id) for node_id in data['node_ids'].split(',')] @@ -204,16 +206,21 @@ class EnterpriseBusiModelNodeRepository(object): ) session.add(model_node) session.commit() - return - + return def get_nodes_by_busi_model(self, busi_model_id: int) -> List[EnterpriseBusiModelNode]: with get_session() as session: - nodes = session.query(EnterpriseBusiModelNode).filter(EnterpriseBusiModelNode.busi_model_id == busi_model_id).all() + nodes = session.query(EnterpriseBusiModelNode).filter( + EnterpriseBusiModelNode.busi_model_id == busi_model_id).all() return nodes - def delete_by_busi_model_id(self, busi_model_id: int) -> None: with get_session() as session: - session.query(EnterpriseBusiModelNode).filter(EnterpriseBusiModelNode.busi_model_id == busi_model_id).delete() - session.commit() \ No newline at end of file + session.query(EnterpriseBusiModelNode).filter( + EnterpriseBusiModelNode.busi_model_id == busi_model_id).delete() + session.commit() + + def get_busi_model_by_node_id(self, node_id: int) -> Optional[EnterpriseBusiModelNode]: + with get_session() as session: + model = session.query(EnterpriseBusiModelNode).filter(EnterpriseBusiModelNode.node_id == node_id).first() + return model 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 new file mode 100644 index 0000000..14f8216 --- /dev/null +++ b/website/db/enterprise_busi_model/enterprise_busi_model_node_device.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +from typing import List + +from sqlalchemy import Column, Integer, String, DateTime, func +from sqlalchemy.ext.declarative import declarative_base + +from website.db_mysql import get_session + +""" +CREATE TABLE `enterprise_busi_model_node_device` ( + `id` int NOT NULL, + `suid` varchar(10) DEFAULT NULL, + `entity_suid` varchar(10) DEFAULT NULL, + `node_id` int DEFAULT NULL, + `node_suid` varchar(10) DEFAULT NULL, + `busi_model_id` int DEFAULT NULL, + `busi_model_suid` varchar(10) DEFAULT NULL, + `device_id` int DEFAULT NULL, + `device_suid` varchar(10) DEFAULT NULL, + `create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='节点-业务模型-设备关联表'; +""" + +Base = declarative_base() + + +class EnterpriseBusiModelNodeDevice(Base): + __tablename__ = 'enterprise_busi_model_node_device' + + id = Column(Integer, primary_key=True) + suid = Column(String(10)) + entity_suid = Column(String(10)) + node_id = Column(Integer) + node_suid = Column(String(10)) + busi_model_id = Column(Integer) + 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()) + + def __repr__(self): + return f"EnterpriseBusiModelNodeDevice(id={self.id}, suid='{self.suid}')" + + +class EnterpriseBusiModelNodeDeviceRepository(object): + + def insert_record(self, records: List[EnterpriseBusiModelNodeDevice]): + with get_session() as session: + for record in records: + session.add(record) + session.commit() + + def batch_insert_record(self, records: List[dict]): + with get_session() as session: + session.bulk_insert_mappings(EnterpriseBusiModelNodeDevice, records) + session.commit() diff --git a/website/db/enterprise_device/enterprise_device.py b/website/db/enterprise_device/enterprise_device.py index ceecac6..81cb872 100644 --- a/website/db/enterprise_device/enterprise_device.py +++ b/website/db/enterprise_device/enterprise_device.py @@ -171,8 +171,8 @@ class EnterpriseDeviceRepository(object): "total_count": total_count } - def get_device(self, device_id: int) -> dict: with get_session() as session: + def get_device(self, device_id: int) -> dict: try: device = session.query(EnterpriseDevice) \ .filter(EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1) \ @@ -183,6 +183,7 @@ class EnterpriseDeviceRepository(object): device_dict = {} if device: device_dict = { + "suid": device.suid, "name": device.name, "addr": device.addr, "device_model": device.device_model, diff --git a/website/db/enterprise_entity/enterprise_entity.py b/website/db/enterprise_entity/enterprise_entity.py index 09d3b89..e73889e 100644 --- a/website/db/enterprise_entity/enterprise_entity.py +++ b/website/db/enterprise_entity/enterprise_entity.py @@ -38,4 +38,6 @@ class EnterpriseEntityRepository(object): {"id": entity_id}) entity = to_json(res) - return entity["suid"] if entity else "" \ No newline at end of file + return entity["suid"] if entity else "" + + \ No newline at end of file diff --git a/website/db/enterprise_node/enterprise_node.py b/website/db/enterprise_node/enterprise_node.py index dbab69e..1573735 100644 --- a/website/db/enterprise_node/enterprise_node.py +++ b/website/db/enterprise_node/enterprise_node.py @@ -127,4 +127,12 @@ class EnterpriseNodeRepository(object): param = {"id": node_id} res = session.execute(text(sql), param) node = to_json(res) - return node \ No newline at end of file + return node + + def get_entity_suid_by_node_id(self, node_id: int) -> dict | None: + with get_session() as session: + res = session.execute(text("select entity_suid from enterprise_node where id=:id"), + {"id": node_id}) + entity = to_json(res) + + return entity if entity else None \ No newline at end of file diff --git a/website/handlers/enterprise_busi_model/handler.py b/website/handlers/enterprise_busi_model/handler.py index df865d1..72d2083 100644 --- a/website/handlers/enterprise_busi_model/handler.py +++ b/website/handlers/enterprise_busi_model/handler.py @@ -136,7 +136,7 @@ class InfoHandler(APIHandler): if not busimodel_id: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") - db_busimodel = DB_BusiModel.EnterpriseBusiModelRepository() + db_busimodel = DB_BusiModel.EnterpriseBusiModelRepository() busi_model_data = db_busimodel.get_busi_model_by_id(busimodel_id) if not busi_model_data: diff --git a/website/handlers/enterprise_device/handler.py b/website/handlers/enterprise_device/handler.py index d259441..2bf4076 100644 --- a/website/handlers/enterprise_device/handler.py +++ b/website/handlers/enterprise_device/handler.py @@ -29,11 +29,9 @@ class DeviceClassificationAddHandler(APIHandler): cur = conn.execute( text("SELECT id FROM device_classification WHERE name=:name"), {"name": name} ) - ex = cur.fetchone() - logging.info("##############################") - logging.info(ex) - logging.info("##############################") - if ex: + row = cur.fetchone() + + if row: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备分类已存在') conn.execute( @@ -283,3 +281,7 @@ class DeviceInfoHandler(APIHandler): logging.info(device) self.finish(device) + + + + diff --git a/website/handlers/enterprise_device/url.py b/website/handlers/enterprise_device/url.py index 0bad0b5..3ce2eeb 100644 --- a/website/handlers/enterprise_device/url.py +++ b/website/handlers/enterprise_device/url.py @@ -13,7 +13,6 @@ handlers = [ ("/enterprise/entity/nodes/device/delete", handler.DeviceDeleteHandler), ("/enterprise/entity/nodes/device/list", handler.DeviceListHandler), ("/enterprise/entity/nodes/device/info", handler.DeviceInfoHandler), - ] page_handlers = [ diff --git a/website/handlers/enterprise_node/handler.py b/website/handlers/enterprise_node/handler.py index 6508481..1a67844 100644 --- a/website/handlers/enterprise_node/handler.py +++ b/website/handlers/enterprise_node/handler.py @@ -4,6 +4,9 @@ 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_device import enterprise_device as DB_Device from website.util import shortuuid @@ -196,3 +199,105 @@ class DeleteHandler(APIHandler): db_node = DB_Node.EnterpriseNodeRepository() db_node.delete_node(node_id) self.finish() + + +class BusimodelHandler(APIHandler): + """ + - 描述:企业节点,业务模型部署 + - 请求方式:post + - 请求参数: + > - pageNo + > - pageSize + > - node_id, int, 节点id + - 返回值: + ``` + { + "count": 123, + "data": [ + { + "busi_model_id": 123, # 业务模型id + "busi_model_name": "xxx", # 业务模型name + "deployed": 0, # 是否部署 + "create_time": "xxx" # 创建时间 + }, + ... + ] + } + ``` + """ + @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) + if not node_id: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空') + db_node = DB_Node.EnterpriseNodeRepository() + busi_models = db_node.select_busi_model(node_id, pageNo, pageSize) + self.finish({ + 'data': busi_models, + 'count': len(busi_models) + }) + + +class BusimodelInfoHandler(APIHandler): + """ + """ + @authenticated + def post(self): + self.finish() + + +class BusimodelDeployHandler(APIHandler): + """ + - 描述:企业节点,节点信息 -> 业务模型部署 -> 业务模型配置 + - 请求方式:post + - 请求参数: + > - node_id, int, 节点id + > - busi_model_id, int,业务模型id + > - 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', '') + if not node_id or not busi_model_id: + 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, '节点不存在') + node_suid = node["suid"] + + db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository() + busi_model = db_busi_model.get_busi_model_by_id(busi_model_id) + busi_model_suid = busi_model.suid + + 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, '企业节点不存在') + + records = [] + + + records = [] + 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 diff --git a/website/handlers/enterprise_node/url.py b/website/handlers/enterprise_node/url.py index 78b7015..f206a37 100644 --- a/website/handlers/enterprise_node/url.py +++ b/website/handlers/enterprise_node/url.py @@ -7,6 +7,11 @@ handlers = [ ('/enterprise/entity/nodes', handler.TreeHandler), ('/enterprise/entity/nodes/info', handler.InfoHandler), ('/enterprise/entity/nodes/delete', handler.DeleteHandler), + + ("/enterprise/entity/nodes/busimodel", handler.BusimodelHandler), + ("/enterprise/entity/nodes/busimodel/info", handler.BusimodelInfoHandler), + ("/enterprise/entity/nodes/busimodel/deploy", handler.BusimodelDeployHandler), + ] page_handlers = [