Browse Source

实现源末端关系设置的新建和查询逻辑

lijie 3 years ago
parent
commit
9ca756e513

+ 72 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/controller/DigitalEquipClassRelController.java

@@ -0,0 +1,72 @@
+package com.persagy.dmp.rwd.define.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
+import com.persagy.dmp.common.constant.CommonConstant;
+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.ParamCheckUtil;
+import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
+import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.mybatis.utils.ConditionUtil;
+import com.persagy.dmp.rwd.define.service.DigitalEquipClassRelService;
+import com.persagy.dmp.rwd.define.service.IRelationDefineService;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+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 javax.validation.Valid;
+import java.util.List;
+
+/***
+ * Description:项目对象类型关系 Controller
+ * @author : lijie
+ * @date :2021/9/14 22:50
+ * Update By lijie 2021/9/14 22:50
+ */
+@RestController
+@RequestMapping("/rwd/def/equipClassRel")
+@RequiredArgsConstructor
+public class DigitalEquipClassRelController {
+
+    private final DigitalEquipClassRelService service;
+
+    /***
+     * Description: 查询项目对象类型关系
+     * @param criteria : 查询条件
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.define.entity.DigitalEquipClassRel>>
+     * @author : lijie
+     * @date :2021/9/14 22:51
+     * Update By lijie 2021/9/14 22:51
+     */
+    @PostMapping("/query")
+    public CommonResult<List<DigitalEquipClassRel>> query(@RequestBody QueryCriteria criteria) {
+        if(criteria == null) {
+            throw new BusinessException(ResponseCode.A0400.getCode(), ResponseCode.A0400.getDesc());
+        }
+        return service.query(criteria);
+    }
+    /***
+     * Description: 批量创建项目对象类型关系
+     * @param vo :
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.define.entity.DigitalEquipClassRel>>
+     * @author : lijie
+     * @date :2021/9/14 22:49
+     * Update By lijie 2021/9/14 22:49
+     */
+    @PostMapping("/create")
+    public CommonResult<List<DigitalEquipClassRel>> create(@RequestBody List<DigitalEquipClassRel> vo){
+        //基础参数校验
+        ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
+        return ResultHelper.single(service.create(vo));
+    }
+}

+ 15 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/dao/DigitalEquipClassRelMapper.java

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

+ 35 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/DigitalEquipClassRelService.java

@@ -0,0 +1,35 @@
+package com.persagy.dmp.rwd.define.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
+
+import java.util.List;
+
+/***
+ * Description: 项目设备类关系对象逻辑处理类
+ * @author : lijie
+ * @date :2021/9/14 21:09
+ * Update By lijie 2021/9/14 21:09
+ */
+public interface DigitalEquipClassRelService extends IService<DigitalEquipClassRel> {
+    /***
+     * Description: 创建设备类关系对象
+     * @param vo : 设备类关系对象
+     * @return : com.persagy.dmp.define.entity.DigitalEquipClassRel
+     * @author : lijie
+     * @date :2021/9/14 21:09
+     * Update By lijie 2021/9/14 21:09
+     */
+    List<DigitalEquipClassRel> create(List<DigitalEquipClassRel> vo);
+    /***
+     * Description: 根据条件查询设备类关系对象列表
+     * @param criteria : 查询条件
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.define.entity.DigitalEquipClassRel>>
+     * @author : lijie
+     * @date :2021/9/14 21:14
+     * Update By lijie 2021/9/14 21:14
+     */
+    CommonResult<List<DigitalEquipClassRel>> query(QueryCriteria criteria);
+}

+ 16 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/IRelationDefineService.java

@@ -2,16 +2,21 @@ package com.persagy.dmp.rwd.define.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.define.entity.DigitalEquipClassRel;
 import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 关系定义 接口
  * @author Charlie Yu
  * @date 2021-06-25
  */
-public interface IRelationDefineService {
+public interface IRelationDefineService extends IService<RelationDefine> {
 
     /**
      * 按条件计数
@@ -54,4 +59,14 @@ public interface IRelationDefineService {
      * @param id 主键
      */
     void delete(String id);
+    /***
+     * Description: 根据图类型编码和边类型编码查询边类型对象映射
+     * @param graphCodes : 图类型编码集合
+     * @param relCodes : 边类型编码集合
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.rwd.basic.constant.DigitalRelCode>
+     * @author : lijie
+     * @date :2021/9/14 21:21
+     * Update By lijie 2021/9/14 21:21
+     */
+    Map<String, RelationDefine> queryRelMapByCodes(Set<String> graphCodes, Set<String> relCodes);
 }

+ 169 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/DigitalEquipClassRelServiceImpl.java

@@ -0,0 +1,169 @@
+package com.persagy.dmp.rwd.define.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.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.dmp.basic.dto.RequestData;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.lang.PsDateTime;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
+import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.mybatis.utils.ConditionUtil;
+import com.persagy.dmp.rwd.basic.constant.BusinessErrorRwdCode;
+import com.persagy.dmp.rwd.define.dao.DigitalEquipClassRelMapper;
+import com.persagy.dmp.rwd.define.service.DigitalEquipClassRelService;
+import com.persagy.dmp.rwd.define.service.IRelationDefineService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/***
+ * Description: 项目设备类关系逻辑处理类
+ * @author : lijie
+ * @date :2021/9/14 21:27
+ * Update By lijie 2021/9/14 21:27
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class DigitalEquipClassRelServiceImpl extends ServiceImpl<DigitalEquipClassRelMapper, DigitalEquipClassRel>
+implements DigitalEquipClassRelService {
+
+    private final IRelationDefineService relationDefineService;
+
+    /***
+     * Description: 创建设备类关系对象
+     * @param voList : 设备类关系对象列表
+     * @return : com.persagy.dmp.define.entity.DigitalEquipClassRel
+     * @author : lijie
+     * @date :2021/9/14 21:09
+     * Update By lijie 2021/9/14 21:09
+     */
+    @Override
+    @Transactional(rollbackFor = BusinessException.class)
+    public List<DigitalEquipClassRel> create(List<DigitalEquipClassRel> voList) {
+        Set<String> calcNames = new HashSet<>();
+        // 1.如果关系类型code与图类型编码为空且calcName为空则报错
+        for (DigitalEquipClassRel vo : voList) {
+            if ((StrUtil.isBlank(vo.getGraphCode())
+                    || StrUtil.isBlank(vo.getRelCode()))
+                    && StrUtil.isBlank(vo.getCalcName())){
+                throw new BusinessException(ResponseCode.A0402.getCode(),"缺少图类型编码和关系类型编码");
+            }
+            if (StrUtil.isNotBlank(vo.getCalcName())){
+                calcNames.add(vo.getCalcName());
+            }
+        }
+        // 2.根据名称填充图类型编码及关系类型编码
+        Map<String, RelationDefine> relationDefineMap = new HashMap<>();
+        if (CollUtil.isNotEmpty(calcNames)){
+            // 根据名称查询图类型编码和关系类型编码
+            LambdaQueryWrapper<RelationDefine> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.in(RelationDefine::getName,calcNames);
+            queryWrapper.eq(RelationDefine::getValid,true);
+            List<RelationDefine> defines = relationDefineService.queryByCondition(queryWrapper);
+            if (CollUtil.isEmpty(defines)){
+                throw new BusinessException(ResponseCode.A0402.getCode(),"关系类型编码不存在");
+            }
+            // 获得关系类型编码映射
+            for (RelationDefine define : defines) {
+                RelationDefine relationDefine = relationDefineMap.get(define.getName());
+                if (null!=relationDefine){
+                    throw new BusinessException(ResponseCode.A0402.getCode(),define.getName()+"关系类型编码存在多条");
+                }
+                relationDefineMap.put(define.getName(),define);
+            }
+        }
+        // 3.填充数据
+        LambdaUpdateWrapper<DigitalEquipClassRel> updateWrapper = new LambdaUpdateWrapper<>();
+        for (DigitalEquipClassRel vo : voList) {
+            if (StrUtil.isNotBlank(vo.getCalcName())){
+                if(!relationDefineMap.containsKey(vo.getCalcName())){
+                    throw new BusinessException(ResponseCode.A0402.getCode(),vo.getCalcName()+"关系类型编码不存在");
+                }
+                RelationDefine relationDefine = relationDefineMap.get(vo.getCalcName());
+                vo.setGraphCode(relationDefine.getGraphCode());
+                vo.setRelCode(relationDefine.getCode());
+            }
+            vo.setProjectId(AppContext.getContext().getProjectId());
+            vo.setCreator(AppContext.getContext().getAccountId());
+            updateWrapper.or(wrapper->{
+                wrapper.eq(DigitalEquipClassRel::getGraphCode,vo.getGraphCode());
+                wrapper.eq(DigitalEquipClassRel::getRelCode,vo.getRelCode());
+                wrapper.eq(DigitalEquipClassRel::getProjectId,vo.getProjectId());
+            });
+        }
+        // 4.逻辑删除历史数据
+        DigitalEquipClassRel digitalEquipClassRel = new DigitalEquipClassRel();
+        digitalEquipClassRel.setModifier(AppContext.getContext().getAccountId());
+        digitalEquipClassRel.setModifiedTime(new PsDateTime());
+        digitalEquipClassRel.setValid(0);
+        this.update(digitalEquipClassRel,updateWrapper);
+        this.saveBatch(voList);
+        return voList;
+    }
+
+    /***
+     * Description: 根据条件查询设备类关系对象列表
+     * @param criteria : 查询条件
+     * @return : com.persagy.dmp.common.model.response.CommonResult<java.util.List<com.persagy.dmp.define.entity.DigitalEquipClassRel>>
+     * @author : lijie
+     * @date :2021/9/14 21:14
+     * Update By lijie 2021/9/14 21:14
+     */
+    @Override
+    public CommonResult<List<DigitalEquipClassRel>> query(QueryCriteria criteria) {
+        QueryWrapper<DigitalEquipClassRel> wrapper = new QueryWrapper<>();
+        // 添加所属项目条件
+        ConditionUtil.ensureProjectCriteriaDirectly(wrapper);
+        // 转换查询条件
+        QueryCriteriaHelper.toWrapper(wrapper, criteria, DigitalEquipClassRel.class);
+        if(criteria.isOnlyCount()) {
+            int total = count(wrapper);
+            return ResultHelper.multi(new ArrayList<>(),total);
+        }
+        Page<DigitalEquipClassRel> page = page(QueryCriteriaHelper.toPage(criteria), wrapper);
+        // 填充关系名称
+        List<DigitalEquipClassRel> records = page.getRecords();
+        if (CollUtil.isEmpty(records)){
+            return ResultHelper.multi(new ArrayList<>(),page.getTotal());
+        }
+        // 获取图类型和边类型编码
+        Set<String> graphCodes = records.stream()
+                .map(DigitalEquipClassRel::getGraphCode)
+                .collect(Collectors.toSet());
+        Set<String> relCodes = records.stream()
+                .map(DigitalEquipClassRel::getRelCode)
+                .collect(Collectors.toSet());
+        // {图类型编码_边类型编码:边类型对象}
+        Map<String, RelationDefine> relCodeMap = relationDefineService.queryRelMapByCodes(graphCodes,relCodes);
+        records.forEach(record->{
+            String key = record.getGraphCode() + StrUtil.UNDERLINE + record.getRelCode();
+            if (!relCodeMap.containsKey(key)){
+                return;
+            }
+            record.setCalcName(relCodeMap.get(key).getName());
+        });
+        return ResultHelper.multi(page.getRecords(), page.getTotal());
+    }
+
+
+}
+
+
+
+

+ 38 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/RelationDefineServiceImpl.java

@@ -1,16 +1,27 @@
 package com.persagy.dmp.rwd.define.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.dmp.common.constant.ValidEnum;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
 import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
+import com.persagy.dmp.rwd.define.dao.DigitalEquipClassRelMapper;
 import com.persagy.dmp.rwd.define.dao.RelationDefineMapper;
 import com.persagy.dmp.rwd.define.service.IRelationDefineService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 关系定义 实现类
@@ -19,7 +30,7 @@ import java.util.List;
  */
 @Service
 @Transactional(rollbackFor = Exception.class)
-public class RelationDefineServiceImpl implements IRelationDefineService {
+public class RelationDefineServiceImpl  extends ServiceImpl<RelationDefineMapper, RelationDefine> implements IRelationDefineService {
 
     @Resource
     private RelationDefineMapper dao;
@@ -57,4 +68,30 @@ public class RelationDefineServiceImpl implements IRelationDefineService {
         vo.setValid(ValidEnum.FALSE.getType());
         dao.updateById(vo);
     }
+    /***
+     * Description: 根据图类型编码和边类型编码查询边类型对象映射
+     * @param graphCodes : 图类型编码集合
+     * @param relCodes : 边类型编码集合
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.rwd.basic.constant.DigitalRelCode>
+     * @author : lijie
+     * @date :2021/9/14 21:21
+     * Update By lijie 2021/9/14 21:21
+     */
+    @Override
+    public Map<String, RelationDefine> queryRelMapByCodes(Set<String> graphCodes, Set<String> relCodes) {
+        if (CollUtil.isEmpty(graphCodes)
+                || CollUtil.isEmpty(relCodes)){
+            return new HashMap<>();
+        }
+        LambdaQueryWrapper<RelationDefine> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(RelationDefine::getGraphCode,graphCodes);
+        queryWrapper.in(RelationDefine::getCode,relCodes);
+        queryWrapper.eq(RelationDefine::getValid,true);
+        List<RelationDefine> relationDefines = this.list(queryWrapper);
+        if (CollUtil.isEmpty(relationDefines)){
+            return new HashMap<>();
+        }
+        return relationDefines.stream().collect(Collectors.toMap(relationDefine -> relationDefine.getGraphCode()
+                + StrUtil.UNDERLINE+relationDefine.getCode(),relationDefine -> relationDefine,(k1,k2)->k1));
+    }
 }

+ 16 - 0
dmp-business/dmp-rwd/src/main/resources/db/init/schema.sql

@@ -190,3 +190,19 @@ CREATE TABLE  IF NOT EXISTS `relation_project_cal`  (
 `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP  ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '乐观锁',
 PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT = Dynamic COMMENT='项目关系记录表';
+
+CREATE TABLE IF NOT EXISTS `dt_equip_class_rel`  (
+ `id` varchar(40) NOT NULL COMMENT '主键,32位UUID',
+ `project_id` varchar(40) NULL DEFAULT NULL COMMENT '项目id',
+ `source_equip_code` varchar(40) NULL DEFAULT NULL COMMENT '源端设备类编码',
+ `end_equip_code` varchar(40) NULL DEFAULT NULL COMMENT '末端设备类编码',
+ `graph_code` varchar(40) NULL DEFAULT NULL COMMENT '图类型编码',
+ `rel_code` varchar(40) NULL DEFAULT NULL COMMENT '边类型编码',
+ `creator` varchar(32) NULL DEFAULT NULL COMMENT '创建人',
+ `creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
+ `modifier` varchar(32) NULL DEFAULT NULL COMMENT '最后修改人',
+ `modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
+ `valid` tinyint(0) NULL DEFAULT 1 COMMENT '合法标识',
+ `ts` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '乐观锁',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COMMENT = '项目设备类边关系表' ROW_FORMAT = Dynamic;

+ 2 - 2
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/QueryCriteriaHelper.java

@@ -27,7 +27,7 @@ public class QueryCriteriaHelper {
      * @param criteria
      * @return
      */
-    public static Page toPage(QueryCriteria criteria) {
+    public static <T> Page<T> toPage(QueryCriteria criteria) {
         if(criteria == null) {
             criteria = new QueryCriteria();
         }
@@ -39,7 +39,7 @@ public class QueryCriteriaHelper {
         if(criteria.getSize() == null || criteria.getSize() < 1) {
             criteria.setSize(-1L);
         }
-        Page pageInfo = new Page();
+        Page<T> pageInfo = new Page<>();
         pageInfo.setCurrent(criteria.getPage());
         pageInfo.setSize(criteria.getSize());
         // 20210819 size<-1时,拦截器不执行page的配置,因此改为在wrapper中排序

+ 56 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/define/client/DigitalEquipClassRelClient.java

@@ -0,0 +1,56 @@
+package com.persagy.dmp.define.client;
+
+import com.persagy.dmp.basic.config.DigitalFeignConfig;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 文件管理Client
+ * @author Charlie Yu
+ * @date 2021-05-15
+ */
+@FeignClient(name = "dmp-rwd", configuration = DigitalFeignConfig.class,
+        url = "${persagy.bdtp.rwd.service:}",path = "/rwd/def/equipClassRel")
+public interface DigitalEquipClassRelClient {
+
+    /**
+     * 查询项目对象类型关系
+     * @param groupCode 集团编码
+     * @param projectId 项目ID
+     * @param appId 应用ID
+     * @param userId 用户ID
+     * @param criteria 查询条件
+     * @return 项目对象类型关系
+     */
+    @PostMapping("query")
+    CommonResult<List<DigitalEquipClassRel>> query(
+            @RequestParam("groupCode") String groupCode,
+            @RequestParam("projectId") String projectId,
+            @RequestParam("appId") String appId,
+            @RequestParam("userId") String userId,
+            @RequestBody QueryCriteria criteria);
+
+    /**
+     * 新增项目对象类型关系-批量新增
+     * @param groupCode: 集团编码
+     * @param projectId: 项目ID
+     * @param appId: 应用ID
+     * @param userId: 用户ID
+     * @param voList: 新增项目对象类型关系对象数组
+     * @return 项目对象类型关系对象数组
+     */
+    @PostMapping("create")
+    CommonResult<List<DigitalEquipClassRel>> createBatch(@RequestParam("groupCode") String groupCode,
+                                                         @RequestParam("projectId") String projectId,
+                                                         @RequestParam("appId") String appId,
+                                                         @RequestParam("userId") String userId,
+                                                         @RequestBody List<DigitalEquipClassRel> voList);
+}

+ 61 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/define/client/DigitalEquipClassRelFacade.java

@@ -0,0 +1,61 @@
+package com.persagy.dmp.define.client;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.define.entity.DigitalEquipClassRel;
+
+import java.util.List;
+
+/***
+ * Description: 项目对象类型关系Client门面
+ * @author : lijie
+ * @date :2021/9/14 23:10
+ * Update By lijie 2021/9/14 23:10
+ */
+public class DigitalEquipClassRelFacade {
+
+    private static DigitalEquipClassRelClient client = SpringUtil.getBean(DigitalEquipClassRelClient.class);
+
+    /**
+     * 查询项目对象类型关系
+     * @param groupCode 集团编码
+     * @param projectId 项目ID
+     * @param appId 应用ID
+     * @param userId 用户ID
+     * @param criteria 查询条件
+     * @return 项目对象类型关系
+     */
+    public static List<DigitalEquipClassRel> query(String groupCode, String projectId, String appId, String userId, QueryCriteria criteria) {
+        CommonResult<List<DigitalEquipClassRel>> result = client.query(groupCode, projectId, appId, userId, criteria);
+        return ResultHelper.getContent(result);
+    }
+
+    /**
+     * 查询项目对象类型关系-原样返回结果
+     * @param groupCode 集团编码
+     * @param projectId 项目ID
+     * @param appId 应用ID
+     * @param userId 用户ID
+     * @param criteria 查询条件
+     * @return 项目对象类型关系对象集合
+     */
+    public static CommonResult<List<DigitalEquipClassRel>> queryPrototype(String groupCode, String projectId, String appId, String userId, QueryCriteria criteria) {
+        return client.query(groupCode, projectId, appId, userId, criteria);
+    }
+
+    /**
+     * 创建项目对象类型关系-批量新增
+     * @param groupCode 集团编码
+     * @param projectId 项目ID
+     * @param appId 应用ID
+     * @param userId 用户ID
+     * @param voList 对象类型对象数组
+     * @return 项目对象类型关系对象数组
+     */
+    public static List<DigitalEquipClassRel> createBatch(String groupCode, String projectId, String appId, String userId, List<DigitalEquipClassRel> voList) {
+        CommonResult<List<DigitalEquipClassRel>> commonResult = client.createBatch(groupCode, projectId, appId, userId, voList);
+        return commonResult.getData();
+    }
+}

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

@@ -0,0 +1,81 @@
+package com.persagy.dmp.define.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 项目设备类边关系表
+ * @TableName dt_equip_class_rel
+ */
+@TableName(value ="dt_equip_class_rel")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DigitalEquipClassRel extends AuditableEntity {
+
+    /**
+     * 项目id
+     */
+    @TableField(value = "project_id")
+    private String projectId;
+
+    /**
+     * 源端设备类编码
+     */
+    @TableField(value = "source_equip_code")
+    private String sourceEquipCode;
+
+    /**
+     * 末端设备类编码
+     */
+    @TableField(value = "end_equip_code")
+    private String endEquipCode;
+
+    /**
+     * 图类型编码
+     */
+    @TableField(value = "graph_code")
+    private String graphCode;
+
+    /**
+     * 边类型编码
+     */
+    @TableField(value = "rel_code")
+    private String relCode;
+    /**
+     * 边类型名称
+     */
+    @TableField(exist = false)
+    private String calcName;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @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(", projectId=").append(projectId);
+        sb.append(", sourceEquipCode=").append(sourceEquipCode);
+        sb.append(", endEquipCode=").append(endEquipCode);
+        sb.append(", graphCode=").append(graphCode);
+        sb.append(", relCode=").append(relCode);
+        sb.append(", creator=").append(creator);
+        sb.append(", creationTime=").append(creationTime);
+        sb.append(", modifier=").append(modifier);
+        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();
+    }
+}