From af2d0375776b9a1d5ec7af8d6a00e0744c35ffc5 Mon Sep 17 00:00:00 2001 From: zhouping Date: Tue, 18 Jun 2024 09:06:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=81=E4=B8=9A=E8=AE=BE=E5=A4=87=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/enterprise_device/enterprise_device.py | 38 ++++- website/handlers/enterprise_device/handler.py | 134 +++++++++++++++--- website/handlers/enterprise_node/handler.py | 16 ++- website/util/date_util.py | 16 +++ 4 files changed, 179 insertions(+), 25 deletions(-) diff --git a/website/db/enterprise_device/enterprise_device.py b/website/db/enterprise_device/enterprise_device.py index 9bab2ec..cc26a58 100644 --- a/website/db/enterprise_device/enterprise_device.py +++ b/website/db/enterprise_device/enterprise_device.py @@ -308,7 +308,8 @@ class EnterpriseDeviceRepository(object): return 0 - def list_entity_devices(self, entity_id: int, pageNo: int, pageSize: int, classification: str, status: int) -> dict: + def list_entity_devices(self, entity_id: int, pageno: int, pagesize: int, classification: str = "", + status: int = 0) -> dict: """获取企业的设备列表""" with get_session() as session: try: @@ -326,7 +327,8 @@ class EnterpriseDeviceRepository(object): count = session_count.count() session_device = ( - session.query(EnterpriseDevice) + session.query(EnterpriseDevice, DeviceClassification.name.label("classification_name")) + .join(DeviceClassification, DeviceClassification.id == EnterpriseDevice.classification, isouter=True) .filter( EnterpriseDevice.entity_id == entity_id, EnterpriseDevice.delete != 1, @@ -337,11 +339,39 @@ class EnterpriseDeviceRepository(object): if status: session_device.filter(EnterpriseDevice.status == status) - devices = session_device.order_by(EnterpriseDevice.id.desc()).limit(pageSize).offset( - (pageNo - 1) * pageSize).all() + devices = session_device.order_by(EnterpriseDevice.id.desc()).limit(pagesize).offset( + (pageno - 1) * pagesize).all() except Exception as e: logging.error("Failed to list devices") raise e + + logging.info(devices) + return {"count": count, "devices": devices} + + def status_count(self, entity_id: int, classification: str=""): + with get_session() as session: + try: + session_count = ( + session.query( + EnterpriseDevice.status, + func.count(EnterpriseDevice.id).label("count") + ) + .filter( + EnterpriseDevice.entity_id == entity_id, + EnterpriseDevice.delete != 1, + ) + .group_by(EnterpriseDevice.status) + ) + + if classification: + session_count = session_count.filter(EnterpriseDevice.classification == classification) + + result = session_count.all() + except Exception as e: + logging.error("Failed to get status count") + raise e + + return dict(result) \ No newline at end of file diff --git a/website/handlers/enterprise_device/handler.py b/website/handlers/enterprise_device/handler.py index 55380f2..133df95 100644 --- a/website/handlers/enterprise_device/handler.py +++ b/website/handlers/enterprise_device/handler.py @@ -8,9 +8,7 @@ from sqlalchemy import text from website import consts from website import db_mysql, errors from website.db.alg_model.alg_model import ModelRepositry as DB_AlgModel -from website.db.device_classification import ( - device_classification as DB_DeviceClassification, -) +from website.db.device_classification import device_classification as DB_DeviceClassification from website.db.enterprise_busi_model import ( enterprise_busi_model as DB_BusiModel, ) @@ -18,6 +16,7 @@ from website.db.enterprise_busi_model import enterprise_busi_model_node_device a from website.db.enterprise_device import enterprise_device as DB_Device from website.db.enterprise_node import enterprise_node_base_model_conf as DB_NodeBaseModelConf from website.handler import APIHandler, authenticated +from website.util import date_util from website.util import shortuuid @@ -405,15 +404,15 @@ class DeviceBasemodelListHandler(APIHandler): base_model_version = base_model["default_version"] db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository() conf = db_conf.get_busi_model_custom_config(busi_model_id=busi_model_id, device_id=device_id, - node_id=item["node_id"]) + node_id=item["node_id"]) base_model_hub_image = "" if conf: base_model_hub_image = conf.model_hub_image base_models.append({ - "model_id": base_model_id, - "model_name": base_model_name, - "model_version": base_model_version, - "model_hub_image": base_model_hub_image, + "model_id": base_model_id, + "model_name": base_model_name, + "model_version": base_model_version, + "model_hub_image": base_model_hub_image, }) res.append({ "busi_model_id": busi_model_id, @@ -541,8 +540,8 @@ class StatusListHandler(APIHandler): db_device = DB_Device.EnterpriseDeviceRepository() res = db_device.list_entity_devices( entity_id=entity_id, - pageNo=pageNo, - pageSize=pageSize, + pageno=pageNo, + pagesize=pageSize, classification=classification, status=status, ) @@ -550,7 +549,8 @@ class StatusListHandler(APIHandler): count = res["count"] devices = res["devices"] data = [] - for item in devices: + for item, _ in devices: + logging.info(item) data.append( { "id": item.id, @@ -563,7 +563,17 @@ class StatusListHandler(APIHandler): } ) - self.finish({"count": count, "data": data}) + status_dic = { + consts.device_status_online: 0, + consts.device_status_offline: 0, + consts.device_status_ongoing: 0, + consts.device_status_error: 0, + } + status_count = db_device.status_count(entity_id=entity_id, classification=classification) + for key in status_count: + status_dic.update({key: status_count[key]}) + + self.finish({"count": count, "data": data, "status_count": status_dic}) class StatusInfoHandler(APIHandler): @@ -575,22 +585,112 @@ class StatusInfoHandler(APIHandler): if not device_id: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备id不能为空") + # 查询设备信息 db_device = DB_Device.EnterpriseDeviceRepository() res = db_device.get_devices(device_ids=[device_id]) if not res: raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备不存在") res = res[0] + device_suid = res["suid"] + device_name = res["name"] + device_comment = res["comment"] + classification = res["classification"] + db_cls = DB_DeviceClassification.DeviceClassificationReporitory() + row_cls = db_cls.get_row_by_suid(suid=classification) + device_classification_name = row_cls.name + db_busi_model = DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository() busi_models, _ = db_busi_model.get_busi_model_by_device(device_id=device_id) - for busi_model in busi_models: - base_model_ids = json.loads(busi_model["base_models"]) - self.finish() + models = [] + for item in busi_models: + busi_model_id = item["busi_model_id"] + busi_model_name = item["name"] + base_model_list = json.loads(item["base_models"]) + base_models = [] + for base_model in base_model_list: + base_model_id = base_model["id"] + base_model_name = base_model["name"] + db_alg_model = DB_AlgModel() + base_model = db_alg_model.get_model_dict_by_id(base_model_id) + base_model_version = base_model["default_version"] + db_conf = DB_NodeBaseModelConf.EnterpriseNodeDeviceBMCusConfRepository() + conf = db_conf.get_busi_model_custom_config(busi_model_id=busi_model_id, device_id=device_id, + node_id=item["node_id"]) + base_model_hub_image = "" + if conf: + base_model_hub_image = conf.model_hub_image + base_models.append({ + "model_id": base_model_id, + "model_name": base_model_name, + "model_version": base_model_version, + "model_hub_image": base_model_hub_image, + }) + models.append({ + "busi_model": busi_model_name, + "base_models": base_models + }) + + self.finish({ + "classification": device_classification_name, + "name": device_name, + "ID": device_suid, + "cpu": random.randint(20, 30), + "mem": random.randint(20, 30), + "storage": random.randint(20, 30), + "gpu": random.randint(20, 30), + "models": models + }) class StatusLogHandler(APIHandler): - """ """ + """ + - 描述:设备状态日志 + - 请求方式:post + - 请求参数: + > - entity_id, int, 企业id + > - pageNo + > - pageSize + - 返回值: + ``` + { + "count": 123, + "data": [ + { + "ID": "xxx", + "name": "xxx", + "classification": "xxx", + "IP": "xxx", + "duration": "xxx", + } + ] + } +``` +""" @authenticated def post(self): - self.finish() + entity_id = self.get_int_argument("entity_id") + pageNo = self.get_int_argument("pageNo", 1) + pageSize = self.get_int_argument("pageSize", 10) + + db_device = DB_Device.EnterpriseDeviceRepository() + res = db_device.list_entity_devices(entity_id=entity_id, pageno=pageNo, pagesize=pageSize) + count = res["count"] + devices = res["devices"] + + result = [] + for device, classification_name in devices: + device_name = device.name + device_suid = device.suid + device_ip = "" + duration = date_util.time_diff(str(device.create_time)) + result.append({ + "ID": device_suid, + "name": device_name, + "classification": classification_name, + "IP": device_ip, + "duration": duration, + }) + + self.finish({"count": count, "data": result}) diff --git a/website/handlers/enterprise_node/handler.py b/website/handlers/enterprise_node/handler.py index 2df6ae0..5c97fcb 100644 --- a/website/handlers/enterprise_node/handler.py +++ b/website/handlers/enterprise_node/handler.py @@ -418,15 +418,23 @@ class AlertHandler(APIHandler): db_alert = DB_NodeAlert.EnterpriseNodeAlertRepository() data = db_alert.get_one(entity_suid, node_suid) - self.finish( - { + res = { + "is_sms": 0, + "sms_to": "", + "is_email": 0, + "email_to": "", + "freq": "T", + } + if data: + res.update({ "is_sms": data["is_sms"], "sms_to": data["sms_to"], "is_email": data["is_email"], "email_to": data["email_to"], "freq": data["freq"], - } - ) + }) + + self.finish(res) class AlertConfigHandler(APIHandler): diff --git a/website/util/date_util.py b/website/util/date_util.py index 3da9f5a..dca07b6 100644 --- a/website/util/date_util.py +++ b/website/util/date_util.py @@ -1,5 +1,6 @@ #!/usr/bin/env python import datetime +from datetime import datetime, timedelta # 获取过去几天的日期 def get_last_days(delta): @@ -12,6 +13,21 @@ def get_last_days(delta): days.sort() return days +def time_diff(t1): + # 将字符串转换为 datetime 对象 + t1 = datetime.strptime(t1, "%Y-%m-%d %H:%M:%S") + + # 计算当前时间与 t1 的差值 + diff = datetime.now() - t1 + + # 计算天数、小时数和分钟数 + days = diff.days + hours, remainder = divmod(diff.seconds, 3600) + minutes, seconds = divmod(remainder, 60) + + # 返回格式化的时间差 + return f"{days}:{hours}:{minutes}" + class DateNext(object): def get_next_week_date(self, weekday):