Ver código fonte

feat:新增设备区域树形展示接口

黄渊昊 6 meses atrás
pai
commit
9ef1b2d0b5

+ 11 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/controller/MonitorTargetRegionController.java

@@ -13,6 +13,7 @@
 package vip.xiaonuo.coldchain.modular.monitortargetregion.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -120,4 +121,14 @@ public class MonitorTargetRegionController {
     public CommonResult<MonitorTargetRegion> detail(@Valid MonitorTargetRegionIdParam monitorTargetRegionIdParam) {
         return CommonResult.data(monitorTargetRegionService.detail(monitorTargetRegionIdParam));
     }
+
+    /**
+     * 获取区域树
+     */
+    @Operation(summary = "获取区域树")
+    @SaCheckPermission("/coldchain/monitortargetregion/tree")
+    @GetMapping("/coldchain/monitortargetregion/tree")
+    public CommonResult<List<Tree<String>>> tree() {
+        return CommonResult.data(monitorTargetRegionService.tree());
+    }
 }

+ 29 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/param/MonitorTargetRegionTreeParam.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.coldchain.modular.monitortargetregion.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 字典树参数
+ *
+ * @author xuyuxiang
+ * @date 2022/7/30 21:49
+ */
+@Getter
+@Setter
+public class MonitorTargetRegionTreeParam {
+
+}

+ 6 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java

@@ -12,6 +12,7 @@
  */
 package vip.xiaonuo.coldchain.modular.monitortargetregion.service;
 
+import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
@@ -82,4 +83,9 @@ public interface MonitorTargetRegionService extends IService<MonitorTargetRegion
      * 根据targetId获取region列表
      */
     List<MonitorTargetRegion> getRegionListByTargetId(String targetId);
+
+    /**
+     * 获取区域树
+     */
+    List<Tree<String>> tree();
 }

+ 63 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java

@@ -14,8 +14,15 @@ package vip.xiaonuo.coldchain.modular.monitortargetregion.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.tree.Tree;
+import cn.hutool.core.lang.tree.TreeNode;
+import cn.hutool.core.lang.tree.TreeNodeConfig;
+import cn.hutool.core.lang.tree.TreeUtil;
+import cn.hutool.core.lang.tree.parser.DefaultNodeParser;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -39,6 +46,11 @@ import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.page.CommonPageRequest;
 
 import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 /**
  * 区域管理Service接口实现类
@@ -134,4 +146,55 @@ public class MonitorTargetRegionServiceImpl extends ServiceImpl<MonitorTargetReg
         queryWrapper.eq(MonitorTargetRegion::getMonitorTargetId, targetId);
         return list(queryWrapper);
     }
+
+    @Override
+    public List<Tree<String>> tree() {
+        List<MonitorTargetRegion> monitorTargetRegionList = list();
+
+        this.fillParentLocationInfo(monitorTargetRegionList);
+
+        for (MonitorTargetRegion monitorTargetRegion : monitorTargetRegionList) {
+            MonitorTargetRegion byId = this.getById(monitorTargetRegion.getParentId());
+            if(ObjectUtil.isNotEmpty(byId)) {
+                monitorTargetRegion.setParentId(byId.getId());
+            }
+        }
+
+        List<TreeNode<String>> treeNodeList = monitorTargetRegionList.stream().map(locationType ->
+                        new TreeNode<>(locationType.getId(), locationType.getParentId(),
+                                locationType.getName(), 0).setExtra(JSONUtil.parseObj(locationType)))
+                .collect(Collectors.toList());
+        List<Tree<String>> build = TreeUtil.build(treeNodeList, "-1");
+        return build;
+    }
+
+    private void fillParentLocationInfo(List<MonitorTargetRegion> resourceList) {
+        if (CollUtil.isNotEmpty(resourceList)) {
+            List<MonitorTargetRegion> locationTypes = resourceList.stream().filter(distinctByKey(MonitorTargetRegion::getParentId)).collect(Collectors.toList());
+
+            List<String> parentIds = null;
+            if (CollUtil.isNotEmpty(locationTypes)) {
+                parentIds = CollUtil.newArrayList();
+                for (MonitorTargetRegion locationType : locationTypes) {
+                    if (!StrUtil.equals(locationType.getParentId(), "-1")) {
+                        parentIds.add(locationType.getParentId());
+                    }
+                }
+            }
+            if (CollUtil.isNotEmpty(parentIds)) {
+                LambdaQueryWrapper<MonitorTargetRegion> locationTypeLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                locationTypeLambdaQueryWrapper.in(MonitorTargetRegion::getId, parentIds);
+                List<MonitorTargetRegion> parentLocationMenus = this.list(locationTypeLambdaQueryWrapper);
+                if (CollUtil.isNotEmpty(parentLocationMenus)) {
+                    this.fillParentLocationInfo(parentLocationMenus);
+                    resourceList.addAll(parentLocationMenus);
+                }
+            }
+        }
+    }
+
+    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
+        Set<Object> seen = ConcurrentHashMap.newKeySet();
+        return t -> seen.add(keyExtractor.apply(t));
+    }
 }