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

main
周平 11 months ago
parent 6b10daf0fe
commit 6a4100d612

@ -1,10 +1,10 @@
# -*- coding: utf-8 -*-
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 website.db_mysql import get_session
from website.db_mysql import get_session, to_json_list
"""
CREATE TABLE `enterprise_busi_model_node_device` (
@ -26,7 +26,7 @@ Base = declarative_base()
class EnterpriseBusiModelNodeDevice(Base):
__tablename__ = 'enterprise_busi_model_node_device'
__tablename__ = "enterprise_busi_model_node_device"
id = Column(Integer, primary_key=True)
suid = Column(String(10))
@ -37,7 +37,9 @@ class EnterpriseBusiModelNodeDevice(Base):
busi_model_suid = Column(String(10))
device_id = Column(Integer)
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):
return f"EnterpriseBusiModelNodeDevice(id={self.id}, suid='{self.suid}')"
@ -56,15 +58,24 @@ class EnterpriseBusiModelNodeDeviceRepository(object):
session.bulk_insert_mappings(EnterpriseBusiModelNodeDevice, records)
session.commit()
def check_deployed(self, node_id: int, busi_model_id: int) -> int:
with get_session() as session:
count = (
session.query(EnterpriseBusiModelNodeDevice)
.filter(
EnterpriseBusiModelNodeDevice.node_id==node_id,
EnterpriseBusiModelNodeDevice.busi_model_id==busi_model_id
EnterpriseBusiModelNodeDevice.node_id == node_id,
EnterpriseBusiModelNodeDevice.busi_model_id == busi_model_id,
)
.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):
__tablename__ = 'enterprise_device'
__tablename__ = "enterprise_device"
id = Column(Integer, primary_key=True)
suid = Column(String(length=10), default="")
@ -80,21 +80,25 @@ class EnterpriseDeviceRepository(object):
name = device["name"]
with get_session() as session:
existing_device = session.query(EnterpriseDevice) \
.filter_by(node_id=node_id, name=name, delete=0) \
existing_device = (
session.query(EnterpriseDevice)
.filter_by(node_id=node_id, name=name, delete=0)
.first()
)
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, "设备已存在")
new_device = EnterpriseDevice(**device)
try:
# session.execute(
# text(
# """INSERT INTO enterprise_device
# (suid, entity_id, entity_suid, node_id, node_suid, classification, name, addr, device_model, param, comment)
# """INSERT INTO enterprise_device
# (suid, entity_id, entity_suid, node_id, node_suid, classification, name, addr, device_model, param, comment)
# values (:suid, :entity_id, :entity_suid, :node_id, :node_suid, :classification, :name, :addr, :device_model, :param, :comment)"""
# ),
# ),
# device)
session.add(new_device)
except Exception as e:
@ -107,7 +111,9 @@ class EnterpriseDeviceRepository(object):
device_id = device["id"]
with get_session() as session:
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:
logging.error("Failed to edit device")
raise e
@ -117,7 +123,9 @@ class EnterpriseDeviceRepository(object):
def delete_device(self, device_id):
with get_session() as session:
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:
logging.error("Failed to delete device")
raise e
@ -127,17 +135,32 @@ class EnterpriseDeviceRepository(object):
def list_devices(self, node_id: int, pageNo: int, pageSize: int) -> dict:
with get_session() as session:
try:
total_count = session.query(EnterpriseDevice) \
.filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \
total_count = (
session.query(EnterpriseDevice)
.filter(
EnterpriseDevice.node_id == node_id,
EnterpriseDevice.delete != 1,
)
.count()
devices = session.query(EnterpriseDevice,
DeviceClassification.name.label("classification_name")) \
.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) \
)
devices = (
session.query(
EnterpriseDevice,
DeviceClassification.name.label("classification_name"),
)
.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()
)
except Exception as e:
logging.error("Failed to list devices")
raise e
@ -158,25 +181,26 @@ class EnterpriseDeviceRepository(object):
"param": device.param,
"comment": device.comment,
"delete": device.delete,
"create_time": device.create_time.strftime('%Y-%m-%d %H:%M:%S'),
"update_time": str(device.update_time)
"create_time": device.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"update_time": str(device.update_time),
}
device_dicts.append(device_dict)
# for row in devices:
# logging.info(row.name)
logging.info(device_dicts)
return {
"devices": device_dicts,
"total_count": total_count
}
return {"devices": device_dicts, "total_count": total_count}
with get_session() as session:
def get_device(self, device_id: int) -> dict:
with get_session() as session:
try:
device = session.query(EnterpriseDevice) \
.filter(EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1) \
device = (
session.query(EnterpriseDevice)
.filter(
EnterpriseDevice.id == device_id, EnterpriseDevice.delete != 1
)
.first()
)
except Exception as e:
logging.error("Failed to get device")
raise e
@ -189,7 +213,34 @@ class EnterpriseDeviceRepository(object):
"device_model": device.device_model,
"param": device.param,
"comment": device.comment,
"classification": device.classification
"classification": device.classification,
}
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 -*-
import json
from website import errors
from website.handler import APIHandler, authenticated
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_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.util import shortuuid
@ -45,18 +47,20 @@ class AddHandler(APIHandler):
entity_suid = db_entity.get_entity_suid(entity_id)
db_node = DB_Node.EnterpriseNodeRepository()
db_node.insert_node({
"suid": shortuuid.ShortUUID().random(length=10),
"entity_id": entity_id,
"entity_suid": entity_suid,
"name": name,
"parent": parent,
"addr": addr,
"lola": lola,
"contact": contact,
"phone": phone,
"comment": comment
})
db_node.insert_node(
{
"suid": shortuuid.ShortUUID().random(length=10),
"entity_id": entity_id,
"entity_suid": entity_suid,
"name": name,
"parent": parent,
"addr": addr,
"lola": lola,
"contact": contact,
"phone": phone,
"comment": comment,
}
)
self.finish()
@ -92,16 +96,18 @@ class EditHandler(APIHandler):
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
db_node = DB_Node.EnterpriseNodeRepository()
db_node.update_node({
"node_id": node_id,
"name": name,
"parent": parent,
"addr": addr,
"lola": lola,
"contact": contact,
"phone": phone,
"comment": comment
})
db_node.update_node(
{
"node_id": node_id,
"name": name,
"parent": parent,
"addr": addr,
"lola": lola,
"contact": contact,
"phone": phone,
"comment": comment,
}
)
self.finish()
@ -115,7 +121,7 @@ class TreeHandler(APIHandler):
>- name, string, 搜索内容
- 返回值
```
{
{
"data":[
{
"id": 123,
@ -129,7 +135,7 @@ class TreeHandler(APIHandler):
"id": 123,
"name": "xxx"
},
]
},
...
@ -137,7 +143,7 @@ class TreeHandler(APIHandler):
},
...
]
}
```
"""
@ -151,9 +157,7 @@ class TreeHandler(APIHandler):
db_node = DB_Node.EnterpriseNodeRepository()
nodes = db_node.select_tree(entity_id, name)
self.finish({
"data": nodes
})
self.finish({"data": nodes})
class InfoHandler(APIHandler):
@ -225,13 +229,14 @@ class BusimodelHandler(APIHandler):
}
```
"""
@authenticated
def post(self):
node_id = self.get_int_argument('node_id')
pageNo = self.get_int_argument('pageNo', 1)
pageSize = self.get_int_argument('pageSize', 20)
node_id = self.get_int_argument("node_id")
pageNo = self.get_int_argument("pageNo", 1)
pageSize = self.get_int_argument("pageSize", 20)
if not node_id:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空')
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不能为空")
db_model_node = DB_BusiModel.EnterpriseBusiModelNodeRepository()
@ -240,15 +245,18 @@ class BusimodelHandler(APIHandler):
count = busi_models["count"]
models = busi_models["data"]
db_mode_node_device = DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository()
db_mode_node_device = (
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository()
)
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
self.finish({"count": count, "data": models})
class BusimodelInfoHandler(APIHandler):
"""
- 描述企业节点业务模型部署 -> 业务模型信息
@ -272,9 +280,42 @@ class BusimodelInfoHandler(APIHandler):
}
```
"""
@authenticated
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):
@ -287,17 +328,18 @@ class BusimodelDeployHandler(APIHandler):
> - device_ids, string, 设备id, 多个id逗号分割
- 返回值
"""
@authenticated
def post(self):
node_id = self.get_int_argument('node_id')
busi_model_id = self.get_int_argument('busi_model_id')
device_ids = self.get_escaped_argument('device_ids', '')
node_id = self.get_int_argument("node_id")
busi_model_id = self.get_int_argument("busi_model_id")
device_ids = self.get_escaped_argument("device_ids", "")
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()
node = db_node.get_node_by_id(node_id)
if not node:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '节点不存在')
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "节点不存在")
node_suid = node["suid"]
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)
if not entity_suid_row:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不存在')
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不存在")
records = []
for device_id in device_ids.split(','):
for device_id in device_ids.split(","):
device = DB_Device.EnterpriseDeviceRepository().get_device(int(device_id))
if not device:
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备不存在')
records.append({
"suid": shortuuid.ShortUUID.random(length=10),
"entity_suid": entity_suid_row["entity_suid"],
"node_id": node_id,
"node_suid": node_suid,
"busi_model_id": busi_model_id,
"busi_model_suid": busi_model_suid,
"device_id": int(device_id),
"device_suid": device["suid"]
})
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(records)
self.finish()
raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备不存在")
records.append(
{
"suid": shortuuid.ShortUUID.random(length=10),
"entity_suid": entity_suid_row["entity_suid"],
"node_id": node_id,
"node_suid": node_suid,
"busi_model_id": busi_model_id,
"busi_model_suid": busi_model_suid,
"device_id": int(device_id),
"device_suid": device["suid"],
}
)
DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(
records
)
self.finish()

Loading…
Cancel
Save