From 809ef6f7b4181e9121152ef5b02b76d4a1d6fa7d Mon Sep 17 00:00:00 2001 From: zhouping Date: Mon, 20 May 2024 17:10:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BC=81=E4=B8=9A=E6=A8=A1=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- website/db/enterprise_busi_model/__init__.py | 0 .../enterprise_busi_model.py | 102 ++++++++++-- website/db/file/__init__.py | 0 website/db/file/file.py | 54 +++++++ .../handlers/enterprise_busi_model/handler.py | 148 +++++++++++++++--- website/handlers/enterprise_busi_model/url.py | 2 +- 6 files changed, 268 insertions(+), 38 deletions(-) create mode 100644 website/db/enterprise_busi_model/__init__.py rename website/db/{ => enterprise_busi_model}/enterprise_busi_model.py (55%) create mode 100644 website/db/file/__init__.py create mode 100644 website/db/file/file.py diff --git a/website/db/enterprise_busi_model/__init__.py b/website/db/enterprise_busi_model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/website/db/enterprise_busi_model.py b/website/db/enterprise_busi_model/enterprise_busi_model.py similarity index 55% rename from website/db/enterprise_busi_model.py rename to website/db/enterprise_busi_model/enterprise_busi_model.py index 9c92868..c47a3cb 100644 --- a/website/db/enterprise_busi_model.py +++ b/website/db/enterprise_busi_model/enterprise_busi_model.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import json import copy +import logging from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DateTime, func from typing import Any, Dict, List, Optional, Tuple, Union @@ -48,22 +49,22 @@ CREATE TABLE `enterprise_busi_model_node` ( class EnterpriseBusiModel(Base): __tablename__ = 'enterprise_busi_model' - id = Column(Integer, primary_key=True) - suid = Column(String(10), nullable=False, default='') - entity_id = Column(Integer, nullable=False) - entity_suid = Column(String(10), nullable=False) + id = Column(Integer, primary_key=True, autoincrement=True) + suid = Column(String(10), nullable=False, default='', comment='short uuid') + entity_id = Column(Integer, nullable=False, comment='企业id') + entity_suid = Column(String(10), nullable=False, comment='企业uuid') name = Column(String(255), nullable=False) - comment = Column(String(255)) - basemodel_ids = Column(String(255), nullable=False) - business_logic = Column(String(32)) - business_conf_file = Column(String(32)) - business_conf_param = Column(String(255)) + comment = Column(String(255), nullable=True, default='') + base_models = Column(String(255), nullable=False, comment='关联的基础模型,json list, [{"id":123,"suid":"xxx"},...]') + business_logic = Column(String(32), nullable=True, comment='业务代码压缩包的md5') + business_conf_file = Column(String(32), nullable=True, comment='业务配置参数压缩包的文件md5') + business_conf_param = Column(String(255), nullable=True, comment='业务配置的参数,json字符串,eg: ''{"a":1, "b":2}''') delete = Column(Integer, default=0) - create_time = Column(DateTime, default=func.current_timestamp()) - update_time = Column(DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp()) + create_time = Column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) + update_time = Column(DateTime, nullable=False, default=func.now(), onupdate=func.now()) def __repr__(self): - return f'' + return f"EnterpriseBusiModel(id={self.id}, suid='{self.suid}', name='{self.name}')" class EnterpriseBusiModelNode(Base): __tablename__ = 'enterprise_busi_model_node' @@ -83,7 +84,10 @@ class EnterpriseBusiModelNode(Base): class EnterpriseBusiModelRepository(object): def get_by_id(self, id: int) -> Optional[EnterpriseBusiModel]: - return self.db.query(EnterpriseBusiModel).filter(EnterpriseBusiModel.id == id).first() + 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']) @@ -99,7 +103,7 @@ class EnterpriseBusiModelRepository(object): 'id': base_model_id, 'suid': base_model_suid }) - data['basemodel_ids'] = json.dumps(base_model) + data['base_models'] = json.dumps(base_model) new_data = copy.copy(data) with get_session() as session: @@ -109,6 +113,27 @@ class EnterpriseBusiModelRepository(object): 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() + base_model = [] + for base_model_id in base_model_ids: + base_model_suid = base_model_db.get_suid(base_model_id) + base_model.append({ + 'id': base_model_id, + 'suid': base_model_suid + }) + + data['base_models'] = json.dumps(base_model) + with get_session() as session: + try: + session.query(EnterpriseBusiModel).filter(EnterpriseBusiModel.id == data['id']).update(data) + except Exception as e: + logging.error("Failed to edit device") + session.commit() + + return + def get_busi_model_by_id(self, id: int) -> Optional[EnterpriseBusiModel]: with get_session() as session: @@ -116,6 +141,45 @@ class EnterpriseBusiModelRepository(object): return model + def list_enterprise_busi_model(self, entity_id: int, page_no: int, page_size: int) -> Dict[Any, Any]: + """ + 获取企业部署的业务模型列表 + + Args: + session (Session): SQLAlchemy 数据库会话 + entity_id (int): 企业 ID + page_no (int): 页码 + page_size (int): 每页数量 + + Returns: + dict: 包含总数和数据列表的字典 + """ + 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"), + EnterpriseBusiModel.name.label("model_name"), + EnterpriseBusiModel.create_time + ) + .filter(EnterpriseBusiModel.entity_id == entity_id) + .offset((page_no - 1) * page_size) + .limit(page_size) + .all() + ) + + return { + "count": total_count, + "data": [ + { + "model_id": model.model_id, + "model_name": model.model_name, + "create_time": model.create_time.strftime("%Y-%m-%d %H:%M:%S"), + } + for model in models + ] + } class EnterpriseBusiModelNodeRepository(object): # def get_by_id(self, id: int) -> Optional[EnterpriseBusiModelNode]: @@ -142,3 +206,13 @@ class EnterpriseBusiModelNodeRepository(object): 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() + 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 diff --git a/website/db/file/__init__.py b/website/db/file/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/website/db/file/file.py b/website/db/file/file.py new file mode 100644 index 0000000..b6afb53 --- /dev/null +++ b/website/db/file/file.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from typing import List, Dict, Any + +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 + + +""" +CREATE TABLE `files` ( + `id` int NOT NULL AUTO_INCREMENT, + `filename` varchar(255) NOT NULL DEFAULT '', + `filepath` varchar(255) NOT NULL DEFAULT '', + `md5_str` varchar(32) NOT NULL DEFAULT '', + `filesize` int DEFAULT NULL, + `filetype` varchar(50) DEFAULT '', + `user` int DEFAULT '0', + `create_time` datetime DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文件表'; +""" + + + +Base = declarative_base() + +class File(Base): + __tablename__ = 'files' + + id = Column(Integer, primary_key=True, autoincrement=True) + filename = Column(String(255), nullable=False, default='') + filepath = Column(String(255), nullable=False, default='') + md5_str = Column(String(32), nullable=False, default='') + filesize = Column(Integer, nullable=True) + filetype = Column(String(50), nullable=True, default='') + user = Column(Integer, nullable=True, default=0) + create_time = Column(DateTime, nullable=False, default=func.now()) + + def __repr__(self): + return f"File(id={self.id}, filename='{self.filename}', filepath='{self.filepath}')" + + +class FileRepository(object): + + def get_file_by_md5(self, md5_list: List[str]) -> List(File): + 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() + + \ 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 21adc21..0427096 100644 --- a/website/handlers/enterprise_busi_model/handler.py +++ b/website/handlers/enterprise_busi_model/handler.py @@ -1,22 +1,49 @@ # -*- coding: utf-8 -*- - +import json import logging from sqlalchemy import text from website import db_mysql, errors from website.handler import APIHandler, authenticated from website.util import shortuuid -from website.db import enterprise_busi_model as DB_BusiModel +from website.db.enterprise_busi_model import enterprise_busi_model as DB_BusiModel +from website.db.file import file as DB_File class ListHandler(APIHandler): """ - + - 描述:企业部署的业务模型列表 + - 请求方式:post + - 请求参数: + > - pageNo + > - pageSize + > - entity_id, int, 企业id + - 返回值: + ``` + { + "count": 123, + "data": [ + { + "model_id": 123, # 模型id + "model_name": "xxx", # 模型名称 + "create_time": "xxxx", # 创建时间 + }, + ... + ] + } + ``` """ @authenticated def post(self): + pageNo = self.get_argument("pageNo", 1) + pageSize = self.get_argument("pageSize", 10) + entity_id = self.get_argument("entity_id") + if not entity_id: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") - self.finish() + db_busimodel = DB_BusiModel.EnterpriseBusiModelRepository() + result = db_busimodel.list_enterprise_busi_model(entity_id, pageNo, pageSize) + self.finish({"count": result["count"], "data": result["data"]}) class AddHandler(APIHandler): @@ -114,36 +141,111 @@ class InfoHandler(APIHandler): if not busi_model_data: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务模型不存在") - - - model_data = { - "name": busi_model_data.name, - "comment": busi_model_data.comment, - "basemodel_ids": ",".join([str(x) for x in busi_model_data.basemodel_list]), - "business_logic": busi_model_data.business_logic, - "business_conf_file": busi_model_data.business_conf_file, - "business_conf_param": busi_model_data.business_conf - } + db_file = DB_File.FileRepository() + files = db_file.get_file_by_md5([busi_model_data.business_conf_file, busi_model_data.business_logic]) + business_conf_name = files[0].filename + business_logic_name = files[1].filename + # 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) + + db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() + link_nodes = db_model_node.get_nodes_by_busi_model(busimodel_id) + link_node_list = [] + for node in link_nodes: + link_node_list.append(node.node_id) self.finish({ - "name": model_data["name"], - "comment": model_data["comment"], - "basemodel_list": model_data["basemodel_ids"], - "business_logic": model_data["business_logic"], - "business_conf_file": model_data["business_conf_file"], - "business_conf_param": model_data["business_conf_param"], - "link_node_list": model_data["link_node_ids"] + "name": busi_model_data.name, + "comment": busi_model_data.comment, + "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, # 业务参数配置文件名 + "business_conf_md5": busi_model_data.business_conf_file, # 业务参数配置md5 + "business_conf_param": busi_model_data.business_conf_param, # 业务参数配置的字段 + "link_node_list": ",".join(link_node_list) # 关联节点的id,多个id逗号分割 }) - class EditHandler(APIHandler): """ - + - 描述:企业部署的业务模型编辑 + - 请求方式:post + - 请求参数: + > - id, int, 业务模型的id + > - name, string, 业务模型名称 + > - comment, string, 简介 + > - basemodel_ids, string, 基础模型id, 多个使用逗号分割 + > - business_logic, string, 业务代码压缩包的md5 + > - business_conf_file, string, 业务配置压缩包的文件md5 + > - business_conf_param, string, 业务配置的参数,json字符串,eg: '{"a":1, "b":2}' + > - link_node_ids, string, 关联节点id, 多个节点逗号分割 + - 返回值:无 """ @authenticated def post(self): + busimodel_id = self.get_argument("id") + + if not busimodel_id: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") + + db_busimodel = DB_BusiModel.EnterpriseBusiModelRepository() + busi_model_data = db_busimodel.get_busi_model_by_id(busimodel_id) + if not busi_model_data: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务模型不存在") + + name = self.get_escaped_argument("name", "") + comment = self.get_escaped_argument("comment", "") + basemodel_ids = self.get_escaped_argument("basemodel_ids", "") + business_logic = self.get_escaped_argument("business_logic", "") + business_conf_file = self.get_escaped_argument("business_conf_file", "") + business_conf_param = self.get_escaped_argument("business_conf_param", "") + link_node_ids = self.get_escaped_argument("link_node_ids", "") + + if not name or not basemodel_ids: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") + + if not business_logic: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务代码参数错误") + + if not business_conf_file and not business_conf_param: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务配置参数错误") + + if not link_node_ids: + raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "关联节点参数错误") + + # 更新业务模型 + model_data = { + "id": busimodel_id, + "name": name, + "comment": comment, + "basemodel_ids": basemodel_ids, + "business_logic": business_logic, + "business_conf_file": business_conf_file, + "business_conf_param": business_conf_param, + "link_node_ids": link_node_ids, + } + + db_busimodel.edit_busi_model(model_data) + + # 获取业务模型的数据 + busi_model = db_busimodel.get_busi_model_by_id(busimodel_id) + + db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() + + # 删除关联节点 + db_model_node.delete_by_busi_model_id(busimodel_id) + + # 插入关联节点 + model_node_data = { + "entity_id": busi_model.entity_id, + "busimodel_id": busimodel_id, + "busimodel_suid": busi_model.suid, + "node_ids": link_node_ids + } + db_model_node.insert_busi_model_nodes(model_node_data) 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 94f4521..ae6c97e 100644 --- a/website/handlers/enterprise_busi_model/url.py +++ b/website/handlers/enterprise_busi_model/url.py @@ -11,5 +11,5 @@ handlers = [ ] page_handlers = [ - + ] \ No newline at end of file