소스 검색

feat(adm-diagram): 专业-系统-系统实例树状结构接口

liyang 3 년 전
부모
커밋
50474f2c0d

+ 20 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/constant/Constants.java

@@ -23,4 +23,24 @@ public class Constants {
      * system
      */
     public static final String SYSTEM = "system";
+    /**
+     * major
+     */
+    public static final String MAJOR = "major";
+    /**
+     * type
+     */
+    public static final String TYPE = "type";
+    /**
+     * code
+     */
+    public static final String CODE = "code";
+    /**
+     * majorCode
+     */
+    public static final String MAJOR_CODE = "majorCode";
+    /**
+     * children
+     */
+    public static final String CHILDREN = "children";
 }

+ 10 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/controller/DiagramController.java

@@ -98,6 +98,16 @@ public class DiagramController {
     }
 
     /**
+     * 项目下的专业 -> 系统 ->系统实例 的树状结构数据
+     *
+     * @return 列表
+     */
+    @PostMapping("/major/system/instance")
+    public CommonResult<List<ObjectNode>> loadMajorSystemInstance() {
+        return ResultHelper.multi(dataStrategy.loadMajorSystemInstance());
+    }
+
+    /**
      * 根据系统图类型获取模板列表
      *
      * @param diagramType 系统图类型

+ 7 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/DataStrategy.java

@@ -72,4 +72,11 @@ public interface DataStrategy {
      * @return 实例列表
      */
     List<ObjectNode> loadSystemInstance(String projectId, String groupCode);
+
+    /**
+     * 项目下的专业 -> 系统 ->系统实例 的树状结构数据
+     *
+     * @return 列表
+     */
+    List<ObjectNode> loadMajorSystemInstance();
 }

+ 90 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/core/impl/DataStrategyImpl.java

@@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.adm.diagram.client.DicClient;
+import com.persagy.adm.diagram.client.RwdClient;
 import com.persagy.adm.diagram.constant.Constants;
 import com.persagy.adm.diagram.core.DataStrategy;
 import com.persagy.adm.diagram.core.model.Diagram;
@@ -22,12 +24,14 @@ import com.persagy.adm.diagram.entity.DiagramType;
 import com.persagy.adm.diagram.entity.LegendEntity;
 import com.persagy.adm.diagram.entity.ModelAdapter;
 import com.persagy.adm.diagram.entity.TemplateEntity;
+import com.persagy.adm.diagram.frame.BdtpRequest;
 import com.persagy.adm.diagram.util.ServiceUtil;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.client.DigitalRelationFacade;
 import com.persagy.dmp.digital.entity.ObjectDigital;
@@ -58,6 +62,10 @@ import java.util.stream.Collectors;
 public class DataStrategyImpl implements DataStrategy {
 
     @Autowired
+    private DicClient dicClient;
+    @Autowired
+    private RwdClient rwdClient;
+    @Autowired
     private ModelAdapter modelAdapter;
     @Autowired
     private ObjectMapper objectMapper;
@@ -508,4 +516,86 @@ public class DataStrategyImpl implements DataStrategy {
         List<ObjectNode> result = DigitalObjectFacade.query(groupCode, projectId, null, null, criteria);
         return result == null ? new ArrayList<>() : result;
     }
+
+    /**
+     * 项目下的专业 -> 系统 ->系统实例 的树状结构数据
+     *
+     * @return 列表
+     */
+    @Override
+    public List<ObjectNode> loadMajorSystemInstance() {
+        BdtpRequest req = BdtpRequest.getCurrent();
+        String groupCode = req.getGroupCode();
+        String projectId = req.getProjectId();
+        String appId = req.getAppId();
+        String userId = req.getUserId();
+        //查询专业
+        CompletableFuture<List<ObjectNode>> majorFuture = CompletableFuture.supplyAsync(() -> {
+            QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper);
+            criteria.getCriteria().put(Constants.TYPE, Constants.MAJOR);
+            CommonResult<List<ObjectNode>> result = dicClient.dataQuery(groupCode, projectId,
+                    appId, userId, criteria);
+            return result.getData();
+        }, executor);
+        //查询系统
+        CompletableFuture<List<ObjectNode>> systemFuture = CompletableFuture.supplyAsync(() -> {
+            QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, Constants.SYSTEM);
+            CommonResult<List<ObjectNode>> result = rwdClient.queryObjectType(groupCode, projectId,
+                    appId, userId, criteria);
+            return result.getData();
+        }, executor);
+        //查询系统实例
+        CompletableFuture<List<ObjectNode>> instanceFuture = CompletableFuture.supplyAsync(() -> {
+            QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, Constants.SYSTEM);
+            return DigitalObjectFacade.query(groupCode, projectId, appId, userId, criteria);
+        }, executor);
+
+        CompletableFuture.allOf(majorFuture, systemFuture, instanceFuture).join();
+
+        List<ObjectNode> result = null;
+        try {
+            result = buildMajorSystemInstance(majorFuture.get(), systemFuture.get(), instanceFuture.get());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 组装树状结构
+     *
+     * @param majorNodes    专业节点列表
+     * @param systemNodes   系统节点列表
+     * @param instanceNodes 系统实例节点列表
+     * @return
+     */
+    private List<ObjectNode> buildMajorSystemInstance(List<ObjectNode> majorNodes, List<ObjectNode> systemNodes,
+                                                      List<ObjectNode> instanceNodes) {
+        //TODO 是否会存在有些系统没有对应的专业、有些实例没有对应的系统
+        //组装系统和系统实例的树状结构
+        Optional.ofNullable(systemNodes).ifPresent(nodes -> nodes.stream().filter(Objects::nonNull).forEach(node -> {
+            String systemCode = node.get(Constants.CODE).asText();
+            Optional.ofNullable(instanceNodes).ifPresent(items -> {
+                List<ObjectNode> childrenList = items.stream().filter(Objects::nonNull).filter(item -> {
+                    JsonNode jsonNode = item.get(ObjectDigital.CLASS_CODE_HUM);
+                    return jsonNode != null && StrUtil.equalsIgnoreCase(jsonNode.asText(), systemCode);
+                }).collect(Collectors.toList());
+                ArrayNode children = node.putArray(Constants.CHILDREN);
+                children.addAll(childrenList);
+            });
+        }));
+        //组装专业和系统的树状结构
+        Optional.ofNullable(majorNodes).ifPresent(nodes -> nodes.stream().filter(Objects::nonNull).forEach(node -> {
+            String majorCode = node.get(Constants.CODE).asText();
+            Optional.ofNullable(systemNodes).ifPresent(items -> {
+                List<ObjectNode> childrenList = items.stream().filter(Objects::nonNull).filter(item -> {
+                    JsonNode jsonNode = item.get(Constants.MAJOR_CODE);
+                    return jsonNode != null && StrUtil.equalsIgnoreCase(jsonNode.asText(), majorCode);
+                }).collect(Collectors.toList());
+                ArrayNode children = node.putArray(Constants.CHILDREN);
+                children.addAll(childrenList);
+            });
+        }));
+        return majorNodes;
+    }
 }

+ 5 - 0
adm-business/adm-diagram/src/main/java/com/persagy/adm/diagram/demo/DemoDataStrategy.java

@@ -381,4 +381,9 @@ public class DemoDataStrategy implements DataStrategy {
 	public List<ObjectNode> loadSystemInstance(String projectId, String groupCode) {
 		return null;
 	}
+
+	@Override
+	public List<ObjectNode> loadMajorSystemInstance() {
+		return null;
+	}
 }