Browse Source

优化:优化queryObjectListByGraphCodeAndRelCode接口,当关系数据较大时原sql逻辑无法查询

lijie 3 years ago
parent
commit
8cfb4d9e1c

+ 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 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/FileMd5Controller.java

@@ -85,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);
     }
 

+ 21 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/controller/TestController.java

@@ -1,5 +1,7 @@
 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;
@@ -10,11 +12,20 @@ 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.utils.FileStorageHelper;
+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.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
@@ -24,6 +35,8 @@ import java.io.IOException;
 @RestController
 @RequestMapping("/test")
 public class TestController {
+    @Autowired
+    private MinioClient minioClient;
 
     @PostMapping(value = "/uploadFile")
     @CrossOrigin
@@ -79,4 +92,11 @@ public class TestController {
                 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值

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

+ 11 - 8
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/FileServiceImpl.java

@@ -105,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)){
@@ -142,7 +142,6 @@ public class FileServiceImpl extends ServiceImpl<FileMapper, FileInfo> implement
         return firstInitChunkUploadInternal(requestData);
     }
 
-
     /***
      * Description: 合并断点续传的文件
      * @param requestData : 请求参数
@@ -170,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);
@@ -206,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());
@@ -274,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());

+ 1 - 1
dmp-cloud/dmp-file/src/main/java/com/persagy/dmp/file/service/impl/MinioStorageServiceImpl.java

@@ -30,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;
 
     /**排序*/

+ 53 - 4
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileClientFacade.java

@@ -2,10 +2,12 @@ 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.FileRequestData;
 import com.persagy.dmp.file.model.UploadMes;
-import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
 
 /**
  * 文件管理Client门面
@@ -16,6 +18,54 @@ public class FileClientFacade {
 
     private static FileManageClient client = SpringUtil.getBean(FileManageClient.class);
 
+    /**
+     * 新增
+     * @param fileInfo
+     * @return
+     */
+    public static FileInfo insert(FileInfo fileInfo) {
+        CommonResult<FileInfo> result = client.insert(fileInfo);
+        return ResultHelper.getContent(result);
+    }
+
+    /**
+     * 修改
+     * @param fileInfo
+     * @return
+     */
+    public static FileInfo update(FileInfo fileInfo) {
+        CommonResult<FileInfo> result = client.update(fileInfo);
+        return ResultHelper.getContent(result);
+    }
+
+    /**
+     * 删除
+     * @param fileId
+     */
+    public static void delete(String fileId) {
+        CommonResult<String> result = client.delete(fileId);
+        ResultHelper.getContent(result);
+    }
+
+    /**
+     * 查询
+     * @param fileId
+     * @return
+     */
+    public static FileInfo load(String fileId) {
+        CommonResult<FileInfo> result = client.load(fileId);
+        return ResultHelper.getContent(result);
+    }
+    /**
+     * 查询
+     * @param fileMd5
+     * @return
+     */
+    public static List<FileInfo> queryByFileMd5(String fileMd5) {
+        CommonResult<List<FileInfo>> result = client.queryByFileMd5(fileMd5);
+        return ResultHelper.getContent(result);
+    }
+
     /***
      * Description: 获取文件上传信息-单个文件
      * @param requestData : 请求参数
@@ -62,9 +112,8 @@ public class FileClientFacade {
      * @date :2021/11/9 10:18
      * Update By lijie 2021/11/9 10:18
      */
-    public static CommonResult<FileInfo> initFileDownloadPrototype(String groupCode, String projectId, String appId,
-                                                                   String userId, FileRequestData requestData){
-        return client.initFileDownload(groupCode, projectId, appId, userId, requestData);
+    public static CommonResult<FileInfo> initFileDownloadPrototype(FileRequestData requestData){
+        return client.initFileDownload(requestData);
     }
 
 

+ 42 - 5
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileManageClient.java

@@ -7,6 +7,8 @@ import com.persagy.dmp.file.model.UploadMes;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 文件管理Client
  * @author Charlie Yu
@@ -15,6 +17,45 @@ import org.springframework.web.bind.annotation.*;
 @FeignClient(name = "dmp-file", configuration = FileFeignConfig.class,path = "/file/",url = "${persagy.bdtp.file.service:}")
 public interface FileManageClient {
 
+    /**
+     * 新增文件信息
+     * @param fileInfo 文件信息
+     * @return 文件信息
+     */
+    @PostMapping("insert")
+    CommonResult<FileInfo> insert(@RequestBody FileInfo fileInfo);
+
+    /**
+     * 修改文件信息
+     * @param fileInfo 文件信息
+     * @return 文件信息
+     */
+    @PostMapping("update")
+    CommonResult<FileInfo> update(@RequestBody FileInfo fileInfo);
+
+    /**
+     * 删除文件信息
+     * @param id 文件信息
+     * @return 文件信息
+     */
+    @PostMapping("delete")
+    CommonResult<String> delete(@RequestBody String id);
+
+    /**
+     * 查询文件信息
+     * @param id 文件信息
+     * @return 文件信息
+     */
+    @PostMapping("load")
+    CommonResult<FileInfo> load(@RequestBody String id);
+    /**
+     * 查询文件信息
+     * @param id 文件信息
+     * @return 文件信息
+     */
+    @PostMapping("queryByFileMd5")
+    CommonResult<List<FileInfo>> queryByFileMd5(@RequestBody String id);
+
     /***
      * Description: 获取断点续传上传信息
      * @param requestData : 请求参数
@@ -71,10 +112,6 @@ public interface FileManageClient {
      * Update By lijie 2021/11/9 10:17
      */
     @PostMapping("/initFileDownload")
-    CommonResult<FileInfo> initFileDownload(@RequestParam("groupCode") String groupCode,
-                                            @RequestParam("projectId") String projectId,
-                                            @RequestParam("appId") String appId,
-                                            @RequestParam("userId") String userId,
-                                            @RequestBody FileRequestData requestData);
+    CommonResult<FileInfo> initFileDownload(@RequestBody FileRequestData requestData);
 
 }

+ 62 - 0
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/client/FileMd5Client.java

@@ -0,0 +1,62 @@
+package com.persagy.dmp.file.client;
+
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.file.model.FileMd5;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * 文件管理Client
+ * @author Charlie Yu
+ * @date 2021-05-15
+ */
+@FeignClient(name = "dmp-file", configuration = FileFeignConfig.class,path = "/file/md5/",url = "${persagy.bdtp.file.service:}")
+public interface FileMd5Client {
+
+    /**
+     * 新增文件MD5信息
+     * @param fileMd5 文件MD5信息
+     * @return 文件MD5信息
+     */
+    @PostMapping("insert")
+    CommonResult<FileMd5> insert(@RequestBody FileMd5 fileMd5);
+
+    /**
+     * 修改文件MD5信息
+     * @param fileMd5 MD5信息
+     * @return MD5信息
+     */
+    @PostMapping("update")
+    CommonResult<FileMd5> update(@RequestBody FileMd5 fileMd5);
+
+    /**
+     * 删除文件MD5信息
+     * @param id 文件MD5信息
+     * @return 文件MD5信息
+     */
+    @PostMapping("delete")
+    CommonResult<String> delete(@RequestBody String id);
+
+    /**
+     * 查询文件MD5信息
+     * @param id 文件MD5信息
+     * @return 文件MD5信息
+     */
+    @PostMapping("load")
+    CommonResult<FileMd5> load(@RequestBody String id);
+    /**
+     * 查询文件MD5信息
+     * @param md5 文件的md5
+     * @return 文件MD5信息
+     */
+    @PostMapping("loadByMd5")
+    CommonResult<FileMd5> loadByMd5(@RequestBody String md5);
+    /**
+     * 查询文件MD5信息
+     * @param fileMd5 文件的md5
+     * @return 文件MD5信息
+     */
+    @PostMapping("ensureFilePath")
+    CommonResult<FileMd5> ensureFilePath(@RequestBody FileMd5 fileMd5);
+}

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

@@ -0,0 +1,81 @@
+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.FileMd5;
+
+/**
+ * 文件管理Client门面
+ * @author Charlie Yu
+ * @date 2021-05-15
+ */
+public class FileMd5ClientFacade {
+
+    private static FileMd5Client client = SpringUtil.getBean(FileMd5Client.class);
+
+    /**
+     * 新增
+     * @param fileMd5
+     * @return
+     */
+    public static FileMd5 insert(FileMd5 fileMd5) {
+        CommonResult<FileMd5> result = client.insert(fileMd5);
+        return ResultHelper.getContent(result);
+    }
+
+    /**
+     * 修改
+     * @param fileMd5
+     * @return
+     */
+    public static FileMd5 update(FileMd5 fileMd5) {
+        CommonResult<FileMd5> result = client.update(fileMd5);
+        return ResultHelper.getContent(result);
+    }
+
+    /**
+     * 删除
+     * @param fileId
+     */
+    public static void delete(String fileId) {
+        CommonResult<String> result = client.delete(fileId);
+        ResultHelper.getContent(result);
+    }
+
+    /**
+     * 查询
+     * @param fileId
+     * @return
+     */
+    public static FileMd5 load(String fileId) {
+        CommonResult<FileMd5> result = client.load(fileId);
+        return ResultHelper.getContent(result);
+    }
+    /**
+     * 查询
+     * @param fileMd5
+     * @return
+     */
+    public static FileMd5 loadByMd5(String fileMd5) {
+        CommonResult<FileMd5> result = client.loadByMd5(fileMd5);
+        return ResultHelper.getContent(result);
+    }
+    /**
+     * 查询
+     * @param fileMd5
+     * @return
+     */
+    public static CommonResult<FileMd5> loadByMd5Prototype(String fileMd5) {
+        return client.loadByMd5(fileMd5);
+    }
+    /**
+     * 查询
+     * @param fileMd5:文件MD5信息
+     * @return
+     */
+    public static FileMd5 ensureFilePath(FileMd5 fileMd5) {
+        CommonResult<FileMd5> result = client.ensureFilePath(fileMd5);
+        return ResultHelper.getContent(result);
+    }
+}

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

@@ -30,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);
     }

+ 93 - 111
dmp-comp/dmp-file-starter/src/main/java/com/persagy/dmp/file/utils/FileStorageHelper.java

@@ -15,6 +15,8 @@ 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;
@@ -40,7 +42,7 @@ public class FileStorageHelper {
         // 1.获得文件大小
         byte[] streamBytes = getStreamBytes(in);
         // 2.获得文件的md5值
-        String fileMd5Str = DigestUtil.md5Hex(streamBytes);
+        fileInfo.setFileMd5(DigestUtil.md5Hex(streamBytes));
         FileRequestData requestData = new FileRequestData();
         requestData.setGroupCode(fileInfo.getGroupCode());
         requestData.setBusinessId(fileInfo.getBusinessId());
@@ -48,7 +50,8 @@ public class FileStorageHelper {
         requestData.setFileBucket(fileInfo.getFileBucket());
         requestData.setFileName(fileInfo.getFileName());
         requestData.setFileSize((long) streamBytes.length);
-        // 3.创建新的存储的fileInfo
+        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())){
@@ -70,6 +73,7 @@ public class FileStorageHelper {
         }
         return uploadMes.getId();
     }
+
     /***
      * Description: 读取流的字节数组
      * @param stream : 流
@@ -94,117 +98,95 @@ public class FileStorageHelper {
         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
+     * @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 stream
+     * 更新图片
+     * @param fileId
+     * @param fileName
+     * @param in
      * @return
      */
-//    private static Long getStreamSize(InputStream stream) {
-//        try {
-//            return Long.valueOf(stream.available());
-//        } catch (IOException e) {
-//            log.error(e.getMessage(), e);
-//            throw new BusinessException("文件上传失败!");
-//        }
-//    }
+    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()));
+    }
 }