完成企业节点模型部署的功能编写

main
周平 1 year ago
parent 6b10daf0fe
commit 6a4100d612

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from typing import List from typing import List
from sqlalchemy import Column, Integer, String, DateTime, func from sqlalchemy import Column, Integer, String, DateTime, func, text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from website.db_mysql import get_session from website.db_mysql import get_session, to_json_list
""" """
CREATE TABLE `enterprise_busi_model_node_device` ( CREATE TABLE `enterprise_busi_model_node_device` (
@ -26,7 +26,7 @@ Base = declarative_base()
class EnterpriseBusiModelNodeDevice(Base): class EnterpriseBusiModelNodeDevice(Base):
__tablename__ = 'enterprise_busi_model_node_device' __tablename__ = "enterprise_busi_model_node_device"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
suid = Column(String(10)) suid = Column(String(10))
@ -37,7 +37,9 @@ class EnterpriseBusiModelNodeDevice(Base):
busi_model_suid = Column(String(10)) busi_model_suid = Column(String(10))
device_id = Column(Integer) device_id = Column(Integer)
device_suid = Column(String(10)) device_suid = Column(String(10))
create_time = Column(DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp()) create_time = Column(
DateTime, default=func.current_timestamp(), onupdate=func.current_timestamp()
)
def __repr__(self): def __repr__(self):
return f"EnterpriseBusiModelNodeDevice(id={self.id}, suid='{self.suid}')" return f"EnterpriseBusiModelNodeDevice(id={self.id}, suid='{self.suid}')"
@ -56,15 +58,24 @@ class EnterpriseBusiModelNodeDeviceRepository(object):
session.bulk_insert_mappings(EnterpriseBusiModelNodeDevice, records) session.bulk_insert_mappings(EnterpriseBusiModelNodeDevice, records)
session.commit() session.commit()
def check_deployed(self, node_id: int, busi_model_id: int) -> int: def check_deployed(self, node_id: int, busi_model_id: int) -> int:
with get_session() as session: with get_session() as session:
count = ( count = (
session.query(EnterpriseBusiModelNodeDevice) session.query(EnterpriseBusiModelNodeDevice)
.filter( .filter(
EnterpriseBusiModelNodeDevice.node_id==node_id, EnterpriseBusiModelNodeDevice.node_id == node_id,
EnterpriseBusiModelNodeDevice.busi_model_id==busi_model_id EnterpriseBusiModelNodeDevice.busi_model_id == busi_model_id,
) )
.count() .count()
) )
return 1 if count > 0 else 0 return 1 if count > 0 else 0
def get_device_id(self, node_id: int, busi_model_id: int) -> int | None:
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"
)
res = session.execute(
sql, {"node_id": node_id, "busi_model_id": busi_model_id}
)
return to_json_list(res)

@ -46,7 +46,7 @@ CREATE TABLE `enterprise_device` (
class EnterpriseDevice(Base): class EnterpriseDevice(Base):
__tablename__ = 'enterprise_device' __tablename__ = "enterprise_device"
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
suid = Column(String(length=10), default="") suid = Column(String(length=10), default="")
@ -80,11 +80,15 @@ class EnterpriseDeviceRepository(object):
name = device["name"] name = device["name"]
with get_session() as session: with get_session() as session:
existing_device = session.query(EnterpriseDevice) \ existing_device = (
.filter_by(node_id=node_id, name=name, delete=0) \ session.query(EnterpriseDevice)
.filter_by(node_id=node_id, name=name, delete=0)
.first() .first()
)
if existing_device: if existing_device:
logging.error(f"Failed to add device: device with node_id={node_id} and name={name} already exists") logging.error(
f"Failed to add device: device with node_id={node_id} and name={name} already exists"
)
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备已存在") raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备已存在")
new_device = EnterpriseDevice(**device) new_device = EnterpriseDevice(**device)
@ -107,7 +111,9 @@ class EnterpriseDeviceRepository(object):
device_id = device["id"] device_id = device["id"]
with get_session() as session: with get_session() as session:
try: try:
session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update(device) session.query(EnterpriseDevice).filter(
EnterpriseDevice.id == device_id
).update(device)
except Exception as e: except Exception as e:
logging.error("Failed to edit device") logging.error("Failed to edit device")
raise e raise e
@ -117,7 +123,9 @@ class EnterpriseDeviceRepository(object):
def delete_device(self, device_id): def delete_device(self, device_id):
with get_session() as session: with get_session() as session:
try: try:
session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update({"delete": 1}) session.query(EnterpriseDevice).filter(
EnterpriseDevice.id == device_id
).update({"delete": 1})
except Exception as e: except Exception as e:
logging.error("Failed to delete device") logging.error("Failed to delete device")
raise e raise e
@ -127,17 +135,32 @@ class EnterpriseDeviceRepository(object):
def list_devices(self, node_id: int, pageNo: int, pageSize: int) -> dict: def list_devices(self, node_id: int, pageNo: int, pageSize: int) -> dict:
with get_session() as session: with get_session() as session:
try: try:
total_count = session.query(EnterpriseDevice) \ total_count = (
.filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \ session.query(EnterpriseDevice)
.filter(
EnterpriseDevice.node_id == node_id,
EnterpriseDevice.delete != 1,
)
.count() .count()
devices = session.query(EnterpriseDevice, )
DeviceClassification.name.label("classification_name")) \ devices = (
.join(DeviceClassification, EnterpriseDevice.classification == DeviceClassification.suid) \ session.query(
.filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \ EnterpriseDevice,
.order_by(EnterpriseDevice.id.desc()) \ DeviceClassification.name.label("classification_name"),
.limit(pageSize) \ )
.offset((pageNo - 1) * pageSize) \ .join(
DeviceClassification,
EnterpriseDevice.classification == DeviceClassification.suid,
)
.filter(
EnterpriseDevice.node_id == node_id,
EnterpriseDevice.delete != 1,
)
.order_by(EnterpriseDevice.id.desc())
.limit(pageSize)
.offset((pageNo - 1) * pageSize)
.all() .all()
)
except Exception as e: except Exception as e:
logging.error("Failed to list devices") logging.error("Failed to list devices")
raise e raise e
@ -158,25 +181,26 @@ class EnterpriseDeviceRepository(object):
"param": device.param, "param": device.param,
"comment": device.comment, "comment": device.comment,
"delete": device.delete, "delete": device.delete,
"create_time": device.create_time.strftime('%Y-%m-%d %H:%M:%S'), "create_time": device.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"update_time": str(device.update_time) "update_time": str(device.update_time),
} }
device_dicts.append(device_dict) device_dicts.append(device_dict)
# for row in devices: # for row in devices:
# logging.info(row.name) # logging.info(row.name)
logging.info(device_dicts) logging.info(device_dicts)
return { return {"devices": device_dicts, "total_count": total_count}
"devices": device_dicts,
"total_count": total_count
}
with get_session() as session:
def get_device(self, device_id: int) -> dict: def get_device(self, device_id: int) -> dict:
with get_session() as session:
try: try:
device = session.query(EnterpriseDevice) \ device = (
.filter(EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1) \ session.query(EnterpriseDevice)
.filter(
EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1
)
.first() .first()
)
except Exception as e: except Exception as e:
logging.error("Failed to get device") logging.error("Failed to get device")
raise e raise e
@ -189,7 +213,34 @@ class EnterpriseDeviceRepository(object):
"device_model": device.device_model, "device_model": device.device_model,
"param": device.param, "param": device.param,
"comment": device.comment, "comment": device.comment,
"classification": device.classification "classification": device.classification,
} }
return device_dict return device_dict
def get_devices(self, device_ids: list) -> list:
with get_session() as session:
try:
devices = (
session.query(EnterpriseDevice)
.filter(
EnterpriseDevice.id.in_(device_ids),
EnterpriseDevice.delete != 1,
)
.all()
)
except Exception as e:
logging.error("Failed to get devices")
raise e
device_dicts = []
for device in devices:
device_dict = {
"id": device.id,
"name": device.name,
"addr": device.addr,
"device_model": device.device_model,
"param": device.param,
"comment": device.comment,
}
device_dicts.append(device_dict)
return device_dicts

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import json
from website import errors from website import errors
from website.handler import APIHandler, authenticated from website.handler import APIHandler, authenticated
from website.db.enterprise_entity import enterprise_entity as DB_Entity 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_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 as DB_BusiModel
from website.db.enterprise_busi_model import enterprise_busi_model_node_device as DB_BusiModelNodeDevice 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_device import enterprise_device as DB_Device
from website.util import shortuuid from website.util import shortuuid
@ -45,18 +47,20 @@ class AddHandler(APIHandler):
entity_suid = db_entity.get_entity_suid(entity_id) entity_suid = db_entity.get_entity_suid(entity_id)
db_node = DB_Node.EnterpriseNodeRepository() db_node = DB_Node.EnterpriseNodeRepository()
db_node.insert_node({ db_node.insert_node(
"suid": shortuuid.ShortUUID().random(length=10), {
"entity_id": entity_id, "suid": shortuuid.ShortUUID().random(length=10),
"entity_suid": entity_suid, "entity_id": entity_id,
"name": name, "entity_suid": entity_suid,
"parent": parent, "name": name,
"addr": addr, "parent": parent,
"lola": lola, "addr": addr,
"contact": contact, "lola": lola,
"phone": phone, "contact": contact,
"comment": comment "phone": phone,
}) "comment": comment,
}
)
self.finish() self.finish()
@ -92,16 +96,18 @@ class EditHandler(APIHandler):
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误") raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
db_node = DB_Node.EnterpriseNodeRepository() db_node = DB_Node.EnterpriseNodeRepository()
db_node.update_node({ db_node.update_node(
"node_id": node_id, {
"name": name, "node_id": node_id,
"parent": parent, "name": name,
"addr": addr, "parent": parent,
"lola": lola, "addr": addr,
"contact": contact, "lola": lola,
"phone": phone, "contact": contact,
"comment": comment "phone": phone,
}) "comment": comment,
}
)
self.finish() self.finish()
@ -151,9 +157,7 @@ class TreeHandler(APIHandler):
db_node = DB_Node.EnterpriseNodeRepository() db_node = DB_Node.EnterpriseNodeRepository()
nodes = db_node.select_tree(entity_id, name) nodes = db_node.select_tree(entity_id, name)
self.finish({ self.finish({"data": nodes})
"data": nodes
})
class InfoHandler(APIHandler): class InfoHandler(APIHandler):
@ -225,13 +229,14 @@ class BusimodelHandler(APIHandler):
} }
``` ```
""" """
@authenticated @authenticated
def post(self): def post(self):
node_id = self.get_int_argument('node_id') node_id = self.get_int_argument("node_id")
pageNo = self.get_int_argument('pageNo', 1) pageNo = self.get_int_argument("pageNo", 1)
pageSize = self.get_int_argument('pageSize', 20) pageSize = self.get_int_argument("pageSize", 20)
if not node_id: if not node_id:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空') raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不能为空")
db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository() db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository()
@ -240,15 +245,18 @@ class BusimodelHandler(APIHandler):
count = busi_models["count"] count = busi_models["count"]
models = busi_models["data"] models = busi_models["data"]
db_mode_node_device = DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() db_mode_node_device = (
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository()
)
for busi_model in models: for busi_model in models:
deployed = db_mode_node_device.check_deployed(node_id, busi_model["busi_model_id"]) deployed = db_mode_node_device.check_deployed(
node_id, busi_model["busi_model_id"]
)
busi_model["deployed"] = deployed busi_model["deployed"] = deployed
self.finish({"count": count, "data": models}) self.finish({"count": count, "data": models})
class BusimodelInfoHandler(APIHandler): class BusimodelInfoHandler(APIHandler):
""" """
- 描述企业节点业务模型部署 -> 业务模型信息 - 描述企业节点业务模型部署 -> 业务模型信息
@ -272,9 +280,42 @@ class BusimodelInfoHandler(APIHandler):
} }
``` ```
""" """
@authenticated @authenticated
def post(self): def post(self):
self.finish() node_id = self.get_int_argument("node_id")
busi_model_id = self.get_int_argument("busi_model_id")
if not node_id or not busi_model_id:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository()
busi_model = db_busi_model.get_busi_model_by_id(busi_model_id)
busi_model_name = busi_model.name
busi_model_comment = busi_model.comment
base_models = json.loads(busi_model.base_models)
base_model_names = ",".join([base_model["name"] for base_model in base_models])
db_mode_node_device = (
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository()
)
device_ids = db_mode_node_device.get_device_id(node_id, busi_model_id)
device_ids = list(set([item["device_id"] for item in device_ids]))
db_device = DB_Device.EnterpriseDeviceRepository()
devices = db_device.get_devices(device_ids)
devices_return = [
{"device_id": item["id"], "device_name": item["name"]} for item in devices
]
self.finish(
{
"busi_model_name": busi_model_name,
"busi_model_comment": busi_model_comment,
"base_models": base_model_names,
"devices": devices_return,
}
)
class BusimodelDeployHandler(APIHandler): class BusimodelDeployHandler(APIHandler):
@ -287,17 +328,18 @@ class BusimodelDeployHandler(APIHandler):
> - device_ids, string, 设备id, 多个id逗号分割 > - device_ids, string, 设备id, 多个id逗号分割
- 返回值 - 返回值
""" """
@authenticated @authenticated
def post(self): def post(self):
node_id = self.get_int_argument('node_id') node_id = self.get_int_argument("node_id")
busi_model_id = self.get_int_argument('busi_model_id') busi_model_id = self.get_int_argument("busi_model_id")
device_ids = self.get_escaped_argument('device_ids', '') device_ids = self.get_escaped_argument("device_ids", "")
if not node_id or not busi_model_id: if not node_id or not busi_model_id:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '参数错误') raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
db_node = DB_Node.EnterpriseNodeRepository() db_node = DB_Node.EnterpriseNodeRepository()
node = db_node.get_node_by_id(node_id) node = db_node.get_node_by_id(node_id)
if not node: if not node:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '节点不存在') raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "节点不存在")
node_suid = node["suid"] node_suid = node["suid"]
db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository() db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository()
@ -306,24 +348,28 @@ class BusimodelDeployHandler(APIHandler):
entity_suid_row = db_node.get_entity_suid_by_node_id(node_id) entity_suid_row = db_node.get_entity_suid_by_node_id(node_id)
if not entity_suid_row: if not entity_suid_row:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不存在') raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不存在")
records = [] records = []
for device_id in device_ids.split(','): for device_id in device_ids.split(","):
device = DB_Device.EnterpriseDeviceRepository().get_device(int(device_id)) device = DB_Device.EnterpriseDeviceRepository().get_device(int(device_id))
if not device: if not device:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备不存在') raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备不存在")
records.append({ records.append(
"suid": shortuuid.ShortUUID.random(length=10), {
"entity_suid": entity_suid_row["entity_suid"], "suid": shortuuid.ShortUUID.random(length=10),
"node_id": node_id, "entity_suid": entity_suid_row["entity_suid"],
"node_suid": node_suid, "node_id": node_id,
"busi_model_id": busi_model_id, "node_suid": node_suid,
"busi_model_suid": busi_model_suid, "busi_model_id": busi_model_id,
"device_id": int(device_id), "busi_model_suid": busi_model_suid,
"device_suid": device["suid"] "device_id": int(device_id),
}) "device_suid": device["suid"],
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(records) }
)
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(
records
)
self.finish() self.finish()
Loading…
Cancel
Save