From 7a765dd1acc958b18dc400c778ce32ff2f40b16d Mon Sep 17 00:00:00 2001 From: zhouping Date: Wed, 12 Jun 2024 13:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/db/alg_model/alg_model.py | 4 +- .../enterprise_busi_model.py | 40 +++++++++++-- .../enterprise_busi_model_node_device.py | 20 +++++-- .../enterprise_node_base_model_conf.py | 60 +++++++++++++++++++ website/db/file/file.py | 14 ++++- website/db_mysql.py | 3 + .../handlers/enterprise_busi_model/handler.py | 31 ++++++++-- website/handlers/enterprise_busi_model/url.py | 1 + website/handlers/enterprise_device/handler.py | 54 +++++++++++++++-- 9 files changed, 203 insertions(+), 24 deletions(-) create mode 100644 website/db/enterprise_node/enterprise_node_base_model_conf.py diff --git a/website/db/alg_model/alg_model.py b/website/db/alg_model/alg_model.py index 3eeb20f..685eafc 100644 --- a/website/db/alg_model/alg_model.py +++ b/website/db/alg_model/alg_model.py @@ -68,8 +68,8 @@ class ModelRepositry(object): with get_session() as session: logging.info(f"model id is : {model_id}") model = session.query(Model).filter(Model.id == model_id).first() - # if not model: - # return {} + if not model: + return {} model_dict = { 'id': model.id, diff --git a/website/db/enterprise_busi_model/enterprise_busi_model.py b/website/db/enterprise_busi_model/enterprise_busi_model.py index 0f569ae..5231895 100644 --- a/website/db/enterprise_busi_model/enterprise_busi_model.py +++ b/website/db/enterprise_busi_model/enterprise_busi_model.py @@ -6,11 +6,12 @@ from typing import Any, Dict, List, Optional from sqlalchemy import Column, Integer, String, DateTime, func from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import text 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_mysql import get_session +from website.db_mysql import get_session, to_json_list, to_json, Row, dict_to_obj from website.util import shortuuid Base = declarative_base() @@ -136,7 +137,12 @@ class EnterpriseBusiModelRepository(object): 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 + + if model: + model_dict = model.__dict__ + model_dict.pop('_sa_instance_state') + return dict_to_obj(model_dict) + return None def list_enterprise_busi_model(self, entity_id: int, page_no: int, page_size: int) -> Dict[Any, Any]: """ @@ -178,6 +184,22 @@ class EnterpriseBusiModelRepository(object): ] } + def delete_by_id(self, model_id: int): + """ + 删除业务模型 + delete字段置为1 + + Args: + model_id (int): 业务模型 ID + + """ + + with get_session() as session: + model = session.query(EnterpriseBusiModel).filter(EnterpriseBusiModel.id == model_id).first() + if model: + model.delete = 1 + session.commit() + return class EnterpriseBusiModelNode(Base): __tablename__ = 'enterprise_busi_model_node' @@ -221,11 +243,17 @@ class EnterpriseBusiModelNodeRepository(object): session.commit() return - def get_nodes_by_busi_model(self, busi_model_id: int) -> List[EnterpriseBusiModelNode]: + def get_nodes_by_busi_model(self, busi_model_id: int, entity_suid: str) -> Optional[List[Row]]: with get_session() as session: - nodes = session.query(EnterpriseBusiModelNode).filter( - EnterpriseBusiModelNode.busi_model_id == busi_model_id).all() - return nodes + # nodes = session.query(EnterpriseBusiModelNode, ).filter( + # EnterpriseBusiModelNode.busi_model_id == busi_model_id).all() + sql = ("select mn.node_id, n.name node_name from enterprise_busi_model_node mn, enterprise_node n " + "where mn.node_id=n.id " + " and mn.busi_model_id = :busi_model_id" + " and mn.entity_suid = :entity_suid") + nodes = session.execute(text(sql), {"busi_model_id": busi_model_id, "entity_suid": entity_suid}) + + return to_json_list(nodes) def delete_by_busi_model_id(self, busi_model_id: int) -> None: with get_session() as session: 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 8812c63..187689a 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 @@ -5,7 +5,7 @@ from typing import List, Union, Optional, Tuple from sqlalchemy import Column, Integer, String, DateTime, func, text from sqlalchemy.ext.declarative import declarative_base -from website.db_mysql import get_session, to_json_list, Row +from website.db_mysql import get_session, to_json, to_json_list, Row """ CREATE TABLE `enterprise_busi_model_node_device` ( @@ -63,7 +63,8 @@ class EnterpriseBusiModelNodeDeviceRepository(object): try: with get_session() as session: sql = text( - "delete from enterprise_busi_model_node_device where node_id=:node_id and busi_model_id=:busi_model_id" + "delete from enterprise_busi_model_node_device " + "where node_id=:node_id and busi_model_id=:busi_model_id" ) session.execute( sql, {"node_id": node_id, "busi_model_id": busi_model_id} @@ -87,10 +88,20 @@ class EnterpriseBusiModelNodeDeviceRepository(object): ) return 1 if count > 0 else 0 + def get_one_by_busimodel(self, busi_model_id: int): + with get_session() as session: + sql = text( + "select node_id, busi_model_id from enterprise_busi_model_node_device " + "where busi_model_id=:busi_model_id limit 1" + ) + res = session.execute(sql, {"busi_model_id": busi_model_id}) + return to_json(res) + def get_device_ids(self, node_id: int, busi_model_id: int) -> list: 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" + "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} @@ -104,11 +115,10 @@ class EnterpriseBusiModelNodeDeviceRepository(object): logging.error("get_busi_model_by_device error: device_id and device_suid is null") return [] - res = [] count = 0 with get_session() as session: sql = """ - select d.busi_model_id, m.name, m.base_models + select d.busi_model_id, d.node_id, m.name, m.base_models from enterprise_busi_model_node_device d, enterprise_busi_model m where d.busi_model_id=m.id""" p = {} diff --git a/website/db/enterprise_node/enterprise_node_base_model_conf.py b/website/db/enterprise_node/enterprise_node_base_model_conf.py new file mode 100644 index 0000000..a39e70c --- /dev/null +++ b/website/db/enterprise_node/enterprise_node_base_model_conf.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +import copy +import json +import logging +from typing import Any, Dict, List, Optional + +from sqlalchemy import Column, Integer, String, DateTime, func +from sqlalchemy.ext.declarative import declarative_base + +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_mysql import get_session +from website.util import shortuuid + +Base = declarative_base() + +class EnterpriseNodeDeviceBMCusConf(Base): + """企业设备关联业务模型下的基础模型自定义配置""" + __tablename__ = 'enterprise_node_device_bm_cus_conf' + + id = Column(Integer, primary_key=True, autoincrement=True) + entity_id = Column(Integer, nullable=True) + entity_suid = Column(String(255), nullable=True) + node_id = Column(Integer, nullable=True) + node_suid = Column(String(255), nullable=True) + device_id = Column(Integer, nullable=True) + device_suid = Column(String(255), nullable=True) + busi_model_id = Column(Integer, nullable=True) + busi_model_suid = Column(String(255), nullable=True) + base_model_id = Column(Integer, nullable=True) + base_model_suid = Column(String(255), nullable=True) + busi_conf_file = Column(String(255), nullable=True) + busi_conf_str = Column(String(255), nullable=True) + model_hub_image = Column(String(255), nullable=True) + model_conf_file = Column(String(255), nullable=True) + model_conf_str = Column(String(255), nullable=True) + create_time = Column(DateTime, server_default=func.now(), onupdate=func.now()) + + def __repr__(self): + return f"EnterpriseNodeDeviceBMCusConf(id={self.id}, entity_id={self.entity_id})" + + +class EnterpriseNodeDeviceBMCusConfRepository(): + + def create_busi_model_custom_config(self, data: Dict[str, Any]): + with get_session() as session: + + session.add(EnterpriseNodeDeviceBMCusConf(**data)) + session.commit() + return + + def get_busi_model_custom_config(self, node_id: int, device_id: int, busi_model_id: int): + with get_session() as session: + data = session.query(EnterpriseNodeDeviceBMCusConf).filter( + EnterpriseNodeDeviceBMCusConf.node_id == node_id, + EnterpriseNodeDeviceBMCusConf.device_id == device_id, + EnterpriseNodeDeviceBMCusConf.busi_model_id == busi_model_id + ).first() + return data \ No newline at end of file diff --git a/website/db/file/file.py b/website/db/file/file.py index 2f86acd..f38f805 100644 --- a/website/db/file/file.py +++ b/website/db/file/file.py @@ -4,7 +4,7 @@ from typing import List, Dict, Any, Type from sqlalchemy import Column, Integer, String, DateTime, func, text from sqlalchemy.ext.declarative import declarative_base -from website.db_mysql import get_session, to_json_list, to_json +from website.db_mysql import get_session, to_json_list, to_json, dict_to_obj """ @@ -44,11 +44,19 @@ class File(Base): class FileRepository(object): def get_file_by_md5(self, md5_list: List[str]) -> List[File]: + resp = [] with get_session() as session: # return ( # session.query(File).filter(File.md5_str == md5_str).first() # ) - - return session.query(File).filter(File.md5_str.in_(md5_list)).all() + files = session.query(File).filter(File.md5_str.in_(md5_list)).all() + for file in files: + obj_dict = file.__dict__ + del obj_dict['_sa_instance_state'] + print(obj_dict) + resp.append(dict_to_obj(obj_dict)) + + # return session.query(File).filter(File.md5_str.in_(md5_list)).all() + return resp \ No newline at end of file diff --git a/website/db_mysql.py b/website/db_mysql.py index 5e40b68..fcb7698 100644 --- a/website/db_mysql.py +++ b/website/db_mysql.py @@ -23,6 +23,9 @@ class Row(dict): raise AttributeError(name) +def dict_to_obj(d): + return type('GenericClass', (object,), d)() + def to_json_list(cursor: Any) -> Optional[List[Row]]: column_names = list(cursor.keys()) result = cursor.fetchall() diff --git a/website/handlers/enterprise_busi_model/handler.py b/website/handlers/enterprise_busi_model/handler.py index 628f77f..d39b0d0 100644 --- a/website/handlers/enterprise_busi_model/handler.py +++ b/website/handlers/enterprise_busi_model/handler.py @@ -7,6 +7,7 @@ from website import db_mysql, errors from website.handler import APIHandler, authenticated from website.util import shortuuid 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.file import file as DB_File @@ -149,18 +150,20 @@ class InfoHandler(APIHandler): # business_conf_name = db_file.get_file_by_md5(busi_model_data.business_conf_file) # business_logic_name = db_file.get_file_by_md5(busi_model_data.business_logic) - basemodel_list = json.loads(busi_model_data.basemodel) + basemodel_list = json.loads(busi_model_data.base_models) + + entity_suid = busi_model_data.entity_suid db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() - link_nodes = db_model_node.get_nodes_by_busi_model(busimodel_id) + link_nodes = db_model_node.get_nodes_by_busi_model(busimodel_id, entity_suid) link_node_list = [] for node in link_nodes: - link_node_list.append({"node_id": node.node_id, "node_name": node.node_name}) + link_node_list.append({"node_id": node["node_id"], "node_name": node["node_name"]}) self.finish({ "name": busi_model_data.name, "comment": busi_model_data.comment, - "basemodel_list":basemodel_list, # 关联模型 + "basemodel_list": basemodel_list, # 关联模型 "business_logic_name": business_logic_name, # 业务代码压缩包文件名 "business_logic_md5": busi_model_data.business_logic, # 业务代码压缩包md5 "business_conf_name": business_conf_name, # 业务参数配置文件名 @@ -248,4 +251,24 @@ class EditHandler(APIHandler): } db_model_node.insert_busi_model_nodes(model_node_data) + self.finish() + +class DeleteHandler(APIHandler): + @authenticated + def post(self): + busimodel_id = self.get_int_argument("id") + if not busimodel_id: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") + + db_con = DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() + one = db_con.get_one_by_busimodel(busimodel_id) + if one: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "该业务模型已关联设备,无法删除") + + db_busimodel = DB_BusiModel.EnterpriseBusiModelRepository() + db_busimodel.delete_by_id(busimodel_id) + + db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() + db_model_node.delete_by_busi_model_id(busimodel_id) + self.finish() \ No newline at end of file diff --git a/website/handlers/enterprise_busi_model/url.py b/website/handlers/enterprise_busi_model/url.py index f613eaa..aecaf66 100644 --- a/website/handlers/enterprise_busi_model/url.py +++ b/website/handlers/enterprise_busi_model/url.py @@ -8,5 +8,6 @@ handlers = [ ("/enterprise/model/deployment/add", handler.AddHandler), ("/enterprise/model/deployment/info", handler.InfoHandler), ("/enterprise/model/deployment/edit", handler.EditHandler), + ("/enterprise/model/delete", handler.DeleteHandler), ] page_handlers = [] diff --git a/website/handlers/enterprise_device/handler.py b/website/handlers/enterprise_device/handler.py index d215924..55380f2 100644 --- a/website/handlers/enterprise_device/handler.py +++ b/website/handlers/enterprise_device/handler.py @@ -14,7 +14,9 @@ from website.db.device_classification import ( 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.db.enterprise_node import enterprise_node_base_model_conf as DB_NodeBaseModelConf from website.handler import APIHandler, authenticated from website.util import shortuuid @@ -384,17 +386,42 @@ class DeviceBasemodelListHandler(APIHandler): busi_models, count = db_busi_model.get_busi_model_by_device(device_id=device_id, pagination=True, page_no=pageNo, page_size=pageSize) + if count == 0: + self.finish({"count": count, "data": []}) + return + res = [] for item in busi_models: busi_model_id = item["busi_model_id"] busi_model_name = item["name"] base_model_list = json.loads(item["base_models"]) + base_models = [] for base_model in base_model_list: base_model_id = base_model["id"] base_model_suid = base_model["suid"] base_model_name = base_model["name"] - - self.finish() + db_alg_model = DB_AlgModel() + base_model = db_alg_model.get_model_dict_by_id(base_model_id) + base_model_version = base_model["default_version"] + db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository() + conf = db_conf.get_busi_model_custom_config(busi_model_id=busi_model_id, device_id=device_id, + node_id=item["node_id"]) + base_model_hub_image = "" + if conf: + base_model_hub_image = conf.model_hub_image + base_models.append({ + "model_id": base_model_id, + "model_name": base_model_name, + "model_version": base_model_version, + "model_hub_image": base_model_hub_image, + }) + res.append({ + "busi_model_id": busi_model_id, + "busi_model_name": busi_model_name, + "base_models": base_models + }) + + self.finish({"count": count, "data": res}) class DeviceBaseModelCustomConfigHandler(APIHandler): @@ -432,7 +459,7 @@ class DeviceBaseModelCustomConfigHandler(APIHandler): if device["node_id"] != node_id: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "device not belong to this node") db_alg_model = DB_AlgModel() - base_model = db_alg_model.get_model_by_id(base_model_id) + base_model = db_alg_model.get_model_dict_by_id(base_model_id) if not base_model: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "base model not exist") @@ -444,7 +471,26 @@ class DeviceBaseModelCustomConfigHandler(APIHandler): 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 - + data = dict() + data.update( + entity_id=entity_id, + entity_suid=entity_suid, + node_id=node_id, + node_suid=node_suid, + device_id=device_id, + device_suid=device_suid, + busi_model_id=busi_model_id, + busi_model_suid=busi_model_suid, + base_model_id=base_model_id, + base_model_suid=base_model["suid"], + busi_conf_file=busi_conf_file, + busi_conf_str=busi_conf_str, + model_hub_image=model_hub_image, + model_conf_file=model_conf_file, + model_conf_str=model_conf_str + ) + db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository() + db_conf.create_busi_model_custom_config(data=data) self.finish()