Browse Source

Merge remote-tracking branch 'origin/develop' into develop

lijie 3 years ago
parent
commit
7eec0a9827
17 changed files with 681 additions and 14 deletions
  1. 11 0
      dmp-business/dmp-rwd-plus/README.md
  2. 39 0
      dmp-business/dmp-rwd-plus/pom.xml
  3. 63 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/controller/QrCodeController.java
  4. 103 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/handler/QrCodeMessageHandler.java
  5. 14 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/service/QrCodeService.java
  6. 99 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/service/impl/QrCodeServiceImpl.java
  7. 132 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/version/entity/ObjectDigitalHistory.java
  8. 81 0
      dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/version/entity/ObjectRelationHistory.java
  9. 41 0
      dmp-business/dmp-rwd-plus/src/main/resources/bootstrap.yml
  10. 0 0
      dmp-business/dmp-rwd-plus/src/main/resources/db/init/data.sql
  11. 0 0
      dmp-business/dmp-rwd-plus/src/main/resources/db/init/migrate.sql
  12. 64 0
      dmp-business/dmp-rwd-plus/src/main/resources/db/init/schema.sql
  13. 3 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java
  14. 2 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/IObjectDigitalService.java
  15. 16 14
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java
  16. 1 0
      dmp-business/pom.xml
  17. 12 0
      dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java

+ 11 - 0
dmp-business/dmp-rwd-plus/README.md

@@ -0,0 +1,11 @@
+物理世界增强服务
+============ 
+1. 对象二维码生成工具
+2. 物理世界数据版本管理
+
+说明
+---------------
+
+最新变化
+---------------
+

+ 39 - 0
dmp-business/dmp-rwd-plus/pom.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>dmp-business</artifactId>
+        <groupId>com.persagy</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <artifactId>dmp-rwd-plus</artifactId>
+    <packaging>jar</packaging>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-file-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-digital-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-amqp-starter</artifactId>
+        </dependency>
+        <!--生成二维码-->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-rwd</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 63 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/controller/QrCodeController.java

@@ -0,0 +1,63 @@
+package com.persagy.dmp.rwd.qrcode.controller;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.rwd.qrcode.service.QrCodeService;
+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 java.util.List;
+
+/**
+ * 二维码管理
+ * @author:linhuili
+ * @date:2021/11/8
+ */
+@RestController
+@RequestMapping("/rwd/plus/qrCode")
+public class QrCodeController {
+
+    @Autowired
+    private QrCodeService qrCodeService;
+
+    /**
+     * 对象生成默认二维码
+     * @param criteria
+     * @return
+     * @throws Exception
+     */
+    @PostMapping("/createDefaultQrCode")
+    @Deprecated
+    public CommonResult createDefaultQrCode(@RequestBody QueryCriteria criteria) throws Exception {
+        String projectId = AppContext.getContext().getProjectId();
+        String groupCode = AppContext.getContext().getGroupCode();
+        //统计对象数据总数
+        criteria.setOnlyCount(true);
+        List<ObjectNode> onlyCountList = DigitalObjectFacade.query(groupCode, projectId, null, null, criteria);
+        Integer total = onlyCountList.size();
+        if(total <= 0){
+            return CommonResult.success("暂无可生成二维码的对象数据");
+        }
+        //分页处理:生成对象二维码
+        int pageNum = total / 500;
+        for(int i=0 ; i< pageNum ; i++){
+            criteria.setOnlyCount(false);
+            criteria.setPage(Long.valueOf(i));
+            criteria.setSize(Long.valueOf(500));
+            List<ObjectNode> pageList = DigitalObjectFacade.query(groupCode, projectId, null, null, criteria);
+            if(pageList.size() <= 0){
+                continue;
+            }
+            qrCodeService.createDefaultQrCode(pageList);
+        }
+        return CommonResult.success("创建成功");
+    }
+
+
+}

+ 103 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/handler/QrCodeMessageHandler.java

@@ -0,0 +1,103 @@
+package com.persagy.dmp.rwd.qrcode.handler;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.amqp.handler.AbstractRabbitHandlerTemplate;
+import com.persagy.dmp.basic.model.DigitalManageMessage;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.file.model.UploadMes;
+import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.rwd.qrcode.service.impl.QrCodeServiceImpl;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 二维码消息处理
+ * @author:linhuili
+ * @date:2021/11/8
+ */
+@Slf4j
+@Component
+@RabbitListener(queues = "queue-dmp-rwd")
+public class QrCodeMessageHandler extends AbstractRabbitHandlerTemplate {
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    @Autowired
+    private QrCodeServiceImpl qrCodeService;
+
+    @Override
+    protected void handler(String message, Channel channel, Message vo) {
+          try {
+            log.info("接收对象消息:{}", message);
+            //接收对象消息
+            DigitalManageMessage messageVO = objectMapper.readValue(message, DigitalManageMessage.class);
+            ObjectNode objectDigital = messageVO.getNewObj();
+            if(objectDigital == null || StringUtils.isEmpty(messageVO.getOperatorType())){
+                log.info("新增消息格式有误:{}"+ messageVO);
+            }
+            //获取基本参数
+            String groupCode = objectDigital.get("groupCode").textValue();
+            String projectId = objectDigital.get("projectId").textValue();
+            //创建二维码图片
+            if(DigitalMessageConstant.OPERATE_AFTER_INSERT.equals(messageVO.getOperatorType())){
+                createObjectQrCode(groupCode,projectId,objectDigital);
+            }
+            //删除二维码信息
+            if(DigitalMessageConstant.OPERATE_AFTER_DELETE.equals(messageVO.getOperatorType())){
+                removeObjectQrCode(groupCode,projectId,objectDigital);
+            }
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+            throw new BusinessException(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 生成二维码信息
+     * @param digital
+     */
+    private void createObjectQrCode(String groupCode,String projectId,ObjectNode digital){
+        //生成二维码图片并上传到文件服务器
+        UploadMes objectQrCode = qrCodeService.createObjectQrCode(groupCode,projectId,digital);
+        if(objectQrCode == null){
+            log.info("生成二维码失败");
+            return;
+        }
+        //设置对象二维码信息
+        qrCodeService.setObjectQrCode(digital,objectQrCode);
+        //更新对象二维码信息
+        List<ObjectNode> list = new ArrayList<>();
+        list.add(digital);
+        DigitalObjectFacade.update(groupCode,projectId,null,null,list);
+    }
+
+    /**
+     * 移除对象二维码信息点
+     * @param digital
+     */
+    public void removeObjectQrCode(String groupCode,String projectId,ObjectNode digital){
+        ObjectNode infos = JsonNodeFactory.instance.objectNode();
+        //删除二维码信息点
+        ArrayNode removeInfos = JsonNodeFactory.instance.arrayNode();
+        removeInfos.add(CommonConstant.QR_CODE_PIC_INFO);
+        infos.put(CommonConstant.REMOVE_FIELD, removeInfos);
+
+        List<ObjectNode> list = new ArrayList<>();
+        list.add(digital);
+        DigitalObjectFacade.update(groupCode,projectId,null,null,list);
+    }
+}

+ 14 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/service/QrCodeService.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.rwd.qrcode.service;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.List;
+
+public interface QrCodeService {
+
+    /**
+     * 生成默认二维码
+     * @param objectDigitals
+     */
+    void createDefaultQrCode(List<ObjectNode> objectDigitals);
+}

+ 99 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/qrcode/service/impl/QrCodeServiceImpl.java

@@ -0,0 +1,99 @@
+package com.persagy.dmp.rwd.qrcode.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.digital.client.DigitalObjectFacade;
+import com.persagy.dmp.file.client.FileClientFacade;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
+import com.persagy.dmp.rwd.qrcode.service.QrCodeService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * 二维码管理 Service
+ * @author:linhuili
+ * @date:2021/11/8
+ */
+@Service
+@Slf4j
+public class QrCodeServiceImpl implements QrCodeService {
+
+    /**
+     * 生成默认二维码
+     * @param objectDigitals
+     */
+    @Override
+    public void createDefaultQrCode(List<ObjectNode> objectDigitals) {
+        if(CollUtil.isEmpty(objectDigitals)){
+            return;
+        }
+        //获取基础参数
+        String projectId = AppContext.getContext().getProjectId();
+        String groupCode = AppContext.getContext().getGroupCode();
+        for (ObjectNode objectDigital : objectDigitals) {
+            //生成二维码图片,并上传到文件服务器
+            UploadMes objectQrCode = createObjectQrCode(groupCode,projectId,objectDigital);
+            if(objectQrCode == null){
+                log.info("生成二维码失败");
+                continue;
+            }
+            //设置对象二维码信息
+            setObjectQrCode(objectDigital,objectQrCode);
+        }
+        //更新对象二维码信息
+        DigitalObjectFacade.update(groupCode,projectId,null,null,objectDigitals);
+    }
+
+    /**
+     * 设置二维码图片
+     * @param objectDigital
+     */
+    public void setObjectQrCode(ObjectNode objectDigital, UploadMes objectQrCode){
+        //设置二维码信息
+        ArrayNode qrCodePics = JsonNodeFactory.instance.arrayNode();
+        ObjectNode qrCodePic = JsonNodeFactory.instance.objectNode();
+        qrCodePic.put("key", objectQrCode.getId());
+        qrCodePics.add(qrCodePic);
+        objectDigital.put(CommonConstant.QR_CODE_PIC_INFO,qrCodePics);
+    }
+
+    /**
+     * 生成二维码信息并上传到文件服务器
+     * @param objectDigital
+     */
+    public UploadMes createObjectQrCode(String groupCode,String projectId,ObjectNode objectDigital){
+        //获取基础参数
+        String objId =objectDigital.get("id").textValue();
+        String key = CommonConstant.QRCODE_KEY_PREFIX +"_"+ objId;
+        //生成二维码
+        QrConfig qrConfig = new QrConfig(300, 300);
+        File qrCodeFile = QrCodeUtil.generate(objId, qrConfig, FileUtil.file("/image"));
+        //上传到文件服务器
+        FileRequestData fileRequestData = new FileRequestData();
+        fileRequestData.setFileName(key);
+        fileRequestData.setFileMd5(SecureUtil.md5(qrCodeFile));
+        fileRequestData.setGroupCode(groupCode);
+        fileRequestData.setFileBucket(CommonConstant.FILE_BUCKET_NAME);
+        fileRequestData.setFileSize(qrCodeFile.length());
+        CommonResult<UploadMes> uploadMesCommonResult = FileClientFacade.initSingleUploadPrototype(groupCode,projectId,null,null,fileRequestData);
+        if(!CommonConstant.QUERY_SUCCESS.equals(uploadMesCommonResult.getResult())){
+            log.info("上传文件失败:"+uploadMesCommonResult.getMessage());
+            return new UploadMes();
+        }
+        log.info("生成二维码信息"+uploadMesCommonResult.getMessage());
+        return uploadMesCommonResult.getData();
+    }
+}

+ 132 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/version/entity/ObjectDigitalHistory.java

@@ -0,0 +1,132 @@
+package com.persagy.dmp.rwd.version.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.common.lang.PsDateTime;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+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;
+
+/**
+ * 对象数据
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName(value = "dt_object_his",autoResultMap = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ObjectDigitalHistory extends AuditableEntity {
+
+    /** 扩展属性列 */
+    public static final String EXTRA_COLUMN = "infos";
+    /** 扩展属性列 */
+    public static final String OBJ_TYPE = "obj_type";
+    /** 扩展属性列 */
+    public static final String OBJ_TYPE_HUM = "objType";
+    /** 对象类型 */
+    public static final String CLASS_CODE = "class_code";
+    /** 对象类型 */
+    public static final String CLASS_CODE_HUM = "classCode";
+    /** 对象本地名称 */
+    public static final String LOCAL_NAME_HUM = "localName";
+    /** 对象本地名称 */
+    public static final String LOCAL_NAME = "local_name";
+    /** 对象本地编码 */
+    public static final String LOCAL_ID_HUM = "localId";
+    /** 对象本地编码 */
+    public static final String LOCAL_ID = "local_id";
+    /** 对象名称 */
+    public static final String NAME = "name";
+
+    /** 项目ID */
+    private String projectId;
+
+    /** 对象id */
+    private String objId;
+    /** 名称 */
+    @NotNull(message = "名称不允许为空")
+    @Length(max = 200)
+    private String name;
+    /** 本地编码 */
+    private String localId;
+    /** 本地名称 */
+    private String localName;
+    /** 对象分类 */
+    private String objType;
+    /** 类型编码 */
+    @NotNull(message = "类型编码不允许为空")
+    @Length(max = 40)
+    private String classCode;
+    /** 集团编码 */
+    private String groupCode;
+    /** 组标识 mysql8中grouping是关键字,必须标识 */
+    @TableField(value = "`grouping`")
+    private Integer grouping;
+    /** 边类型编码 */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private ObjectNode infos;
+    /** 虚点清单 */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<String> virtualCodes;
+    /** 创建应用 */
+    private String createApp;
+    /** 最后修改应用 */
+    private String updateApp;
+    /** 符合查询条件的数据总条数 */
+    @TableField(exist = false)
+    private Integer totalCount;
+    /** 来源的对象id集合 */
+    @TableField(exist = false)
+    private Set<String> objFromIds;
+    /** 去向的对象id集合 */
+    @TableField(exist = false)
+    private Set<String> objToIds;
+    /** 主从对象标记,true-主对象,false-从对象 */
+    @TableField(exist = false)
+    private Boolean mainFlag;
+    /** CADID */
+    @TableField(exist = false)
+    private String cadId;
+    /** 模型id */
+    @TableField(exist = false)
+    private String modelId;
+    /** 序号 */
+    @TableField(exist = false)
+    private Integer sequenceId;
+    /** 是否使用的标记 */
+    @TableField(exist = false)
+    private Boolean usedFlag;
+    /** 关联的对象列表 */
+    @TableField(exist = false,typeHandler = JacksonTypeHandler.class)
+    private List<ObjectDigitalHistory> 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;
+    /** 该对象的对象分类所拥有的classCode集合 */
+    @TableField(exist = false,typeHandler = JacksonTypeHandler.class,value = "objTypeClassCodes")
+    private Set<String> objTypeClassCodes;
+
+    /** 最新标示 */
+    private Boolean lastFlag;
+
+    /** 版本创建时间 */
+    private PsDateTime startTime;
+
+    /** 版本结束时间 */
+    private PsDateTime endTime;
+}

+ 81 - 0
dmp-business/dmp-rwd-plus/src/main/java/com/persagy/dmp/rwd/version/entity/ObjectRelationHistory.java

@@ -0,0 +1,81 @@
+package com.persagy.dmp.rwd.version.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.persagy.dmp.common.lang.PsDateTime;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotNull;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ * 对象数据
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName(value = "dt_relation_his", autoResultMap = true)
+public class ObjectRelationHistory extends AuditableEntity {
+
+    public static final String OBJ_FROM="obj_from";
+    public static final String OBJ_TO="obj_to";
+    public static final String REL_CODE_HUM="relCode";
+    public static final String OBJ_FROM_HUM="objFrom";
+    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;
+    /** 集团编码 */
+    private String groupCode;
+
+    /** 关系id */
+    private String relId;
+    /** 图例ID */
+    @Length(max = 40)
+    private String graphId;
+    /** 图例编码 */
+    @NotNull(message = "图例编码不允许为空")
+    @Length(max = 40)
+    private String graphCode;
+    /** 关系编码 */
+    @NotNull(message = "关系编码不允许为空")
+    @Length(max = 40)
+    private String relCode;
+    /** 关系值 */
+    private String relValue;
+    /** 来源对象 */
+    @NotNull(message = "来源对象不允许为空")
+    private String objFrom;
+    /** 目标对象 */
+    @NotNull(message = "目标对象不允许为空")
+    private String objTo;
+    /** 创建应用 */
+    private String createApp;
+    /** 最后修改应用 */
+    private String updateApp;
+    /** 对象的outline平面坐标 */
+    @TableField(exist = false,typeHandler = JacksonTypeHandler.class,value = "outLines")
+    private List<LinkedHashMap<String,Object>> outLines;
+    /** 统计数 */
+    @TableField(exist = false)
+    private Integer count;
+
+    /** 最新标示 */
+    private Boolean lastFlag;
+
+    /** 版本创建时间 */
+    private PsDateTime startTime;
+
+    /** 版本结束时间 */
+    private PsDateTime endTime;
+}

+ 41 - 0
dmp-business/dmp-rwd-plus/src/main/resources/bootstrap.yml

@@ -0,0 +1,41 @@
+server:
+  port: 8833
+spring:
+  application:
+    # 应用名称
+    name: dmp-rwd-plus
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+#  datasource:
+#    druid:
+#      filters: stat,slf4j
+#      filter:
+#        wall:
+#          config:
+#            #允许一次执行多条语句
+#            multi-statement-allow: true
+#            #允许非基本语句的其他语句,开启后可以执行DDL语句
+#            none-base-statement-allow: true
+#          enabled: false
+#        slf4j:
+#          enabled: true
+
+config:
+  file:
+    absolute:
+      path: ${CONFIG_FILE_PATH:D:\SpringCloud}
+#feign:
+#  compression:
+#    request:
+#      # 开启请求压缩
+#      enabled: true
+#      # 配置压缩的 MIME TYPE
+#      mime-types: text/xml,application/xml,application/json
+#      # 配置压缩数据大小的下限
+#      min-request-size: 2048
+#    response:
+#      # 开启响应压缩
+#      enabled: true
+#扫描Entity, 加入此设置方可在Mybatis的XML文件中使用实体类的Alias
+mybatis-plus:
+  type-handlers-package: com.persagy.dmp.basic.config

+ 0 - 0
dmp-business/dmp-rwd-plus/src/main/resources/db/init/data.sql


+ 0 - 0
dmp-business/dmp-rwd-plus/src/main/resources/db/init/migrate.sql


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

@@ -0,0 +1,64 @@
+
+CREATE TABLE IF NOT EXISTS `dt_object_his` (
+  `id` varchar(100) NOT NULL,
+  `objId` varchar(100) DEFAULT NULL COMMENT '对象id',
+  `name` varchar(100) DEFAULT NULL COMMENT '对象名称',
+  `local_id` varchar(100) DEFAULT NULL COMMENT '对象本地编码',
+  `local_name` varchar(100) DEFAULT NULL COMMENT '对象本地名称',
+  `group_code` varchar(40) DEFAULT NULL COMMENT '集团编码',
+  `project_id` varchar(40) NOT NULL COMMENT '项目id',
+  `obj_type` varchar(40) NOT NULL COMMENT '对象分类',
+  `class_code` varchar(40) NOT NULL COMMENT '对象类型编码',
+  `grouping` int(11) NOT NULL DEFAULT '1' COMMENT '1单个对象,2对象组',
+  `infos` json DEFAULT NULL COMMENT '边类型编码',
+  `virtual_codes` json DEFAULT NULL COMMENT '虚点清单',
+  `create_app` varchar(40) DEFAULT NULL COMMENT '创建应用',
+  `update_app` varchar(40) DEFAULT NULL COMMENT '最后更新应用',
+  `creator` varchar(32) DEFAULT NULL COMMENT '创建人',
+  `creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
+  `modifier` varchar(32) DEFAULT NULL COMMENT '最后修改人',
+  `modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
+  `last_flag` tinyint DEFAULT NULL COMMENT '最新标示',
+  `start_time` char(14) NULL DEFAULT NULL COMMENT '版本开始时间',
+  `end_time` char(14) NULL DEFAULT NULL COMMENT '版本结束时间',
+  `valid` tinyint DEFAULT NULL COMMENT '合法标识',
+  `ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+  PRIMARY KEY (`id`) USING BTREE,
+  KEY `idx_project_1` (`project_id`,`class_code`,`creation_time`) USING BTREE,
+  KEY `idx_project_2` (`project_id`,`creation_time`) USING BTREE,
+  KEY `idx_project_3` (`project_id`,`modified_time`) USING BTREE,
+  KEY `idx_project_4` (`obj_type`) USING BTREE,
+  KEY `idx_project_5` (`project_id`) USING BTREE
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='对象实例表';
+
+CREATE TABLE IF NOT EXISTS `dt_relation_his` (
+  `id` varchar(40) NOT NULL,
+  `rel_id` varchar(40) DEFAULT NULL COMMENT '关系id',
+  `group_code` varchar(40) DEFAULT NULL,
+  `project_id` varchar(40) NOT NULL,
+  `graph_id` varchar(40) DEFAULT NULL COMMENT '图主键',
+  `graph_code` varchar(40) DEFAULT NULL COMMENT '图编码',
+  `rel_code` varchar(40) DEFAULT NULL COMMENT '关系编码',
+  `rel_value` varchar(50) DEFAULT NULL COMMENT '关系值',
+  `obj_from` varchar(60) DEFAULT NULL COMMENT '来源对象',
+  `obj_to` varchar(60) DEFAULT NULL COMMENT '目标对象',
+  `create_app` varchar(40) DEFAULT NULL COMMENT '创建应用',
+  `update_app` varchar(40) DEFAULT NULL COMMENT '最后更新应用',
+  `creator` varchar(32) DEFAULT NULL COMMENT '创建人',
+  `creation_time` char(14) NULL DEFAULT NULL COMMENT '创建时间',
+  `modifier` varchar(32) DEFAULT NULL COMMENT '最后修改人',
+  `modified_time` char(14) NULL DEFAULT NULL COMMENT '最后修改时间',
+  `last_flag` tinyint DEFAULT NULL COMMENT '最新标示',
+  `start_time` char(14) NULL DEFAULT NULL COMMENT '版本开始时间',
+  `end_time` char(14) NULL DEFAULT NULL COMMENT '版本结束时间',
+  `valid` tinyint DEFAULT '1' COMMENT '合法标识',
+  `ts` timestamp default current_timestamp on update current_timestamp NOT NULL COMMENT '乐观锁',
+  PRIMARY KEY (`id`) USING BTREE,
+  KEY `idx_graph_code` (`graph_code`) USING BTREE,
+  KEY `idx_1` (`graph_code`,`rel_code`,`obj_from`,`obj_to`,`project_id`) USING BTREE,
+  KEY `idx_2` (`graph_id`,`rel_code`,`obj_from`,`obj_to`,`project_id`) USING BTREE,
+  KEY `idx_3` (`graph_code`,`rel_code`,`obj_to`,`project_id`) USING BTREE,
+  KEY `idx_4` (`graph_id`,`rel_code`,`obj_to`,`project_id`) USING BTREE,
+  KEY `idx_5` (`obj_from`) USING BTREE,
+  KEY `idx_6` (`obj_to`) USING BTREE
+) ENGINE=InnoDB ROW_FORMAT=DYNAMIC COMMENT='关系实例表';

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

@@ -478,4 +478,7 @@ public class ObjectDigitalController{
             }
         }
     }
+
+
+
 }

+ 2 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/IObjectDigitalService.java

@@ -3,6 +3,7 @@ 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.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.digital.entity.ObjectDigital;
@@ -147,4 +148,5 @@ public interface IObjectDigitalService extends IService<ObjectDigital> {
      * Update By lijie 2021/9/27 17:46
      */
     CommonResult<List<ObjectDigital>> batchUpdateClassCodesByIds(List<ObjectDigital> objectDigitals);
+
 }

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

@@ -2,15 +2,21 @@ package com.persagy.dmp.rwd.digital.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
 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.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.dto.RequestData;
 import com.persagy.dmp.basic.model.CodeTableTypeEnum;
@@ -39,11 +45,14 @@ import com.persagy.dmp.rwd.digital.dao.ObjectRelationMapper;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
 import com.persagy.dmp.rwd.parser.service.InfoDataFactory;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.File;
 import java.lang.reflect.Field;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -55,6 +64,7 @@ import java.util.stream.Collectors;
 @Service
 @Transactional(rollbackFor = Exception.class)
 @RequiredArgsConstructor
+@Slf4j
 public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, ObjectDigital> implements IObjectDigitalService {
 
     private final ObjectDigitalMapper objectDigitalMapper;
@@ -85,10 +95,10 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
 
     @Override
     public List<ObjectDigital> insert(List<ObjectDigital> voList) {
-        validateOnSave(voList, false);
         if(CollUtil.isEmpty(voList)) {
             return null;
         }
+        validateOnSave(voList, false);
         //获取对象类型
         Map<String, String> typeMap = typeService.queryObjTypeMap();
         voList.forEach(vo -> {
@@ -128,9 +138,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         fillClassCodeForUpdate(voList,dbMap);
         //信息点校验
         validateOnSave(voList, true);
-        if(CollUtil.isEmpty(voList)) {
-            return null;
-        }
+        List<ObjectDigital> resultList = new ArrayList<>();
         voList.forEach(vo -> {
             ObjectDigital dbVO = MapUtil.get(dbMap, vo.getId(), ObjectDigital.class);
             // 容错处理
@@ -456,6 +464,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return ResultHelper.multi(new ArrayList<>());
     }
 
+
     /***
      * Description: 通用处理分页数据方法
      * @param dataResult : 分页数据
@@ -681,7 +690,6 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         // 查询信息点定义
         Map<String, Map<String, ObjectInfoDefine>> allInfoMap = infoService.queryByTypes(typeCodeList);
         // 信息点校验器
-        List<ObjectDigital> restList = new ArrayList<>();
         for(ObjectDigital vo:voList) {
             // 获取信息点列表 TODO 先这样处理,后续优化信息点接口后直接删掉此段即可
             Map<String, ObjectInfoDefine> infoMap = new HashMap<>(16);
@@ -701,11 +709,8 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
                 }
             }
             if(MapUtil.isEmpty(infoMap)) {
-                log.error(StrUtil.format("没有对象类型【{}】的信息点定义信息!", vo.getClassCode()));
-                continue;
+                throw new BusinessException(StrUtil.format("没有对象类型【{}】的信息点定义信息!", vo.getClassCode()));
             }
-            // 只保留有对象类型的
-            restList.add(vo);
             // 信息点值对象
             ObjectNode infos = vo.getInfos();
             if(infos == null || infos.isNull()) {
@@ -724,11 +729,6 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
                 InfoDataFactory.parse(infoMap.get(infoCode), infos.get(infoCode));
             }
         }
-        // 只保留能找到对象类型的
-        voList.clear();
-        if(CollUtil.isNotEmpty(restList)) {
-            voList.addAll(restList);
-        }
     }
 
     /**
@@ -822,4 +822,6 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return CollUtil.fieldValueAsMap(objectDigitals, "id", "virtual_codes");
     }
 
+
+
 }

+ 1 - 0
dmp-business/pom.xml

@@ -17,5 +17,6 @@
         <module>dmp-dic</module>
         <module>dmp-rwd</module>
         <module>dmp-rwd-version</module>
+        <module>dmp-rwd-plus</module>
     </modules>
 </project>

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

@@ -40,4 +40,16 @@ public interface CommonConstant {
     CharSequence RELATION_UNIQUE_KEY_FORMAT = "{}_{}_{}_{}";
     /** 新中台已移除的旧中台数据表字段 */
     String TYPE = "type";;
+
+    /** 二维码图片key前缀 */
+    String QRCODE_KEY_PREFIX = "QrCode";
+
+    /** 文件存储桶名称 */
+    String FILE_BUCKET_NAME = "dmp-rwd";
+
+    /** 二维码图片信息点 */
+    String QR_CODE_PIC_INFO ="qrCodePic";
+
+    /** remove字段 */
+    String REMOVE_FIELD ="$remove";
 }