更新代码,完成企业模型的功能实现

main
周平 1 year ago
parent 85daf8c320
commit 809ef6f7b4

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json import json
import copy import copy
import logging
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, DateTime, func from sqlalchemy import Column, Integer, String, DateTime, func
from typing import Any, Dict, List, Optional, Tuple, Union from typing import Any, Dict, List, Optional, Tuple, Union
@ -48,22 +49,22 @@ CREATE TABLE `enterprise_busi_model_node` (
class EnterpriseBusiModel(Base): class EnterpriseBusiModel(Base):
__tablename__ = 'enterprise_busi_model' __tablename__ = 'enterprise_busi_model'
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True, autoincrement=True)
suid = Column(String(10), nullable=False, default='') suid = Column(String(10), nullable=False, default='', comment='short uuid')
entity_id = Column(Integer, nullable=False) entity_id = Column(Integer, nullable=False, comment='企业id')
entity_suid = Column(String(10), nullable=False) entity_suid = Column(String(10), nullable=False, comment='企业uuid')
name = Column(String(255), nullable=False) name = Column(String(255), nullable=False)
comment = Column(String(255)) comment = Column(String(255), nullable=True, default='')
basemodel_ids = Column(String(255), nullable=False) base_models = Column(String(255), nullable=False, comment='关联的基础模型json list, [{"id":123,"suid":"xxx"},...]')
business_logic = Column(String(32)) business_logic = Column(String(32), nullable=True, comment='业务代码压缩包的md5')
business_conf_file = Column(String(32)) business_conf_file = Column(String(32), nullable=True, comment='业务配置参数压缩包的文件md5')
business_conf_param = Column(String(255)) business_conf_param = Column(String(255), nullable=True, comment='业务配置的参数json字符串eg: ''{"a":1, "b":2}''')
delete = Column(Integer, default=0) delete = Column(Integer, default=0)
create_time = Column(DateTime, default=func.current_timestamp()) create_time = Column(DateTime, nullable=False, default=func.now(), onupdate=func.now())
update_time = Column(DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp()) update_time = Column(DateTime, nullable=False, default=func.now(), onupdate=func.now())
def __repr__(self): def __repr__(self):
return f'<EnterpriseBusiModel(id={self.id}, suid={self.suid})>' return f"EnterpriseBusiModel(id={self.id}, suid='{self.suid}', name='{self.name}')"
class EnterpriseBusiModelNode(Base): class EnterpriseBusiModelNode(Base):
__tablename__ = 'enterprise_busi_model_node' __tablename__ = 'enterprise_busi_model_node'
@ -83,7 +84,10 @@ class EnterpriseBusiModelNode(Base):
class EnterpriseBusiModelRepository(object): class EnterpriseBusiModelRepository(object):
def get_by_id(self, id: int) -> Optional[EnterpriseBusiModel]: 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): def insert_busi_model(self, data: Dict):
entity_suid = EnterpriseEntityRepository().get_entity_suid(data['entity_id']) entity_suid = EnterpriseEntityRepository().get_entity_suid(data['entity_id'])
@ -99,7 +103,7 @@ class EnterpriseBusiModelRepository(object):
'id': base_model_id, 'id': base_model_id,
'suid': base_model_suid 'suid': base_model_suid
}) })
data['basemodel_ids'] = json.dumps(base_model) data['base_models'] = json.dumps(base_model)
new_data = copy.copy(data) new_data = copy.copy(data)
with get_session() as session: with get_session() as session:
@ -109,6 +113,27 @@ class EnterpriseBusiModelRepository(object):
return model.id, model.suid 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]: def get_busi_model_by_id(self, id: int) -> Optional[EnterpriseBusiModel]:
with get_session() as session: with get_session() as session:
@ -116,6 +141,45 @@ class EnterpriseBusiModelRepository(object):
return model 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): class EnterpriseBusiModelNodeRepository(object):
# def get_by_id(self, id: int) -> Optional[EnterpriseBusiModelNode]: # def get_by_id(self, id: int) -> Optional[EnterpriseBusiModelNode]:
@ -142,3 +206,13 @@ class EnterpriseBusiModelNodeRepository(object):
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()
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()

@ -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()

@ -1,22 +1,49 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
import logging import logging
from sqlalchemy import text from sqlalchemy import text
from website import db_mysql, errors from website import db_mysql, errors
from website.handler import APIHandler, authenticated from website.handler import APIHandler, authenticated
from website.util import shortuuid 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): class ListHandler(APIHandler):
""" """
- 描述企业部署的业务模型列表
- 请求方式post
- 请求参数
> - pageNo
> - pageSize
> - entity_id, int, 企业id
- 返回值
```
{
"count": 123,
"data": [
{
"model_id": 123, # 模型id
"model_name": "xxx", # 模型名称
"create_time": "xxxx", # 创建时间
},
...
]
}
```
""" """
@authenticated @authenticated
def post(self): 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): class AddHandler(APIHandler):
@ -114,36 +141,111 @@ class InfoHandler(APIHandler):
if not busi_model_data: if not busi_model_data:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务模型不存在") raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "业务模型不存在")
model_data = { db_file = DB_File.FileRepository()
"name": busi_model_data.name, files = db_file.get_file_by_md5([busi_model_data.business_conf_file, busi_model_data.business_logic])
"comment": busi_model_data.comment, business_conf_name = files[0].filename
"basemodel_ids": ",".join([str(x) for x in busi_model_data.basemodel_list]), business_logic_name = files[1].filename
"business_logic": busi_model_data.business_logic,
"business_conf_file": busi_model_data.business_conf_file,
"business_conf_param": busi_model_data.business_conf
}
# 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({ self.finish({
"name": model_data["name"], "name": busi_model_data.name,
"comment": model_data["comment"], "comment": busi_model_data.comment,
"basemodel_list": model_data["basemodel_ids"], "basemodel_list":basemodel_list, # 关联模型
"business_logic": model_data["business_logic"], "business_logic_name": business_logic_name, # 业务代码压缩包文件名
"business_conf_file": model_data["business_conf_file"], "business_logic_md5": busi_model_data.business_logic, # 业务代码压缩包md5
"business_conf_param": model_data["business_conf_param"], "business_conf_name": business_conf_name, # 业务参数配置文件名
"link_node_list": model_data["link_node_ids"] "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): 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 @authenticated
def post(self): 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() self.finish()

@ -11,5 +11,5 @@ handlers = [
] ]
page_handlers = [ page_handlers = [
] ]
Loading…
Cancel
Save