Browse Source

修复queryObjectListSuperiorId接口可以查询到关系已删除的bug
修复queryEquipListByConditions接口传classCode查不到数据的bug

lijie 3 years ago
parent
commit
bd531c30c5

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

@@ -24,7 +24,8 @@ public enum BusinessErrorRwdCode {
     A7308("A7308", "关系计算策略错误"),
     A7309("A7309", "边类型编码不存在"),
     A7310("A7310", "计算关系链为空"),
-    A7311("A7311", "计算器的类型不存在");
+    A7311("A7311", "计算器的类型不存在"),
+    A7312("A7312", "关系两侧的对象分类不存在");
 
     private String code;
 

+ 11 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/CalRuleTypeEnum.java

@@ -1,8 +1,15 @@
 package com.persagy.dmp.rwd.basic.constant;
 
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.EnumUtil;
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang3.EnumUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /***
  * Description: 计算规则种类
@@ -24,6 +31,9 @@ public enum CalRuleTypeEnum {
     private String index;
     private String beanName;
 
-
+    public static Map<String,String> getCalRuleTypeMap(){
+        List<CalRuleTypeEnum> enumList = EnumUtils.getEnumList(CalRuleTypeEnum.class);
+        return enumList.stream().collect(Collectors.toMap(CalRuleTypeEnum::getIndex,CalRuleTypeEnum::getBeanName));
+    }
 
 }

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

@@ -297,7 +297,7 @@ public class ObjectDigitalController{
         if (StrUtil.isNotBlank(requestData.getClassCode())){
             ObjectNode classCodeObj = objectMapper.createObjectNode();
             classCodeObj.put(QueryOperator.LIKE_RIGHT.getIndex(),requestData.getClassCode());
-            objectNode.put(ObjectDigital.CLASS_CODE,classCodeObj);
+            objectNode.put(ObjectDigital.CLASS_CODE_HUM,classCodeObj);
         }
         // 楼层id
         if (StrUtil.isNotBlank(requestData.getFloorId())){
@@ -338,6 +338,7 @@ public class ObjectDigitalController{
             objectNode.put(ObjectDigital.LOCAL_NAME_HUM,keywordObj);
         }
         objectNode.put(ObjectDigital.OBJ_TYPE_HUM, DigitalObjectType.EQUIPMENT.getIndex());
+        objectNode.put(ObjectDigital.PROP_VALID,Boolean.TRUE);
         queryCriteria.setCriteria(objectNode);
         return query(queryCriteria);
     }

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

@@ -81,6 +81,8 @@ public class CalculatingDTO {
     private String accountId;
     /** 关系链 */
     private List<RelationCalDTO> chain;
+    /** 关系定义 */
+    private RelationDefine relationDefine;
 
 
 

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

@@ -1,12 +1,23 @@
 package com.persagy.dmp.rwd.digital.service.impl;
 
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.persagy.dmp.basic.dto.CoordinateCalInfo;
+import com.persagy.dmp.basic.dto.RelationCalDTO;
 import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.rwd.basic.constant.BusinessErrorRwdCode;
 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;
 
+import java.util.List;
+import java.util.Map;
+
 /***
  * Description: 根据坐标计算关系的策略类
  * @author : lijie
@@ -28,6 +39,16 @@ public class CoordinateCalculateServiceImpl implements CalculateService {
      */
     @Override
     public void calculateRelation(RelationCalRuleDTO calRule, CalculatingDTO calculatingDTO) {
+        CoordinateCalInfo graphCalInfo = calRule.getGraphCalInfo();
+        RelationDefine relationDefine = calculatingDTO.getRelationDefine();
+        if (StrUtil.isBlank(relationDefine.getFromObjType()) || StrUtil.isBlank(relationDefine.getToObjType())){
+            throw new BusinessException(BusinessErrorRwdCode.A7312.getCode(),BusinessErrorRwdCode.A7312.getDesc());
+        }
+
+
+
+
+
 
     }
 }

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

@@ -63,14 +63,9 @@ public class RelChainCalculateServiceImpl implements CalculateService {
         if (StrUtil.isNotBlank(calculatingDTO.getProjectId())){
             queryWrapper.eq(ObjectRelation::getProjectId,calculatingDTO.getProjectId());
         }
-        //objectRelationService.remove(queryWrapper);
+        objectRelationService.remove(queryWrapper);
         // 2.根据链的关系计算,链的首尾
         calculatingDTO.setChain(calRule.getDependentRelChain());
         objectRelationMapper.insertObjectRelationByRelChain(calculatingDTO);
-
-
-
-
-
     }
 }

+ 24 - 28
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCalServiceImpl.java

@@ -205,7 +205,7 @@ public class RelationCalServiceImpl implements RelationCalService {
         return ResultHelper.multi(objectRelations,objectRelations.size());
     }
     /***
-     * Description: 关系计算
+     * Description: 关系计算(整体计算采用fast-fail机制处理,遇到失败立即中止,不进行计算)
      * @param requestData : 请求参数
      * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.digital.entity.ObjectRelation>>
      * @author : lijie
@@ -213,6 +213,7 @@ public class RelationCalServiceImpl implements RelationCalService {
      * Update By lijie 2021/9/7 14:36
      */
     @Override
+    @Transactional
     public CommonResult<List<ObjectRelation>> calculatingObjRelation(RequestData requestData) {
         // 拷贝参数到计算对象中
         CalculatingDTO calculatingDTO = copyRequestDataToDTO(requestData);
@@ -303,42 +304,37 @@ public class RelationCalServiceImpl implements RelationCalService {
         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);
+        // {规则索引值:对应的算法类名称},用枚举记录计算策略实体类名称
+        Map<String, String> calRuleTypeMap = CalRuleTypeEnum.getCalRuleTypeMap();
+        for (RelationCalDTO relationCalDTO : beforeCalRels) {
+            // 图类型编码与关系编码为空时抛出异常
             if (StrUtil.isBlank(relationCalDTO.getGraphCode())
-                    || StrUtil.isBlank(relationCalDTO.getRelCode())){
-                throw new BusinessException(BusinessErrorRwdCode.A7307.getCode(),BusinessErrorRwdCode.A7307.getDesc());
+                    || 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());
+            // 关系定义不存在抛出异常
+            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.A7308.getCode(),BusinessErrorRwdCode.A7308.getDesc());
-            }
-            if (CalRuleTypeEnum.REL_CHAIN.getIndex().equals(calRules.getCalRuleType())){
-                CalculateService calculateService = SpringHelper
-                        .getBean(CalRuleTypeEnum.REL_CHAIN.getBeanName(), CalculateService.class);
-                calculateService.calculateRelation(calRules,calculatingDTO);
+            if (!calRuleTypeMap.containsKey(calRules.getCalRuleType())) {
+                throw new BusinessException(BusinessErrorRwdCode.A7308.getCode(), BusinessErrorRwdCode.A7308.getDesc());
             }
-
-
+            // 因为根据空间坐标计算关系需要知道关系两侧对应的对象分类,所以这里直接冗余存储一下关系定义对象
+            calculatingDTO.setRelationDefine(relationDefine);
+            // 获取策略类的bean
+            CalculateService calculateService = SpringHelper
+                    .getBean(calRuleTypeMap.get(calRules.getCalRuleType()), CalculateService.class);
+            // 根据计算规则和参数计算关系
+            calculateService.calculateRelation(calRules, calculatingDTO);
         }
-
-
-
-
-
-
-
-
     }
 
     /***

+ 1 - 1
dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml

@@ -123,7 +123,7 @@
         FROM dt_object AS dto
         LEFT JOIN (SELECT * FROM dt_relation AS dtrA WHERE dtrA.obj_to=#{param.filterObjId} OR
         dtrA.obj_from=#{param.filterObjId}) AS dtr ON dtr.obj_to=dto.id
-        WHERE 1=1
+        WHERE 1=1 AND dtr.valid=TRUE
         <include refid="commonJoinQueryParam">
             <property name="param" value="#{param}"/>
         </include>

+ 2 - 2
dmp-business/dmp-rwd/src/main/resources/mapper/ObjectRelationMapper.xml

@@ -101,7 +101,7 @@
         <if test="null!=param.chain and param.chain.size()>0">
             SELECT
             dtr0.obj_from AS obj_from,
-            dtr${chain.size()-1}.obj_to AS obj_to,
+            dtr${param.chain.size()-1}.obj_to AS obj_to,
             dtr0.group_code AS group_code,
             dtr0.project_id AS project_id
             FROM
@@ -133,7 +133,7 @@
                           AND valid = TRUE
                     ) AS dtr${index}
                 </when>
-                <when test="index==chain.size()-1">
+                <when test="index==param.chain.size()-1">
                     INNER JOIN (SELECT if(#{rule.currentRelDirection},obj_to,obj_from) AS obj_to,if(true,obj_from,obj_to) AS obj_from FROM dt_relation WHERE
                     (
                     1=1

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

@@ -14,6 +14,8 @@ public class CoordinateCalInfo {
     private String fromInfoCode;
     /**右侧计算坐标的信息点code*/
     private String toInfoCode;
+    /**是否从文件key查询对应业务id作为关系侧id*/
+    private String calRelFromFileRelFlag;