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

main
周平 11 months ago
parent 85daf8c320
commit 809ef6f7b4

@ -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'<EnterpriseBusiModel(id={self.id}, suid={self.suid})>'
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()

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

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