Browse Source

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

linhuili 3 years ago
parent
commit
4fa76f1970
73 changed files with 1476 additions and 558 deletions
  1. 11 0
      dmp-business/dmp-rwd-plus/README.md
  2. 40 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. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/DigitalMessageHelper.java
  14. 1 18
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/ObjectInfoServiceImpl.java
  15. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/define/service/impl/ObjectTypeServiceImpl.java
  16. 3 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java
  17. 2 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/IObjectDigitalService.java
  18. 20 4
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/service/impl/ObjectDigitalServiceImpl.java
  19. 1 0
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java
  20. 65 76
      dmp-business/dmp-rwd/src/main/resources/mapper/ObjectDigitalMapper.xml
  21. 1 0
      dmp-business/pom.xml
  22. 28 5
      dmp-cloud/dmp-file/pom.xml
  23. 2 2
      dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/service/impl/MinioExceptionHandler.java
  24. 3 3
      dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/config/HdfsConfig.java
  25. 5 5
      dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/config/MinioConfig.java
  26. 1 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/constant/FileStorageEnum.java
  27. 2 3
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileController.java
  28. 1 8
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileMd5Controller.java
  29. 0 12
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileMigrateController.java
  30. 44 9
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/TestController.java
  31. 1 2
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/FileMd5Service.java
  32. 2 2
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/service/FileStorageFactory.java
  33. 2 2
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/IFileService.java
  34. 1 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/service/IFileStorageService.java
  35. 11 9
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileMd5ServiceImpl.java
  36. 15 18
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileServiceImpl.java
  37. 8 7
      dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/service/impl/HdfsStorageServiceImpl.java
  38. 11 13
      dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/service/impl/MinioStorageServiceImpl.java
  39. 19 0
      dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java
  40. 4 13
      dmp-comp/dmp-file-minio-starter/pom.xml
  41. 38 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebClient.java
  42. 25 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebFallbackFactory.java
  43. 0 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/constant/AuthChannelEnum.java
  44. 18 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/Group.java
  45. 13 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/Project.java
  46. 46 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/ResultReturn.java
  47. 0 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/handler/AppContextHandler.java
  48. 0 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/service/AuthService.java
  49. 0 0
      dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/service/AuthServiceFactory.java
  50. 1 0
      dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/AbstractAuthServiceImpl.java
  51. 3 2
      dmp-comp/dmp-auth/pom.xml
  52. 30 0
      dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/config/CommonWebConfigurer.java
  53. 76 1
      dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/EmsAuthServiceImpl.java
  54. 0 3
      dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/NoneAuthServiceImpl.java
  55. 1 1
      dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/constant/DigitalMessageConstant.java
  56. 0 44
      dmp-comp/dmp-file-hdfs-starter/pom.xml
  57. 0 39
      dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/service/impl/HdfsExceptionHandler.java
  58. 56 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileClientFacade.java
  59. 1 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/config/FileFeignConfig.java
  60. 63 4
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileManageClient.java
  61. 1 3
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileMd5Client.java
  62. 0 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileMd5ClientFacade.java
  63. 1 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/constant/FileCommonConst.java
  64. 0 0
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/constant/UploadCodeEnum.java
  65. 1 3
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/model/FileInfoCreator.java
  66. 2 8
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/model/FileMd5Creator.java
  67. 1 2
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/FileRequestData.java
  68. 1 1
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/UploadMes.java
  69. 1 1
      dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/UploadSubMes.java
  70. 192 0
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/utils/FileStorageHelper.java
  71. 1 1
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/utils/ImageHelper.java
  72. 0 224
      dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/utils/FileStorageHelper.java
  73. 1 2
      dmp-comp/pom.xml

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

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

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

@@ -0,0 +1,40 @@
+<?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>
+            <version>1.0.0</version>
+        </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 cn.hutool.core.util.StrUtil;
+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.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.rwd.qrcode.service.impl.QrCodeServiceImpl;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+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 || StrUtil.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='关系实例表';

+ 1 - 1
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/basic/utils/DigitalMessageHelper.java

@@ -8,7 +8,7 @@ import com.persagy.dmp.basic.model.DigitalManageMessage;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.entity.BaseEntity;
-import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.basic.constant.DigitalMessageConstant;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;

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

@@ -4,40 +4,23 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.StrFormatter;
-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.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-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.ValidEnum;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.entity.BaseEntity;
-import com.persagy.dmp.define.entity.GraphDefine;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
-import com.persagy.dmp.define.entity.ObjectTypeDefine;
-import com.persagy.dmp.digital.entity.ObjectDigital;
-import com.persagy.dmp.mybatis.utils.ConditionUtil;
-import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.utils.DigitalMessageHelper;
 import com.persagy.dmp.rwd.define.dao.ObjectInfoMapper;
 import com.persagy.dmp.rwd.define.service.IObjectInfoService;
-import com.persagy.dmp.rwd.define.service.IObjectTypeService;
 import com.persagy.dmp.rwd.parser.service.InfoDataFactory;
 import lombok.RequiredArgsConstructor;
-import org.hibernate.validator.constraints.Length;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
-import javax.validation.constraints.NotNull;
 import java.util.*;
 import java.util.stream.Collectors;
 

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

@@ -14,7 +14,7 @@ import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.entity.ObjectTypeDefine;
 import com.persagy.dmp.mybatis.utils.ConditionUtil;
-import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.utils.DigitalMessageHelper;
 import com.persagy.dmp.rwd.define.dao.ObjectTypeMapper;
 import com.persagy.dmp.rwd.define.service.IObjectTypeService;

+ 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);
+
 }

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

@@ -27,7 +27,7 @@ import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
-import com.persagy.dmp.rwd.basic.constant.DigitalMessageConstant;
+import com.persagy.dmp.basic.constant.DigitalMessageConstant;
 import com.persagy.dmp.rwd.basic.constant.DigitalObjectType;
 import com.persagy.dmp.rwd.basic.constant.DigitalRelCode;
 import com.persagy.dmp.rwd.basic.utils.DigitalCommonUtils;
@@ -39,6 +39,7 @@ 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;
@@ -55,6 +56,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 +87,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,7 +130,9 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         fillClassCodeForUpdate(voList,dbMap);
         //信息点校验
         validateOnSave(voList, true);
-        List<ObjectDigital> resultList = new ArrayList<>();
+        if(CollUtil.isEmpty(voList)) {
+            return null;
+        }
         voList.forEach(vo -> {
             ObjectDigital dbVO = MapUtil.get(dbMap, vo.getId(), ObjectDigital.class);
             // 容错处理
@@ -454,6 +458,7 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return ResultHelper.multi(new ArrayList<>());
     }
 
+
     /***
      * Description: 通用处理分页数据方法
      * @param dataResult : 分页数据
@@ -679,6 +684,7 @@ 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);
@@ -698,8 +704,11 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
                 }
             }
             if(MapUtil.isEmpty(infoMap)) {
-                throw new BusinessException(StrUtil.format("没有对象类型【{}】的信息点定义信息!", vo.getClassCode()));
+                log.error(StrUtil.format("没有对象类型【{}】的信息点定义信息!", vo.getClassCode()));
+                continue;
             }
+            // 只保留有对象类型的
+            restList.add(vo);
             // 信息点值对象
             ObjectNode infos = vo.getInfos();
             if(infos == null || infos.isNull()) {
@@ -718,6 +727,11 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
                 InfoDataFactory.parse(infoMap.get(infoCode), infos.get(infoCode));
             }
         }
+        // 只保留能找到对象类型的
+        voList.clear();
+        if(CollUtil.isNotEmpty(restList)) {
+            voList.addAll(restList);
+        }
     }
 
     /**
@@ -811,4 +825,6 @@ public class ObjectDigitalServiceImpl extends ServiceImpl<ObjectDigitalMapper, O
         return CollUtil.fieldValueAsMap(objectDigitals, "id", "virtual_codes");
     }
 
+
+
 }

+ 1 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -357,6 +357,7 @@ public class ObjectDigitalCriteriaHelper {
         addWhereCond(jsonNode, inSql, "graphId");
         addWhereCond(jsonNode, inSql, "graphCode");
         addWhereCond(jsonNode, inSql, "relCode");
+        addWhereCond(jsonNode, inSql, "relValue");
         addWhereCond(jsonNode, inSql, "valid");
         addWhereCond(jsonNode, inSql, whereKey);
         inSql.append(")");

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

@@ -378,84 +378,73 @@
     </select>
     <select id="queryObjectListByGraphCodeAndRelCode" resultMap="BaseResultMap">
         SELECT DISTINCT
-            dtoA.*,
-        IF
-            (
-                CONCAT( JSON_EXTRACT( JSON_EXTRACT( JSON_ARRAYAGG( JSON_OBJECT( 'id', dtoB.id ) ), '$[0]' ), '$.id' ), '' ) = 'null',
-                JSON_ARRAY( ),
-                JSON_ARRAYAGG(
-                    JSON_OBJECT(
-                        'id',
-                        dtoB.id,
-                        'name',
-                        IFNULL( dtoB.`name`, ''),
-                        'localId',
-                        IFNULL( dtoB.local_id, ''),
-                        'localName',
-                        IFNULL( dtoB.local_name, ''),
-                        'infos',
-                        IFNULL( dtoB.infos, JSON_OBJECT()),
-                        'groupCode',
-                        IFNULL( dtoB.group_code, ''),
-                        'projectId',
-                        IFNULL( dtoB.project_id, ''),
-                        'objType',
-                        IFNULL( dtoB.obj_type, ''),
-                        'classCode',
-                        IFNULL( dtoB.class_code, ''),
-                        'grouping',
-                        IFNULL( dtoB.grouping, ''),
-                        'valid',
-                        IFNULL( dtoB.valid, 1 )
-                    )
-                )
-            ) AS relObjs
+        dtoA.*,
+        IF(COUNT( dtoB.id )> 0,
+            JSON_ARRAYAGG(
+            JSON_OBJECT(
+            'id',
+            dtoB.id,
+            'name',
+            IFNULL( dtoB.`name`, '' ),
+            'localId',
+            IFNULL( dtoB.local_id, '' ),
+            'localName',
+            IFNULL( dtoB.local_name, '' ),
+            'infos',
+            IFNULL(dtoB.infos,JSON_OBJECT()),
+            'groupCode',
+            IFNULL( dtoB.group_code, '' ),
+            'projectId',
+            IFNULL( dtoB.project_id, '' ),
+            'objType',
+            IFNULL( dtoB.obj_type, '' ),
+            'classCode',
+            IFNULL( dtoB.class_code, '' ),
+            'grouping',
+            IFNULL( dtoB.grouping, '' ),
+            'valid',
+            IFNULL( dtoB.valid, 1 ))),
+        JSON_ARRAY())  AS relObjs
         FROM
-            (
-            SELECT
-                dto.*,
-                JSON_ARRAYAGG( dtr.obj_to ) AS objToIds
-            FROM
-                dt_object dto
-                INNER JOIN dt_relation dtr ON (dto.id = dtr.obj_from AND dtr.valid=TRUE)
-            WHERE 1=1
-            <if test="null!=param.relCode and param.relCode.length>0">
-                AND dtr.rel_code = #{param.relCode}
-            </if>
-            <if test="null!=param.graphCode and param.graphCode.length>0">
-                AND dtr.graph_code = #{param.graphCode}
-            </if>
-            <if test="null!=param.projectId and param.projectId.length>0">
-                AND dto.project_id = #{param.projectId}
-            </if>
-            <if test="null!=param.groupCode and param.groupCode.length>0">
-                AND dto.group_code = #{param.groupCode}
-            </if>
-            <if test="null!=param.mainContent and param.mainContent.length>0">
-                AND (
-                    dto.id = #{param.mainContent}
-                    OR dto.`name` LIKE CONCAT( '%', #{param.mainContent}, '%' )
-                    OR dto.local_name LIKE CONCAT( '%', #{param.mainContent}, '%' )
-                    OR dto.local_id LIKE CONCAT( '%', #{param.mainContent}, '%' )
-                    OR JSON_EXTRACT( dto.infos, '$.cADID' ) LIKE CONCAT( '%', #{param.mainContent}, '%' )
-                )
-            </if>
-            GROUP BY
-                dto.id
-            ) AS dtoA
-            LEFT JOIN dt_object AS dtoB ON (
-                JSON_SEARCH( dtoA.objToIds, 'one', dtoB.id ) > 0
-                <if test="null!=param.slaveContent and param.slaveContent.size()>0">
-                    <foreach collection="param.slaveContent" item="keyword" open="AND (" close=")" separator=" OR ">
-                        dtoB.id = #{keyword}
-                        OR dtoB.`name` LIKE CONCAT( '%', #{keyword}, '%' )
-                        OR dtoB.local_name LIKE CONCAT( '%', #{keyword}, '%' )
-                        OR dtoB.local_id LIKE CONCAT( '%', #{keyword}, '%' )
-                    </foreach>
-                </if>
+        dt_object dtoA
+        INNER JOIN dt_relation dtr ON ( dtoA.id = dtr.obj_from AND dtr.valid = TRUE )
+        LEFT JOIN dt_object dtoB ON ( dtr.obj_to = dtoB.id AND dtr.valid = TRUE )
+        WHERE
+        dtoA.valid=TRUE AND dtoB.valid=TRUE
+        <if test="null!=param.relCode and param.relCode.length>0">
+            AND dtr.rel_code = #{param.relCode}
+        </if>
+        <if test="null!=param.graphCode and param.graphCode.length>0">
+            AND dtr.graph_code = #{param.graphCode}
+        </if>
+        <if test="null!=param.relValue and param.relValue.length>0">
+            AND dtr.rel_value = #{param.relValue}
+        </if>
+        <if test="null!=param.projectId and param.projectId.length>0">
+            AND dtr.project_id = #{param.projectId}
+        </if>
+        <if test="null!=param.groupCode and param.groupCode.length>0">
+            AND dtr.group_code = #{param.groupCode}
+        </if>
+        <if test="null!=param.mainContent and param.mainContent.length>0">
+            AND (
+            dtoA.id = #{param.mainContent}
+                OR dtoA.`name` LIKE CONCAT( '%', #{param.mainContent}, '%' )
+                OR dtoA.local_name LIKE CONCAT( '%', #{param.mainContent}, '%' )
+                OR dtoA.local_id LIKE CONCAT( '%', #{param.mainContent}, '%' )
+                OR JSON_EXTRACT(dtoA.infos, '$.cADID' ) LIKE CONCAT( '%', #{param.mainContent}, '%' )
             )
-        WHERE dtoA.valid=TRUE AND dtoB.valid=TRUE
-        GROUP BY dtoA.id
+        </if>
+        <if test="null!=param.slaveContent and param.slaveContent.size()>0">
+            <foreach collection="param.slaveContent" item="keyword" open="AND (" close=")" separator=" OR ">
+                dtoB.id = #{keyword}
+                OR dtoB.`name` LIKE CONCAT( '%', #{keyword}, '%' )
+                OR dtoB.local_name LIKE CONCAT( '%', #{keyword}, '%' )
+                OR dtoB.local_id LIKE CONCAT( '%', #{keyword}, '%' )
+            </foreach>
+        </if>
+        GROUP BY
+        dtoA.id
     </select>
 
     <select id="queryToData" resultMap="BaseResultMap">

+ 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>

+ 28 - 5
dmp-cloud/dmp-file/pom.xml

@@ -27,14 +27,37 @@
             <artifactId>dmp-mybatis</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>dmp-file-minio-starter</artifactId>
-            <version>1.0.0</version>
+            <groupId>jdk.tools</groupId>
+            <artifactId>jdk.tools</artifactId>
+            <version>1.8</version>
+            <scope>system</scope>
+            <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>log4j-over-slf4j</artifactId>
+            <version>1.7.32</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-common</artifactId>
+            <version>2.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-hdfs</artifactId>
+            <version>2.5.1</version>
         </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
-            <artifactId>dmp-file-hdfs-starter</artifactId>
-            <version>1.0.0</version>
+            <artifactId>dmp-file-starter</artifactId>
+        </dependency>
+        <!-- MinIO -->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.3.0</version>
         </dependency>
     </dependencies>
 </project>

+ 2 - 2
dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/service/impl/MinioExceptionHandler.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.service.impl;
+package com.persagy.dmp.file.config;
 
 import com.persagy.dmp.common.exception.BusinessException;
 import io.minio.errors.*;
@@ -15,7 +15,7 @@ import java.security.NoSuchAlgorithmException;
  * @date 2021-05-15
  */
 @Slf4j
-public class MinioExceptionHandler {
+public class FileExceptionHandler {
 
     /**
      * Minio异常处理

+ 3 - 3
dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/config/HdfsConfig.java

@@ -1,9 +1,9 @@
-package com.persagy.dmp.storage.config;
+package com.persagy.dmp.file.config;
 
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.storage.service.IFileStorageService;
-import com.persagy.dmp.storage.service.impl.HdfsStorageServiceImpl;
+import com.persagy.dmp.file.service.IFileStorageService;
+import com.persagy.dmp.file.service.impl.HdfsStorageServiceImpl;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;

+ 5 - 5
dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/config/MinioConfig.java

@@ -1,7 +1,7 @@
-package com.persagy.dmp.storage.config;
+package com.persagy.dmp.file.config;
 
-import com.persagy.dmp.storage.service.IFileStorageService;
-import com.persagy.dmp.storage.service.impl.MinioStorageServiceImpl;
+import com.persagy.dmp.file.service.IFileStorageService;
+import com.persagy.dmp.file.service.impl.MinioStorageServiceImpl;
 import io.minio.MinioClient;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -30,13 +30,13 @@ public class MinioConfig {
     private String minioRegion;
 
     @Bean
-    @ConditionalOnProperty(value = "persagy.common.file.storage", havingValue = "0")
+    @ConditionalOnProperty(value = "persagy.common.file.storage", havingValue = "0",matchIfMissing = true)
     public MinioClient minioClient() {
         return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).region(minioRegion).build();
     }
 
     @Bean
-    @ConditionalOnProperty(value = "persagy.common.file.storage", havingValue = "0")
+    @ConditionalOnProperty(value = "persagy.common.file.storage", havingValue = "0",matchIfMissing = true)
     public IFileStorageService minioStorageServiceImpl() {
         return new MinioStorageServiceImpl(minioClient());
     }

+ 1 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/constant/FileStorageEnum.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.constant;
+package com.persagy.dmp.file.constant;
 
 import lombok.Getter;
 

+ 2 - 3
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileController.java

@@ -1,6 +1,5 @@
 package com.persagy.dmp.file.controller;
 
-import cn.hutool.core.util.ReUtil;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ValidEnum;
@@ -9,10 +8,10 @@ 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.file.domain.FileRequestData;
-import com.persagy.dmp.file.domain.UploadMes;
 import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileInfoCreator;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
 import com.persagy.dmp.file.service.IFileService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;

+ 1 - 8
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileMd5Controller.java

@@ -3,22 +3,15 @@ package com.persagy.dmp.file.controller;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ValidEnum;
-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.file.domain.FileRequestData;
-import com.persagy.dmp.file.domain.UploadMes;
-import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileMd5;
 import com.persagy.dmp.file.service.FileMd5Service;
-import com.persagy.dmp.file.service.IFileService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-
 /**
  * 文件管理Controller
  * @author Charlie Yu
@@ -92,7 +85,7 @@ public class FileMd5Controller {
         if(null==fileMd5) {
             throw new BusinessException(ResponseCode.A0400.getCode(), ResponseCode.A0400.getDesc());
         }
-        fileMd5Service.ensureFilePath(fileMd5,fileMd5.getFileName(),fileMd5.getGroupCode());
+        fileMd5Service.ensureFilePath(fileMd5,fileMd5.getFileName());
         return ResultHelper.single(fileMd5);
     }
 

+ 0 - 12
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileMigrateController.java

@@ -1,17 +1,10 @@
 package com.persagy.dmp.file.controller;
 
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.io.FastByteArrayOutputStream;
-import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 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;
@@ -19,14 +12,11 @@ import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileInfoCreator;
 import com.persagy.dmp.file.service.IFileService;
-import com.persagy.dmp.mybatis.helper.DynamicDataSourceHelper;
 import io.minio.*;
-import io.minio.errors.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.*;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
 import org.springframework.core.io.support.ResourcePatternResolver;
@@ -37,8 +27,6 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
 import java.util.*;
 
 /**

+ 44 - 9
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/TestController.java

@@ -1,21 +1,31 @@
 package com.persagy.dmp.file.controller;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.persagy.dmp.common.context.AppContext;
 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.file.client.FileClientFacade;
 import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileInfoCreator;
-import com.persagy.dmp.file.service.IFileService;
-import com.persagy.dmp.storage.service.FileStorageFactory;
-import com.persagy.dmp.storage.utils.FileStorageHelper;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
+import io.minio.MinioClient;
+import io.minio.PostPolicy;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.io.IOException;
+import java.time.ZonedDateTime;
+import java.util.Map;
 
 /**
  * 文件管理Controller
@@ -25,6 +35,8 @@ import java.io.IOException;
 @RestController
 @RequestMapping("/test")
 public class TestController {
+    @Autowired
+    private MinioClient minioClient;
 
     @PostMapping(value = "/uploadFile")
     @CrossOrigin
@@ -33,9 +45,9 @@ public class TestController {
         FileInfo fileInfo = FileInfoCreator.of(AppContext.getContext().getGroupCode(),
                 IdWorker.getIdStr(), "ADM", fileName);
         fileInfo.setCreationTime(new PsDateTime());
-        String fileId = FileStorageHelper.uploadImage(fileInfo, multipartFile.getInputStream());
+        //String fileId = FileStorageHelper.uploadImage(fileInfo, multipartFile.getInputStream());
         FileInfo dest = new FileInfo();
-        dest.setId(fileId);
+        //dest.setId(fileId);
         return ResultHelper.single(dest);
     }
     @PostMapping(value = "/replaceFile")
@@ -46,7 +58,7 @@ public class TestController {
         FileInfo fileInfo = FileInfoCreator.of(AppContext.getContext().getGroupCode(),
                 IdWorker.getIdStr(), "ADM", fileName);
         fileInfo.setCreationTime(new PsDateTime());
-        FileStorageHelper.replaceFile(fileId,fileName, multipartFile.getInputStream());
+        //FileStorageHelper.replaceFile(fileId,fileName, multipartFile.getInputStream());
         FileInfo dest = new FileInfo();
         dest.setId(fileId);
         return ResultHelper.single(dest);
@@ -54,7 +66,7 @@ public class TestController {
     @PostMapping(value = "/deleteFile")
     @CrossOrigin
     public CommonResult<FileInfo> deleteFile(@RequestParam("fileId") String fileId) throws IOException {
-        FileStorageHelper.deleteFile(fileId);
+        //FileStorageHelper.deleteFile(fileId);
         FileInfo dest = new FileInfo();
         dest.setId(fileId);
         return ResultHelper.single(dest);
@@ -62,6 +74,29 @@ public class TestController {
     @PostMapping(value = "/downloadUrl")
     @CrossOrigin
     public CommonResult<FileInfo> downloadUrl(@RequestParam("fileId") String fileId) throws IOException {
-        return ResultHelper.single(FileStorageHelper.downloadUrl(fileId));
+        return ResultHelper.single(new FileInfo());//FileStorageHelper.downloadUrl(fileId));
+    }
+    @PostMapping(value = "/testInitChunkUpload")
+    @CrossOrigin
+    public CommonResult<UploadMes> testInitChunkUpload(@RequestBody FileRequestData requestData) throws IOException {
+        return FileClientFacade.initChunkUploadPrototype(AppContext.getContext().getGroupCode(),
+                AppContext.getContext().getProjectId(),
+                AppContext.getContext().getAppId(),
+                AppContext.getContext().getAccountId(),requestData);
+    }
+    @PostMapping(value = "/testInitSingleUpload")
+    @CrossOrigin
+    public CommonResult<UploadMes> testInitSingleUpload(@RequestBody FileRequestData requestData) throws IOException {
+        return FileClientFacade.initSingleUploadPrototype(AppContext.getContext().getGroupCode(),
+                AppContext.getContext().getProjectId(),
+                AppContext.getContext().getAppId(),
+                AppContext.getContext().getAccountId(),requestData);
     }
+
+    @PostMapping(value = "/testInitMultiUploads")
+    @CrossOrigin
+    public String testInitMultiUploads(@RequestBody FileRequestData requestData) throws Exception {
+        return "success";
+    }
+
 }

+ 1 - 2
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/FileMd5Service.java

@@ -20,13 +20,12 @@ public interface FileMd5Service extends IService<FileMd5> {
      * Description: 确定文件上传路径
      * @param fileMd5 : 文件信息
      * @param fileName : 文件名称
-     * @param groupCode : 集团编码
      * @return : void
      * @author : lijie
      * @date :2021/10/22 21:46
      * Update By lijie 2021/10/22 21:46
      */
-    void ensureFilePath(FileMd5 fileMd5, String fileName, String groupCode);
+    void ensureFilePath(FileMd5 fileMd5, String fileName);
     /***
      * Description: 根据文件md5值查询文件Md5信息
      * @param fileMd5 : 文件的md5值

+ 2 - 2
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/service/FileStorageFactory.java

@@ -1,7 +1,7 @@
-package com.persagy.dmp.storage.service;
+package com.persagy.dmp.file.service;
 
 import com.persagy.dmp.common.helper.SpringHelper;
-import com.persagy.dmp.storage.constant.FileStorageEnum;
+import com.persagy.dmp.file.constant.FileStorageEnum;
 
 /**
  * 文件存储管理工厂

+ 2 - 2
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/IFileService.java

@@ -1,8 +1,8 @@
 package com.persagy.dmp.file.service;
 
-import com.persagy.dmp.file.domain.FileRequestData;
-import com.persagy.dmp.file.domain.UploadMes;
 import com.persagy.dmp.file.model.FileInfo;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
 
 import java.util.List;
 

+ 1 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/service/IFileStorageService.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.service;
+package com.persagy.dmp.file.service;
 
 import lombok.SneakyThrows;
 

+ 11 - 9
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileMd5ServiceImpl.java

@@ -13,6 +13,7 @@ import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileMd5;
 import com.persagy.dmp.file.model.FileMd5Creator;
 import com.persagy.dmp.file.service.FileMd5Service;
+import com.persagy.dmp.file.service.FileStorageFactory;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -32,7 +33,7 @@ public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> impl
      */
     @Override
     public FileMd5 insertFileMd5(FileMd5 fileMd5) {
-        ensureFilePath(fileMd5,fileMd5.getFileName(),fileMd5.getGroupCode());
+        ensureFilePath(fileMd5,fileMd5.getFileName());
         this.save(fileMd5);
         return fileMd5;
     }
@@ -43,9 +44,9 @@ public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> impl
      * @return
      */
     @Override
-    public void ensureFilePath(FileMd5 vo, String fileName, String groupCode) {
+    public void ensureFilePath(FileMd5 vo, String fileName) {
         // 组装文件路径 - 日期以文件创建日期为准
-        FileMd5Creator.buildFilePath(vo,fileName,groupCode);
+        FileMd5Creator.buildFilePath(vo,fileName);
         // 是否存在同名
         LambdaQueryWrapper<FileMd5> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(FileMd5::getValid, ValidEnum.TRUE.getType()).
@@ -59,7 +60,7 @@ public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> impl
         }
         // 存在同名 - 重新命名 +随机数
         String resetFileName = resetFileName(fileName);
-        ensureFilePath(vo,resetFileName,groupCode);
+        ensureFilePath(vo,resetFileName);
     }
 
     /***
@@ -115,8 +116,11 @@ public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> impl
      */
     @Override
     public void deleteFileMd5(FileMd5 fileMd5) {
+        // 1.更新文件为无效态
         fileMd5.setValid(ValidEnum.FALSE.getType());
         updateFileMd5(fileMd5);
+        // 2.删除文件
+        FileStorageFactory.getService().delete(fileMd5.getFileBucket(), fileMd5.getFilePath());
     }
 
     /**
@@ -125,11 +129,9 @@ public class FileMd5ServiceImpl extends ServiceImpl<FileMd5Mapper, FileMd5> impl
      * @return 原文件名前缀+"-随机数"+后缀
      */
     private String resetFileName(String oldFileName) {
-        StringBuilder fileName = new StringBuilder();
-        fileName.append(FileUtil.getPrefix(oldFileName)).append("-");
-        fileName.append(RandomUtil.randomInt(100000)).append(".");
-        fileName.append(FileUtil.getSuffix(oldFileName));
-        return fileName.toString();
+        return FileUtil.getPrefix(oldFileName) + StrUtil.DASHED +
+                RandomUtil.randomInt(100000) + StrUtil.DOT +
+                FileUtil.getSuffix(oldFileName);
     }
 }
 

+ 15 - 18
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileServiceImpl.java

@@ -11,20 +11,14 @@ import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.lang.PsDate;
 import com.persagy.dmp.common.lang.PsDateTime;
 import com.persagy.dmp.file.constant.UploadCodeEnum;
-import com.persagy.dmp.file.domain.FileRequestData;
-import com.persagy.dmp.file.domain.UploadMes;
-import com.persagy.dmp.file.domain.UploadSubMes;
-import com.persagy.dmp.file.model.FileInfo;
-import com.persagy.dmp.file.model.FileInfoCreator;
-import com.persagy.dmp.file.model.FileMd5;
-import com.persagy.dmp.file.model.FileMd5Creator;
+import com.persagy.dmp.file.model.*;
 import com.persagy.dmp.file.service.FileMd5Service;
 import com.persagy.dmp.file.service.IFileService;
 import com.persagy.dmp.file.dao.FileMapper;
 import com.persagy.dmp.common.constant.ValidEnum;
-import com.persagy.dmp.storage.constant.FileCommonConst;
-import com.persagy.dmp.storage.service.FileStorageFactory;
-import com.persagy.dmp.storage.service.IFileStorageService;
+import com.persagy.dmp.file.constant.FileCommonConst;
+import com.persagy.dmp.file.service.FileStorageFactory;
+import com.persagy.dmp.file.service.IFileStorageService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -111,7 +105,7 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
                 && FileCommonConst.UPLOAD_SUCCESS.equals(fileMd5.getUploadStatus())){
             // 秒传
             return secondTransmission(requestData.getFileName(),requestData.getGroupCode(),
-                    requestData.getBusinessId(),requestData.getExpireDate(),fileMd5.getFileMd5());
+                    requestData.getBusinessId(),requestData.getExpireDate(),fileMd5.getFileMd5(),requestData.getFileId());
         }
         // 3.历史已上传且已上传分片
         if (ObjectUtil.isNotNull(fileMd5)){
@@ -148,7 +142,6 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
         return firstInitChunkUploadInternal(requestData);
     }
 
-
     /***
      * Description: 合并断点续传的文件
      * @param requestData : 请求参数
@@ -176,7 +169,7 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
                 requestData.getBusinessId(),fileMd5.getFileMd5(),requestData.getExpireDate());
         fileInfo.setCreator(AppContext.getContext().getAccountId());
         // 4.计算文件上传路径
-        fileMd5Service.ensureFilePath(fileMd5,fileInfo.getFileName(),requestData.getGroupCode());
+        fileMd5Service.ensureFilePath(fileMd5,fileInfo.getFileName());
         // 5.合并文件
         if(service.composeObject(requestData.getFileBucket(),chunks,fileMd5.getFilePath())){
             fileMd5.setUploadStatus(FileCommonConst.UPLOAD_SUCCESS);
@@ -212,18 +205,19 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
                 && FileCommonConst.UPLOAD_SUCCESS.equals(fileMd5.getUploadStatus())){
             // 秒传
             return secondTransmission(requestData.getFileName(),requestData.getGroupCode(),
-                    requestData.getBusinessId(),requestData.getExpireDate(),fileMd5.getFileMd5());
+                    requestData.getBusinessId(),requestData.getExpireDate(),fileMd5.getFileMd5(),requestData.getFileId());
         }
         FileInfo fileInfo = FileInfoCreator
                 .of(requestData.getGroupCode(), requestData.getFileName(), requestData.getBusinessId(),
                         requestData.getFileMd5(),requestData.getExpireDate());
         fileInfo.setCreator(AppContext.getContext().getAccountId());
+        fileInfo.setId(requestData.getFileId());
         fileMd5 = FileMd5Creator.of(requestData.getFileBucket(), requestData.getFileMd5(), FileCommonConst.UPLOAD_SUCCESS);
         fileMd5.setFileSize(requestData.getFileSize());
         fileMd5.setCreationTime(new PsDateTime());
-        fileMd5Service.ensureFilePath(fileMd5,requestData.getFileName(),requestData.getGroupCode());
+        fileMd5Service.ensureFilePath(fileMd5,requestData.getFileName());
         String uploadUrl = service.createUploadUrl(fileMd5.getFileBucket(), fileMd5.getFilePath());
-        this.save(fileInfo);
+        this.saveOrUpdate(fileInfo);
         fileMd5Service.save(fileMd5);
         UploadMes uploadMes = new UploadMes();
         uploadMes.setId(fileInfo.getId());
@@ -280,12 +274,15 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
      * Update By lijie 2021/10/22 10:03
      */
     private UploadMes secondTransmission(String fileName, String groupCode,
-                                         String businessId, PsDate expireDate,String fileMd5) {
+                                         String businessId, PsDate expireDate,String fileMd5,String fileId) {
         // 1.生成文件信息并返回
         FileInfo fileInfo = FileInfoCreator.of(groupCode,fileName,businessId,fileMd5,expireDate);
         fileInfo.setCreator(AppContext.getContext().getAccountId());
+        if (StrUtil.isNotBlank(fileId)){
+            fileInfo.setId(fileId);
+        }
         // 2.保存文件信息
-        this.save(fileInfo);
+        this.saveOrUpdate(fileInfo);
         // 3.组装上传信息
         UploadMes uploadMes = new UploadMes();
         uploadMes.setId(fileInfo.getId());

+ 8 - 7
dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/service/impl/HdfsStorageServiceImpl.java

@@ -1,10 +1,11 @@
-package com.persagy.dmp.storage.service.impl;
+package com.persagy.dmp.file.service.impl;
 
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.storage.service.IFileStorageService;
+import com.persagy.dmp.file.config.FileExceptionHandler;
+import com.persagy.dmp.file.service.IFileStorageService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.hadoop.conf.Configuration;
@@ -52,7 +53,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
                 IoUtil.copy(inputStream, outputStream);
             }
         } catch (IOException e) {
-            HdfsExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
 
@@ -75,7 +76,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
             }
             return fs.open(filePath);
         } catch (IOException e) {
-            HdfsExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
         return null;
     }
@@ -105,7 +106,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
             Path filePath = getFilePath(bucketName,fileName);
             return fs.exists(filePath);
         } catch (IOException e) {
-            HdfsExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
         return false;
     }
@@ -131,7 +132,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
             // 非递归删除
             fs.delete(filePath,false);
         } catch (IOException e) {
-            HdfsExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
     /**
@@ -152,7 +153,7 @@ public class HdfsStorageServiceImpl implements IFileStorageService {
             // 递归删除
             fs.delete(filePath,true);
         } catch (IOException e) {
-            HdfsExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
     /***

+ 11 - 13
dmp-comp/dmp-file-minio-starter/src/main/java/com/persagy/dmp/storage/service/impl/MinioStorageServiceImpl.java

@@ -1,12 +1,11 @@
-package com.persagy.dmp.storage.service.impl;
+package com.persagy.dmp.file.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.file.model.FileMd5;
-import com.persagy.dmp.storage.constant.FileCommonConst;
-import com.persagy.dmp.storage.service.IFileStorageService;
+import com.persagy.dmp.file.config.FileExceptionHandler;
+import com.persagy.dmp.file.constant.FileCommonConst;
+import com.persagy.dmp.file.service.IFileStorageService;
 import io.minio.*;
 import io.minio.http.Method;
 import io.minio.messages.Item;
@@ -16,7 +15,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Value;
 
-import javax.swing.filechooser.FileView;
 import java.io.InputStream;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -32,7 +30,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
 
     private final MinioClient minioClient;
 
-    @Value("${persagy.common.file.minio.bucket.chunk:persagy-bdtp-chuck}")
+    @Value("${persagy.common.file.minio.bucket.chunk:bdtp-chuck}")
     private String chunkBucKet;
 
     /**排序*/
@@ -65,7 +63,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).
                             stream(input, input.available(), -1).build());
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
 
@@ -82,7 +80,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
 //            return minioClient.getObject(bucketName, fileName);
             return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
         return null;
     }
@@ -101,7 +99,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET)
                     .bucket(bucketName).object(fileName).expiry(FileCommonConst.URL_EXPIRES).build());
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
         return null;
     }
@@ -121,7 +119,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
             StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
             return stat != null;
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
         return false;
     }
@@ -139,7 +137,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
 //            minioClient.removeObject(bucketName, fileName);
             minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
 
@@ -156,7 +154,7 @@ public class MinioStorageServiceImpl implements IFileStorageService, Initializin
 //            minioClient.removeBucket(bucketName);
             minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
         } catch (Exception e) {
-            MinioExceptionHandler.handleException(e);
+            FileExceptionHandler.handleException(e);
         }
     }
 

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

@@ -16,6 +16,13 @@ public interface CommonConstant {
     /** 项目id */
     String QUERY_PROJECTID = "projectId";
 
+    /** 项目ids */
+    String QUERY_PROJECTIDS = "projectIds";
+    /** success */
+    String QUERY_SUCCESS = "success";
+    /** failure */
+    String QUERY_FAILURE = "failure";
+
     /** 用户id */
     String QUERY_USERID = "accountId";
 
@@ -33,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";
 }

+ 4 - 13
dmp-comp/dmp-file-minio-starter/pom.xml

@@ -9,24 +9,15 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dmp-file-minio-starter</artifactId>
-
+    <artifactId>dmp-auth-starter</artifactId>
     <dependencies>
-        <!-- MinIO -->
-        <dependency>
-            <groupId>io.minio</groupId>
-            <artifactId>minio</artifactId>
-            <version>8.3.0</version>
-        </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
-            <artifactId>dmp-file-starter</artifactId>
-            <version>1.0.0</version>
+            <artifactId>dmp-common</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.squareup.okhttp3</groupId>
-            <artifactId>okhttp</artifactId>
-            <version>4.8.1</version>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
     </dependencies>
 

+ 38 - 0
dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebClient.java

@@ -0,0 +1,38 @@
+package com.persagy.dmp.auth.client;
+
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import feign.Headers;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+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;
+
+/**
+ * 运维系统
+ * <p> PersagyManageClient.java.</p>
+ * <p>Description:  .</p>
+ * <p>Company: .</p>
+ * <p>@author gezhanbin</p>
+ * <p>@version .</p>
+ * 2019年6月17日: 下午2:21:44
+ */
+@FeignClient(name = "EMS-SAAS-WEB",fallbackFactory = EmsSaasWebFallbackFactory.class,url = "${saas.ems.web.service:}")
+public interface EmsSaasWebClient {
+
+	/***
+	 * Description: 查询集团项目列表
+	 * @param param : 请求参数
+	 * @return : java.util.List<com.alibaba.fastjson.JSONObject>
+	 * @author : lijie
+	 * @date :2021/11/8 14:12
+	 * Update By lijie 2021/11/8 14:12
+	 */
+	@PostMapping(value = "/rwd/groupAndSchema/admin/queryGroupProjectList")
+	ResultReturn<Group> queryGroupProjectList(@RequestBody JSONObject param);
+	
+}

+ 25 - 0
dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebFallbackFactory.java

@@ -0,0 +1,25 @@
+package com.persagy.dmp.auth.client;
+
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import com.persagy.dmp.common.constant.CommonConstant;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class EmsSaasWebFallbackFactory implements FallbackFactory<EmsSaasWebClient> {
+
+    /**
+     * 调用失败,返回
+     */
+    @Override
+    public EmsSaasWebClient create(Throwable throwable) {
+        return param -> {
+            ResultReturn<Group> resultReturn = new ResultReturn<>();
+            resultReturn.setResult(CommonConstant.QUERY_FAILURE);
+            resultReturn.setResultMsg("请求运维系统失败:"+throwable.getMessage());
+            return resultReturn;
+        };
+    }
+
+}

dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/constant/AuthChannelEnum.java → dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/constant/AuthChannelEnum.java


+ 18 - 0
dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/Group.java

@@ -0,0 +1,18 @@
+package com.persagy.dmp.auth.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class Group {
+
+    private String groupCode;
+    private String groupName;
+    private List<Project> projects;
+
+}

+ 13 - 0
dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/Project.java

@@ -0,0 +1,13 @@
+package com.persagy.dmp.auth.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class Project {
+    private String projectId;
+    private String projectName;
+}

+ 46 - 0
dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/domain/ResultReturn.java

@@ -0,0 +1,46 @@
+package com.persagy.dmp.auth.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class ResultReturn<T> {
+
+	/**返回状态:success,failure*/
+	@JSONField(name = "Result")
+	@JsonProperty("Result")
+	private String result;
+
+	/**返回一个对象时使用*/
+	@JSONField(name = "Item")
+	@JsonProperty("Item")
+	private T item;
+
+	/**返回集合时使用*/
+	@JSONField(name = "Content")
+	@JsonProperty("Content")
+	private List<T> content;
+
+	/**返回状态的具体信息*/
+	@JSONField(name = "ResultMsg")
+	@JsonProperty("ResultMsg")
+	private String resultMsg;
+
+	/**返回状态码*/
+	@JSONField(name = "ResultCode")
+	@JsonProperty("ResultCode")
+	private Integer resultCode;
+
+	/**返回集合的长度*/
+	@JSONField(name = "Count")
+	@JsonProperty("Count")
+	private Integer count;
+
+}

dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/handler/AppContextHandler.java → dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/handler/AppContextHandler.java


dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/AuthService.java → dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/service/AuthService.java


dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/AuthServiceFactory.java → dmp-comp/dmp-auth-starter/src/main/java/com/persagy/dmp/auth/service/AuthServiceFactory.java


+ 1 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/AbstractAuthServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.auth.service.AuthService;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.helper.SpringHelper;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

+ 3 - 2
dmp-comp/dmp-auth/pom.xml

@@ -13,11 +13,12 @@
     <dependencies>
         <dependency>
             <groupId>com.persagy</groupId>
-            <artifactId>dmp-common</artifactId>
+            <artifactId>integrated-log-spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
-            <artifactId>integrated-log-spring-boot-starter</artifactId>
+            <artifactId>dmp-auth-starter</artifactId>
+            <version>1.0.0</version>
         </dependency>
     </dependencies>
     

+ 30 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/config/CommonWebConfigurer.java

@@ -1,6 +1,12 @@
 package com.persagy.dmp.auth.config;
 
+import com.persagy.dmp.auth.client.EmsSaasWebFallbackFactory;
 import com.persagy.dmp.auth.handler.AppContextHandler;
+import com.persagy.dmp.auth.service.AuthService;
+import com.persagy.dmp.auth.service.impl.BossAuthServiceImpl;
+import com.persagy.dmp.auth.service.impl.EmsAuthServiceImpl;
+import com.persagy.dmp.auth.service.impl.NoneAuthServiceImpl;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;
@@ -29,4 +35,28 @@ public class CommonWebConfigurer implements WebMvcConfigurer {
         registry.addInterceptor(appContextHandler()).order(10).addPathPatterns(includePaths).excludePathPatterns(excludePaths);
     }
 
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "1")
+    public EmsSaasWebFallbackFactory emsSaasWebFallbackFactory(){
+        return new EmsSaasWebFallbackFactory();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "1")
+    public AuthService emsAuthServiceImpl(){
+        return new EmsAuthServiceImpl();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "-1",matchIfMissing = true)
+    public AuthService noneAuthServiceImpl(){
+        return new NoneAuthServiceImpl();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "2")
+    public AuthService bossAuthServiceImpl(){
+        return new BossAuthServiceImpl();
+    }
+
 }

+ 76 - 1
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/EmsAuthServiceImpl.java

@@ -1,7 +1,25 @@
 package com.persagy.dmp.auth.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.dmp.auth.client.EmsSaasWebClient;
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.Project;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.exception.BusinessException;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 运维平台2.0 鉴权实现类
@@ -10,11 +28,68 @@ import javax.servlet.http.HttpServletResponse;
  * @date 2021-11-02
  */
 public class EmsAuthServiceImpl extends AbstractAuthServiceImpl {
+    @Autowired
+    private EmsSaasWebClient emsSaasWebClient;
 
     @Override
     public void loginSuccess(HttpServletRequest request, HttpServletResponse response) {
         super.loginSuccess(request, response);
         loadContextByRequest(request);
-        // TODO 验证集团是否有效、验证项目是否匹配集团、没有集团编码时根据项目匹配集团
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())
+                && StrUtil.isBlank(AppContext.getContext().getProjectId())){
+            // 两者都为空时不做校验,例如def/class的接口,dic的接口
+            return;
+        }
+        JSONObject param = new JSONObject();
+        if (StrUtil.isNotBlank(AppContext.getContext().getGroupCode())){
+            param.put(CommonConstant.QUERY_GROUPCODE,AppContext.getContext().getGroupCode());
+        }
+//        if (StrUtil.isNotBlank(AppContext.getContext().getProjectId())){
+//            param.put(CommonConstant.QUERY_PROJECTIDS, CollUtil.newArrayList(AppContext.getContext().getProjectId()));
+//        }
+        ResultReturn<Group> queryResult = emsSaasWebClient.queryGroupProjectList(param);
+        if (!CommonConstant.QUERY_SUCCESS.equals(queryResult.getResult())){
+            throw new BusinessException(queryResult.getResultMsg());
+        }
+        List<Group> content = queryResult.getContent();
+        if (CollUtil.isEmpty(content)){
+            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+        }
+        Map<String, List<Project>> groupMap = content.stream()
+                .collect(Collectors.toMap(Group::getGroupCode, Group::getProjects, (k1, k2) -> k1));
+        // 1.没有集团编码时根据项目匹配集团
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())){
+            // 如果集团编码为空则通过项目id查找
+            Set<Map.Entry<String, List<Project>>> entries = groupMap.entrySet();
+            flag:
+            for (Map.Entry<String, List<Project>> entry : entries) {
+                if (CollUtil.isEmpty(entry.getValue())){
+                    continue;
+                }
+                for (Project project : entry.getValue()) {
+                    if (AppContext.getContext().getProjectId().equals(project.getProjectId())){
+                        AppContext.getContext().setGroupCode(entry.getKey());
+                        break flag;
+                    }
+                }
+            }
+        }
+        // 2.验证集团是否有效
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())
+                || !groupMap.containsKey(AppContext.getContext().getGroupCode())){
+            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+        }
+//        if (StrUtil.isBlank(AppContext.getContext().getProjectId())){
+//            return;
+//        }
+        // 3.验证项目是否匹配集团
+//        List<Project> projects = groupMap
+//                .getOrDefault(AppContext.getContext().getGroupCode(), new ArrayList<>());
+//        if (!projects.stream()
+//                .map(Project::getProjectId)
+//                .collect(Collectors.toSet())
+//                .contains(AppContext.getContext().getProjectId())){
+//            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+//        }
     }
 }

+ 0 - 3
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/NoneAuthServiceImpl.java

@@ -1,7 +1,5 @@
 package com.persagy.dmp.auth.service.impl;
 
-import org.springframework.stereotype.Service;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -11,7 +9,6 @@ import javax.servlet.http.HttpServletResponse;
  * @author Charlie Yu
  * @date 2021-11-02
  */
-@Service
 public class NoneAuthServiceImpl extends AbstractAuthServiceImpl{
 
     @Override

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

@@ -1,4 +1,4 @@
-package com.persagy.dmp.rwd.basic.constant;
+package com.persagy.dmp.basic.constant;
 
 /**
  * 消息相关常量

+ 0 - 44
dmp-comp/dmp-file-hdfs-starter/pom.xml

@@ -1,44 +0,0 @@
-<?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">
-    <parent>
-        <artifactId>dmp-comp</artifactId>
-        <groupId>com.persagy</groupId>
-        <version>1.0.0</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>dmp-file-hdfs-starter</artifactId>
-    <dependencies>
-        <dependency>
-            <groupId>jdk.tools</groupId>
-            <artifactId>jdk.tools</artifactId>
-            <version>1.8</version>
-            <scope>system</scope>
-            <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>
-        </dependency>
-        <!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>log4j-over-slf4j</artifactId>
-            <version>1.7.32</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-common</artifactId>
-            <version>2.5.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.hadoop</groupId>
-            <artifactId>hadoop-hdfs</artifactId>
-            <version>2.5.1</version>
-        </dependency>
-        <dependency>
-            <groupId>com.persagy</groupId>
-            <artifactId>dmp-file-starter</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-    </dependencies>
-
-</project>

+ 0 - 39
dmp-comp/dmp-file-hdfs-starter/src/main/java/com/persagy/dmp/storage/service/impl/HdfsExceptionHandler.java

@@ -1,39 +0,0 @@
-package com.persagy.dmp.storage.service.impl;
-
-import com.persagy.dmp.common.exception.BusinessException;
-import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
-import lombok.extern.slf4j.Slf4j;
-
-import java.io.IOException;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * MinIO异常处理
- * @author Charlie Yu
- * @date 2021-05-15
- */
-@Slf4j
-public class HdfsExceptionHandler {
-
-    /**
-     * Minio异常处理
-     * @param e 异常
-     */
-    public static void handleException(Exception e) {
-        log.error(e.getMessage(), e);
-        if(e instanceof InvalidKeyException) {
-            throw new BusinessException("文件服务器-密钥有误");
-        }
-        if(e instanceof NoSuchAlgorithmException) {
-            throw new BusinessException("文件服务器密钥有误");
-        }
-        if(e instanceof InternalException) {
-            throw new BusinessException("文件服务器-内部错误。");
-        }
-        if(e instanceof IOException) {
-            throw new BusinessException("文件服务器-连接异常。");
-        }
-        throw new BusinessException(e.getMessage(), e);
-    }
-}

+ 56 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileClientFacade.java

@@ -1,9 +1,11 @@
 package com.persagy.dmp.file.client;
 
 import cn.hutool.extra.spring.SpringUtil;
-import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
+import com.persagy.dmp.file.model.FileInfo;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
 
 import java.util.List;
 
@@ -63,4 +65,57 @@ public class FileClientFacade {
         CommonResult<List<FileInfo>> result = client.queryByFileMd5(fileMd5);
         return ResultHelper.getContent(result);
     }
+
+    /***
+     * Description: 获取文件上传信息-单个文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    public static CommonResult<UploadMes> initChunkUploadPrototype(String groupCode, String projectId, String appId,
+                                                                   String userId, FileRequestData requestData){
+        return client.initChunkUpload(groupCode, projectId, appId, userId, requestData);
+    }
+
+    /***
+     * Description: 获取文件上传信息-单个文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    public static CommonResult<UploadMes> composeFilePrototype(String groupCode, String projectId, String appId,
+                                                                   String userId, FileRequestData requestData){
+        return client.composeFile(groupCode, projectId, appId, userId, requestData);
+    }
+
+    /***
+     * Description: 获取文件上传信息-单个文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    public static CommonResult<UploadMes> initSingleUploadPrototype(String groupCode, String projectId, String appId,
+                                                                    String userId, FileRequestData requestData){
+        return client.initSingleUpload(groupCode, projectId, appId, userId, requestData);
+    }
+    /***
+     * Description: 获取文件上传信息-单个文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    public static CommonResult<FileInfo> initFileDownloadPrototype(FileRequestData requestData){
+        return client.initFileDownload(requestData);
+    }
+
+
+
 }

+ 1 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/config/FileFeignConfig.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.config;
+package com.persagy.dmp.file.client;
 
 import feign.Logger;
 import feign.codec.Encoder;

+ 63 - 4
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileManageClient.java

@@ -1,11 +1,11 @@
 package com.persagy.dmp.file.client;
 
-import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.common.model.response.CommonResult;
-import com.persagy.dmp.storage.config.FileFeignConfig;
+import com.persagy.dmp.file.model.FileInfo;
+import com.persagy.dmp.file.model.FileRequestData;
+import com.persagy.dmp.file.model.UploadMes;
 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.*;
 
 import java.util.List;
 
@@ -55,4 +55,63 @@ public interface FileManageClient {
      */
     @PostMapping("queryByFileMd5")
     CommonResult<List<FileInfo>> queryByFileMd5(@RequestBody String id);
+
+    /***
+     * Description: 获取断点续传上传信息
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    @PostMapping("/initChunkUpload")
+    CommonResult<UploadMes> initChunkUpload(@RequestParam("groupCode") String groupCode,
+                                             @RequestParam("projectId") String projectId,
+                                             @RequestParam("appId") String appId,
+                                             @RequestParam("userId") String userId,
+                                             @RequestBody FileRequestData requestData);
+
+    /***
+     * Description: 合并断点续传上传文件
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    @PostMapping("/composeFile")
+    CommonResult<UploadMes> composeFile(@RequestParam("groupCode") String groupCode,
+                                        @RequestParam("projectId") String projectId,
+                                        @RequestParam("appId") String appId,
+                                        @RequestParam("userId") String userId,
+                                        @RequestBody FileRequestData requestData);
+
+
+
+    /***
+     * Description: 获取文件上传信息
+     * @param requestData : 请求参数
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.UploadMes>  
+     * @author : lijie
+     * @date :2021/11/9 10:18
+     * Update By lijie 2021/11/9 10:18
+     */
+    @PostMapping("/initSingleUpload")
+    CommonResult<UploadMes> initSingleUpload(@RequestParam("groupCode") String groupCode,
+                                             @RequestParam("projectId") String projectId,
+                                             @RequestParam("appId") String appId,
+                                             @RequestParam("userId") String userId,
+                                             @RequestBody FileRequestData requestData);
+
+    /***
+     * Description: 获取文件下载信息
+     * @param requestData : 请求信息
+     * @return : com.persagy.dmp.common.model.response.CommonResult<com.persagy.dmp.file.model.FileInfo>
+     * @author : lijie
+     * @date :2021/11/9 10:17
+     * Update By lijie 2021/11/9 10:17
+     */
+    @PostMapping("/initFileDownload")
+    CommonResult<FileInfo> initFileDownload(@RequestBody FileRequestData requestData);
+
 }

+ 1 - 3
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileMd5Client.java

@@ -1,9 +1,7 @@
 package com.persagy.dmp.file.client;
 
 import com.persagy.dmp.common.model.response.CommonResult;
-import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileMd5;
-import com.persagy.dmp.storage.config.FileFeignConfig;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -61,4 +59,4 @@ public interface FileMd5Client {
      */
     @PostMapping("ensureFilePath")
     CommonResult<FileMd5> ensureFilePath(@RequestBody FileMd5 fileMd5);
-}
+}

+ 0 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileMd5ClientFacade.java

@@ -3,7 +3,6 @@ package com.persagy.dmp.file.client;
 import cn.hutool.extra.spring.SpringUtil;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ResultHelper;
-import com.persagy.dmp.file.model.FileInfo;
 import com.persagy.dmp.file.model.FileMd5;
 
 /**

+ 1 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/constant/FileCommonConst.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.constant;
+package com.persagy.dmp.file.constant;
 
 /**
  * 文件管理常量

dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/constant/UploadCodeEnum.java → dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/constant/UploadCodeEnum.java


+ 1 - 3
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/model/FileInfoCreator.java

@@ -5,9 +5,7 @@ import cn.hutool.core.util.ReUtil;
 import cn.hutool.core.util.StrUtil;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.lang.PsDate;
-import com.persagy.dmp.storage.constant.FileCommonConst;
-
-import java.util.Date;
+import com.persagy.dmp.file.constant.FileCommonConst;
 
 /**
  * 文件信息组装器

+ 2 - 8
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/model/FileMd5Creator.java

@@ -1,12 +1,7 @@
 package com.persagy.dmp.file.model;
 
 import cn.hutool.core.io.file.FileNameUtil;
-import cn.hutool.core.util.ReUtil;
-import cn.hutool.core.util.StrUtil;
-import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.lang.PsDate;
-import com.persagy.dmp.storage.constant.FileCommonConst;
-
 /***
  * Description: 文件信息组装器
  * @author : lijie
@@ -35,9 +30,8 @@ public class FileMd5Creator {
      * groupCode/dateStr/fileName
      * @param fileMd5 文件管理信息
      */
-    public static void buildFilePath(FileMd5 fileMd5,String fileName,String groupCode) {
-        String date = PsDate.parsePsDate(fileMd5.getCreationTime()).toString();
-        String sb = groupCode + FileNameUtil.UNIX_SEPARATOR + date +
+    public static void buildFilePath(FileMd5 fileMd5,String fileName) {
+        String sb = PsDate.parsePsDate(fileMd5.getCreationTime()).toString() +
                 FileNameUtil.UNIX_SEPARATOR + fileName;
         fileMd5.setFilePath(sb);
     }

+ 1 - 2
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/FileRequestData.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.file.domain;
+package com.persagy.dmp.file.model;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.persagy.dmp.common.lang.PsDate;
@@ -6,7 +6,6 @@ import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
-import java.util.Date;
 
 /***
  * Description: 文件请求参数

+ 1 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/UploadMes.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.file.domain;
+package com.persagy.dmp.file.model;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 1 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/domain/UploadSubMes.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.file.domain;
+package com.persagy.dmp.file.model;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;

+ 192 - 0
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/utils/FileStorageHelper.java

@@ -0,0 +1,192 @@
+package com.persagy.dmp.file.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.digest.DigestUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpStatus;
+import cn.hutool.http.HttpUtil;
+import com.persagy.dmp.common.constant.CommonConstant;
+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.helper.SpringHelper;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.file.client.FileClientFacade;
+import com.persagy.dmp.file.client.FileMd5ClientFacade;
+import com.persagy.dmp.file.constant.FileCommonConst;
+import com.persagy.dmp.file.constant.UploadCodeEnum;
+import com.persagy.dmp.file.model.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.*;
+import java.util.List;
+
+/**
+ * 文件存储助手
+ * @author Charlie Yu
+ * @date 2021-05-15
+ */
+@Slf4j
+public class FileStorageHelper {
+
+    /**
+     * 上传文件
+     * @param fileInfo
+     * @param in
+     * @return
+     */
+    public static String uploadFile(FileInfo fileInfo, InputStream in) {
+        // 1.获得文件大小
+        byte[] streamBytes = getStreamBytes(in);
+        // 2.获得文件的md5值
+        fileInfo.setFileMd5(DigestUtil.md5Hex(streamBytes));
+        FileRequestData requestData = new FileRequestData();
+        requestData.setGroupCode(fileInfo.getGroupCode());
+        requestData.setBusinessId(fileInfo.getBusinessId());
+        requestData.setExpireDate(fileInfo.getExpireDate());
+        requestData.setFileBucket(fileInfo.getFileBucket());
+        requestData.setFileName(fileInfo.getFileName());
+        requestData.setFileSize((long) streamBytes.length);
+        requestData.setFileMd5(fileInfo.getFileMd5());
+        requestData.setFileId(fileInfo.getId());
+        CommonResult<UploadMes> mesCommonResult = FileClientFacade
+                .initSingleUploadPrototype(fileInfo.getGroupCode(), null, null, null, requestData);
+        if (!CommonConstant.QUERY_SUCCESS.equals(mesCommonResult.getResult())){
+            throw new BusinessException(mesCommonResult.getResult(),mesCommonResult.getMessage());
+        }
+        UploadMes uploadMes = mesCommonResult.getData();
+        List<UploadSubMes> content = uploadMes.getContent();
+        if (UploadCodeEnum.CODE_200.getCode().equals(uploadMes.getUploadCode())){
+            // 秒传
+            return uploadMes.getId();
+        }
+        if (CollUtil.isEmpty(content) || StrUtil.isBlank(content.get(0).getUploadUrl())){
+            throw new BusinessException(ResponseCode.B0300.getCode(),ResponseCode.B0300.getDesc());
+        }
+        HttpResponse response = HttpRequest.put(content.get(0).getUploadUrl()).form("file", streamBytes).execute();
+        if (!response.isOk()){
+            log.error("上传文件出错:{}",response.body());
+            throw new BusinessException(ResponseCode.B0001.getCode(),ResponseCode.B0001.getDesc());
+        }
+        return uploadMes.getId();
+    }
+
+    /***
+     * Description: 读取流的字节数组
+     * @param stream : 流
+     * @return : byte[]
+     * @author : lijie
+     * @date :2021/10/23 12:22
+     * Update By lijie 2021/10/23 12:22
+     */
+    private static byte[] getStreamBytes(InputStream stream) {
+        return IoUtil.readBytes(stream);
+    }
+
+    /**
+     * 上传图片
+     * @param fileInfo
+     * @param in
+     * @return
+     */
+    public static String uploadImage(FileInfo fileInfo, InputStream in) {
+        // 图片压缩
+        InputStream cutIn = ImageHelper.cutImage(in);
+        return uploadFile(fileInfo, cutIn);
+    }
+
+    /**
+     * 修改文件
+     * @param fileId
+     * @param fileName
+     * @param in
+     * @return
+     */
+    public static String replaceFile(String fileId, String fileName, InputStream in) {
+        FileInfo fileInfo = FileClientFacade.load(fileId);
+        byte[] streamBytes = getStreamBytes(in);
+        // 1.判断文件是否已存在,如果已存在则更新文件信息关联的MD5值即可,秒传
+        String fileMd5Str = DigestUtil.md5Hex(streamBytes);
+        FileMd5 newFileMd5 = FileMd5ClientFacade.loadByMd5(fileMd5Str);
+        if (null!=newFileMd5){
+            fileInfo.setFileMd5(fileMd5Str);
+            fileInfo.setFileName(fileName);
+            FileClientFacade.update(fileInfo);
+            return fileInfo.getId();
+        }
+        // 2.判断md5关联的文件信息是否只有当前一个,如果只有一个则删除历史文件
+        List<FileInfo> fileInfos = FileClientFacade.queryByFileMd5(fileInfo.getFileMd5());
+        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
+        if (CollUtil.isNotEmpty(fileInfos) && fileInfos.size()==1){
+            // 删除MD5文件信息
+            FileMd5ClientFacade.delete(fileMd5.getId());
+        }
+        // 3.更新文件信息,然后重新上传文件
+        fileInfo.setFileMd5(fileMd5Str);
+        fileInfo.setFileName(fileName);
+        uploadFile(fileInfo,IoUtil.toStream(streamBytes));
+        return fileInfo.getId();
+    }
+
+    /**
+     * 更新图片
+     * @param fileId
+     * @param fileName
+     * @param in
+     * @return
+     */
+    public static String replaceImage(String fileId, String fileName, InputStream in) {
+        // 图片压缩
+        InputStream cutIn = ImageHelper.cutImage(in);
+        return replaceFile(fileId, fileName, cutIn);
+    }
+
+    /**
+     * 删除文件及图片
+     * @param fileId
+     */
+    public static void deleteFile(String fileId) {
+        FileInfo fileInfo = FileClientFacade.load(fileId);
+        List<FileInfo> fileInfos = FileClientFacade.queryByFileMd5(fileInfo.getFileMd5());
+        if (CollUtil.isNotEmpty(fileInfos) && fileInfos.size()>1){
+            // 多余一个绑定到相同的md5文件上,仅删除文件信息即可
+            FileClientFacade.delete(fileId);
+            return;
+        }
+        // 只有一个绑定到相同的md5文件上,删除文件信息,文件MD5信息,文件信息
+        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
+        FileClientFacade.delete(fileId);
+        FileMd5ClientFacade.delete(fileMd5.getId());
+    }
+
+    /**
+     * 下载
+     * @param fileId 文件id
+     * @return 文件下载地址
+     */
+    public static FileInfo downloadUrl(String fileId) {
+        FileRequestData requestData = new FileRequestData();
+        requestData.setFileId(fileId);
+        CommonResult<FileInfo> infoCommonResult = FileClientFacade.initFileDownloadPrototype(requestData);
+        if (!CommonConstant.QUERY_SUCCESS.equals(infoCommonResult.getResult())){
+            throw new BusinessException(infoCommonResult.getResult(),infoCommonResult.getMessage());
+        }
+        return infoCommonResult.getData();
+    }
+
+    /**
+     * 下载
+     * @param fileId 文件id
+     * @return 文件流
+     */
+    public static InputStream downloadStream(String fileId) {
+        FileInfo info = downloadUrl(fileId);
+        if (StrUtil.isNotBlank(info.getFileDownloadUrl())){
+            throw new BusinessException(ResponseCode.B0300.getCode(),ResponseCode.B0300.getDesc());
+        }
+        return IoUtil.toStream(HttpUtil.downloadBytes(info.getFileDownloadUrl()));
+    }
+}

+ 1 - 1
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/utils/ImageHelper.java

@@ -1,4 +1,4 @@
-package com.persagy.dmp.storage.utils;
+package com.persagy.dmp.file.utils;
 
 import cn.hutool.core.img.ImgUtil;
 import lombok.extern.slf4j.Slf4j;

+ 0 - 224
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/storage/utils/FileStorageHelper.java

@@ -1,224 +0,0 @@
-package com.persagy.dmp.storage.utils;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.NumberUtil;
-import cn.hutool.crypto.digest.DigestUtil;
-import com.persagy.dmp.common.constant.ResponseCode;
-import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.file.client.FileClientFacade;
-import com.persagy.dmp.file.client.FileMd5ClientFacade;
-import com.persagy.dmp.file.model.FileInfo;
-import com.persagy.dmp.file.model.FileInfoCreator;
-import com.persagy.dmp.file.model.FileMd5;
-import com.persagy.dmp.file.model.FileMd5Creator;
-import com.persagy.dmp.storage.constant.FileCommonConst;
-import com.persagy.dmp.storage.service.FileStorageFactory;
-import com.sun.corba.se.impl.encoding.WrapperInputStream;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.IOUtils;
-import org.springframework.util.StreamUtils;
-
-import java.io.*;
-import java.util.List;
-
-/**
- * 文件存储助手
- * @author Charlie Yu
- * @date 2021-05-15
- */
-@Slf4j
-public class FileStorageHelper {
-
-    /**
-     * 上传文件
-     * @param fileInfo
-     * @param in
-     * @return
-     */
-    public static String uploadFile(FileInfo fileInfo, InputStream in) {
-        // 1.获得文件大小
-        byte[] streamBytes = getStreamBytes(in);
-        fileInfo.setFileSize((long) streamBytes.length);
-        // 2.获得文件的md5值
-        String fileMd5Str = DigestUtil.md5Hex(streamBytes);
-        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileMd5Str);
-        // 3.创建新的存储的fileInfo
-        FileInfo saveFileInfo = FileInfoCreator.of(fileInfo.getGroupCode(),fileInfo.getFileName(),
-                fileInfo.getBusinessId(), fileMd5Str, fileInfo.getExpireDate());
-        // 4.如果文件MD5信息已存在,则直接保存文件信息即可.秒传
-        saveFileInfo = FileClientFacade.insert(saveFileInfo);
-        if (null!=fileMd5
-                && FileCommonConst.UPLOAD_SUCCESS.equals(fileMd5.getUploadStatus())){
-            return saveFileInfo.getId();
-        }
-        if (null!=fileMd5
-                && FileCommonConst.UPLOAD_PART.equals(fileMd5.getUploadStatus())){
-            // 5.文件为断点续传,更改MD5文件信息的文件状态
-            fileMd5.setFileSize(fileInfo.getFileSize());
-            fileMd5.setFileBucket(fileInfo.getFileBucket());
-            fileMd5.setUploadStatus(FileCommonConst.UPLOAD_SUCCESS);
-            fileMd5.setFileName(fileInfo.getFileName());
-            fileMd5.setGroupCode(fileInfo.getGroupCode());
-            fileMd5=FileMd5ClientFacade.ensureFilePath(fileMd5);
-            FileMd5ClientFacade.update(fileMd5);
-        }else {
-            // 6.没上传过,新建MD5文件信息
-            fileMd5 = FileMd5Creator.of(fileInfo.getFileBucket(), fileMd5Str, FileCommonConst.UPLOAD_SUCCESS);
-            fileMd5.setFileName(fileInfo.getFileName());
-            fileMd5.setGroupCode(fileInfo.getGroupCode());
-            fileMd5.setFileSize(fileInfo.getFileSize());
-            fileMd5 = FileMd5ClientFacade.insert(fileMd5);
-        }
-        FileStorageFactory.getService().upload(fileMd5.getFileBucket(), fileMd5.getFilePath(), IoUtil.toStream(streamBytes));
-        return saveFileInfo.getId();
-    }
-    /***
-     * Description: 读取流的字节数组
-     * @param stream : 流
-     * @return : byte[]
-     * @author : lijie
-     * @date :2021/10/23 12:22
-     * Update By lijie 2021/10/23 12:22
-     */
-    private static byte[] getStreamBytes(InputStream stream) {
-        return IoUtil.readBytes(stream);
-    }
-
-    /**
-     * 上传图片
-     * @param fileInfo
-     * @param in
-     * @return
-     */
-    public static String uploadImage(FileInfo fileInfo, InputStream in) {
-        // 图片压缩
-        InputStream cutIn = ImageHelper.cutImage(in);
-        return uploadFile(fileInfo, cutIn);
-    }
-
-    /**
-     * 修改文件
-     * @param fileId
-     * @param fileName
-     * @param in
-     * @return
-     */
-    public static String replaceFile(String fileId, String fileName, InputStream in) {
-        FileInfo fileInfo = FileClientFacade.load(fileId);
-        byte[] streamBytes = getStreamBytes(in);
-        // 1.判断文件是否已存在,如果已存在则更新文件信息关联的MD5值即可,秒传
-        String fileMd5Str = DigestUtil.md5Hex(streamBytes);
-        FileMd5 newFileMd5 = FileMd5ClientFacade.loadByMd5(fileMd5Str);
-        if (null!=newFileMd5){
-            fileInfo.setFileMd5(fileMd5Str);
-            fileInfo.setFileName(fileName);
-            FileClientFacade.update(fileInfo);
-            return fileInfo.getId();
-        }
-        // 2.判断md5关联的文件信息是否只有当前一个,如果只有一个则删除历史文件
-        List<FileInfo> fileInfos = FileClientFacade.queryByFileMd5(fileInfo.getFileMd5());
-        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
-        if (CollUtil.isNotEmpty(fileInfos) && fileInfos.size()==1){
-            // 删除MD5文件信息
-            FileMd5ClientFacade.delete(fileMd5.getId());
-            // 删除文件
-            FileStorageFactory.getService().delete(fileMd5.getFileBucket(), fileMd5.getFilePath());
-        }
-        // 3.更新文件信息,然后重新上传文件
-        FileMd5 uploadFileMd5 = FileMd5Creator.of(fileMd5.getFileBucket(), fileMd5Str, FileCommonConst.UPLOAD_SUCCESS);
-        uploadFileMd5.setFileName(fileName);
-        uploadFileMd5.setGroupCode(fileInfo.getGroupCode());
-        uploadFileMd5.setFileSize((long) streamBytes.length);
-        uploadFileMd5 = FileMd5ClientFacade.insert(uploadFileMd5);
-        fileInfo.setFileMd5(fileMd5Str);
-        fileInfo.setFileName(fileName);
-        FileClientFacade.update(fileInfo);
-        FileStorageFactory.getService().upload(uploadFileMd5.getFileBucket(), uploadFileMd5.getFilePath(),
-                IoUtil.toStream(streamBytes));
-        return fileInfo.getId();
-    }
-
-    /**
-     * 更新图片
-     * @param fileId
-     * @param fileName
-     * @param in
-     * @return
-     */
-    public static String replaceImage(String fileId, String fileName, InputStream in) {
-        // 图片压缩
-        InputStream cutIn = ImageHelper.cutImage(in);
-        return replaceFile(fileId, fileName, cutIn);
-    }
-
-    /**
-     * 删除文件及图片
-     * @param fileId
-     */
-    public static void deleteFile(String fileId) {
-        FileInfo fileInfo = FileClientFacade.load(fileId);
-        List<FileInfo> fileInfos = FileClientFacade.queryByFileMd5(fileInfo.getFileMd5());
-        if (CollUtil.isNotEmpty(fileInfos) && fileInfos.size()>1){
-            // 多余一个绑定到相同的md5文件上,仅删除文件信息即可
-            FileClientFacade.delete(fileId);
-            return;
-        }
-        // 只有一个绑定到相同的md5文件上,删除文件信息,文件MD5信息,文件信息
-        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
-        FileClientFacade.delete(fileId);
-        FileMd5ClientFacade.delete(fileMd5.getId());
-        FileStorageFactory.getService().delete(fileMd5.getFileBucket(), fileMd5.getFilePath());
-    }
-
-    /**
-     * 下载
-     * @param fileId 文件id
-     * @return 文件下载地址
-     */
-    public static FileInfo downloadUrl(String fileId) {
-        FileInfo fileInfo = FileClientFacade.load(fileId);
-        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
-        if (null!=fileMd5){
-            String fetchUrl = FileStorageFactory.getService().fetchUrl(fileMd5.getFileBucket(), fileMd5.getFilePath());
-            fileInfo.setFileDownloadUrl(fetchUrl);
-        }
-        return fileInfo;
-    }
-
-    /**
-     * 下载
-     * @param fileId 文件id
-     * @return 文件流
-     */
-    public static InputStream downloadStream(String fileId) {
-        FileInfo fileInfo = FileClientFacade.load(fileId);
-        FileMd5 fileMd5 = FileMd5ClientFacade.loadByMd5(fileInfo.getFileMd5());
-        return FileStorageFactory.getService().download(fileMd5.getFileBucket(), fileMd5.getFilePath());
-    }
-
-    /**
-     * 下载
-     * @param fileId 文件id
-     * @return 文件内容
-     */
-    public static byte[] downloadContent(String fileId) {
-        // TODO 暂不提供,依赖前端显示规则
-        return null;
-    }
-
-    /**
-     * 获取文件大小
-     * @param stream
-     * @return
-     */
-//    private static Long getStreamSize(InputStream stream) {
-//        try {
-//            return Long.valueOf(stream.available());
-//        } catch (IOException e) {
-//            log.error(e.getMessage(), e);
-//            throw new BusinessException("文件上传失败!");
-//        }
-//    }
-}

+ 1 - 2
dmp-comp/pom.xml

@@ -19,8 +19,7 @@
         <module>dmp-digital-starter</module>
         <module>dmp-amqp-starter</module>
         <module>dmp-auth</module>
-        <module>dmp-file-hdfs-starter</module>
-        <module>dmp-file-minio-starter</module>
+        <module>dmp-auth-starter</module>
     </modules>
 
 </project>