Forráskód Böngészése

实现createObjRelationsByKeywordAndObjType接口

lijie 3 éve
szülő
commit
4ed17aca34
14 módosított fájl, 808 hozzáadás és 0 törlés
  1. 43 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/BusinessErrorRwdCode.java
  2. 3 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectRelationController.java
  3. 65 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/RelationCaclController.java
  4. 9 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/ObjectDigitalMapper.java
  5. 15 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/RelationCalSignMapper.java
  6. 112 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/domain/RelationCalSign.java
  7. 25 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/RelationCaclService.java
  8. 11 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/RelationCalSignService.java
  9. 325 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCaclServiceImpl.java
  10. 20 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/RelationCalSignServiceImpl.java
  11. 94 0
      dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml
  12. 4 0
      dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java
  13. 70 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/dto/RequestData.java
  14. 12 0
      dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/digital/entity/ObjectDigital.java

+ 43 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/BusinessErrorRwdCode.java

@@ -0,0 +1,43 @@
+package com.persagy.dmp.rwd.basic.constant;
+
+/***
+ * Description: rwd定制的错误返回码
+ * @author : lijie
+ * @date :2021/9/3 14:25
+ * Update By lijie 2021/9/3 14:25
+ */
+public enum BusinessErrorRwdCode {
+    /**
+     * A73XX:代表关系计算的错误码
+     *
+     * */
+	A7301("A7301", ":不存在"),
+    A7302("A7302", ":存在多个实例"),
+    A7303("A7303", ":不存在"),
+    A7304("A7304", ":存在多个实例"),
+    A7305("A7305", ":错误的类型参考:这里的传感器包含车库摄像头,车位检测器,办公摄像头,火灾探测器,燃气探测器,漏电探测器,消防设备电源传感器,监控摄像头,入侵报警探测器,以及传感器系统下所有设备类型"),
+    A7306("A7306", ":不符合主对象条件限制");
+
+    private String code;
+
+    private String desc;
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    private BusinessErrorRwdCode(String code, String desc) {
+        this.desc = desc;
+        this.code = code;
+    }
+
+    @Override
+    public String toString() {
+        return this.code + "_" + this.desc;
+    }
+
+}

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

@@ -1,8 +1,10 @@
 package com.persagy.dmp.rwd.digital.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ResponseCode;
@@ -23,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 /**

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

@@ -0,0 +1,65 @@
+package com.persagy.dmp.rwd.digital.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+import com.persagy.dmp.basic.dto.RequestData;
+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.common.utils.ResultHelper;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.rwd.digital.service.RelationCaclService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/***
+ * Description: 关系计算入口
+ * @author : lijie
+ * @date :2021/9/2 21:19
+ * Update By lijie 2021/9/2 21:19
+ */
+@RestController
+@RequestMapping("/rwd/instance/object/compatible/")
+@RequiredArgsConstructor
+public class RelationCaclController {
+
+    private final RelationCaclService relationCaclService;
+
+
+    /***
+     * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.digital.entity.ObjectRelation>>
+     * @author : lijie
+     * @date :2021/9/2 20:20
+     * Update By lijie 2021/9/2 20:20
+     */
+    @PostMapping("/createObjRelationsByKeywordAndObjType")
+    public CommonResult<List<ObjectRelation>> createObjRelationsByKeywordAndObjType(@RequestBody RequestData requestData){
+        // 校验必填项
+        if (StrUtil.isBlank(requestData.getGroupCode())
+                || StrUtil.isBlank(requestData.getRelCode())
+                || StrUtil.isBlank(requestData.getMasterObjType())
+                || StrUtil.isBlank(requestData.getSlaveObjType())
+                || StrUtil.isBlank(requestData.getType())
+                || StrUtil.isBlank(requestData.getMainContent())
+                || CollUtil.isEmpty(requestData.getFromContent())){
+            throw new BusinessException(ResponseCode.A0400.getCode(),ResponseCode.A0400.getDesc());
+        }
+        if (StrUtil.isNotBlank(requestData.getSign()) && !NumberUtil.isInteger(requestData.getSign())){
+            throw new BusinessException(ResponseCode.A0400.getCode(),ResponseCode.A0400.getDesc());
+        }
+        return relationCaclService.createObjRelationsByKeywordAndObjType(requestData);
+    }
+
+
+
+
+}

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

@@ -60,4 +60,13 @@ public interface ObjectDigitalMapper extends BaseMapper<ObjectDigital> {
      * Update By lijie 2021/8/30 17:44
      */
     List<List<ObjectDigital>> queryEquipListByClassCode(@Param("param") RequestData requestData);
+    /***
+     * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系
+     * @param requestData : 请求参数
+     * @return : java.util.List<com.persagy.dmp.digital.entity.ObjectDigital>  
+     * @author : lijie
+     * @date :2021/9/2 21:43
+     * Update By lijie 2021/9/2 21:43
+     */
+    List<ObjectDigital> queryObjectListByIdOrNameOrCadId(@Param("param") RequestData requestData);
 }

+ 15 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/dao/RelationCalSignMapper.java

@@ -0,0 +1,15 @@
+package com.persagy.dmp.rwd.digital.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.dmp.rwd.digital.domain.RelationCalSign;
+
+/**
+ * @Entity generator.domain.RelationCalSign
+ */
+public interface RelationCalSignMapper extends BaseMapper<RelationCalSign> {
+
+}
+
+
+
+

+ 112 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/domain/RelationCalSign.java

@@ -0,0 +1,112 @@
+package com.persagy.dmp.rwd.digital.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 记录关系的计算标记表,与dt_relation表为一对一关系
+ * @TableName dt_relation_cal_sign
+ */
+@TableName(value ="dt_relation_cal_sign")
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RelationCalSign implements Serializable {
+    /**
+     * 主键id,与dt_relation保持一致
+     */
+    @TableId(value = "id")
+    private String id;
+
+    /**
+     * 计算标记 1 为手动 2为自动
+     */
+    @TableField(value = "sign")
+    private Integer sign;
+
+    /**
+     * 创建时间,格式为yyyyMMddHHmmss
+     */
+    @TableField(value = "creation_time")
+    private String creationTime;
+
+    /**
+     * 更新时间,格式为yyyyMMddHHmmss
+     */
+    @TableField(value = "modified_time")
+    private String modifiedTime;
+
+    /**
+     * 合法标记,true-有效,false-无效
+     */
+    @TableField(value = "valid")
+    private Byte valid;
+
+    /**
+     * 乐观锁
+     */
+    @TableField(value = "ts")
+    private Date ts;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        RelationCalSign other = (RelationCalSign) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getSign() == null ? other.getSign() == null : this.getSign().equals(other.getSign()))
+            && (this.getCreationTime() == null ? other.getCreationTime() == null : this.getCreationTime().equals(other.getCreationTime()))
+            && (this.getModifiedTime() == null ? other.getModifiedTime() == null : this.getModifiedTime().equals(other.getModifiedTime()))
+            && (this.getValid() == null ? other.getValid() == null : this.getValid().equals(other.getValid()))
+            && (this.getTs() == null ? other.getTs() == null : this.getTs().equals(other.getTs()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getSign() == null) ? 0 : getSign().hashCode());
+        result = prime * result + ((getCreationTime() == null) ? 0 : getCreationTime().hashCode());
+        result = prime * result + ((getModifiedTime() == null) ? 0 : getModifiedTime().hashCode());
+        result = prime * result + ((getValid() == null) ? 0 : getValid().hashCode());
+        result = prime * result + ((getTs() == null) ? 0 : getTs().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", sign=").append(sign);
+        sb.append(", creationTime=").append(creationTime);
+        sb.append(", modifiedTime=").append(modifiedTime);
+        sb.append(", valid=").append(valid);
+        sb.append(", ts=").append(ts);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

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

@@ -0,0 +1,25 @@
+package com.persagy.dmp.rwd.digital.service;
+
+import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+
+import java.util.List;
+
+/***
+ * Description: 处理关系计算逻辑的接口
+ * @author : lijie
+ * @date :2021/9/2 21:10
+ * Update By lijie 2021/9/2 21:10
+ */
+public interface RelationCaclService {
+    /***
+     * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.digital.entity.ObjectRelation>>  
+     * @author : lijie
+     * @date :2021/9/2 21:24
+     * Update By lijie 2021/9/2 21:24
+     */
+    CommonResult<List<ObjectRelation>> createObjRelationsByKeywordAndObjType(RequestData requestData);
+}

+ 11 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/RelationCalSignService.java

@@ -0,0 +1,11 @@
+package com.persagy.dmp.rwd.digital.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.persagy.dmp.rwd.digital.domain.RelationCalSign;
+
+/**
+ *
+ */
+public interface RelationCalSignService extends IService<RelationCalSign> {
+
+}

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

@@ -0,0 +1,325 @@
+package com.persagy.dmp.rwd.digital.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+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.model.entity.BaseEntity;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ResultHelper;
+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.digital.dao.ObjectDigitalMapper;
+import com.persagy.dmp.rwd.digital.dao.ObjectRelationMapper;
+import com.persagy.dmp.rwd.digital.domain.RelationCalSign;
+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 lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.validation.constraints.NotNull;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class RelationCaclServiceImpl implements RelationCaclService {
+
+    private final ObjectDigitalMapper objectDigitalMapper;
+    private final IObjectRelationService objectRelationService;
+    private final RelationCalSignService relationCalSignService;
+
+
+    /***
+     * Description: 根据id,localId,name,localName,CADID及关系类型信息,对象分类信息创建关系
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.digital.entity.ObjectRelation>>
+     * @author : lijie
+     * @date :2021/9/2 21:24
+     * Update By lijie 2021/9/2 21:24
+     */
+    @Override
+    public CommonResult<List<ObjectRelation>> createObjRelationsByKeywordAndObjType(@RequestBody RequestData requestData) {
+        // 根据对象信息点和对象内容(主/副)查询对象,然后添加关系及计算标记
+        requestData.setProjectId(AppContext.getContext().getProjectId());
+        requestData.setGroupCode(AppContext.getContext().getGroupCode());
+        // 1. 查询主对象及从对象
+        // 1.1 查询主对象:obj_type,project_id,type(设备名称(name),设备ID(id),本地编码(localId),本地名称(localName))查询主对象
+        // 1.2 查询从对象:obj_type,project_id,type(设备名称(name),设备ID(id),本地编码(localId),本地名称(localName)),排除主对象id,是否主对象的class_code查询从对象
+        List<ObjectDigital> resultList =
+                objectDigitalMapper.queryObjectListByIdOrNameOrCadId(requestData);
+        if (CollUtil.isEmpty(resultList)){
+            return ResultHelper.multi(new ArrayList<>(),0L);
+        }
+        // 1.3 按mainFlag对主对象分组并进行校验
+        checkMasterObjValid(resultList,requestData);
+        // 1.4 对从对象按mainFlag,fromContent分组
+        checkSlaveObjValid(resultList,requestData);
+        // 4.插入关系from_id,to_id,图类型编码,边类型编码,项目id,如果rel_value有值则加上,结束
+        // 4.1 获得主对象
+        ObjectDigital masterObjectDigital = resultList
+                .stream()
+                .filter(ObjectDigital::getMainFlag)
+                .collect(Collectors.toList())
+                .get(0);
+        // 校验传感器类型
+        checkSensor(masterObjectDigital,requestData);
+        // 校验对象类型
+        checkClassCode(masterObjectDigital,requestData);
+        // 4.2 获得从对象
+        List<ObjectDigital> slaveObjectDigitals = resultList
+                .stream()
+                .filter(objectDigital -> !objectDigital.getMainFlag())
+                .collect(Collectors.toList());
+        // 4.3 根据主对象id和从对象id数组查询已经存在的关系
+        Map<String,ObjectRelation> relationMap =
+                queryObjectRelationMapByFromIdAndToIds(masterObjectDigital.getId(),slaveObjectDigitals
+                .stream().map(BaseEntity::getId).collect(Collectors.toList()));
+        // 4.3 创建关系
+        List<ObjectRelation> addRelations = new ArrayList<>();
+        List<ObjectRelation> updateRelations = new ArrayList<>();
+        List<RelationCalSign> relationCalSigns = new ArrayList<>();
+        boolean flag = StrUtil.isNotBlank(requestData.getSign()) && NumberUtil.isInteger(requestData.getSign());
+        for (ObjectDigital slaveObjectDigital : slaveObjectDigitals) {
+            // 当已经存在关系,仅更新一下操作记录
+            String uniqueKey = StrUtil
+                    .format(CommonConstant.RELATION_UNIQUE_KEY_FORMAT,
+                            requestData.getGraphCode(),
+                            requestData.getRelCode(),
+                            masterObjectDigital.getId(),
+                            slaveObjectDigital.getId());
+            if (relationMap.containsKey(uniqueKey)){
+                ObjectRelation objectRelation = relationMap.get(uniqueKey);
+                objectRelation.setUpdateApp(AppContext.getContext().getAppId());
+                objectRelation.setModifier(AppContext.getContext().getAccountId());
+                if (requestData.getHasRelValue()){
+                    objectRelation.setRelValue(masterObjectDigital.getClassCode());
+                }
+                updateRelations.add(objectRelation);
+                if (flag){
+                    relationCalSigns.add(RelationCalSign
+                            .builder()
+                            .id(objectRelation.getId())
+                            .sign(NumberUtil.parseInt(requestData.getSign()))
+                            .build());
+                }
+                continue;
+            }
+            // 生成插入关系
+            ObjectRelation objectRelation = new ObjectRelation();
+            objectRelation.setId(IdWorker.getIdStr());
+            objectRelation.setGraphCode(requestData.getGraphCode());
+            objectRelation.setGroupCode(AppContext.getContext().getGroupCode());
+            objectRelation.setProjectId(AppContext.getContext().getProjectId());
+            objectRelation.setCreateApp(AppContext.getContext().getAppId());
+            objectRelation.setUpdateApp(AppContext.getContext().getAppId());
+            objectRelation.setGraphId(getDefaultGraphIdByGraphCode(requestData.getGraphCode()));
+            objectRelation.setObjFrom(masterObjectDigital.getId());
+            objectRelation.setObjTo(slaveObjectDigital.getId());
+            objectRelation.setRelCode(requestData.getRelCode());
+            if (requestData.getHasRelValue()){
+                objectRelation.setRelValue(masterObjectDigital.getClassCode());
+            }
+            objectRelation.setCreator(AppContext.getContext().getAccountId());
+            objectRelation.setModifier(AppContext.getContext().getAccountId());
+            addRelations.add(objectRelation);
+            if (flag){
+                relationCalSigns.add(RelationCalSign
+                        .builder()
+                        .id(objectRelation.getId())
+                        .sign(NumberUtil.parseInt(requestData.getSign()))
+                        .build());
+            }
+        }
+        if (CollUtil.isNotEmpty(updateRelations)){
+            objectRelationService.updateBatchById(updateRelations);
+        }
+        if (CollUtil.isNotEmpty(addRelations)){
+            objectRelationService.saveBatch(addRelations);
+        }
+        // 5.处理sign:计算标记 1 为手动 2为自动
+        if (CollUtil.isNotEmpty(relationCalSigns)){
+            relationCalSignService.saveOrUpdateBatch(relationCalSigns);
+        }
+        addRelations.addAll(updateRelations);
+        return ResultHelper.multi(addRelations,addRelations.size());
+    }
+    /***
+     * Description: 根据fromId和toIds查询关系
+     * @param fromId : fromId
+     * @param toIds : toIds
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.digital.entity.ObjectRelation>
+     *     {"图类型编码_关系类型编码_fromId_toId":关系对象}
+     * @author : lijie
+     * @date :2021/9/3 16:29
+     * Update By lijie 2021/9/3 16:29
+     */
+    private Map<String, ObjectRelation> queryObjectRelationMapByFromIdAndToIds(String fromId, List<String> toIds) {
+        if (StrUtil.isBlank(fromId) || CollUtil.isEmpty(toIds)){
+            return new HashMap<>();
+        }
+        LambdaQueryWrapper<ObjectRelation> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(ObjectRelation::getObjTo,toIds);
+        queryWrapper.eq(ObjectRelation::getObjFrom,fromId);
+        queryWrapper.eq(ObjectRelation::getValid,true);
+        List<ObjectRelation> objectRelations = objectRelationService.list(queryWrapper);
+        if (CollUtil.isEmpty(objectRelations)){
+            return new HashMap<>();
+        }
+        return objectRelations.stream()
+                .collect(Collectors.toMap(objectRelation -> StrUtil.format(CommonConstant.RELATION_UNIQUE_KEY_FORMAT,
+                        objectRelation.getGraphCode(),objectRelation.getRelCode(),
+                        objectRelation.getObjFrom(),objectRelation.getObjTo()),
+                        objectRelation -> objectRelation,(k1,k2)->k1));
+    }
+
+    /***
+     * 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 : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/3 15:50
+     * Update By lijie 2021/9/3 15:50
+     */
+    private void checkClassCode(ObjectDigital masterObjectDigital, RequestData requestData) {
+        if (null==requestData.getHasCheckClassCode()
+                || !requestData.getHasCheckClassCode()
+                || CollUtil.isEmpty(requestData.getCheckClassCodes())){
+            return;
+        }
+        if (!requestData.getCheckClassCodes()
+                .contains(masterObjectDigital.getClassCode())){
+            throw new BusinessException(BusinessErrorRwdCode.A7306.getCode(), requestData.getMainContent()+BusinessErrorRwdCode.A7306.getDesc());
+        }
+    }
+
+    /***
+     * Description: 校验传感器类型
+     * @param masterObjectDigital : 主对象
+     * @param requestData : 请求参数
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/3 15:36
+     * Update By lijie 2021/9/3 15:36
+     */
+    private void checkSensor(ObjectDigital masterObjectDigital, RequestData requestData) {
+        if (null==requestData.getHasCheckSensor()
+                || !requestData.getHasCheckSensor()
+                || CollUtil.isEmpty(requestData.getCheckSensorCodes())){
+            return;
+        }
+        if (!requestData.getCheckSensorCodes()
+                .contains(masterObjectDigital.getClassCode())){
+            throw new BusinessException(BusinessErrorRwdCode.A7305.getCode(), requestData.getMainContent()+BusinessErrorRwdCode.A7305.getDesc());
+        }
+    }
+
+    /***
+     * Description: 校验从对象的合法性
+     * @param resultList : 结果集
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/3 14:52
+     * Update By lijie 2021/9/3 14:52
+     */
+    private void checkSlaveObjValid(List<ObjectDigital> resultList,RequestData requestData) {
+        long count = resultList.stream()
+                .filter(objectDigital -> !objectDigital.getMainFlag()).count();
+        if (count<=0){
+            throw new BusinessException(BusinessErrorRwdCode.A7303.getCode(), requestData.getFromContent()+BusinessErrorRwdCode.A7303.getDesc());
+        }
+        if (ObjectDigital.NAME.equals(requestData.getType())){
+            Map<String, List<ObjectDigital>> nameMap = resultList.stream()
+                                .filter(objectDigital -> !objectDigital.getMainFlag())
+                                .collect(Collectors.groupingBy(ObjectDigital::getName));
+            commonCheckSlaveObjValid(nameMap);
+        }
+        if (ObjectDigital.PROP_ID.equals(requestData.getType())){
+            Map<String, List<ObjectDigital>> idMap = resultList.stream()
+                                .filter(objectDigital -> !objectDigital.getMainFlag())
+                                .collect(Collectors.groupingBy(ObjectDigital::getId));
+            commonCheckSlaveObjValid(idMap);
+        }
+        if (ObjectDigital.LOCAL_NAME.equals(requestData.getType())){
+            Map<String, List<ObjectDigital>> localNameMap = resultList.stream()
+                                .filter(objectDigital -> !objectDigital.getMainFlag())
+                                .collect(Collectors.groupingBy(ObjectDigital::getLocalName));
+            commonCheckSlaveObjValid(localNameMap);
+        }
+        if (ObjectDigital.LOCAL_ID.equals(requestData.getType())){
+            Map<String, List<ObjectDigital>> localIdMap = resultList.stream()
+                                .filter(objectDigital -> !objectDigital.getMainFlag())
+                                .collect(Collectors.groupingBy(ObjectDigital::getLocalId));
+            commonCheckSlaveObjValid(localIdMap);
+        }
+        if (RequestData.CAD_ID.equals(requestData.getType())){
+            Map<String, List<ObjectDigital>> cadIdMap = resultList.stream()
+                                .filter(objectDigital -> !objectDigital.getMainFlag())
+                                .collect(Collectors.groupingBy(ObjectDigital::getCadId));
+            commonCheckSlaveObjValid(cadIdMap);
+        }
+    }
+    /***
+     * Description: 通用校验从对象的合法性
+     * @param dataMap : 映射
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/3 14:54
+     * Update By lijie 2021/9/3 14:54
+     */
+    private void commonCheckSlaveObjValid(Map<String, List<ObjectDigital>> dataMap) {
+        Set<Map.Entry<String, List<ObjectDigital>>> entries = dataMap.entrySet();
+        for (Map.Entry<String, List<ObjectDigital>> entry : entries) {
+            if (CollUtil.isEmpty(entry.getValue())){
+                throw new BusinessException(BusinessErrorRwdCode.A7303.getCode(), entry.getKey()+BusinessErrorRwdCode.A7303.getDesc());
+            }
+            if (CollUtil.size(entry.getValue())>1){
+                throw new BusinessException(BusinessErrorRwdCode.A7304.getCode(), entry.getKey()+BusinessErrorRwdCode.A7304.getDesc());
+            }
+        }
+    }
+
+    /***
+     * Description: 校验主对象的合法性
+     * @param resultList : 结果集
+     * @return : void
+     * @author : lijie
+     * @date :2021/9/3 14:52
+     * Update By lijie 2021/9/3 14:52
+     */
+    private void checkMasterObjValid(List<ObjectDigital> resultList,RequestData requestData) {
+        long count = resultList.stream()
+                .filter(ObjectDigital::getMainFlag).count();
+        if (count<=0){
+            throw new BusinessException(BusinessErrorRwdCode.A7301.getCode(), requestData.getFromContent()+BusinessErrorRwdCode.A7301.getDesc());
+        }
+        if (count>1){
+            throw new BusinessException(BusinessErrorRwdCode.A7302.getCode(), requestData.getFromContent()+BusinessErrorRwdCode.A7302.getDesc());
+        }
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.persagy.dmp.rwd.digital.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.dmp.rwd.digital.dao.RelationCalSignMapper;
+import com.persagy.dmp.rwd.digital.domain.RelationCalSign;
+import com.persagy.dmp.rwd.digital.service.RelationCalSignService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ */
+@Service
+public class RelationCalSignServiceImpl extends ServiceImpl<RelationCalSignMapper, RelationCalSign>
+implements RelationCalSignService {
+
+}
+
+
+
+

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

@@ -288,5 +288,99 @@
         </include>
     </select>
 
+    <sql id="queryMasterObjSql">
+        FROM
+        dt_object AS dobj
+        WHERE
+        1=1
+        <choose>
+            <when test='null!=param.type and param.type=="id" and null!=param.mainContent and param.mainContent.length>0'>
+                AND dobj.id=#{param.mainContent}
+            </when>
+            <when test='null!=param.type and param.type=="name" and null!=param.mainContent and param.mainContent.length>0'>
+                AND dobj.name=#{param.mainContent}
+            </when>
+            <when test='null!=param.type and param.type=="localId" and null!=param.mainContent and param.mainContent.length>0'>
+                AND dobj.local_id=#{param.mainContent}
+            </when>
+            <when test='null!=param.type and param.type=="localName" and null!=param.mainContent and param.mainContent.length>0'>
+                AND dobj.local_name=#{param.mainContent}
+            </when>
+            <when test='null!=param.type and param.type=="cadId" and null!=param.mainContent and param.mainContent.length>0'>
+                AND JSON_UNQUOTE(JSON_EXTRACT(dobj.infos, '$.cADID')) =#{param.mainContent}
+            </when>
+        </choose>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND dobj.group_code=#{param.groupCode}
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND dobj.project_id=#{param.projectId}
+        </if>
+        <if test="null!=param.masterObjType and param.masterObjType.length>0">
+            AND dobj.obj_type=#{param.masterObjType}
+        </if>
+        AND dobj.valid=TRUE
+    </sql>
+
+    <select id="queryObjectListByIdOrNameOrCadId" resultType="com.persagy.dmp.digital.entity.ObjectDigital">
+        SELECT
+            dobj.*,
+            true AS mainFlag,
+            IFNULL(JSON_UNQUOTE(JSON_EXTRACT(dobj.infos, '$.cADID')),"") AS cadId
+        <include refid="queryMasterObjSql">
+            <property name="param" value="#{param}"/>
+        </include>
+        UNION
+        SELECT
+        dobj.*,
+        false AS mainFlag,
+        IFNULL(JSON_UNQUOTE(JSON_EXTRACT(dobj.infos, '$.cADID')),"") AS cadId
+        FROM
+        dt_object AS dobj
+        WHERE
+        1=1
+        <choose>
+            <when test='null!=param.type and param.type=="id" and null!=param.fromContent and param.fromContent.size()>0'>
+                <foreach collection="param.fromContent" open="AND dobj.id IN(" close=")" separator="," item="keyword">
+                    #{keyword}
+                </foreach>
+            </when>
+            <when test='null!=param.type and param.type=="name" and null!=param.fromContent and param.fromContent.size()>0'>
+                <foreach collection="param.fromContent" open="AND dobj.name IN(" close=")" separator="," item="keyword">
+                    #{keyword}
+                </foreach>
+            </when>
+            <when test='null!=param.type and param.type=="localId" and null!=param.fromContent and param.fromContent.size()>0'>
+                <foreach collection="param.fromContent" open="AND dobj.local_id IN(" close=")" separator="," item="keyword">
+                    #{keyword}
+                </foreach>
+            </when>
+            <when test='null!=param.type and param.type=="localName" and null!=param.fromContent and param.fromContent.size()>0'>
+                <foreach collection="param.fromContent" open="AND dobj.local_name IN(" close=")" separator="," item="keyword">
+                    #{keyword}
+                </foreach>
+            </when>
+            <when test='null!=param.type and param.type=="cadId" and null!=param.fromContent and param.fromContent.size()>0'>
+                <foreach collection="param.fromContent" open="AND JSON_UNQUOTE(JSON_EXTRACT(dobj.infos, '$.cADID')) IN(" close=")" separator="," item="keyword">
+                    #{keyword}
+                </foreach>
+            </when>
+        </choose>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND dobj.group_code=#{param.groupCode}
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND dobj.project_id=#{param.projectId}
+        </if>
+        <if test="null!=param.slaveObjType and param.slaveObjType.length>0">
+            AND dobj.obj_type=#{param.slaveObjType}
+        </if>
+        AND dobj.id NOT IN(SELECT id <include refid="queryMasterObjSql"><property name="param" value="#{param}"/></include>)
+        <if test="null!=param.hasFilterClassCode and param.hasFilterClassCode">
+            AND dobj.class_code IN(SELECT class_code <include refid="queryMasterObjSql"><property name="param" value="#{param}"/></include>)
+        </if>
+        AND dobj.valid=TRUE
+    </select>
+
 
 </mapper>

+ 4 - 0
dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java

@@ -27,4 +27,8 @@ public interface CommonConstant {
 
     /** 默认配置的分页key */
     Long QUERY_DEFAULT_PAGE_SIZE = 500L;
+    /** 默认的图实例模板 */
+    String DEFAULT_GRAPH_ID_FORMAT = "Gt{}001";
+    /** 默认的关系唯一识别key */
+    CharSequence RELATION_UNIQUE_KEY_FORMAT = "{}_{}_{}_{}";
 }

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

@@ -37,6 +37,8 @@ public class RequestData {
     public static final String EQUIP_STATUS_HUM = "equipStatus";
     /** 维保单位名称 */
     public static final String WARRANTER = "warranter";
+    /** CADID图纸编码 */
+    public static final String CAD_ID = "cadId";
 
     /**账号id*/
     @JsonAlias({"user_id"})
@@ -222,5 +224,73 @@ public class RequestData {
     @JsonProperty("typeCode")
     @JSONField(name = "typeCode",alternateNames = {"typeCode","type_code"})
     private String typeCode;
+    /** 图类型编码 */
+    @JsonAlias({"graphCode","graph_code"})
+    @JsonProperty("graphCode")
+    @JSONField(name = "graphCode",alternateNames = {"graphCode","graph_code"})
+    private String graphCode;
+    /** 主对象分类 */
+    @JsonAlias({"masterObjType","master_obj_type"})
+    @JsonProperty("masterObjType")
+    @JSONField(name = "masterObjType",alternateNames = {"masterObjType","master_obj_type"})
+    private String masterObjType;
+    /** 从对象分类 */
+    @JsonAlias({"slaveObjType","slave_obj_type"})
+    @JsonProperty("slaveObjType")
+    @JSONField(name = "slaveObjType",alternateNames = {"slaveObjType","slave_obj_type"})
+    private String slaveObjType;
+    /** 信息点名称,CADID图纸编码(cadId),设备名称(name),设备ID(id),本地编码(localId),本地名称(localName) */
+    @JsonProperty("type")
+    @JSONField(name = "type")
+    private String type;
+    /** 主对象内容 */
+    @JsonAlias({"mainContent","main_content"})
+    @JsonProperty("mainContent")
+    @JSONField(name = "mainContent",alternateNames = {"mainContent","main_content"})
+    private String mainContent;
+    /** 从对象内容 */
+    @JsonAlias({"fromContent","from_content"})
+    @JsonProperty("fromContent")
+    @JSONField(name = "fromContent",alternateNames = {"fromContent","from_content"})
+    private Set<String> fromContent;
+    /** 计算标记 1 为手动 2为自动 */
+    @JsonProperty("sign")
+    @JSONField(name = "sign")
+    private String sign;
+    /** 创建关系时是否带上relValue,默认不赋值 */
+    @JsonAlias({"hasRelValue","has_rel_value"})
+    @JsonProperty("hasRelValue")
+    @JSONField(name = "hasRelValue",alternateNames = {"hasRelValue","has_rel_value"})
+    private Boolean hasRelValue;
+    /** 查询从对象时是否过滤主对象id,默认过滤 */
+    @JsonAlias({"hasFilterMasterId","has_filter_master_id"})
+    @JsonProperty("hasFilterMasterId")
+    @JSONField(name = "hasFilterMasterId",alternateNames = {"hasFilterMasterId","has_filter_master_id"})
+    private Boolean hasFilterMasterId;
+    /** 查询从对象时是否过滤classCode,true-过滤,false-不过滤,默认不过滤 */
+    @JsonAlias({"hasFilterClassCode","has_filter_class_code"})
+    @JsonProperty("hasFilterClassCode")
+    @JSONField(name = "hasFilterClassCode",alternateNames = {"hasFilterClassCode","has_filter_class_code"})
+    private Boolean hasFilterClassCode;
+    /** 是否检查传感器类型,true-检查,false-不检查,默认不检查 */
+    @JsonAlias({"hasCheckSensor","has_check_sensor"})
+    @JsonProperty("hasCheckSensor")
+    @JSONField(name = "hasCheckSensor",alternateNames = {"hasCheckSensor","has_check_sensor"})
+    private Boolean hasCheckSensor;
+    /** 是否检查classCode,true-检查,false-不检查,默认不检查 */
+    @JsonAlias({"hasCheckClassCode","has_check_class_code"})
+    @JsonProperty("hasCheckClassCode")
+    @JSONField(name = "hasCheckClassCode",alternateNames = {"hasCheckClassCode","has_check_class_code"})
+    private Boolean hasCheckClassCode;
+    /** 是否检查classCode使用的classCodes列表 */
+    @JsonAlias({"checkClassCodes","check_class_codes"})
+    @JsonProperty("checkClassCodes")
+    @JSONField(name = "checkClassCodes",alternateNames = {"checkClassCodes","check_class_codes"})
+    private Set<String> checkClassCodes;
+    /** 是否检查传感器使用的传感器类型列表 */
+    @JsonAlias({"checkSensorCodes","check_sensor_codes"})
+    @JsonProperty("checkSensorCodes")
+    @JSONField(name = "checkSensorCodes",alternateNames = {"checkSensorCodes","check_sensor_codes"})
+    private Set<String> checkSensorCodes;
 
 }

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

@@ -37,6 +37,12 @@ public class ObjectDigital extends AuditableEntity {
     public static final String CLASS_CODE_HUM = "class_code";
     /** 对象本地名称 */
     public static final String LOCAL_NAME_HUM = "localName";
+    /** 对象本地名称 */
+    public static final String LOCAL_NAME = "local_name";
+    /** 对象本地编码 */
+    public static final String LOCAL_ID = "local_id";
+    /** 对象名称 */
+    public static final String NAME = "name";
 
     /** 项目ID */
     private String projectId;
@@ -78,4 +84,10 @@ public class ObjectDigital extends AuditableEntity {
     /** 去向的对象id集合 */
     @TableField(exist = false)
     private Set<String> objToIds;
+    /** 主从对象标记,true-主对象,false-从对象 */
+    @TableField(exist = false)
+    private Boolean mainFlag;
+    /** CADID */
+    @TableField(exist = false)
+    private String cadId;
 }