Browse Source

去掉查询关系的单项目限制

lijie 3 years ago
parent
commit
8826700cc0
22 changed files with 821 additions and 15 deletions
  1. 5 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/BusinessErrorRwdCode.java
  2. 29 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/CalRuleTypeEnum.java
  3. 3 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java
  4. 2 2
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/RelationCaclController.java
  5. 83 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/domain/CalculatingDTO.java
  6. 26 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/CalculateService.java
  7. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/RelationCaclService.java
  8. 33 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/CoordinateCalculateServiceImpl.java
  9. 70 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelChainCalculateServiceImpl.java
  10. 134 9
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCaclServiceImpl.java
  11. 51 0
      dmp-cloud/dmp-file/pom.xml
  12. 50 0
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/config/HDFSFileConfiguration.java
  13. 4 0
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/AccountDTO.java
  14. 32 0
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/init/InitRunner.java
  15. 8 1
      dmp-cloud/dmp-file/src/main/resources/bootstrap.yml
  16. 62 0
      dmp-cloud/dmp-file/src/main/resources/core-site.xml
  17. 137 0
      dmp-cloud/dmp-file/src/main/resources/hdfs-site.xml
  18. 21 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/CoordinateCalInfo.java
  19. 20 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RelationCalDTO.java
  20. 29 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RelationCalRuleDTO.java
  21. 5 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RequestData.java
  22. 16 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/define/entity/RelationDefine.java

+ 5 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/BusinessErrorRwdCode.java

@@ -21,7 +21,11 @@ public enum BusinessErrorRwdCode {
     A7305("A7305", ":错误的类型参考:这里的传感器包含车库摄像头,车位检测器,办公摄像头,火灾探测器,燃气探测器,漏电探测器,消防设备电源传感器,监控摄像头,入侵报警探测器,以及传感器系统下所有设备类型"),
     A7306("A7306", ":不符合主对象条件限制"),
     A7307("A7307", "图类型编码或边类型编码不能为空"),
-    A7308("A7308", "错误的关系计算策略");
+    A7308("A7308", "错误的关系计算策略"),
+    A7309("A7309", "边类型编码不存在"),
+    A7310("A7310", "前置关系中的图类型编码或边类型编码不能为空"),
+    A7311("A7311", "计算关系链为空"),
+    A7312("A7312", "计算器的类型不存在");
 
     private String code;
 

+ 29 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/CalRuleTypeEnum.java

@@ -0,0 +1,29 @@
+package com.persagy.dmp.rwd.basic.constant;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+/***
+ * Description: 计算规则种类
+ * @author : lijie
+ * @date :2021/9/8 10:48
+ * Update By lijie 2021/9/8 10:48
+ */
+@Getter
+public enum CalRuleTypeEnum {
+
+    REL_CHAIN("1","relChainCalculateService"),
+    COORDINATE("2","coordinateCalculateService");
+
+    CalRuleTypeEnum(String index, String beanName) {
+        this.index = index;
+        this.beanName = beanName;
+    }
+
+    private String index;
+    private String beanName;
+
+
+
+}

+ 3 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java

@@ -44,7 +44,9 @@ public class ObjectRelationController {
             throw new BusinessException(ResponseCode.A0400.getCode(), ResponseCode.A0400.getDesc());
         }
         //基础参数校验
-        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
+        // ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
+        // 2021年9月8日18:23:25 放开单项目限制
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE);
 
         QueryWrapper<ObjectRelation> wrapper = new QueryWrapper<>();
         // 添加所属项目条件

+ 2 - 2
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/RelationCaclController.java

@@ -8,7 +8,7 @@ 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.entity.ObjectRelation;
-import com.persagy.dmp.rwd.digital.service.RelationCaclService;
+import com.persagy.dmp.rwd.digital.service.RelationCalService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -29,7 +29,7 @@ import java.util.List;
 @RequiredArgsConstructor
 public class RelationCaclController {
 
-    private final RelationCaclService relationCaclService;
+    private final RelationCalService relationCaclService;
 
     /***
      * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系

+ 83 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/domain/CalculatingDTO.java

@@ -0,0 +1,83 @@
+package com.persagy.dmp.rwd.digital.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.persagy.dmp.define.entity.RelationDefine;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+import java.util.Set;
+
+/***
+ * Description: 计算关系中间结果存储类
+ * @author : lijie
+ * @date :2021/9/8 11:39
+ * Update By lijie 2021/9/8 11:39
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class CalculatingDTO {
+
+    /** 关系左侧id集合 */
+    @JsonAlias({"fromIds","from_ids"})
+    @JsonProperty("fromIds")
+    @JSONField(name = "fromIds",alternateNames = {"fromIds","from_ids"})
+    private Set<String> fromIds;
+    /** 关系右侧id集合 */
+    @JsonAlias({"toIds","to_ids"})
+    @JsonProperty("toIds")
+    @JSONField(name = "toIds",alternateNames = {"toIds","to_ids"})
+    private Set<String> toIds;
+    /** 主对象内容 */
+    @JsonAlias({"mainContent","main_content"})
+    @JsonProperty("mainContent")
+    @JSONField(name = "mainContent",alternateNames = {"mainContent","main_content"})
+    private String mainContent;
+    /** 从对象内容 */
+    @JsonAlias({"slaveContent","slave_content"})
+    @JsonProperty("slaveContent")
+    @JSONField(name = "slaveContent",alternateNames = {"slaveContent","slave_content"})
+    private Set<String> slaveContent;
+    /** 图类型编码 */
+    @JsonAlias({"graphCode","graph_code"})
+    @JsonProperty("graphCode")
+    @JSONField(name = "graphCode",alternateNames = {"graphCode","graph_code"})
+    private String graphCode;
+    /** 关系值 */
+    @JsonAlias({"relValue","rel_value"})
+    @JsonProperty("relValue")
+    @JSONField(name = "relValue",alternateNames = {"relValue","rel_value"})
+    private String relValue;
+    /** 关系Code */
+    @JsonAlias({"rel_code","relCode"})
+    @JsonProperty("relCode")
+    @JSONField(name = "relCode",alternateNames = {"rel_code","relCode"})
+    private String relCode;
+    /** 是否计算前置关系,true-计算,false-不计算.默认不计算 */
+    @JsonAlias({"calBeforeRelFlag","cal_before_rel_flag"})
+    @JsonProperty("calBeforeRelFlag")
+    @JSONField(name = "calBeforeRelFlag",alternateNames = {"calBeforeRelFlag","cal_before_rel_flag"})
+    private Boolean calBeforeRelFlag=false;
+    /** 关系定义映射 */
+    @JsonAlias({"relationDefineMap","relation_define_map"})
+    @JsonProperty("relationDefineMap")
+    @JSONField(name = "relationDefineMap",alternateNames = {"relationDefineMap","relation_define_map"})
+    private Map<String, RelationDefine> relationDefineMap;
+    /** 集团code */
+    private String groupCode;
+    /** 项目id */
+    private String projectId;
+    /** 应用APP */
+    private String appId;
+    /** 账号id */
+    private String accountId;
+
+
+
+}

+ 26 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/CalculateService.java

@@ -0,0 +1,26 @@
+package com.persagy.dmp.rwd.digital.service;
+
+import com.persagy.dmp.basic.dto.RelationCalDTO;
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
+import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
+
+import java.util.List;
+
+/***
+ * Description: 关系计算逻辑类
+ * @author : lijie
+ * @date :2021/9/8 16:46
+ * Update By lijie 2021/9/8 16:46
+ */
+public interface CalculateService {
+    /***
+     * Description: 计算关系逻辑
+     * @param calRule : 计算规则对象
+     * @param calculatingDTO : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/8 17:09
+     * Update By lijie 2021/9/8 17:09
+     */
+    void calculateRelation(RelationCalRuleDTO calRule, CalculatingDTO calculatingDTO);
+}

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/RelationCaclService.java

@@ -12,7 +12,7 @@ import java.util.List;
  * @date :2021/9/2 21:10
  * Update By lijie 2021/9/2 21:10
  */
-public interface RelationCaclService {
+public interface RelationCalService {
     /***
      * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系
      * @param requestData : 请求参数

+ 33 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/CoordinateCalculateServiceImpl.java

@@ -0,0 +1,33 @@
+package com.persagy.dmp.rwd.digital.service.impl;
+
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
+import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
+import com.persagy.dmp.rwd.digital.service.CalculateService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/***
+ * Description: 根据坐标计算关系的策略类
+ * @author : lijie
+ * @date :2021/9/8 17:02
+ * Update By lijie 2021/9/8 17:02
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CoordinateCalculateServiceImpl implements CalculateService {
+    /***
+     * Description: 根据坐标计算关系
+     * @param calRule : 计算规则
+     * @param calculatingDTO : 参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/8 17:14
+     * Update By lijie 2021/9/8 17:14
+     */
+    @Override
+    public void calculateRelation(RelationCalRuleDTO calRule, CalculatingDTO calculatingDTO) {
+
+    }
+}

+ 70 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelChainCalculateServiceImpl.java

@@ -0,0 +1,70 @@
+package com.persagy.dmp.rwd.digital.service.impl;
+
+import cn.hutool.core.util.EscapeUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.persagy.dmp.basic.dto.RelationCalDTO;
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
+import com.persagy.dmp.rwd.digital.service.CalculateService;
+import com.persagy.dmp.rwd.digital.service.IObjectRelationService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/***
+ * Description: 根据关系链计算关系的策略类
+ * @author : lijie
+ * @date :2021/9/8 17:03
+ * Update By lijie 2021/9/8 17:03
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class RelChainCalculateServiceImpl implements CalculateService {
+
+    private final IObjectRelationService objectRelationService;
+
+
+    /***
+     * Description: 根据关系链计算关系
+     * @param calRule : 计算规则
+     * @param calculatingDTO : 参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/8 17:10
+     * Update By lijie 2021/9/8 17:10
+     */
+    @Override
+    @Transactional
+    public void calculateRelation(RelationCalRuleDTO calRule, CalculatingDTO calculatingDTO) {
+        // 1.删除该类关系
+        LambdaQueryWrapper<ObjectRelation> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(ObjectRelation::getGraphCode,calculatingDTO.getGraphCode());
+        queryWrapper.eq(ObjectRelation::getRelCode,calculatingDTO.getRelCode());
+        if (StrUtil.isNotBlank(calculatingDTO.getRelValue())){
+            queryWrapper.eq(ObjectRelation::getRelValue,calculatingDTO.getRelValue());
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getGroupCode())){
+            queryWrapper.eq(ObjectRelation::getGroupCode,calculatingDTO.getGroupCode());
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getProjectId())){
+            queryWrapper.eq(ObjectRelation::getProjectId,calculatingDTO.getProjectId());
+        }
+        objectRelationService.remove(queryWrapper);
+
+
+        List<RelationCalDTO> chain = calRule.getDependentRelChain();
+
+
+        // 2.根据链的关系计算,链的首尾
+
+
+
+
+    }
+}

+ 134 - 9
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCaclServiceImpl.java

@@ -7,23 +7,27 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.persagy.dmp.basic.dto.RelationCalDTO;
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.context.AppContext;
 import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.define.entity.RelationDefine;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.dmp.digital.entity.RelationCalSign;
 import com.persagy.dmp.digital.entity.RelationProjectCal;
 import com.persagy.dmp.rwd.basic.constant.BusinessErrorRwdCode;
+import com.persagy.dmp.rwd.basic.constant.CalRuleTypeEnum;
+import com.persagy.dmp.rwd.define.service.IRelationDefineService;
 import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
-import com.persagy.dmp.rwd.digital.service.IObjectRelationService;
-import com.persagy.dmp.rwd.digital.service.RelationCaclService;
-import com.persagy.dmp.rwd.digital.service.RelationCalSignService;
-import com.persagy.dmp.rwd.digital.service.RelationProjectCalService;
+import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
+import com.persagy.dmp.rwd.digital.service.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -36,12 +40,13 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 @RequiredArgsConstructor
-public class RelationCaclServiceImpl implements RelationCaclService {
+public class RelationCalServiceImpl implements RelationCalService {
 
     private final ObjectDigitalMapper objectDigitalMapper;
     private final IObjectRelationService objectRelationService;
     private final RelationCalSignService relationCalSignService;
     private final RelationProjectCalService relationProjectCalService;
+    private final IRelationDefineService relationDefineService;
 
 
     /***
@@ -209,12 +214,132 @@ public class RelationCaclServiceImpl implements RelationCaclService {
      */
     @Override
     public CommonResult<List<ObjectRelation>> calculatingObjRelation(RequestData requestData) {
-//        CalculatingRelationService relationService = calculatingRelationContext
-//                .getCalculatingRelationService(requestData.getGraphCode(),
-//                        requestData.getRelCode(), requestData.getRelValue());
-//        relationService.handle(requestData);
+        // 拷贝参数到计算对象中
+        CalculatingDTO calculatingDTO = copyRequestDataToDTO(requestData);
+        // 1.应用fast-fail机制,先校验一下数据正确性,如果不正确拒绝计算
+        // calculationRelationDatas(requestData);
+        // 1.查询所有边类型数据
+        // 因为边类型数据<200,所有数据大小在100KB以下,为了减少查询次数,所以一次查询,重复使用
+        LambdaQueryWrapper<RelationDefine> queryWrapper = new LambdaQueryWrapper<>();
+        //queryWrapper.eq(RelationDefine::getGraphCode,requestData.getGraphCode());
+        //queryWrapper.eq(RelationDefine::getCode,requestData.getRelCode());
+        queryWrapper.eq(BaseEntity::getValid,true);
+        List<RelationDefine> relationDefines = relationDefineService.queryByCondition(queryWrapper);
+        if (CollUtil.isEmpty(relationDefines)){
+            throw new BusinessException(BusinessErrorRwdCode.A7309.getCode(),BusinessErrorRwdCode.A7309.getDesc());
+        }
+        // 2.获得当前关系定义并计算其前置关系,计算自己的关系
+        Optional<RelationDefine> currentRelationDefineList = relationDefines.stream()
+                .filter(relationDefine ->
+                        relationDefine.getGraphCode().equals(calculatingDTO.getGraphCode())
+                                && relationDefine.getCode().equals(calculatingDTO.getRelCode()))
+                .findFirst();
+        if (!currentRelationDefineList.isPresent()){
+            throw new BusinessException(BusinessErrorRwdCode.A7309.getCode(),BusinessErrorRwdCode.A7309.getDesc());
+        }
+        RelationDefine currentRelationDefine = currentRelationDefineList.get();
+        Map<String, RelationDefine> relationDefineMap = relationDefines.stream().collect(Collectors.toMap(relationDefine ->
+                        relationDefine.getGraphCode() + StrUtil.UNDERLINE + relationDefine.getCode(),
+                relationDefine -> relationDefine, (k1, k2) -> k1));
+        calculatingDTO.setRelationDefineMap(relationDefineMap);
+        // 2.1 前置关系是否存在,如果存在先处理前置关系
+        handlePreRelation(currentRelationDefine,calculatingDTO);
+
+
+
+
         return ResultHelper.multi(new ArrayList<>(),0L);
     }
+    /***
+     * Description: 拷贝请求参数到DTO中
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.rwd.digital.domain.CalculatingDTO
+     * @author : lijie
+     * @date :2021/9/8 14:56
+     * Update By lijie 2021/9/8 14:56
+     */
+    private CalculatingDTO copyRequestDataToDTO(RequestData requestData) {
+        return CalculatingDTO.builder()
+                .graphCode(requestData.getGraphCode())
+                .relCode(requestData.getRelCode())
+                .mainContent(requestData.getMainContent())
+                .slaveContent(requestData.getSlaveContent())
+                .relValue(requestData.getRelValue())
+                .calBeforeRelFlag(requestData.getCalBeforeRelFlag())
+                .groupCode(AppContext.getContext().getGroupCode())
+                .projectId(AppContext.getContext().getProjectId())
+                .appId(AppContext.getContext().getAppId())
+                .accountId(AppContext.getContext().getAccountId())
+                .build();
+    }
+
+    /***
+     * Description: 计算关系前先校验一下数据(fast-fail)
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.rwd.digital.domain.CalculatingDTO
+     * @author : lijie
+     * @date :2021/9/8 11:44
+     * Update By lijie 2021/9/8 11:44
+     */
+    private void calculationRelationDatas(RequestData requestData) {
+
+
+
+    }
+
+    /***
+     * Description: 计算前置关系
+     * @param currentRelationDefine : 当前关系定义
+     * @param calculatingDTO : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/8 11:03
+     * Update By lijie 2021/9/8 11:03
+     */
+    private void handlePreRelation(RelationDefine currentRelationDefine, CalculatingDTO calculatingDTO) {
+        if (CollUtil.isEmpty(currentRelationDefine.getBeforeCalRels())){
+            return;
+        }
+        if (!calculatingDTO.getCalBeforeRelFlag()){
+            return;
+        }
+        List<RelationCalDTO> beforeCalRels = currentRelationDefine.getBeforeCalRels();
+        Map<String, RelationDefine> relationDefineMap = calculatingDTO.getRelationDefineMap();
+        String prefixDefineObjType = "";
+        int size = beforeCalRels.size();
+        for (int i = 0; i < size; i++) {
+            RelationCalDTO relationCalDTO = beforeCalRels.get(i);
+            if (StrUtil.isBlank(relationCalDTO.getGraphCode())
+                    || StrUtil.isBlank(relationCalDTO.getRelCode())){
+                throw new BusinessException(BusinessErrorRwdCode.A7307.getCode(),BusinessErrorRwdCode.A7307.getDesc());
+            }
+            String tempKey = relationCalDTO.getGraphCode()+StrUtil.UNDERLINE+relationCalDTO.getRelCode();
+            if (!relationDefineMap.containsKey(tempKey)){
+                throw new BusinessException(BusinessErrorRwdCode.A7309.getCode(),BusinessErrorRwdCode.A7309.getDesc());
+            }
+            RelationDefine relationDefine = relationDefineMap.get(tempKey);
+            RelationCalRuleDTO calRules = relationDefine.getCalRules();
+            if (!(CalRuleTypeEnum.REL_CHAIN.getIndex().equals(calRules.getCalRuleType())
+                || CalRuleTypeEnum.COORDINATE.getIndex().equals(calRules.getCalRuleType()))){
+                throw new BusinessException(BusinessErrorRwdCode.A7312.getCode(),BusinessErrorRwdCode.A7312.getDesc());
+            }
+            if (CalRuleTypeEnum.REL_CHAIN.getIndex().equals(calRules.getCalRuleType())){
+                CalculateService calculateService = SpringHelper
+                        .getBean(CalRuleTypeEnum.REL_CHAIN.getBeanName(), CalculateService.class);
+                calculateService.calculateRelation(calRules,calculatingDTO);
+            }
+
+
+        }
+
+
+
+
+
+
+
+
+    }
 
     /***
      * Description: 根据项目id和图类型编码及关系类型编码更新计算时间

+ 51 - 0
dmp-cloud/dmp-file/pom.xml

@@ -16,19 +16,70 @@
         <dependency>
             <groupId>com.persagy</groupId>
             <artifactId>integrated-config-client</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <!-- 项目启动 -->
         <dependency>
             <groupId>com.persagy</groupId>
             <artifactId>dmp-server</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
             <artifactId>dmp-mybatis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
             <artifactId>dmp-file-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+            <version>2.5.1</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>slf4j-api</artifactId>
+                    <groupId>org.slf4j</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>log4j</artifactId>
+                    <groupId>log4j</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-hdfs</artifactId>
+            <version>2.5.1</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
+            <version>1.7.32</version>
+        </dependency>
+
     </dependencies>
 </project>

+ 50 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/config/HDFSFileConfiguration.java

@@ -0,0 +1,50 @@
+package com.persagy.dmp.file.config;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.file.service.IFileService;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Map;
+
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "persagy.hdfs.file")
+public class HDFSFileConfiguration {
+
+    private static Map<String,String> accounts;
+
+    /***
+     * Description: 根据账号id获取密码
+     * @param accountId : 账号id
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/7 22:43
+     * Update By lijie 2021/9/7 22:43
+     */
+    public static String getSecretById(String accountId){
+        if (MapUtil.isEmpty(accounts)){
+            return StrUtil.EMPTY;
+        }
+        return accounts.getOrDefault(accountId, StrUtil.EMPTY);
+    }
+    /***
+     * Description: 根据账号id获取密码
+     * @param accountId : 账号id
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/7 22:43
+     * Update By lijie 2021/9/7 22:43
+     */
+    public static Boolean checkAccountExists(String accountId){
+        if (MapUtil.isEmpty(accounts)){
+            return false;
+        }
+        return accounts.containsKey(accountId);
+    }
+
+
+}

+ 4 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/AccountDTO.java

@@ -0,0 +1,4 @@
+package com.persagy.dmp.file.domain;
+
+public class AccountDTO {
+}

+ 32 - 0
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/init/InitRunner.java

@@ -0,0 +1,32 @@
+package com.persagy.dmp.file.init;
+
+import com.persagy.dmp.common.helper.SpringHelper;
+import com.persagy.dmp.mybatis.dao.DbDao;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.core.annotation.Order;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import java.net.InetAddress;
+
+@Component
+@Order(1)
+@Slf4j
+public class InitRunner implements CommandLineRunner {
+
+    @Override
+    public void run(String... args){
+        log.warn("dmp-file应用初始化开始......");
+        try {
+            // 1.配置hdoop环境变量
+            System.setProperty("HADOOP_USER_NAME", SpringHelper.getString("hadoop.user.name","hadoop"));
+        } catch (Exception e) {
+            log.error("dmp-file应用初始化失败",e);
+        }
+        log.warn("dmp-file应用初始化结束......");
+    }
+
+}

+ 8 - 1
dmp-cloud/dmp-file/src/main/resources/bootstrap.yml

@@ -24,4 +24,11 @@ persagy:
     file:
       url: http://192.168.25.129:9000/
       accessKey: admin
-      secretKey: 12345678
+      secretKey: 12345678
+  hdfs:
+    file:
+      accounts:
+        dev: 123
+        saas: 46f869eea8b31d14
+        superClass: 90b92e6f71b47b31
+        revit: 63afbef6906c342b

+ 62 - 0
dmp-cloud/dmp-file/src/main/resources/core-site.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License. See accompanying LICENSE file.
+-->
+
+<!-- Put site-specific property overrides in this file. -->
+
+<configuration>
+    <property>
+        <name>fs.defaultFS</name>
+        <value>hdfs://node1:8020</value>
+    </property>
+    <property>
+        <name>hadoop.tmp.dir</name>
+        <value>file:/var/hadoop/tmp</value>
+    </property>
+    <property>
+        <name>hadoop.logfile.size</name>
+        <value>10000000</value>
+    </property>
+    <property>
+        <name>hadoop.logfile.count</name>
+        <value>10</value>
+    </property>
+
+<property>
+	<name>hadoop.security.authentication</name>
+	<value>kerberos</value>
+</property> 
+<property>
+	<name>hadoop.security.authorization</name>
+	<value>true</value>
+</property>
+<property>
+	<name>hadoop.rpc.protection</name>
+	<value>authentication</value>
+</property>
+<property>
+	<name>hadoop.http.authentication.type</name>
+	<value>kerberos</value>
+</property>
+<property>
+	<name>hadoop.rpc.protection</name>
+	<value>privacy</value>
+</property>
+<property>
+	<name>hadoop.http.authentication.kerberos.keytab</name>
+	<value>/var/security/keytab/kerberos.keytab</value>
+</property>
+
+</configuration>

+ 137 - 0
dmp-cloud/dmp-file/src/main/resources/hdfs-site.xml

@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<!--
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License. See accompanying LICENSE file.
+-->
+
+<!-- Put site-specific property overrides in this file. -->
+
+<configuration>
+    <!-- comma-separated directory for backup -->
+    <property>
+        <name>dfs.namenode.name.dir</name>
+        <value>file:/mnt/data-disk-1/name</value>
+    </property>
+    <!-- comma-separated directory for backup -->
+    <property>
+        <name>dfs.namenode.checkpoint.dir</name>
+        <value>file:/mnt/data-disk-1/namesecondary</value>
+    </property>
+    <!-- comma-separated directory for round-robin -->
+    <property>
+        <name>dfs.datanode.data.dir</name>
+        <value>file:/mnt/data-disk-1/datanode,file:/mnt/data-disk-2/datanode</value>
+    </property>
+    <property>
+        <name>dfs.replication</name>
+        <value>1</value>
+    </property>
+    <property>
+        <name>dfs.namenode.http-address</name>
+        <value>node1:50070</value>
+    </property>
+    <property>
+        <name>dfs.namenode.secondary.http-address</name>
+        <value>node1:50090</value>
+    </property>
+    <property>
+        <name>dfs.hosts.exclude</name>
+        <value>/var/hadoop/conf/excludes</value>
+    </property>
+	<property>
+		<name>dfs.encrypt.data.transfer</name>  
+		<value>true</value>  
+	</property>
+
+	<property>
+		<name>dfs.datanode.data.dir.perm</name>  
+		<value>700</value>  
+	</property>	
+	<property>
+		<name>dfs.datanode.address</name>
+		<value>0.0.0.0:50070</value>
+	</property>
+	<property>
+		<name>dfs.datanode.http.address</name>
+		<value>0.0.0.0:50075</value>
+	</property>
+	<property>
+		<name>dfs.block.access.token.enable</name>
+		<value>true</value>
+	</property>
+	<property>
+		<name>dfs.http.policy</name>
+		<value>HTTPS_ONLY</value>
+	</property>
+	<property>
+		<name>dfs.data.transfer.protection</name>
+		<value>integrity</value>
+	</property>
+	
+	<property>
+		<name>dfs.namenode.keytab.file</name>
+		<value>/var/security/keytab/kerberos.keytab</value>
+	</property>
+	<property>
+		<name>dfs.namenode.kerberos.principal</name>
+		<value>hadoop/_HOST@HADOOP.COM</value>
+	</property>
+	<property>
+		<name>dfs.namenode.kerberos.internal.spnego.principal</name>
+		<value>HTTP/_HOST@HADOOP.COM</value>
+	</property>
+	<property>
+		<name>dfs.secondary.namenode.keytab.file</name>
+		<value>/var/security/keytab/kerberos.keytab</value>
+	</property>
+	<property>
+		<name>dfs.secondary.namenode.kerberos.principal</name>
+		<value>hadoop/_HOST@HADOOP.COM</value>
+	</property>
+	<property>
+		<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
+		<value>HTTP/_HOST@HADOOP.COM</value>
+	</property>
+	
+	<property>
+		<name>dfs.web.authentication.kerberos.keytab</name>
+		<value>/var/security/keytab/kerberos.keytab</value>
+	</property>
+	<property>
+		<name>dfs.web.authentication.kerberos.principal</name>
+		<value>HTTP/_HOST@HADOOP.COM</value>
+	</property>
+	
+	<property>
+		<name>dfs.datanode.keytab.file</name>
+		<value>/var/security/keytab/kerberos.keytab</value>
+	</property>	
+	<property>
+		<name>dfs.datanode.kerberos.principal</name>
+		<value>hadoop/_HOST@HADOOP.COM</value>
+	</property>
+	
+	<property>
+		<name>dfs.journalnode.keytab.file</name>
+		<value>/var/security/keytab/kerberos.keytab</value>
+	</property> 
+	<property>
+		<name>dfs.journalnode.kerberos.principal</name>
+		<value>hadoop/_HOST@HADOOP.COM</value>
+	</property> 
+	<property>
+		<name>dfs.journalnode.kerberos.internal.spnego.principal</name>
+		<value>${dfs.web.authentication.kerberos.principal}</value>
+	</property>
+
+</configuration>

+ 21 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/CoordinateCalInfo.java

@@ -0,0 +1,21 @@
+package com.persagy.dmp.basic.dto;
+
+import lombok.Data;
+
+/***
+ * Description: 图计算信息类
+ * @author : lijie
+ * @date :2021/9/7 20:53
+ * Update By lijie 2021/9/7 20:53
+ */
+@Data
+public class CoordinateCalInfo {
+    /**左侧计算坐标的信息点code*/
+    private String fromInfoCode;
+    /**右侧计算坐标的信息点code*/
+    private String toInfoCode;
+
+
+
+
+}

+ 20 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RelationCalDTO.java

@@ -0,0 +1,20 @@
+package com.persagy.dmp.basic.dto;
+
+import lombok.Data;
+
+/***
+ * Description: 关系DTO
+ * @author : lijie
+ * @date :2021/9/7 16:35
+ * Update By lijie 2021/9/7 16:35
+ */
+@Data
+public class RelationCalDTO {
+    /**图类型编码*/
+    private String graphCode;
+    /**关系编码*/
+    private String relCode;
+    /**空间类型编码*/
+    private String relValue;
+
+}

+ 29 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RelationCalRuleDTO.java

@@ -0,0 +1,29 @@
+package com.persagy.dmp.basic.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/***
+ * Description: 关系规则DTO
+ * @author : lijie
+ * @date :2021/9/7 20:45
+ * Update By lijie 2021/9/7 20:45
+ */
+@Data
+public class RelationCalRuleDTO {
+    /**计算规则类型,1-通过关系链计算,2-通过平面图坐标计算*/
+    private String calRuleType;
+    /**计算规则类型为1时的关系计算链*/
+    private List<RelationCalDTO> dependentRelChain;
+    /**计算规则类型为2时的坐标计算信息点code*/
+    private CoordinateCalInfo graphCalInfo;
+
+
+
+
+
+
+
+
+}

+ 5 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RequestData.java

@@ -302,4 +302,9 @@ public class RequestData {
     @JsonProperty("filterSigns")
     @JSONField(name = "filterSigns",alternateNames = {"filterSigns","filter_signs"})
     private Set<String> filterSigns;
+    /** 是否计算前置关系,true-计算,false-不计算.默认不计算 */
+    @JsonAlias({"calBeforeRelFlag","cal_before_rel_flag"})
+    @JsonProperty("calBeforeRelFlag")
+    @JSONField(name = "calBeforeRelFlag",alternateNames = {"calBeforeRelFlag","cal_before_rel_flag"})
+    private Boolean calBeforeRelFlag=false;
 }

+ 16 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/define/entity/RelationDefine.java

@@ -1,12 +1,16 @@
 package com.persagy.dmp.define.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
+import com.persagy.dmp.basic.dto.RelationCalDTO;
 import com.persagy.dmp.common.model.entity.AuditableEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * 关系定义
@@ -37,4 +41,16 @@ public class RelationDefine extends AuditableEntity {
     private String targetObjs;
     /** 备注 */
     private String remark;
+    /** 计算关系之前需要计算的关系 */
+    @TableField(exist = false)
+    private List<RelationCalDTO> beforeCalRels;
+    /** 计算关系之前需要计算的关系 */
+    @TableField(exist = false)
+    private RelationCalRuleDTO calRules;
+    /** 关系左侧的对象分类 */
+    @TableField(exist = false)
+    private String fromObjType;
+    /** 关系右侧的对象分类 */
+    @TableField(exist = false)
+    private String toObjType;
 }