Procházet zdrojové kódy

实现根据图坐标计算关系的计算器

lijie před 3 roky
rodič
revize
ad8631865a
15 změnil soubory, kde provedl 486 přidání a 28 odebrání
  1. 18 0
      dmp-business/dmp-rwd/pom.xml
  2. 13 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/DigitalCommonUtils.java
  3. 79 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/GeoToolsUtil.java
  4. 11 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/TestController.java
  5. 28 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/ObjectDigitalMapper.java
  6. 3 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/domain/CalculatingDTO.java
  7. 3 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/IObjectDigitalService.java
  8. 217 4
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/CoordinateCalculateServiceImpl.java
  9. 6 7
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java
  10. 2 13
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCalServiceImpl.java
  11. 1 1
      dmp-business/dmp-rwd/src/main/resources/db/init/data.sql
  12. 92 0
      dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml
  13. 4 2
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/CoordinateCalInfo.java
  14. 7 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectDigital.java
  15. 2 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectRelation.java

+ 18 - 0
dmp-business/dmp-rwd/pom.xml

@@ -10,8 +10,26 @@
     <modelVersion>4.0.0</modelVersion>
     <artifactId>dmp-rwd</artifactId>
     <packaging>jar</packaging>
+    <repositories>
+        <repository>
+            <id>osgeo</id>
+            <name>Open Source Geospatial Foundation Repository</name>
+            <url>https://repo.osgeo.org/repository/release/</url>
+        </repository>
+    </repositories>
 
     <dependencies>
+        <dependency>
+            <groupId>org.geotools</groupId>
+            <artifactId>gt-main</artifactId>
+            <version>25.2</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>javax</groupId>
+                    <artifactId>javaee-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <!-- 配置中心(包含注册中心) -->
         <dependency>
             <groupId>com.persagy</groupId>

+ 13 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/DigitalCommonUtils.java

@@ -2,6 +2,7 @@ package com.persagy.dmp.rwd.basic.utils;
 
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectTypeShort;
 
@@ -57,4 +58,16 @@ public class DigitalCommonUtils {
             return "";
         }
     }
+
+    /***
+     * Description: 获取默认的图实例id
+     * @param graphCode : 图类型编码
+     * @return : java.lang.String
+     * @author : lijie
+     * @date :2021/9/3 16:07
+     * Update By lijie 2021/9/3 16:07
+     */
+    public static String getDefaultGraphIdByGraphCode(String graphCode) {
+        return StrUtil.format(CommonConstant.DEFAULT_GRAPH_ID_FORMAT,graphCode);
+    }
 }

+ 79 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/GeoToolsUtil.java

@@ -0,0 +1,79 @@
+package com.persagy.dmp.rwd.basic.utils;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.geotools.geometry.jts.JTSFactoryFinder;
+import org.locationtech.jts.geom.*;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+
+/**
+ * @ClassName GeoToolsUtil
+ * @Description: 点面包含关系分析
+ * @Author linhuili
+ * @Date 2021/9/3 20:31
+ * @Version V1.0
+ **/
+public class GeoToolsUtil {
+    /**
+     * 创建点
+     * @param pointLocal
+     */
+    private static Point createPoint(ObjectNode pointLocal){
+        double x =0L;
+        double y =0L;
+        double z =0L;
+        if(pointLocal.get("X") != null){
+            x =pointLocal.get("X").doubleValue();
+        }
+        if(pointLocal.get("Y") != null){
+            y = pointLocal.get("Y").doubleValue();
+        }
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        Coordinate coord = new Coordinate(x, y,z);
+        Point point = geometryFactory.createPoint(coord);
+        return point;
+    }
+
+    /**
+     * 创建面
+     * @param outLines
+     */
+    private static Polygon createPolygon(List<LinkedHashMap<String,Object>> outLines){
+        GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
+        List<Coordinate> objects = new ArrayList<>();
+        for (LinkedHashMap<String,Object> outLine : outLines) {
+            double x = Double.parseDouble(outLine.getOrDefault("X",0.0D).toString());
+            double y = Double.parseDouble(outLine.getOrDefault("Y",0.0D).toString());
+            double z = 0L;
+            Coordinate coordinate = new Coordinate(x, y, z);
+            objects.add(coordinate);
+        }
+        //注意数据的闭合
+        Coordinate[] coordinates = objects.toArray(new Coordinate[0]);
+        LinearRing ring = geometryFactory.createLinearRing(coordinates);
+        LinearRing holes[] = null;
+        Polygon polygon = geometryFactory.createPolygon(ring, holes);
+
+        return polygon;
+   }
+
+    /**
+     * 点面包含关系判断
+     * 用途:判断一个面是否包含一个点,即一个点是否在一个面内
+     * @param pointLocal 坐标点
+     * @param outLines 轮廓线
+     * @return
+     */
+   public static Boolean isPointInPoly(ObjectNode pointLocal, List<LinkedHashMap<String,Object>> outLines) {
+       //创建点
+       Point point = createPoint(pointLocal);
+       //创建面
+       Polygon polygon = createPolygon(outLines);
+       //判断点面包含关系
+       return polygon.contains(point);
+   }
+
+}

+ 11 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/TestController.java

@@ -6,6 +6,7 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.rwd.digital.dao.ObjectRelationMapper;
 import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
+import com.persagy.dmp.rwd.digital.service.impl.CoordinateCalculateServiceImpl;
 import com.persagy.dmp.rwd.digital.service.impl.RelChainCalculateServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -21,6 +22,7 @@ import java.util.ArrayList;
 public class TestController {
 
     private final ObjectRelationMapper objectRelationMapper;
+    private final CoordinateCalculateServiceImpl coordinateCalculateService;
 
     @PostMapping("/testCal")
     public CommonResult<Void> testCal(@RequestBody CalculatingDTO calculatingDTO){
@@ -31,6 +33,15 @@ public class TestController {
         objectRelationMapper.insertObjectRelationByRelChain(calculatingDTO);
         return ResultHelper.success();
     }
+    @PostMapping("/testGeoCal")
+    public CommonResult<Void> testGeoCal(@RequestBody CalculatingDTO calculatingDTO){
+        calculatingDTO.setAccountId(AppContext.getContext().getAccountId());
+        calculatingDTO.setAppId(AppContext.getContext().getAppId());
+        calculatingDTO.setGroupCode(AppContext.getContext().getGroupCode());
+        calculatingDTO.setProjectId(AppContext.getContext().getProjectId());
+        coordinateCalculateService.calculateRelation(calculatingDTO.getRelationCalRule(),calculatingDTO);
+        return ResultHelper.success();
+    }
 
 
 

+ 28 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/ObjectDigitalMapper.java

@@ -3,9 +3,11 @@ package com.persagy.dmp.rwd.digital.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * 对象数据 DAO
@@ -78,4 +80,30 @@ public interface ObjectDigitalMapper extends BaseMapper<ObjectDigital> {
      * Update By lijie 2021/8/30 9:41
      */
     List<List<ObjectDigital>> queryObjectListByGraphCodeAndRelCode(@Param("param") RequestData requestData);
+    /***
+     * Description: 查询去向数据
+     * @param toIds : 去向id数组
+     * @param toObjType : 去向对象分类
+     * @param toInfoCode : 去向信息点code
+     * @param calculatingDTO : 请求参数
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * @date :2021/9/11 18:23
+     * Update By lijie 2021/9/11 18:23
+     */
+    List<ObjectDigital> queryToData(@Param("toIds") Set<String> toIds,@Param("toObjType") String toObjType,
+                                    @Param("toInfoCode") String toInfoCode, @Param("param") CalculatingDTO calculatingDTO);
+    /***
+     * Description: 查询来源数据
+     * @param fromIds : 来源id集合
+     * @param fromObjType : 来源对象分类
+     * @param fromInfoCode : 来源信息点
+     * @param calculatingDTO : 请求参数
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * @date :2021/9/11 18:55
+     * Update By lijie 2021/9/11 18:55
+     */
+    List<ObjectDigital> queryFromData(@Param("fromIds") Set<String> fromIds,@Param("fromObjType") String fromObjType,
+                                      @Param("fromInfoCode")  String fromInfoCode, @Param("param") CalculatingDTO calculatingDTO);
 }

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.persagy.dmp.basic.dto.RelationCalDTO;
+import com.persagy.dmp.basic.dto.RelationCalRuleDTO;
 import com.persagy.dmp.define.entity.RelationDefine;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
@@ -83,6 +84,8 @@ public class CalculatingDTO {
     private List<RelationCalDTO> chain;
     /** 关系定义 */
     private RelationDefine relationDefine;
+    /** 关系定义 */
+    private RelationCalRuleDTO relationCalRule;
 
 
 

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

@@ -2,9 +2,11 @@ package com.persagy.dmp.rwd.digital.service;
 
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.RelationCalSign;
 
 import java.io.IOException;
 import java.util.List;
@@ -15,7 +17,7 @@ import java.util.Map;
  * @author Charlie Yu
  * @date 2021-07-08
  */
-public interface IObjectDigitalService {
+public interface IObjectDigitalService extends IService<ObjectDigital> {
 
     /**
      * 通过ID查询

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

@@ -1,22 +1,35 @@
 package com.persagy.dmp.rwd.digital.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 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.basic.dto.RequestData;
+import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.exception.BusinessException;
 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.rwd.basic.constant.BusinessErrorRwdCode;
+import com.persagy.dmp.rwd.basic.utils.DigitalCommonUtils;
+import com.persagy.dmp.rwd.basic.utils.GeoToolsUtil;
+import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
 import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
 import com.persagy.dmp.rwd.digital.service.CalculateService;
+import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
+import com.persagy.dmp.rwd.digital.service.IObjectRelationService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /***
  * Description: 根据坐标计算关系的策略类
@@ -28,6 +41,13 @@ import java.util.Map;
 @Slf4j
 @RequiredArgsConstructor
 public class CoordinateCalculateServiceImpl implements CalculateService {
+
+    private static final Long MAX_HANDLE_NUM = 10000L;
+
+    private final IObjectDigitalService objectDigitalService;
+    private final ObjectDigitalMapper objectDigitalMapper;
+    private final IObjectRelationService objectRelationService;
+
     /***
      * Description: 根据坐标计算关系
      * @param calRule : 计算规则
@@ -44,11 +64,204 @@ public class CoordinateCalculateServiceImpl implements CalculateService {
         if (StrUtil.isBlank(relationDefine.getFromObjType()) || StrUtil.isBlank(relationDefine.getToObjType())){
             throw new BusinessException(BusinessErrorRwdCode.A7312.getCode(),BusinessErrorRwdCode.A7312.getDesc());
         }
+        // 试验过sql计算后,发现效率低下.先暂时使用java实现
+        String fromObjType = relationDefine.getFromObjType();
+        String toObjType = relationDefine.getToObjType();
+        // 1.先分页查询from对象,在分页处理to对象
+        Boolean calRelFromFileRelFlag = graphCalInfo.getCalRelFromFileRelFlag();
+        if (null!=calRelFromFileRelFlag && calRelFromFileRelFlag){
+            // 这种暂时不计算,还没想好怎么做
+            return;
+        }
+        // 2.查询from侧的对象
+        if (graphCalInfo.getFromIsPointFlag()){
+            // 左侧为点,则对左侧点做分页操作
+            calculateRelationInternal(graphCalInfo,calculatingDTO,
+                    calculatingDTO.getFromIds(),relationDefine.getFromObjType(),graphCalInfo.getFromInfoCode(),
+                    calculatingDTO.getToIds(),relationDefine.getToObjType(),graphCalInfo.getToInfoCode());
+            return;
+        }
+        // 右侧为点
+        calculateRelationInternal(graphCalInfo,calculatingDTO,
+                calculatingDTO.getToIds(),relationDefine.getToObjType(),graphCalInfo.getToInfoCode(),
+                calculatingDTO.getFromIds(),relationDefine.getFromObjType(),graphCalInfo.getFromInfoCode());
+    }
+    /***
+     * Description: 内部的计算关系
+     * @param graphCalInfo : 坐标计算信息对象
+     * @param calculatingDTO : 请求参数
+     * @param fromIds : 来源id集合
+     * @param fromObjType : 来源对象分类
+     * @param fromInfoCode : 来与对象信息点
+     * @param toIds : 去向id集合
+     * @param toObjType : 去向对象分类
+     * @param toInfoCode : 去向对象信息点
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/11 14:43
+     * Update By lijie 2021/9/11 14:43
+     */
+    private void calculateRelationInternal(CoordinateCalInfo graphCalInfo, CalculatingDTO calculatingDTO,
+                                           Set<String> fromIds, String fromObjType, String fromInfoCode,
+                                           Set<String> toIds, String toObjType, String toInfoCode) {
+        if (StrUtil.isBlank(fromInfoCode) || StrUtil.isBlank(toInfoCode)){
+            return;
+        }
+        // 1.查询来源对象
+        List<ObjectDigital> fromObjectDigitals = queryFromData(fromIds,fromObjType,fromInfoCode,calculatingDTO);
+        if (CollUtil.isEmpty(fromObjectDigitals)){
+            return;
+        }
+        // 2.查询去向对象
+        List<ObjectDigital> toObjectDigitals = queryToData(toIds,toObjType,toInfoCode,calculatingDTO);
+        if (CollUtil.isEmpty(toObjectDigitals)){
+            return;
+        }
+        // 呵呵,O(n^2)
+        List<ObjectRelation> resultList = new ArrayList<>();
+        for (ObjectDigital fromObjectDigital : fromObjectDigitals) {
+            for (ObjectDigital toObjectDigital : toObjectDigitals) {
+                if (CollUtil.isEmpty(toObjectDigital.getOutLines())){
+                    continue;
+                }
+                if (null==fromObjectDigital.getBimLocation()){
+                    continue;
+                }
+                Boolean pointInPoly = GeoToolsUtil
+                        .isPointInPoly(fromObjectDigital.getBimLocation(), toObjectDigital.getOutLines());
+                if (!pointInPoly){
+                    continue;
+                }
+                ObjectRelation objectRelation = new ObjectRelation();
+                objectRelation.setGroupCode(fromObjectDigital.getGroupCode());
+                objectRelation.setProjectId(fromObjectDigital.getProjectId());
+                objectRelation.setGraphId(DigitalCommonUtils.getDefaultGraphIdByGraphCode(calculatingDTO.getGraphCode()));
+                objectRelation.setGraphCode(calculatingDTO.getGraphCode());
+                objectRelation.setRelCode(calculatingDTO.getRelCode());
+                objectRelation.setObjFrom(graphCalInfo.getFromIsPointFlag()?fromObjectDigital.getId():toObjectDigital.getId());
+                objectRelation.setObjTo(graphCalInfo.getFromIsPointFlag()?toObjectDigital.getId():fromObjectDigital.getId());
+                objectRelation.setRelValue(calculatingDTO.getRelValue());
+                objectRelation.setCreateApp(calculatingDTO.getAppId());
+                objectRelation.setUpdateApp(calculatingDTO.getAppId());
+                objectRelation.setCreator(calculatingDTO.getAccountId());
+                objectRelation.setModifier(calculatingDTO.getAccountId());
+                objectRelation.setValid(1);
+                resultList.add(objectRelation);
+            }
+        }
+        if (CollUtil.isEmpty(resultList)){
+            return;
+        }
+        // 删除关系
+        deleteRelDataByCondition(calculatingDTO,fromIds,toIds);
+        // 新增关系
+        objectRelationService.saveBatch(resultList);
+    }
+    /***
+     * Description: 根据请求参数和id集合删除关系
+     * @param calculatingDTO : 请求参数
+     * @param fromIds : 来源id集合
+     * @param toIds : 去向id集合
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/11 16:13
+     * Update By lijie 2021/9/11 16:13
+     */
+    private void deleteRelDataByCondition(CalculatingDTO calculatingDTO, Set<String> fromIds, Set<String> toIds) {
+        fromIds.addAll(toIds);
+        QueryWrapper<ObjectRelation> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(ObjectDigital.PROP_VALID,Boolean.TRUE);
+        if (CollUtil.isNotEmpty(fromIds)){
+            queryWrapper.in(ObjectDigital.PROP_ID,fromIds);
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getGroupCode())){
+            queryWrapper.eq(StrUtil.toUnderlineCase(CommonConstant.QUERY_GROUPCODE),calculatingDTO.getGroupCode());
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getProjectId())){
+            queryWrapper.eq(StrUtil.toUnderlineCase(CommonConstant.QUERY_PROJECTID),calculatingDTO.getProjectId());
+        }
+        queryWrapper.eq(StrUtil.toUnderlineCase(ObjectRelation.GRAPH_CODE_HUM),calculatingDTO.getGraphCode());
+        queryWrapper.eq(StrUtil.toUnderlineCase(ObjectRelation.REL_CODE_HUM),calculatingDTO.getRelCode());
+        if (StrUtil.isNotBlank(calculatingDTO.getRelValue())){
+            queryWrapper.eq(StrUtil.toUnderlineCase(ObjectRelation.REL_VALUE_HUM),calculatingDTO.getRelValue());
+        }
+        objectRelationService.remove(queryWrapper);
+    }
 
+    /***
+     * Description: 查询去向数据
+     * @param toIds : 去向id集合
+     * @param toObjType : 去向对象类型
+     * @param toInfoCode : 去向对象信息点
+     * @param calculatingDTO : 请求参数
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * @date :2021/9/11 15:36
+     * Update By lijie 2021/9/11 15:36
+     */
+    private List<ObjectDigital> queryToData(Set<String> toIds, String toObjType, String toInfoCode, CalculatingDTO calculatingDTO) {
+        QueryWrapper<ObjectDigital> queryWrapper = createCommonQueryWrapper(toIds,toObjType,calculatingDTO);
+        queryWrapper.select(ObjectDigital.PROP_ID,
+                StrUtil.toUnderlineCase(CommonConstant.QUERY_GROUPCODE),
+                StrUtil.toUnderlineCase(CommonConstant.QUERY_PROJECTID),
+                StrUtil.format("JSON_UNQUOTE(JSON_EXTRACT(JSON_UNQUOTE(JSON_EXTRACT(infos,'$.{}'))," +
+                        "IF(JSON_DEPTH(JSON_UNQUOTE(JSON_EXTRACT(infos,'$.{}')))=3,'$[*]'," +
+                        "IF(JSON_DEPTH(JSON_UNQUOTE(JSON_EXTRACT(infos,'$.{}')))=4,'$[0][*]','$[0][0][*]')))) AS outLines",
+                        toInfoCode,toInfoCode,toInfoCode),
+                ObjectDigital.CLASS_CODE,ObjectDigital.OBJ_TYPE);
+        return objectDigitalMapper.queryToData(toIds,toObjType,toInfoCode,calculatingDTO);
+    }
+    /***
+     * Description: 创建通用查询条件对象
+     * @param ids : 对象id数组
+     * @param objType : 对象分类
+     * @param calculatingDTO : 请求参数
+     * @return : com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<com.persagy.dmp.digital.entity.ObjectDigital>
+     * @author : lijie
+     * @date :2021/9/11 15:41
+     * Update By lijie 2021/9/11 15:41
+     */
+    private QueryWrapper<ObjectDigital> createCommonQueryWrapper(Set<String> ids, String objType, CalculatingDTO calculatingDTO) {
+        QueryWrapper<ObjectDigital> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(ObjectDigital.PROP_VALID,Boolean.TRUE);
+        if (CollUtil.isNotEmpty(ids)){
+            queryWrapper.in(ObjectDigital.PROP_ID,ids);
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getGroupCode())){
+            queryWrapper.eq(StrUtil.toUnderlineCase(CommonConstant.QUERY_GROUPCODE),calculatingDTO.getGroupCode());
+        }
+        if (StrUtil.isNotBlank(calculatingDTO.getProjectId())){
+            queryWrapper.eq(StrUtil.toUnderlineCase(CommonConstant.QUERY_PROJECTID),calculatingDTO.getProjectId());
+        }
+        if (StrUtil.isNotBlank(objType)){
+            queryWrapper.eq(ObjectDigital.OBJ_TYPE,objType);
+        }
+        return queryWrapper;
+    }
 
-
-
-
-
+    /***
+     * Description: 查询来源数据
+     * @param fromIds : 来源id集合
+     * @param fromObjType : 对象分类
+     * @param fromInfoCode : 来源信息点
+     * @param calculatingDTO : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/11 15:32
+     * Update By lijie 2021/9/11 15:32
+     */
+    private List<ObjectDigital> queryFromData(Set<String> fromIds, String fromObjType, String fromInfoCode, CalculatingDTO calculatingDTO) {
+        QueryWrapper<ObjectDigital> queryWrapper = createCommonQueryWrapper(fromIds, fromObjType, calculatingDTO);
+        queryWrapper.select(ObjectDigital.PROP_ID,
+                StrUtil.toUnderlineCase(CommonConstant.QUERY_GROUPCODE),
+                StrUtil.toUnderlineCase(CommonConstant.QUERY_PROJECTID),
+                StrUtil.format("JSON_OBJECT('x',JSON_EXTRACT(JSON_UNQUOTE(CONCAT('[',SUBSTRING(" +
+                                "JSON_EXTRACT(infos, '$.{}') FROM 2 FOR LENGTH(" +
+                                "JSON_EXTRACT(infos, '$.{}'))-2),']')),'$[0]'),'y'," +
+                                "JSON_EXTRACT(JSON_UNQUOTE(CONCAT('[',SUBSTRING(JSON_EXTRACT(infos, '$.{}') " +
+                                "FROM 2 FOR LENGTH(JSON_EXTRACT(infos, '$.{}'))-2),']')), '$[1]')) AS bimLocation",
+                        fromInfoCode,fromInfoCode,fromInfoCode,fromInfoCode),
+                ObjectDigital.CLASS_CODE,ObjectDigital.OBJ_TYPE);
+        return objectDigitalMapper.queryFromData(fromIds,fromObjType,fromInfoCode,calculatingDTO);
     }
 }

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

@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -26,6 +27,7 @@ import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.digital.entity.RelationCalSign;
 import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
@@ -35,6 +37,7 @@ import com.persagy.dmp.rwd.define.service.IObjectInfoService;
 import com.persagy.dmp.rwd.define.service.IObjectTypeService;
 import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
 import com.persagy.dmp.rwd.digital.dao.ObjectRelationMapper;
+import com.persagy.dmp.rwd.digital.dao.RelationCalSignMapper;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
 import com.persagy.dmp.rwd.parser.service.InfoDataFactory;
 import lombok.RequiredArgsConstructor;
@@ -54,7 +57,7 @@ import java.util.stream.Collectors;
 @Service
 @Transactional(rollbackFor = Exception.class)
 @RequiredArgsConstructor
-public class ObjectDigitalServiceImpl implements IObjectDigitalService {
+public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, ObjectDigital> implements IObjectDigitalService {
 
     private final ObjectDigitalMapper objectDigitalMapper;
     private final DigitalMessageHelper messageSender;
@@ -643,7 +646,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
      */
     private void  queryParentClassCode(List<String> typeCodeList,Map<String, String> objTypeMap){
         if(typeCodeList == null || typeCodeList.size()<=0){
-            return ;
+            return;
         }
         //查询classCode对应点objType
         List<String> parentCodes = new ArrayList<>();
@@ -654,11 +657,7 @@ public class ObjectDigitalServiceImpl implements IObjectDigitalService {
             }
             parentCodes.add(objType);
         }
-
-        if(parentCodes!=null && parentCodes.size()>0){
-            typeCodeList.addAll(parentCodes);
-        }
-        return ;
+        typeCodeList.addAll(parentCodes);
     }
     /**
      * 数据合并

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

@@ -24,6 +24,7 @@ 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.basic.utils.DigitalCommonUtils;
 import com.persagy.dmp.rwd.define.service.IRelationDefineService;
 import com.persagy.dmp.rwd.digital.dao.ObjectDigitalMapper;
 import com.persagy.dmp.rwd.digital.domain.CalculatingDTO;
@@ -137,7 +138,7 @@ public class RelationCalServiceImpl implements RelationCalService {
             objectRelation.setProjectId(AppContext.getContext().getProjectId());
             objectRelation.setCreateApp(AppContext.getContext().getAppId());
             objectRelation.setUpdateApp(AppContext.getContext().getAppId());
-            objectRelation.setGraphId(getDefaultGraphIdByGraphCode(requestData.getGraphCode()));
+            objectRelation.setGraphId(DigitalCommonUtils.getDefaultGraphIdByGraphCode(requestData.getGraphCode()));
             objectRelation.setObjFrom(masterObjectDigital.getId());
             objectRelation.setObjTo(slaveObjectDigital.getId());
             objectRelation.setRelCode(requestData.getRelCode());
@@ -386,18 +387,6 @@ public class RelationCalServiceImpl implements RelationCalService {
     }
 
     /***
-     * Description: 获取默认的图实例id
-     * @param graphCode : 图类型编码
-     * @return : java.lang.String
-     * @author : lijie
-     * @date :2021/9/3 16:07
-     * Update By lijie 2021/9/3 16:07
-     */
-    private String getDefaultGraphIdByGraphCode(String graphCode) {
-        return StrUtil.format(CommonConstant.DEFAULT_GRAPH_ID_FORMAT,graphCode);
-    }
-
-    /***
      * Description: 校验对象类型
      * @param masterObjectDigital : 主对象
      * @param requestData : 请求参数

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
dmp-business/dmp-rwd/src/main/resources/db/init/data.sql


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

@@ -27,6 +27,8 @@
             <result property="objFromIds" column="objFromIds" jdbcType="VARCHAR" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
             <result property="objToIds" column="objToIds" jdbcType="VARCHAR" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
             <result property="relObjs" column="relObjs" jdbcType="VARCHAR"  typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+            <result property="bimLocation" column="bimLocation" jdbcType="VARCHAR"  typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+            <result property="outLines" column="outLines" jdbcType="VARCHAR"  typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
             <!--<result property="relObjs" column="relObjs" jdbcType="VARCHAR"  typeHandler="com.persagy.dmp.basic.typehandler.RelObjsHandler"/>-->
     </resultMap>
     <resultMap id="count" type="com.persagy.dmp.digital.entity.ObjectDigital">
@@ -470,5 +472,95 @@
         SELECT FOUND_ROWS() AS totalCount;
     </select>
 
+    <select id="queryToData" resultMap="BaseResultMap">
+        SELECT
+            id,
+            group_code,
+            project_id,
+            JSON_UNQUOTE(
+                JSON_EXTRACT(
+                    JSON_UNQUOTE( JSON_EXTRACT( infos, CONCAT('$.',#{toInfoCode}) ) ),
+                IF
+                    (
+                        JSON_DEPTH( JSON_UNQUOTE( JSON_EXTRACT( infos, CONCAT('$.',#{toInfoCode}) ) ) ) = 3,
+                        '$[*]',
+                    IF
+                        ( JSON_DEPTH( JSON_UNQUOTE( JSON_EXTRACT( infos, CONCAT('$.',#{toInfoCode}) ) ) ) = 4, '$[0][*]', '$[0][0][*]' )
+                    )
+                )
+            ) AS outLines,
+            class_code,
+            obj_type
+        FROM
+            dt_object
+        WHERE
+            valid = TRUE
+        <if test="null!=toIds and toIds.size>0">
+            <foreach collection="toIds" open="AND id IN (" close=")" item="toId" separator=",">
+                #{toId}
+            </foreach>
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND project_id = #{param.projectId}
+        </if>
+        <if test="null!=toObjType and toObjType.length>0">
+            AND obj_type = #{toObjType}
+        </if>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND group_code = #{param.groupCode}
+        </if>
+        ;
+    </select>
+    <select id="queryFromData" resultMap="BaseResultMap">
+        SELECT
+            id,
+            group_code,
+            project_id,
+            JSON_OBJECT(
+                'X',
+                JSON_EXTRACT(
+                    JSON_UNQUOTE(
+                        CONCAT(
+                            '[',
+                            SUBSTRING(JSON_EXTRACT(infos, CONCAT('$.',#{fromInfoCode})) FROM 2 FOR LENGTH(JSON_EXTRACT(infos, CONCAT('$.',#{fromInfoCode})))-2),
+                            ']'
+                        )
+                    ),
+                    '$[0]'
+                ),
+                'Y',
+                JSON_EXTRACT(
+                    JSON_UNQUOTE(
+                        CONCAT(
+                            '[',
+                            SUBSTRING(JSON_EXTRACT(infos, CONCAT('$.',#{fromInfoCode})) FROM 2 FOR LENGTH(JSON_EXTRACT(infos, CONCAT('$.',#{fromInfoCode})))-2),
+                            ']'
+                        )
+                    ),
+                    '$[1]'
+                )
+            ) AS bimLocation,
+            class_code,
+            obj_type
+        FROM
+            dt_object
+        WHERE
+           valid = TRUE
+        <if test="null!=fromIds and fromIds.size>0">
+            <foreach collection="fromIds" open="AND id IN (" close=")" item="fromId" separator=",">
+                #{fromId}
+            </foreach>
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND project_id = #{param.projectId}
+        </if>
+        <if test="null!=fromObjType and fromObjType.length>0">
+            AND obj_type = #{fromObjType}
+        </if>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND group_code = #{param.groupCode}
+        </if>
+    </select>
+
 
 </mapper>

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

@@ -14,8 +14,10 @@ public class CoordinateCalInfo {
     private String fromInfoCode;
     /**右侧计算坐标的信息点code*/
     private String toInfoCode;
-    /**是否从文件key查询对应业务id作为关系侧id*/
-    private String calRelFromFileRelFlag;
+    /**是否从文件key查询对应业务id作为关系侧id,有种计算器是先根据model_id关联的业务id作为楼层*/
+    private Boolean calRelFromFileRelFlag;
+    /**关系左侧为点的标识,true-关系左侧是点,false-关系右侧是点*/
+    private Boolean fromIsPointFlag;
 
 
 

+ 7 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectDigital.java

@@ -12,6 +12,7 @@ import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.Length;
 
 import javax.validation.constraints.NotNull;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Set;
 
@@ -95,4 +96,10 @@ public class ObjectDigital extends AuditableEntity {
     /** 关联的对象列表 */
     @TableField(exist = false,typeHandler = JacksonTypeHandler.class)
     private List<ObjectDigital> relObjs;
+    /** 对象的bim点坐标 */
+    @TableField(exist = false,typeHandler = JacksonTypeHandler.class,value = "bimLocation")
+    private ObjectNode bimLocation;
+    /** 对象的outline平面坐标 */
+    @TableField(exist = false,typeHandler = JacksonTypeHandler.class,value = "outLines")
+    private List<LinkedHashMap<String,Object>> outLines;
 }

+ 2 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectRelation.java

@@ -25,6 +25,8 @@ public class ObjectRelation extends AuditableEntity {
     public static final String OBJ_TO_HUM="objTo";
     public static final String RELATION_TO_HUM="relationTo";
     public static final String RELATION_FROM_HUM="relationFrom";
+    public static final String GRAPH_CODE_HUM="graphCode";
+    public static final String REL_VALUE_HUM="relValue";
 
     /** 项目ID */
     private String projectId;