From 9af8a75ebb56c9199c63f829dd1be0fa6b8224bb Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw <yawen.chen@fit2cloud.com> Date: Thu, 18 Jan 2024 09:05:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A6=96=E6=AC=A1=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E7=89=88=E7=9B=91=E6=B5=8B=E6=B8=B8=E7=A6=BB?= =?UTF-8?q?=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core-backend/pom.xml | 15 +++ .../rmonitor/bo/PerMonitorCheckBO.java | 12 ++ .../rmonitor/bo/PerMonitorNodeBO.java | 24 ++++ .../manage/ResourceMonitorManage.java | 118 ++++++++++++++++++ .../manage/ResourceMonitorSyncManage.java | 28 +++++ .../mapper/ResourceMonitorMapper.java | 41 ++++++ .../mapper/entity/BaseFreeResource.java | 15 +++ .../mapper/entity/DatasetFreeResource.java | 13 ++ .../mapper/entity/DsFreeResource.java | 16 +++ .../mapper/entity/VisualFreeResource.java | 15 +++ .../server/ResourceMonitorServer.java | 30 +++++ 11 files changed, 327 insertions(+) create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java create mode 100644 core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java diff --git a/core/core-backend/pom.xml b/core/core-backend/pom.xml index 72a5f97b9e..d5cf204747 100644 --- a/core/core-backend/pom.xml +++ b/core/core-backend/pom.xml @@ -101,6 +101,21 @@ <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </dependency> + <dependency> + <groupId>io.dataease</groupId> + <artifactId>xpack-base</artifactId> + <version>${dataease.version}</version> + </dependency> + <dependency> + <groupId>io.dataease</groupId> + <artifactId>xpack-permissions</artifactId> + <version>${dataease.version}</version> + </dependency> + <dependency> + <groupId>io.dataease</groupId> + <artifactId>xpack-sync</artifactId> + <version>${dataease.version}</version> + </dependency> </dependencies> <build> diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java new file mode 100644 index 0000000000..aab6e1ed4e --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorCheckBO.java @@ -0,0 +1,12 @@ +package io.dataease.rmonitor.bo; + +import lombok.Data; +import java.io.Serializable; + +@Data +public class PerMonitorCheckBO implements Serializable { + + private boolean valid; + + private boolean emptyPermission; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java new file mode 100644 index 0000000000..ea2e91720c --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/bo/PerMonitorNodeBO.java @@ -0,0 +1,24 @@ +package io.dataease.rmonitor.bo; + +import io.dataease.model.TreeBaseModel; +import io.dataease.model.TreeResultModel; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class PerMonitorNodeBO implements TreeBaseModel<PerMonitorNodeBO>, TreeResultModel<PerMonitorNodeBO>, Serializable { + + private Long id; + + private String name; + + private Long pid; + + private boolean leaf; + + private int extraFlag; + + private List<PerMonitorNodeBO> children; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java new file mode 100644 index 0000000000..920e90cd3b --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorManage.java @@ -0,0 +1,118 @@ +package io.dataease.rmonitor.manage; + +import io.dataease.exception.DEException; +import io.dataease.rmonitor.bo.PerMonitorCheckBO; +import io.dataease.rmonitor.bo.PerMonitorNodeBO; +import io.dataease.rmonitor.mapper.ResourceMonitorMapper; +import io.dataease.rmonitor.mapper.entity.DatasetFreeResource; +import io.dataease.rmonitor.mapper.entity.DsFreeResource; +import io.dataease.rmonitor.mapper.entity.VisualFreeResource; +import io.dataease.utils.BeanUtils; +import io.dataease.utils.TreeUtils; +import jakarta.annotation.Resource; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Component("resourceMonitorManage") +public class ResourceMonitorManage { + + + @Resource(name = "resourceMonitorSyncManage") + private ResourceMonitorSyncManage resourceMonitorSyncManage; + + @Resource + private ResourceMonitorMapper resourceMonitorMapper; + + + private boolean existFreeResource() { + int rCount = resourceMonitorMapper.dsCount() + resourceMonitorMapper.datasetCount() + resourceMonitorMapper.vCount(); + return rCount > 0; + } + + private Map<String, List<PerMonitorNodeBO>> freeResource() { + Map<String, List<PerMonitorNodeBO>> result = new HashMap<>(); + + List<DsFreeResource> dsFreeResources = resourceMonitorMapper.queryFreeDs(); + if (CollectionUtils.isNotEmpty(dsFreeResources)) { + List<PerMonitorNodeBO> dsBos = dsFreeResources.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getType())); + return bo; + }).collect(Collectors.toList()); + List<PerMonitorNodeBO> dsTree = TreeUtils.mergeTree(dsBos, PerMonitorNodeBO.class, false); + result.put("datasource", dsTree); + } + + List<DatasetFreeResource> datasetFreeResources = resourceMonitorMapper.queryFreeDataset(); + if (CollectionUtils.isNotEmpty(datasetFreeResources)) { + List<PerMonitorNodeBO> datasetBos = datasetFreeResources.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getNodeType())); + return bo; + }).collect(Collectors.toList()); + List<PerMonitorNodeBO> datasetTree = TreeUtils.mergeTree(datasetBos, PerMonitorNodeBO.class, false); + result.put("dataset", datasetTree); + } + + List<VisualFreeResource> visualFreeResources = resourceMonitorMapper.queryFreeVusial(); + if (CollectionUtils.isNotEmpty(visualFreeResources)) { + Map<String, List<VisualFreeResource>> baseMap = visualFreeResources.stream().collect(Collectors.groupingBy(VisualFreeResource::getType)); + for (Map.Entry<String, List<VisualFreeResource>> entry : baseMap.entrySet()) { + List<VisualFreeResource> freeResource = entry.getValue(); + List<PerMonitorNodeBO> visualBos = freeResource.stream().map(node -> { + PerMonitorNodeBO bo = BeanUtils.copyBean(new PerMonitorNodeBO(), node); + bo.setLeaf(StringUtils.equals("folder", node.getNodeType())); + return bo; + }).collect(Collectors.toList()); + result.put(convertBusiFlag(entry.getKey()), TreeUtils.mergeTree(visualBos, PerMonitorNodeBO.class, false)); + } + } + return result; + } + + private String convertBusiFlag(String key) { + if (StringUtils.equals("dashboard", key)){ + return "panel"; + } else if (StringUtils.equals("dataV", key)) { + return "screen"; + } else return key; + } + + public boolean check() { + PerMonitorCheckBO checkBO = resourceMonitorSyncManage.checkXpackResource(); + return checkBO.isValid() && checkBO.isEmptyPermission() && existFreeResource(); + } + + @Transactional + public void delete() { + boolean existFree = existFreeResource(); + if (!existFree) DEException.throwException("无未同步资源!"); + resourceMonitorMapper.delFreeDs(); + resourceMonitorMapper.delFreeDataset(); + resourceMonitorMapper.delFreeVisual(); + } + + public void sync() { + //1、从xpack获取资源 如果xpack不存在 或者资源不为空 则直接返回 并且抛出异常“仅支持首次导入lic同步” + //2、从core获取资源 + //3、根据类型分组 并组织成树形结构 + //4、分别遍历每一棵树 从上到下 同步到权限体系 给默认组织 + PerMonitorCheckBO checkBO = resourceMonitorSyncManage.checkXpackResource(); + if (!checkBO.isValid()) DEException.throwException("缺少许可证"); + if (!checkBO.isEmptyPermission()) DEException.throwException("仅支持license首次导入同步"); + Map<String, List<PerMonitorNodeBO>> freeResourceMap = freeResource(); + if (MapUtils.isEmpty(freeResourceMap)) DEException.throwException("无未同步资源!"); + for (Map.Entry<String, List<PerMonitorNodeBO>> entry : freeResourceMap.entrySet()) { + resourceMonitorSyncManage.sync(entry.getKey(), entry.getValue()); + } + } + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java new file mode 100644 index 0000000000..dc875acded --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/manage/ResourceMonitorSyncManage.java @@ -0,0 +1,28 @@ +package io.dataease.rmonitor.manage; + +import io.dataease.exception.DEException; +import io.dataease.license.config.XpackInteract; +import io.dataease.rmonitor.bo.PerMonitorCheckBO; +import io.dataease.rmonitor.bo.PerMonitorNodeBO; +import io.dataease.rmonitor.mapper.ResourceMonitorMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component("resourceMonitorSyncManage") +public class ResourceMonitorSyncManage { + + @Resource(name = "resourceMonitorMapper") + private ResourceMonitorMapper resourceMonitorMapper; + + @XpackInteract(value = "resourceMonitorSyncManage", replace = true) + public void sync(String flag, List<PerMonitorNodeBO> treeNodes) { + DEException.throwException("缺失许可证"); + } + + @XpackInteract(value = "resourceMonitorSyncManage", replace = true) + public PerMonitorCheckBO checkXpackResource() { + return new PerMonitorCheckBO(); + } +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java new file mode 100644 index 0000000000..0b2ae83575 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/ResourceMonitorMapper.java @@ -0,0 +1,41 @@ +package io.dataease.rmonitor.mapper; + +import io.dataease.rmonitor.mapper.entity.DatasetFreeResource; +import io.dataease.rmonitor.mapper.entity.DsFreeResource; +import io.dataease.rmonitor.mapper.entity.VisualFreeResource; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface ResourceMonitorMapper { + + @Select("select count(id) from core_datasource") + int dsCount(); + + @Select("select count(id) from core_dataset_group") + int datasetCount(); + + @Select("select count(id) from data_visualization_info") + int vCount(); + + @Select("select id, name, pid, type, status from core_datasource") + List<DsFreeResource> queryFreeDs(); + + @Select("select id, name, pid, node_type from core_dataset_group") + List<DatasetFreeResource> queryFreeDataset(); + + @Select("select id, name, pid, node_type, type from data_visualization_info") + List<VisualFreeResource> queryFreeVusial(); + + @Delete("delete from core_datasource") + void delFreeDs(); + + @Delete("delete from core_dataset_group") + void delFreeDataset(); + @Delete("delete from data_visualization_info") + void delFreeVisual(); + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java new file mode 100644 index 0000000000..390acb6e10 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/BaseFreeResource.java @@ -0,0 +1,15 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class BaseFreeResource implements Serializable { + + private Long id; + + private String name; + + private Long pid; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java new file mode 100644 index 0000000000..1d4f85c00a --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DatasetFreeResource.java @@ -0,0 +1,13 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class DatasetFreeResource extends BaseFreeResource implements Serializable { + + private String nodeType; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java new file mode 100644 index 0000000000..a8dc0fd1a0 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/DsFreeResource.java @@ -0,0 +1,16 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class DsFreeResource extends BaseFreeResource implements Serializable { + + private String type; + + private String status; + +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java new file mode 100644 index 0000000000..d3302b84c5 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/mapper/entity/VisualFreeResource.java @@ -0,0 +1,15 @@ +package io.dataease.rmonitor.mapper.entity; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +@EqualsAndHashCode(callSuper = true) +@Data +public class VisualFreeResource extends BaseFreeResource implements Serializable { + + private String nodeType; + + private String type; +} diff --git a/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java b/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java new file mode 100644 index 0000000000..1289ba3a79 --- /dev/null +++ b/core/core-backend/src/main/java/io/dataease/rmonitor/server/ResourceMonitorServer.java @@ -0,0 +1,30 @@ +package io.dataease.rmonitor.server; + +import io.dataease.api.rmonitor.ResourceMonitorApi; +import io.dataease.rmonitor.manage.ResourceMonitorManage; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/rmonitor") +public class ResourceMonitorServer implements ResourceMonitorApi { + + @Resource(name = "resourceMonitorManage") + private ResourceMonitorManage resourceMonitorManage; + + @Override + public boolean existFree() { + return resourceMonitorManage.check(); + } + + @Override + public void delete() { + resourceMonitorManage.delete(); + } + + @Override + public void sync() { + resourceMonitorManage.sync(); + } +}