xiewj 2 anni fa
parent
commit
d081c72846
67 ha cambiato i file con 4812 aggiunte e 0 eliminazioni
  1. 41 0
      .gitignore
  2. 27 0
      src/main/java/org/fdkk/bim/BimApplication.java
  3. 44 0
      src/main/java/org/fdkk/bim/Interceptor/BimFaceInterceptor.java
  4. 100 0
      src/main/java/org/fdkk/bim/base/BaseController.java
  5. 62 0
      src/main/java/org/fdkk/bim/base/BaseEntity.java
  6. 186 0
      src/main/java/org/fdkk/bim/base/Result.java
  7. 20 0
      src/main/java/org/fdkk/bim/bimEntity/BimResult.java
  8. 15 0
      src/main/java/org/fdkk/bim/bimEntity/dto/BaseBimDTO.java
  9. 17 0
      src/main/java/org/fdkk/bim/bimEntity/dto/DatabagDownloadDTO.java
  10. 16 0
      src/main/java/org/fdkk/bim/bimEntity/dto/FileItemsDTO.java
  11. 11 0
      src/main/java/org/fdkk/bim/bimEntity/dto/OfflineDatabagDTO.java
  12. 15 0
      src/main/java/org/fdkk/bim/bimEntity/dto/ProjectDTO.java
  13. 14 0
      src/main/java/org/fdkk/bim/bimEntity/dto/SourceDTO.java
  14. 12 0
      src/main/java/org/fdkk/bim/bimEntity/dto/TranslateDTO.java
  15. 36 0
      src/main/java/org/fdkk/bim/bimEntity/vo/AccessTokenBean.java
  16. 15 0
      src/main/java/org/fdkk/bim/bimEntity/vo/ConfigBean.java
  17. 21 0
      src/main/java/org/fdkk/bim/bimEntity/vo/DatabagDerivativeBean.java
  18. 47 0
      src/main/java/org/fdkk/bim/bimEntity/vo/FileBean.java
  19. 19 0
      src/main/java/org/fdkk/bim/bimEntity/vo/FileStatusBean.java
  20. 29 0
      src/main/java/org/fdkk/bim/bimEntity/vo/FileTranslateBean.java
  21. 24 0
      src/main/java/org/fdkk/bim/bimEntity/vo/ProjectBean.java
  22. 1162 0
      src/main/java/org/fdkk/bim/cache/RedisCache.java
  23. 29 0
      src/main/java/org/fdkk/bim/client/BimCallBackClient.java
  24. 108 0
      src/main/java/org/fdkk/bim/client/BimFaceClient.java
  25. 36 0
      src/main/java/org/fdkk/bim/config/BimConfig.java
  26. 62 0
      src/main/java/org/fdkk/bim/config/BimFaceConfig.java
  27. 72 0
      src/main/java/org/fdkk/bim/config/FastJson2JsonRedisSerializer.java
  28. 19 0
      src/main/java/org/fdkk/bim/config/FastJsonHttpMessageConverterEx.java
  29. 21 0
      src/main/java/org/fdkk/bim/config/ForestFastjsonConverter.java
  30. 48 0
      src/main/java/org/fdkk/bim/config/MyBatisPlusConfig.java
  31. 79 0
      src/main/java/org/fdkk/bim/config/RedisConfig.java
  32. 90 0
      src/main/java/org/fdkk/bim/config/ResourcesConfig.java
  33. 95 0
      src/main/java/org/fdkk/bim/constant/HttpStatus.java
  34. 98 0
      src/main/java/org/fdkk/bim/controller/CallBackController.java
  35. 109 0
      src/main/java/org/fdkk/bim/controller/FileController.java
  36. 48 0
      src/main/java/org/fdkk/bim/controller/TestController.java
  37. 29 0
      src/main/java/org/fdkk/bim/entity/dto/BimCallBackDTO.java
  38. 19 0
      src/main/java/org/fdkk/bim/entity/dto/BimFaceBaseDTO.java
  39. 8 0
      src/main/java/org/fdkk/bim/entity/dto/BimUploadDTO.java
  40. 45 0
      src/main/java/org/fdkk/bim/entity/po/BimFaceEntity.java
  41. 50 0
      src/main/java/org/fdkk/bim/entity/vo/BimFaceVO.java
  42. 31 0
      src/main/java/org/fdkk/bim/enums/BusinessStatus.java
  43. 58 0
      src/main/java/org/fdkk/bim/exception/GlobalException.java
  44. 72 0
      src/main/java/org/fdkk/bim/exception/ServiceException.java
  45. 26 0
      src/main/java/org/fdkk/bim/exception/UtilException.java
  46. 98 0
      src/main/java/org/fdkk/bim/exception/base/BaseException.java
  47. 19 0
      src/main/java/org/fdkk/bim/exception/file/FileException.java
  48. 16 0
      src/main/java/org/fdkk/bim/exception/file/FileNameLengthLimitExceededException.java
  49. 16 0
      src/main/java/org/fdkk/bim/exception/file/FileSizeLimitExceededException.java
  50. 82 0
      src/main/java/org/fdkk/bim/exception/file/InvalidExtensionException.java
  51. 30 0
      src/main/java/org/fdkk/bim/handler/MyMetaObjectHandler.java
  52. 15 0
      src/main/java/org/fdkk/bim/mapper/BimFaceMapper.java
  53. 37 0
      src/main/java/org/fdkk/bim/service/BimFaceService.java
  54. 205 0
      src/main/java/org/fdkk/bim/service/impl/BimFaceServiceImpl.java
  55. 112 0
      src/main/java/org/fdkk/bim/task/task.java
  56. 100 0
      src/main/java/org/fdkk/bim/util/BimZipUtil.java
  57. 219 0
      src/main/java/org/fdkk/bim/util/FileUploadUtils.java
  58. 26 0
      src/main/java/org/fdkk/bim/util/MessageUtils.java
  59. 65 0
      src/main/java/org/fdkk/bim/util/MimeTypeUtils.java
  60. 20 0
      src/main/java/org/fdkk/bim/util/ObjectAndByteCovertUtil.java
  61. 32 0
      src/main/java/org/fdkk/bim/util/SnowIdUtil.java
  62. 88 0
      src/main/java/org/fdkk/bim/web/GlobalExceptionHandler.java
  63. 92 0
      src/main/resources/application-dev.yml
  64. 92 0
      src/main/resources/application-prod.yml
  65. 92 0
      src/main/resources/application-uat.yml
  66. 5 0
      src/main/resources/application.yml
  67. 166 0
      src/main/resources/logback-spring.xml

+ 41 - 0
.gitignore

@@ -0,0 +1,41 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.sysLog
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+../.idea
+*.iml
+out
+gen
+rebel.xml
+/target/
+
+
+*.iws
+*.ipr
+!/.gitignore
+!/logs/

+ 27 - 0
src/main/java/org/fdkk/bim/BimApplication.java

@@ -0,0 +1,27 @@
+package org.fdkk.bim;
+
+import com.dtflys.forest.springboot.annotation.ForestScan;
+import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * @author Xiewj
+ * @date ${DATE}
+ */
+@SpringBootApplication(exclude = { PageHelperAutoConfiguration.class})
+@Configuration
+@ForestScan(basePackages = "org.fdkk.bim.client")
+@MapperScan({"org.fdkk.bim.mapper"})
+@ComponentScan(basePackages = {"com.fdkankan.*","org.fdkk.bim.*"})
+@EnableScheduling
+public class BimApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(BimApplication.class, args);
+    }
+}

+ 44 - 0
src/main/java/org/fdkk/bim/Interceptor/BimFaceInterceptor.java

@@ -0,0 +1,44 @@
+package org.fdkk.bim.Interceptor;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.http.ForestResponse;
+import com.dtflys.forest.interceptor.Interceptor;
+import com.dtflys.forest.reflection.ForestMethod;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.config.BimFaceConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Slf4j
+public class BimFaceInterceptor<T> implements Interceptor<T> {
+   @Autowired
+   BimFaceConfig bimFaceConfig;
+
+
+   /**
+    * 该方法在被调用时,并在beforeExecute前被调用
+    * @Param request Forest请求对象
+    * @Param args 方法被调用时传入的参数数组
+    */
+   @Override
+   public void onInvokeMethod(ForestRequest req, ForestMethod method, Object[] args) {
+      log.info("on invoke method");
+      if (!method.getMethodName().equals("getToken")){
+         BimFaceConfig bean = SpringUtil.getBean(BimFaceConfig.class);
+         req.addHeader("Authorization", "Bearer "+bean.getAccessToken());  // 添加Header
+      }
+   }
+
+   /**
+    * 该方法在请求成功响应时被调用
+    */
+   @Override
+   public void onSuccess(T data, ForestRequest req, ForestResponse res) {
+      log.info("invoke Simple onSuccess {},data:{}",res,data);
+   }
+}
+

+ 100 - 0
src/main/java/org/fdkk/bim/base/BaseController.java

@@ -0,0 +1,100 @@
+package org.fdkk.bim.base;
+
+import com.alibaba.fastjson.JSONObject;
+import org.fdkk.bim.util.SnowIdUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import java.beans.PropertyEditorSupport;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * web层通用数据处理
+ *
+ * @author fdkk
+ */
+@Component
+public class BaseController {
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    SnowIdUtil snowIdUtil;
+
+    /**
+     * 获取ID生成器
+     */
+    public String getSnowId() {
+        return snowIdUtil.getNextIdStr();
+    }
+
+    /**
+     * 返回成功
+     */
+    public Result success() {
+        return Result.success();
+    }
+
+    /**
+     * 返回失败消息
+     */
+    public Result error() {
+        return Result.error();
+    }
+    public Result error(String message, Object data) {
+        return Result.error(message, data);
+    }
+
+    /**
+     * 返回成功消息
+     */
+    public Result success(String message) {
+        return Result.success(message);
+    }
+
+    /**
+     * 返回成功消息
+     */
+    public Result success(String message, Object data) {
+        return Result.success(message, data);
+    }
+
+    public static Result success(Object data) {
+        return Result.success(data);
+    }
+
+    public static Result error(int code, String msg) {
+        return new Result(code, msg, null);
+    }
+
+    /**
+     * 返回失败消息
+     */
+    public Result error(String message) {
+        return Result.error(message);
+    }
+
+    /**
+     * 响应返回结果
+     *
+     * @param rows 影响行数
+     * @return 操作结果
+     */
+    protected Result toAjax(int rows) {
+        return rows > 0 ? Result.success() : Result.error();
+    }
+
+    /**
+     * 响应返回结果
+     *
+     * @param result 结果
+     * @return 操作结果
+     */
+    protected Result toAjax(boolean result) {
+        return result ? success() : error();
+    }
+}

+ 62 - 0
src/main/java/org/fdkk/bim/base/BaseEntity.java

@@ -0,0 +1,62 @@
+package org.fdkk.bim.base;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Entity基类
+ *
+ * @author fdkk
+ */
+@Data
+public abstract class BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
+    @TableField(value = "create_time", fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
+    @TableField(value = "update_time", fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    @TableField(value = "delete_flag")
+    @TableLogic(value = "null", delval = "now()")
+    private LocalDateTime deleteFlag;
+
+
+}

+ 186 - 0
src/main/java/org/fdkk/bim/base/Result.java

@@ -0,0 +1,186 @@
+package org.fdkk.bim.base;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import org.fdkk.bim.constant.HttpStatus;
+
+import java.util.HashMap;
+
+/**
+ * 操作消息提醒
+ *
+ * @author fdkk
+ */
+public class Result extends HashMap<String, Object> {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 状态码
+     */
+    private static final String CODE_TAG = "code";
+
+    /**
+     * 返回内容
+     */
+    private static final String MSG_TAG = "msg";
+
+    /**
+     * 数据对象
+     */
+    public static final String DATA_TAG = "data";
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
+     */
+    public Result() {
+    }
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     */
+    public Result(int code, String msg) {
+        super.put(Result.CODE_TAG, code);
+        super.put(Result.MSG_TAG, msg);
+    }
+
+    /**
+     * 初始化一个新创建的 AjaxResult 对象
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     * @param data 数据对象
+     */
+    public Result(int code, String msg, Object data) {
+        super.put(Result.CODE_TAG, code);
+        super.put(Result.MSG_TAG, msg);
+        if (ObjectUtil.isNotNull(data)) {
+            super.put(Result.DATA_TAG, data);
+        }
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @return 成功消息
+     */
+    public static Result success() {
+        return Result.success("操作成功");
+    }
+
+    /**
+     * 返回成功数据
+     *
+     * @return 成功消息
+     */
+    public static Result success(Object data) {
+        return Result.success("操作成功", data);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg 返回内容
+     * @return 成功消息
+     */
+    public static Result success(String msg) {
+        return Result.success(msg, null);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg  返回内容
+     * @param data 数据对象
+     * @return 成功消息
+     */
+    public static Result success(String msg, Object data) {
+        return new Result(HttpStatus.SUCCESS.getCode(), msg, data);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg 返回内容
+     * @param msg 数据对象
+     * @return 成功消息
+     */
+    public static Result success(int code, String msg) {
+        return new Result(code, msg);
+    }
+
+    /**
+     * 返回成功消息
+     *
+     * @param msg 返回内容
+     * @param msg 数据对象
+     * @return 成功消息
+     */
+    public static Result success(int code, String msg, Object data) {
+        return new Result(code, msg, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @return
+     */
+    public static Result error() {
+        return Result.error("操作失败");
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param msg 返回内容
+     * @return 警告消息
+     */
+    public static Result error(String msg) {
+        return Result.error(msg, null);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param data 返回内容
+     * @return 警告消息
+     */
+    public static Result error(Object data) {
+        return Result.error(data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param msg  返回内容
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static Result error(String msg, Object data) {
+        return new Result(HttpStatus.ERROR.getCode(), msg, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param msg  返回内容
+     * @param data 数据对象
+     * @return 警告消息
+     */
+    public static Result error(int code, String msg, Object data) {
+        return new Result(code, msg, data);
+    }
+
+    /**
+     * 返回错误消息
+     *
+     * @param code 状态码
+     * @param msg  返回内容
+     * @return 警告消息
+     */
+    public static Result error(int code, String msg) {
+        return new Result(code, msg, null);
+    }
+}

+ 20 - 0
src/main/java/org/fdkk/bim/bimEntity/BimResult.java

@@ -0,0 +1,20 @@
+package org.fdkk.bim.bimEntity;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.Data;
+import org.fdkk.bim.constant.HttpStatus;
+
+import java.util.HashMap;
+
+/**
+ * 操作消息提醒
+ *
+ * @author fdkk
+ */
+@Data
+public class BimResult<T>   {
+   private String code;
+   private String message;
+   private T data;
+}

+ 15 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/BaseBimDTO.java

@@ -0,0 +1,15 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class BaseBimDTO {
+   private  String callback;
+   private Map<String, Object> config;
+}

+ 17 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/DatabagDownloadDTO.java

@@ -0,0 +1,17 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class DatabagDownloadDTO {
+   private Long compareId;
+   private String databagVersion;
+   private String fileId;
+   private Long integrateId;
+   private Long projectId;
+   private Long type;
+}

+ 16 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/FileItemsDTO.java

@@ -0,0 +1,16 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class FileItemsDTO {
+   private  String name;
+   private  String parentId;
+   private  String parentPath;
+   private  Long length;
+   private  String sourceId;
+}

+ 11 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/OfflineDatabagDTO.java

@@ -0,0 +1,11 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class OfflineDatabagDTO  extends BaseBimDTO{
+}

+ 15 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/ProjectDTO.java

@@ -0,0 +1,15 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class ProjectDTO {
+
+  private String name;
+  private String thumbnail;
+  private String info;
+}

+ 14 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/SourceDTO.java

@@ -0,0 +1,14 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class SourceDTO {
+   private String rootName;
+   private boolean compressed;
+   private Long fileId;
+}

+ 12 - 0
src/main/java/org/fdkk/bim/bimEntity/dto/TranslateDTO.java

@@ -0,0 +1,12 @@
+package org.fdkk.bim.bimEntity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class TranslateDTO extends BaseBimDTO {
+  private SourceDTO source;
+}

+ 36 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/AccessTokenBean.java

@@ -0,0 +1,36 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import java.io.Serializable;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+public class AccessTokenBean implements Serializable {
+   private static final long serialVersionUID = 3689610953146655948L;
+   private String token;
+   private String expireTime;
+
+   public AccessTokenBean() {
+   }
+
+   public String getToken() {
+      return this.token;
+   }
+
+   public void setToken(String token) {
+      this.token = token;
+   }
+
+   public String getExpireTime() {
+      return this.expireTime;
+   }
+
+   public void setExpireTime(String expireTime) {
+      this.expireTime = expireTime;
+   }
+
+   public String toString() {
+      return "AccessTokenBean [token=" + this.token + ", expireTime=" + this.expireTime + "]";
+   }
+}

+ 15 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/ConfigBean.java

@@ -0,0 +1,15 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/10
+ */
+@Data
+public class ConfigBean implements Serializable {
+   private boolean toBimtiles;
+   private boolean texture;
+}

+ 21 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/DatabagDerivativeBean.java

@@ -0,0 +1,21 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class DatabagDerivativeBean implements Serializable {
+   private String reason;
+   private Date createTime;
+   private long length;
+   private String errorCode;
+   private String databagVersion;
+   private String status;
+   private String projectId;
+}

+ 47 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/FileBean.java

@@ -0,0 +1,47 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class FileBean implements Serializable {
+   private String appKey;
+
+   private Date createTime;
+
+   private String fileItemId;
+
+   private boolean folder;
+
+   private String id;
+
+   private int length;
+
+   private String md5;
+
+   private String name;
+
+   private String parentId;
+
+   private String physicalIndex;
+
+   private String projectId;
+
+   private String status;
+
+   private String storeId;
+
+   private String suffix;
+
+   private Date updateTime;
+
+   private String uploadMode;
+
+   private int version;
+}

+ 19 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/FileStatusBean.java

@@ -0,0 +1,19 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class FileStatusBean implements Serializable {
+   private String fileItemId;
+   private String name;
+   private String status;
+   private String failedReason;
+
+}

+ 29 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/FileTranslateBean.java

@@ -0,0 +1,29 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@Data
+public class FileTranslateBean implements Serializable {
+   private String appKey;
+   private boolean compressed;
+   private Date createTime;
+   private String databagId;
+   private ConfigBean config;
+   private String errorCode;
+   private long fileId;
+   private String name;
+   private String outputFormat;
+   private int priority;
+   private String projectId;
+   private String reason;
+   private String status;
+   private List<String> thumbnail;
+}

+ 24 - 0
src/main/java/org/fdkk/bim/bimEntity/vo/ProjectBean.java

@@ -0,0 +1,24 @@
+package org.fdkk.bim.bimEntity.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.sql.Date;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Data
+public class ProjectBean  implements Serializable {
+   private String appKey;
+   private Date createTime;
+   private String hubId;
+   private String id;
+   private String info;
+   private String name;
+   private String tenantCode;
+   private String thumbnail;
+   private String type;
+   private Date updateTime;
+}

File diff suppressed because it is too large
+ 1162 - 0
src/main/java/org/fdkk/bim/cache/RedisCache.java


+ 29 - 0
src/main/java/org/fdkk/bim/client/BimCallBackClient.java

@@ -0,0 +1,29 @@
+package org.fdkk.bim.client;
+
+import com.dtflys.forest.annotation.*;
+import com.dtflys.forest.callback.OnError;
+import com.dtflys.forest.callback.OnSuccess;
+import org.fdkk.bim.Interceptor.BimFaceInterceptor;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.dto.OfflineDatabagDTO;
+import org.fdkk.bim.bimEntity.dto.ProjectDTO;
+import org.fdkk.bim.bimEntity.dto.TranslateDTO;
+import org.fdkk.bim.bimEntity.vo.AccessTokenBean;
+import org.fdkk.bim.bimEntity.vo.DatabagDerivativeBean;
+import org.fdkk.bim.bimEntity.vo.FileBean;
+import org.fdkk.bim.bimEntity.vo.ProjectBean;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/21
+ */
+
+public interface BimCallBackClient {
+
+    @Post("{0}")
+    void postJson(String api, @JSONBody Object params);
+
+}

+ 108 - 0
src/main/java/org/fdkk/bim/client/BimFaceClient.java

@@ -0,0 +1,108 @@
+package org.fdkk.bim.client;
+
+import com.dtflys.forest.annotation.*;
+import org.fdkk.bim.Interceptor.BimFaceInterceptor;
+import org.fdkk.bim.bimEntity.dto.OfflineDatabagDTO;
+import org.fdkk.bim.bimEntity.dto.ProjectDTO;
+import org.fdkk.bim.bimEntity.dto.TranslateDTO;
+import org.fdkk.bim.bimEntity.vo.*;
+import org.fdkk.bim.bimEntity.BimResult;
+
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/21
+ */
+@BaseRequest(
+        baseURL = "https://api.bimface.com",
+        interceptor = {BimFaceInterceptor.class})
+public interface BimFaceClient {
+    @Post("/oauth2/token")
+    BimResult<AccessTokenBean> getToken(@Header("Authorization") String Authorization);
+
+    /**
+     * 获取文件状态
+     */
+    @Request(
+            url = "/bdfs/data/v1/projects/{projectId}/fileItems/status?fileItemId={fileItemId}",
+            type = "get"
+    )
+    BimResult<FileStatusBean> getFileStatusInfo(@Var("projectId")String projectId, @Var("fileItemId")String fileItemId);
+
+
+    /**
+     * 查询项目
+     */
+    @Request(
+            url = "/bdfs/domain/v1/hubs/10000000000020001/projects?name={name}",
+            type = "get"
+    )
+    BimResult<List<ProjectBean>> getProjectInfo(@Var("name")String name);
+
+
+    /**
+     * 创建项目
+     */
+    @Request(
+            url = "/bdfs/domain/v1/hubs/10000000000020001/projects",
+            type = "post"
+    )
+    BimResult<ProjectBean> saveProject(@JSONBody ProjectDTO projectDTO);
+
+    /**
+     * 发送File类型数据
+     */
+    @Request(
+            url = "/bdfs/data/v1/projects/{projectId}/fileItems/sourceUrl?url={url}&parentId={parentId}&name={name}&length={length}",
+            type = "post",
+            contentType = "application/octet-stream"
+    )
+    BimResult<FileBean> fileItems(   @Var("url")String url,
+                                  @Var("parentId")String parentId,
+                                  @Var("name")String name,
+                                  @Var("length")Long length ,
+                                  @Var("projectId") String projectId);
+
+
+    /**
+     * 发送translate转换文件请求
+     */
+    @Request(
+            url = "/translate",
+            type = "put"
+    )
+    BimResult<FileBean> translate(@JSONBody TranslateDTO translateDTO);
+
+
+    /**
+     * 获取translate转换文件的状态
+     */
+    @Request(
+            url = "/translate?fileId={fileId}",
+            type = "get"
+    )
+    BimResult<FileTranslateBean> getTranslateInfo( @Var("fileId")String fileId);
+    /**
+     * 通过文件ID创建离线数据包
+     */
+    @Request(
+            url = "files/{fileId}/offlineDatabag",
+            type = "put"
+    )
+    BimResult<DatabagDerivativeBean> offlineDatabag(@JSONBody OfflineDatabagDTO offlineDatabagDTO, @Var("fileId")Long fileId);
+    /**
+     * 查询单文件的离线数据包
+     */
+    @Request(
+            url = "files/{fileId}/offlineDatabag",
+            type = "get"
+    )
+    BimResult<List<DatabagDerivativeBean>> getOfflineDatabagInfo(@Var("fileId")String fileId);
+
+    @Request(
+            url = "data/databag/downloadUrl",
+            type = "get"
+    )
+    BimResult<String> offlineDatabagDownloadUrl(@Query("fileId") String fileId,@Query("type") String type);
+}

+ 36 - 0
src/main/java/org/fdkk/bim/config/BimConfig.java

@@ -0,0 +1,36 @@
+package org.fdkk.bim.config;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.vo.AccessTokenBean;
+import org.fdkk.bim.cache.RedisCache;
+import org.fdkk.bim.client.BimFaceClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/19
+ */
+@Component
+@ConfigurationProperties(prefix = "bim")
+@Data
+@Slf4j
+public class BimConfig {
+    public  String uploadPath;
+
+
+    public  String defaultFolder;
+
+
+    public  String webSite;
+
+
+}

+ 62 - 0
src/main/java/org/fdkk/bim/config/BimFaceConfig.java

@@ -0,0 +1,62 @@
+package org.fdkk.bim.config;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.ObjectUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.bimEntity.vo.AccessTokenBean;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.cache.RedisCache;
+import org.fdkk.bim.client.BimFaceClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/19
+ */
+@Component
+@ConfigurationProperties(prefix = "bimface")
+@Data
+@Slf4j
+public class BimFaceConfig {
+
+    @Autowired
+    BimFaceClient bimFaceClient;
+    @Autowired
+    RedisUtil cache;
+
+      /**
+       * APP证书
+       *
+       * @author bimface, 2017-03-01
+       */
+      // 通过(bimface.com)创建应用,并拿到自己的appKey和appSecret
+    public String appKey;
+
+    public String appSecret;
+
+    public String accessToken;
+
+    @PostConstruct
+    private void init(){
+       String Authorization = Base64.encode((appKey+":"+appSecret).getBytes());
+        if (cache.hasKey("bim:token")){
+            this.accessToken=cache.get("bim:token");
+        }else {
+            BimResult<AccessTokenBean> token = bimFaceClient.getToken("Basic " + Authorization);
+            if (ObjectUtil.isNotNull(token)&&token.getCode().equals("success")){
+                this.accessToken=token.getData().getToken();
+                log.info("token,-{}",token.getData());
+                cache.set("bim:token",token.getData().getToken(),TimeUnit.SECONDS.convert(6,TimeUnit.DAYS));
+            }
+        }
+
+    }
+
+}

+ 72 - 0
src/main/java/org/fdkk/bim/config/FastJson2JsonRedisSerializer.java

@@ -0,0 +1,72 @@
+package org.fdkk.bim.config;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.parser.ParserConfig;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import org.springframework.util.Assert;
+
+import java.nio.charset.Charset;
+
+/**
+ * Redis使用FastJson序列化
+ * 
+ * @author fdkk
+ */
+public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
+{
+    @SuppressWarnings("unused")
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
+
+    private Class<T> clazz;
+
+    static
+    {
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+    }
+
+    public FastJson2JsonRedisSerializer(Class<T> clazz)
+    {
+        super();
+        this.clazz = clazz;
+    }
+
+    @Override
+    public byte[] serialize(T t) throws SerializationException
+    {
+        if (t == null)
+        {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException
+    {
+        if (bytes == null || bytes.length <= 0)
+        {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+
+        return JSON.parseObject(str, clazz);
+    }
+
+    public void setObjectMapper(ObjectMapper objectMapper)
+    {
+        Assert.notNull(objectMapper, "'objectMapper' must not be null");
+        this.objectMapper = objectMapper;
+    }
+
+    protected JavaType getJavaType(Class<?> clazz)
+    {
+        return TypeFactory.defaultInstance().constructType(clazz);
+    }
+}

+ 19 - 0
src/main/java/org/fdkk/bim/config/FastJsonHttpMessageConverterEx.java

@@ -0,0 +1,19 @@
+package org.fdkk.bim.config;
+
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+
+/**
+ * @ClassName: FastJsonHttpMessageConverterEx
+ * @Description: TODO
+ * @author Xiewj
+ */
+public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter {
+
+    public FastJsonHttpMessageConverterEx() {
+    }
+
+    @Override
+    protected boolean supports(Class<?> clazz) {
+        return super.supports(clazz);
+    }
+}

+ 21 - 0
src/main/java/org/fdkk/bim/config/ForestFastjsonConverter.java

@@ -0,0 +1,21 @@
+package org.fdkk.bim.config;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.dtflys.forest.converter.json.ForestJsonConverter;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/27
+ */
+public class ForestFastjsonConverter {
+   @Bean
+   public ForestJsonConverter forestFastjsonConverter() {
+      com.dtflys.forest.converter.json.ForestFastjsonConverter converter = new com.dtflys.forest.converter.json.ForestFastjsonConverter();
+      // 设置日期格式
+      converter.setDateFormat("yyyy-MM-dd hh:mm:ss");
+      // 设置序列化特性
+      converter.setSerializerFeature(SerializerFeature.IgnoreErrorGetter);
+      return converter;
+   }
+}

+ 48 - 0
src/main/java/org/fdkk/bim/config/MyBatisPlusConfig.java

@@ -0,0 +1,48 @@
+package org.fdkk.bim.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@EnableTransactionManagement
+@MapperScan({"com.fdkk.**.mapper"})
+public class MyBatisPlusConfig {
+    /*
+     * 分页插件,自动识别数据库类型
+     * 多租户,请参考官网【插件扩展】
+     */
+    /**
+     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
+     */
+
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        //向Mybatis过滤器链中添加分页拦截器
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        //还可以添加其他的拦截器
+        // 阻断插件
+        interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
+        return interceptor;
+    }
+    @Bean
+    ConfigurationCustomizer mybatisConfigurationCustomizer() {
+        return configuration -> configuration.addInterceptor(new com.github.pagehelper.PageInterceptor());
+    }
+
+    /**
+     * 如果是对全表的删除或更新操作,就会终止该操作
+     * https://baomidou.com/guide/interceptor-block-attack.html
+     */
+    public BlockAttackInnerInterceptor blockAttackInnerInterceptor()
+    {
+        return new BlockAttackInnerInterceptor();
+    }
+}

+ 79 - 0
src/main/java/org/fdkk/bim/config/RedisConfig.java

@@ -0,0 +1,79 @@
+//package org.fdkk.bim.config;
+//
+//import com.fasterxml.jackson.annotation.JsonAutoDetect;
+//import com.fasterxml.jackson.annotation.JsonTypeInfo;
+//import com.fasterxml.jackson.annotation.PropertyAccessor;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+//import org.springframework.cache.annotation.CachingConfigurerSupport;
+//import org.springframework.cache.annotation.EnableCaching;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.data.redis.connection.RedisConnectionFactory;
+//import org.springframework.data.redis.core.RedisTemplate;
+//import org.springframework.data.redis.core.script.DefaultRedisScript;
+//import org.springframework.data.redis.serializer.StringRedisSerializer;
+//
+///**
+// * redis配置
+// *
+// * @author fdkk
+// */
+//@Configuration
+//@EnableCaching
+//public class RedisConfig extends CachingConfigurerSupport
+//{
+//    @Bean
+//    @SuppressWarnings(value = { "unchecked", "rawtypes" })
+//    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
+//    {
+//        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+//        template.setConnectionFactory(connectionFactory);
+//
+//        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
+//
+//        ObjectMapper mapper = new ObjectMapper();
+//        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+//        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
+//        serializer.setObjectMapper(mapper);
+//
+//        // 使用StringRedisSerializer来序列化和反序列化redis的key值
+//        template.setKeySerializer(new StringRedisSerializer());
+//        template.setValueSerializer(serializer);
+//
+//        // Hash的key也采用StringRedisSerializer的序列化方式
+//        template.setHashKeySerializer(new StringRedisSerializer());
+//        template.setHashValueSerializer(serializer);
+//
+//        template.afterPropertiesSet();
+//        return template;
+//    }
+//
+//    @Bean
+//    public DefaultRedisScript<Long> limitScript()
+//    {
+//        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
+//        redisScript.setScriptText(limitScriptText());
+//        redisScript.setResultType(Long.class);
+//        return redisScript;
+//    }
+//
+//    /**
+//     * 限流脚本
+//     */
+//    private String limitScriptText()
+//    {
+//        return "local key = KEYS[1]\n" +
+//                "local count = tonumber(ARGV[1])\n" +
+//                "local time = tonumber(ARGV[2])\n" +
+//                "local current = redis.call('get', key);\n" +
+//                "if current and tonumber(current) > count then\n" +
+//                "    return tonumber(current);\n" +
+//                "end\n" +
+//                "current = redis.call('incr', key)\n" +
+//                "if tonumber(current) == 1 then\n" +
+//                "    redis.call('expire', key, time)\n" +
+//                "end\n" +
+//                "return tonumber(current);";
+//    }
+//}

+ 90 - 0
src/main/java/org/fdkk/bim/config/ResourcesConfig.java

@@ -0,0 +1,90 @@
+package org.fdkk.bim.config;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 通用配置
+ *
+ * @author fdkk
+ */
+@Configuration
+public class ResourcesConfig implements WebMvcConfigurer {
+
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+        converters.add(fastJsonHttpMessageConverterEx());
+    }
+
+    @Bean
+    public FastJsonHttpMessageConverterEx fastJsonHttpMessageConverterEx() {
+        // 创建fastJson消息转换器
+        FastJsonHttpMessageConverterEx fastConverter = new FastJsonHttpMessageConverterEx();
+        List<MediaType> supportedMediaTypes = new ArrayList<>();
+        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
+        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
+        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
+        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
+        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
+        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
+        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
+        supportedMediaTypes.add(MediaType.APPLICATION_XML);
+        supportedMediaTypes.add(MediaType.IMAGE_GIF);
+        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
+        supportedMediaTypes.add(MediaType.IMAGE_PNG);
+        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
+        supportedMediaTypes.add(MediaType.TEXT_HTML);
+        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
+        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
+        supportedMediaTypes.add(MediaType.TEXT_XML);
+        fastConverter.setSupportedMediaTypes(supportedMediaTypes);
+        // 添加fastjson的配置信息 比如 :是否要格式化返回的json数据
+        FastJsonConfig fastJsonConfig = new FastJsonConfig();
+        // 在serializerFeatureList中添加转换规则
+        List<SerializerFeature> serializerFeatureList = new ArrayList<SerializerFeature>();
+        serializerFeatureList.add(SerializerFeature.WriteMapNullValue);
+        serializerFeatureList.add(SerializerFeature.WriteNullStringAsEmpty);
+        serializerFeatureList.add(SerializerFeature.WriteNullListAsEmpty);
+        serializerFeatureList.add(SerializerFeature.DisableCircularReferenceDetect);
+        SerializerFeature[] serializerFeatures = serializerFeatureList.toArray(new SerializerFeature[serializerFeatureList.size()]);
+        fastJsonConfig.setSerializerFeatures(serializerFeatures);
+        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        // 在转换器中添加配置信息
+        fastConverter.setFastJsonConfig(fastJsonConfig);
+        return fastConverter;
+    }
+
+
+
+    /**
+     * 跨域配置
+     */
+    @Bean
+    public CorsFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        CorsConfiguration config = new CorsConfiguration();
+        config.setAllowCredentials(true);
+        // 设置访问源地址
+        config.addAllowedOriginPattern("*");
+        // 设置访问源请求头
+        config.addAllowedHeader("*");
+        // 设置访问源请求方法
+        config.addAllowedMethod("*");
+        // 对接口配置跨域设置
+        source.registerCorsConfiguration("/**", config);
+        return new CorsFilter(source);
+    }
+}

+ 95 - 0
src/main/java/org/fdkk/bim/constant/HttpStatus.java

@@ -0,0 +1,95 @@
+package org.fdkk.bim.constant;
+
+/**
+ * 返回状态码
+ *
+ * @author fdkk
+ */
+public enum HttpStatus {
+
+    SUCCESS(200, "操作成功"),
+    CREATED(201, "对象创建成功"),
+    ACCEPTED(202, "请求已经被接受"),
+    NO_CONTENT(202, "操作已经执行成功,但是没有返回数据"),
+    MOVED_PERM(301, "请求已经被接受"),
+    SEE_OTHER(302, "重定向"),
+    NOT_MODIFIED(303, "资源没有被修改"),
+    SOLO_LOGIN(304, "检测到另一台设备已登录此账号"),
+    CLOCK_MOVED_BACKWARDS(305, "检测到本地时间已被更改,请重启予以生效"),
+
+    BAD_REQUEST(400, "参数列表错误(缺少,格式不匹配"),
+    UNAUTHORIZED(401, "未授权"),
+    TOKENINVALID(402, "访问受限,授权过期"),
+    FORBIDDEN(403, "访问受限,授权过期"),
+    NOT_FOUND(404, "资源,服务未找到"),
+    BAD_METHOD(405, "不允许的http方法"),
+    CONFLICT(406, "资源冲突,或者资源被锁"),
+    UNSUPPORTED_TYPE(415, "不支持的数据,媒体类型"),
+    ERROR(500, "系统内部错误"),
+    NOT_IMPLEMENTED(501, "接口未实现"),
+    e502(502, "上传的文件大小超出限制的文件大小!允许的文件最大大小是:%sGB!"),
+    e3001(3001, "对象不存在"),
+    e3002(3002, "特殊点表坐标异常"),
+    e3003(3003, "空目录"),
+    e3004(3004, "状态非法"),
+    e3005(3005, "数据集已重复合并"),
+    e3006(3006, "fdToken校验失败"),
+    e3007(3007, "查无此任务"),
+    e3008(3008, "任务失败"),
+    e3009(3009, "登录失败,请稍后再试"),
+    e3101(3101, "正在计算中"),
+
+    e3021(3021, "账号不存在,请核对后重新输入。"),
+    e3024(3024, "不能将场景协作给自己"),
+    e3100(3100, "上传文件非法"),
+    e4001(4001, "验证码返回"),
+    e4002(4002, "检测控制点坐标正在被修改,暂时无法操作"),
+    e4003(4003, "请输入正确地理坐标"),
+    e4004(4004, "场景校验失败"),
+    e4005(4005, "检测控制点坐标正在被修改,暂时无法操作"),
+    e4006(4006, "当前数据集正在被添加,请勿重复操作"),
+    e4007(4007, "数据集添加失败"),
+    e4008(4008, "检测到该数据集正在进行合并,暂时无法操作"),
+    e5027(5027, "文件夹不存在"),
+    e5028(5028, "无权修改该文件夹"),
+    e5030(5030, "同级文件夹名称不能重复"),
+    e6000(6000, "存在数据集"),
+    e6001(6001, "转换模型错误,场景查询不到"),
+    e6002(6002, "转换模型错误,控制点查询不到"),
+    e6003(6003, "转换模型错误,未设置控制点"),
+    e6004(6004, "场景大小超出限制,合并下载失败。"),
+    e6005(6004, "算法调用出错,下载文件未生成"),
+
+    e8001(8001, "恢复默认点云失败,没有找到对应点云数据"),
+    e8002(8002, "算法生成默认点云文件不存在"),
+
+    e6009(6009, "转换模型错误,未设置控制点"),
+    e7000(7000, "场景正在构建中,退出构建"),
+    e7001(7001, "场景构建失败"),
+    e7002(7002, "上传OBJ文件不存在"),
+
+    e7003(7003, "授权失败,不在时间范围内"),
+    e7004(7004, "授权码不可用或已过期"),
+
+    e7005(7005, "正在查询激活码请稍后再试"),
+    e7006(7006, "文件内容错误,缺少obj,或者mtl文件"),
+    e7007(7007, "文件类型错误"),
+    e7008(7008, "无法获取模型贴图,obj 文件名仅支持英文、数字。注意:本地修改文件名无效,请导出 obj 时修改。");
+
+    private final int code;
+    private final String msg;
+
+    HttpStatus(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+}

+ 98 - 0
src/main/java/org/fdkk/bim/controller/CallBackController.java

@@ -0,0 +1,98 @@
+package org.fdkk.bim.controller;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.base.BaseController;
+import org.fdkk.bim.base.Result;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.dto.OfflineDatabagDTO;
+import org.fdkk.bim.bimEntity.vo.DatabagDerivativeBean;
+import org.fdkk.bim.client.BimCallBackClient;
+import org.fdkk.bim.client.BimFaceClient;
+import org.fdkk.bim.config.BimConfig;
+import org.fdkk.bim.config.BimFaceConfig;
+import org.fdkk.bim.entity.dto.BimCallBackDTO;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.enums.BusinessStatus;
+import org.fdkk.bim.service.BimFaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@RestController
+@RequestMapping("/call")
+@Slf4j
+public class CallBackController extends BaseController {
+    @Resource
+    BimFaceConfig bimFaceConfig;
+    @Resource
+    BimCallBackClient bimCallBackClient;
+    @Resource
+    BimFaceService bimFaceService;
+    @Resource
+    BimConfig bimConfig;
+
+    @PostMapping("/callInfo")
+    public Result callInfo(@RequestBody BimCallBackDTO dto ) {
+        log.info("callInfo-{}",dto);
+        return success();
+    }
+
+
+    @GetMapping("/translate/{itemFileId}")
+    public Result translate(@PathVariable("itemFileId") int itemFileId,String status,String fileId,String nonce,String signature,String reason) {
+        //processing(进行中),success(完成),failed(失败)
+        log.info("call_back-itemFileId-:{},itemFileId-:{}, status-:{}, fileId-:{}, nonce-:{}, signature-:{} ,reason -:{}",
+                itemFileId,itemFileId, status, fileId, nonce, signature,reason);
+        BimFaceEntity bimFaceEntity = bimFaceService.getById(itemFileId);
+        if (ObjectUtil.isNotNull(bimFaceEntity)){
+            if (status.equalsIgnoreCase("success")) {
+                bimFaceEntity.setTranslateStatus(status);
+                bimFaceService.updateById(bimFaceEntity);
+                bimFaceService.offlineDatabag(bimFaceEntity);
+                bimFaceService.callBack(BusinessStatus.TRANSLATE,bimFaceEntity);
+            }else {
+                bimFaceEntity.setCallType(BusinessStatus.ERROR.getInfo());
+                bimFaceEntity.setTranslateStatus(status);
+                bimFaceService.updateById(bimFaceEntity);
+                bimFaceService.callBack(BusinessStatus.ERROR,bimFaceEntity);
+            }
+
+
+        }
+
+        return success();
+    }
+
+    @GetMapping("/offline/{itemFileId}")
+    public Result offline(@PathVariable("itemFileId") int itemFileId,String status,String fileId,String nonce,String signature,String reason) {
+        //processing(进行中),success(完成),failed(失败)
+        log.info("call_back-itemFileId-:{},itemFileId-:{}, status-:{}, fileId-:{}, nonce-:{}, signature-:{} ,reason -:{}",
+                itemFileId,itemFileId, status, fileId, nonce, signature,reason);
+        BimFaceEntity bimFaceEntity = bimFaceService.getById(itemFileId);
+        if (ObjectUtil.isNotNull(bimFaceEntity)){
+            if (status.equalsIgnoreCase("success")) {
+                bimFaceEntity.setOfflineStatus(status);
+                bimFaceService.callBack(BusinessStatus.OFFLINE,bimFaceEntity);
+                String s = bimFaceService.downloadOffline(fileId, bimFaceEntity.getProjectId());
+                bimFaceEntity.setOssUrl(s);
+                bimFaceEntity.setCallType(BusinessStatus.DONE.getInfo());
+                bimFaceService.updateById(bimFaceEntity);
+            }else {
+                bimFaceEntity.setCallType(BusinessStatus.ERROR.getInfo());
+                bimFaceEntity.setOfflineStatus(status);
+                bimFaceService.updateById(bimFaceEntity);
+                bimFaceService.callBack(BusinessStatus.ERROR,bimFaceEntity);
+            }
+
+        }
+
+        return success();
+    }
+}

+ 109 - 0
src/main/java/org/fdkk/bim/controller/FileController.java

@@ -0,0 +1,109 @@
+package org.fdkk.bim.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import org.fdkk.bim.base.BaseController;
+import org.fdkk.bim.base.Result;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.dto.*;
+import org.fdkk.bim.bimEntity.vo.DatabagDerivativeBean;
+import org.fdkk.bim.bimEntity.vo.FileBean;
+import org.fdkk.bim.client.BimFaceClient;
+import org.fdkk.bim.config.BimConfig;
+import org.fdkk.bim.config.BimFaceConfig;
+import org.fdkk.bim.entity.dto.BimUploadDTO;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.entity.vo.BimFaceVO;
+import org.fdkk.bim.service.BimFaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@RestController
+@RequestMapping("/file")
+public class FileController extends BaseController {
+    @Autowired
+    BimFaceConfig bimFaceConfig;
+    @Autowired
+    BimFaceClient bimFaceClient;
+    @Autowired
+    BimFaceService bimFaceService;
+
+    @Autowired
+    BimConfig bimConfig;
+
+    @PostMapping("/test")
+    public Result toUploadPage(){
+        return success(bimFaceConfig);
+    }
+
+    @GetMapping("/fileInfo/f/{fileId}")
+    public Result fileInfoByFileId(@PathVariable("fileId") String fileId) {
+        BimFaceEntity bimFaceEntity = bimFaceService.getByFiledId(fileId);
+        BimFaceVO bimFaceVO = new BimFaceVO();
+        BeanUtil.copyProperties(bimFaceEntity,bimFaceVO);
+        return success(bimFaceVO);
+    }
+    @GetMapping("/fileInfo/i/{id}")
+    public Result fileInfoById(@PathVariable("fileId") String id) {
+        BimFaceEntity bimFaceEntity = bimFaceService.getById(id);
+        BimFaceVO bimFaceVO = new BimFaceVO();
+        BeanUtil.copyProperties(bimFaceEntity,bimFaceVO);
+        return success(bimFaceVO);
+    }
+    @PostMapping("/upload")
+    public Result upload(@RequestPart(value="file") MultipartFile file,@RequestPart("dto") BimUploadDTO bimUploadDTO) throws IOException {BimFaceEntity bimFaceEntity = bimFaceService.uploadFile(file, bimUploadDTO);
+        BimFaceVO bimFaceVO = new BimFaceVO();
+        BeanUtil.copyProperties(bimFaceEntity,bimFaceVO);
+        return success(bimFaceVO);
+    }
+    @PostMapping("/translate/{fileId}")
+    public Result translate(@PathVariable("fileId") Long fileId) throws IOException {
+        TranslateDTO translateDTO=new TranslateDTO();
+        SourceDTO sourceDTO=new SourceDTO();
+        sourceDTO.setFileId(fileId);
+        sourceDTO.setCompressed(false);
+        sourceDTO.setRootName("AC20-FZK-Haus.ifc");
+        translateDTO.setSource(sourceDTO);
+        translateDTO.setCallback("http://d40g77q9pmap.ngrok.xiaomiqiu123.top/bim/call/translate/"+fileId);
+        Map<String, Object> config=new HashMap<>();
+        config.put("toBimtiles",true);
+        translateDTO.setConfig(config);
+        BimResult<FileBean> translate = bimFaceClient.translate(translateDTO);
+        return success(translate);
+    }
+
+    @PostMapping("/offlineDatabag/{fileId}")
+    public Result offlineDatabag(@PathVariable("fileId") Long fileId) throws IOException {
+        OfflineDatabagDTO offlineDatabagDTO=new OfflineDatabagDTO();
+        offlineDatabagDTO.setCallback("http://d40g77q9pmap.ngrok.xiaomiqiu123.top/bim/call/translate/"+fileId);
+        BimResult<DatabagDerivativeBean> offlineDatabag = bimFaceClient.offlineDatabag(offlineDatabagDTO,fileId);
+        return success(offlineDatabag);
+    }
+    @PostMapping("/getOfflineDatabag/{fileId}")
+    public Result getOfflineDatabag(@PathVariable("fileId") String fileId) throws IOException {
+        BimResult<List<DatabagDerivativeBean>> offlineDatabag = bimFaceClient.getOfflineDatabagInfo(fileId);
+        return success(offlineDatabag);
+    }
+
+    @PostMapping("/downloadUrl/{fileId}")
+    public Result downloadUrl(@PathVariable("fileId") String fileId) throws IOException {
+        DatabagDownloadDTO databagDownloadDTO=new DatabagDownloadDTO();
+        databagDownloadDTO.setFileId(fileId);
+        BimResult<String> downloadUrl = bimFaceClient.offlineDatabagDownloadUrl(fileId,"offline");
+        if (StrUtil.isNotBlank(downloadUrl.getData())){
+            long l = HttpUtil.downloadFile(downloadUrl.getData(), bimConfig.getUploadPath()+fileId+".zip");
+        }
+        return success(downloadUrl);
+    }
+}

+ 48 - 0
src/main/java/org/fdkk/bim/controller/TestController.java

@@ -0,0 +1,48 @@
+package org.fdkk.bim.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.base.BaseController;
+import org.fdkk.bim.base.Result;
+import org.fdkk.bim.client.BimCallBackClient;
+import org.fdkk.bim.client.BimFaceClient;
+import org.fdkk.bim.config.BimFaceConfig;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.service.BimFaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/26
+ */
+@RestController
+@RequestMapping("/test")
+@Slf4j
+public class TestController extends BaseController {
+
+    @Autowired
+    BimFaceService bimFaceService;
+
+    @Resource
+    BimCallBackClient bimCallBackClient;
+
+
+    @PostMapping("/save")
+    public Result translate() {
+        BimFaceEntity bimFaceEntity=new BimFaceEntity();
+        bimFaceEntity.setTask("bimFaceEntity");
+        bimFaceService.save(bimFaceEntity);
+        return success();
+    }
+
+    @PostMapping("/send")
+    public Result send() {
+        BimFaceEntity bimFaceEntity=new BimFaceEntity();
+        bimFaceEntity.setTask("bimFaceEntity");
+        return success();
+    }
+
+
+}

+ 29 - 0
src/main/java/org/fdkk/bim/entity/dto/BimCallBackDTO.java

@@ -0,0 +1,29 @@
+package org.fdkk.bim.entity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Data
+public class BimCallBackDTO {
+
+   /***
+    * bim服务主键
+    */
+   private Integer itemId;
+   /***
+    * 文件id
+    */
+   private String fileId;
+   /***
+    * 业务字段id
+    */
+   private String task;
+   /***
+    * 业务类型
+    */
+   private String callType;
+
+}

+ 19 - 0
src/main/java/org/fdkk/bim/entity/dto/BimFaceBaseDTO.java

@@ -0,0 +1,19 @@
+package org.fdkk.bim.entity.dto;
+
+import lombok.Data;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Data
+public class BimFaceBaseDTO {
+   private String task;
+
+   private String callBack;
+
+   private String projectName;
+
+   private String source;
+
+}

+ 8 - 0
src/main/java/org/fdkk/bim/entity/dto/BimUploadDTO.java

@@ -0,0 +1,8 @@
+package org.fdkk.bim.entity.dto;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+public class BimUploadDTO extends  BimFaceBaseDTO{
+}

+ 45 - 0
src/main/java/org/fdkk/bim/entity/po/BimFaceEntity.java

@@ -0,0 +1,45 @@
+package org.fdkk.bim.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.fdkk.bim.base.BaseEntity;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Data
+@TableName("t_bim_face")
+public class BimFaceEntity extends BaseEntity {
+
+    private String task;
+
+    private String fileUrl;
+
+    private String callBack;
+
+    private String projectId;
+
+    private String projectName;
+
+    private String fileId;
+
+    private String fileName;
+
+    private String uploadStatus;
+
+    private String translateStatus;
+
+    private String offlineStatus;
+
+    /***
+     * 1.上传,2,转换,3生成离线包 4,完成
+     */
+    private String callType;
+
+    private String ossUrl;
+
+    private String  source;
+}

+ 50 - 0
src/main/java/org/fdkk/bim/entity/vo/BimFaceVO.java

@@ -0,0 +1,50 @@
+package org.fdkk.bim.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/11
+ */
+@Data
+public class BimFaceVO {
+
+   private Integer id;
+
+   private String task;
+
+   private String fileUrl;
+
+   private String projectId;
+
+   private String projectName;
+
+   private String fileId;
+
+   private String fileName;
+
+   private String uploadStatus;
+
+   private String translateStatus;
+
+   private String offlineStatus;
+
+   /***
+    *     ERROR(-1, "ERROR") 错误, DONE(0, "DONE") 完成,UPLOAD(1, "UPLOAD") 上传, TRANSLATE(2, "TRANSLATE") 转换, OFFLINE(3, "OFFLINE") 离线包生成;
+    */
+   private String callType;
+
+   private String ossUrl;
+
+   private String  source;
+
+   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+   @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//set
+   private Date createTime;
+}

+ 31 - 0
src/main/java/org/fdkk/bim/enums/BusinessStatus.java

@@ -0,0 +1,31 @@
+package org.fdkk.bim.enums;
+
+/**
+ * 操作状态
+ *
+ * @author fdkk
+ *
+ */
+public enum BusinessStatus
+{
+    ERROR(-1, "ERROR"), DONE(0, "DONE"),UPLOAD(1, "UPLOAD"), TRANSLATE(2, "TRANSLATE"), OFFLINE(3, "OFFLINE");
+
+    private final Integer code;
+    private final String info;
+
+    BusinessStatus(Integer code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}

+ 58 - 0
src/main/java/org/fdkk/bim/exception/GlobalException.java

@@ -0,0 +1,58 @@
+package org.fdkk.bim.exception;
+
+/**
+ * 全局异常
+ * 
+ * @author fdkk
+ */
+public class GlobalException extends RuntimeException
+{
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     *
+     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+     */
+    private String detailMessage;
+
+    /**
+     * 空构造方法,避免反序列化问题
+     */
+    public GlobalException()
+    {
+    }
+
+    public GlobalException(String message)
+    {
+        this.message = message;
+    }
+
+    public String getDetailMessage()
+    {
+        return detailMessage;
+    }
+
+    public GlobalException setDetailMessage(String detailMessage)
+    {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public GlobalException setMessage(String message)
+    {
+        this.message = message;
+        return this;
+    }
+}

+ 72 - 0
src/main/java/org/fdkk/bim/exception/ServiceException.java

@@ -0,0 +1,72 @@
+package org.fdkk.bim.exception;
+
+import org.fdkk.bim.constant.HttpStatus;
+
+/**
+ * 业务异常
+ *
+ * @author fdkk
+ */
+public final class ServiceException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    private Integer code;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    /**
+     * 错误明细,内部调试错误
+     * <p>
+     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
+     */
+    private String detailMessage;
+
+    /**
+     * 空构造方法,避免反序列化问题
+     */
+    public ServiceException() {
+    }
+
+    public ServiceException(String message) {
+        this.message = message;
+    }
+
+    public ServiceException(String message, Integer code) {
+        this.message = message;
+        this.code = code;
+    }
+
+    public ServiceException(HttpStatus httpStatus) {
+        message = httpStatus.getMsg();
+        code = httpStatus.getCode();
+    }
+
+    public String getDetailMessage() {
+        return detailMessage;
+    }
+
+    @Override
+    public String getMessage() {
+        return message;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public ServiceException setMessage(String message) {
+        this.message = message;
+        return this;
+    }
+
+    public ServiceException setDetailMessage(String detailMessage) {
+        this.detailMessage = detailMessage;
+        return this;
+    }
+}

+ 26 - 0
src/main/java/org/fdkk/bim/exception/UtilException.java

@@ -0,0 +1,26 @@
+package org.fdkk.bim.exception;
+
+/**
+ * 工具类异常
+ * 
+ * @author fdkk
+ */
+public class UtilException extends RuntimeException
+{
+    private static final long serialVersionUID = 8247610319171014183L;
+
+    public UtilException(Throwable e)
+    {
+        super(e.getMessage(), e);
+    }
+
+    public UtilException(String message)
+    {
+        super(message);
+    }
+
+    public UtilException(String message, Throwable throwable)
+    {
+        super(message, throwable);
+    }
+}

+ 98 - 0
src/main/java/org/fdkk/bim/exception/base/BaseException.java

@@ -0,0 +1,98 @@
+package org.fdkk.bim.exception.base;
+
+
+import cn.hutool.core.util.StrUtil;
+import org.fdkk.bim.util.MessageUtils;
+
+/**
+ * 基础异常
+ *
+ * @author fdkk
+ */
+public class BaseException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 所属模块
+     */
+    private String module;
+
+    /**
+     * 错误码
+     */
+    private String code;
+
+    /**
+     * 错误码对应的参数
+     */
+    private Object[] args;
+
+    /**
+     * 错误消息
+     */
+    private String defaultMessage;
+
+    public BaseException(String module, String code, Object[] args, String defaultMessage)
+    {
+        this.module = module;
+        this.code = code;
+        this.args = args;
+        this.defaultMessage = defaultMessage;
+    }
+
+    public BaseException(String module, String code, Object[] args)
+    {
+        this(module, code, args, null);
+    }
+
+    public BaseException(String module, String defaultMessage)
+    {
+        this(module, null, null, defaultMessage);
+    }
+
+    public BaseException(String code, Object[] args)
+    {
+        this(null, code, args, null);
+    }
+
+    public BaseException(String defaultMessage)
+    {
+        this(null, null, null, defaultMessage);
+    }
+
+    @Override
+    public String getMessage()
+    {
+        String message = null;
+        if (!StrUtil.isEmpty(code))
+        {
+            message = MessageUtils.message(code, args);
+        }
+        if (message == null)
+        {
+            message = defaultMessage;
+        }
+        return message;
+    }
+
+    public String getModule()
+    {
+        return module;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public Object[] getArgs()
+    {
+        return args;
+    }
+
+    public String getDefaultMessage()
+    {
+        return defaultMessage;
+    }
+}

+ 19 - 0
src/main/java/org/fdkk/bim/exception/file/FileException.java

@@ -0,0 +1,19 @@
+package org.fdkk.bim.exception.file;
+
+import org.fdkk.bim.exception.base.BaseException;
+
+/**
+ * 文件信息异常类
+ *
+ * @author fdkk
+ */
+public class FileException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileException(String code, Object[] args)
+    {
+        super("file", code, args, null);
+    }
+
+}

+ 16 - 0
src/main/java/org/fdkk/bim/exception/file/FileNameLengthLimitExceededException.java

@@ -0,0 +1,16 @@
+package org.fdkk.bim.exception.file;
+
+/**
+ * 文件名称超长限制异常类
+ *
+ * @author fdkk
+ */
+public class FileNameLengthLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileNameLengthLimitExceededException(int defaultFileNameLength)
+    {
+        super("upload.filename.exceed.length", new Object[] { defaultFileNameLength });
+    }
+}

+ 16 - 0
src/main/java/org/fdkk/bim/exception/file/FileSizeLimitExceededException.java

@@ -0,0 +1,16 @@
+package org.fdkk.bim.exception.file;
+
+/**
+ * 文件名大小限制异常类
+ *
+ * @author fdkk
+ */
+public class FileSizeLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileSizeLimitExceededException(long defaultMaxSize)
+    {
+        super("upload.exceed.maxSize", new Object[] { defaultMaxSize });
+    }
+}

+ 82 - 0
src/main/java/org/fdkk/bim/exception/file/InvalidExtensionException.java

@@ -0,0 +1,82 @@
+package org.fdkk.bim.exception.file;
+
+import org.apache.commons.fileupload.FileUploadException;
+
+import java.util.Arrays;
+
+/**
+ * 文件上传 误异常类
+ *
+ * @author fdkk
+ */
+public class InvalidExtensionException extends FileUploadException
+{
+    private static final long serialVersionUID = 1L;
+
+    private String[] allowedExtension;
+    private String extension;
+    private String filename;
+
+    public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
+    {
+        super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
+        this.allowedExtension = allowedExtension;
+        this.extension = extension;
+        this.filename = filename;
+    }
+
+    public String[] getAllowedExtension()
+    {
+        return allowedExtension;
+    }
+
+    public String getExtension()
+    {
+        return extension;
+    }
+
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    public static class InvalidImageExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidFlashExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidMediaExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidVideoExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+}

+ 30 - 0
src/main/java/org/fdkk/bim/handler/MyMetaObjectHandler.java

@@ -0,0 +1,30 @@
+package org.fdkk.bim.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * @description: 处理createTime,updateTime字段的插入和更新
+ * @author: Xiewj
+ * @date: 2021-08-16 15:32:55
+ **/
+@Slf4j
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        // 起始版本 3.3.3(推荐)
+        this.strictInsertFill(metaObject, "createTime", () -> new Date(), Date.class);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        // 起始版本 3.3.3(推荐)
+        this.strictUpdateFill(metaObject, "updateTime", () ->new Date(), Date.class);
+    }
+}

+ 15 - 0
src/main/java/org/fdkk/bim/mapper/BimFaceMapper.java

@@ -0,0 +1,15 @@
+package org.fdkk.bim.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Mapper
+@Component("BimFaceMapper")
+public interface BimFaceMapper extends BaseMapper<BimFaceEntity> {
+}

+ 37 - 0
src/main/java/org/fdkk/bim/service/BimFaceService.java

@@ -0,0 +1,37 @@
+package org.fdkk.bim.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.fdkk.bim.entity.dto.BimUploadDTO;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.enums.BusinessStatus;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+public interface BimFaceService extends IService<BimFaceEntity> {
+
+    BimFaceEntity getByFiledId(String fileId);
+
+
+
+    List<BimFaceEntity> getByUploadStatus(String status);
+    List<BimFaceEntity> getByTranslateStatus(String status);
+    List<BimFaceEntity> getByOfflineStatus(String status);
+
+    List<BimFaceEntity> getByCallType(String condition ,String... callType);
+
+    BimFaceEntity uploadFile(MultipartFile file, BimUploadDTO bimUploadDTO) throws IOException;
+
+    void translate(BimFaceEntity bimFaceEntity);
+
+    void offlineDatabag(BimFaceEntity bimFaceEntity);
+
+    void callBack(BusinessStatus upload, BimFaceEntity bimFaceEntity);
+
+    String downloadOffline(String fileId,String projectId);
+}

+ 205 - 0
src/main/java/org/fdkk/bim/service/impl/BimFaceServiceImpl.java

@@ -0,0 +1,205 @@
+package org.fdkk.bim.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.dto.*;
+import org.fdkk.bim.bimEntity.vo.DatabagDerivativeBean;
+import org.fdkk.bim.bimEntity.vo.FileBean;
+import org.fdkk.bim.bimEntity.vo.ProjectBean;
+import org.fdkk.bim.client.BimCallBackClient;
+import org.fdkk.bim.client.BimFaceClient;
+import org.fdkk.bim.config.BimConfig;
+import org.fdkk.bim.entity.dto.BimCallBackDTO;
+import org.fdkk.bim.entity.dto.BimUploadDTO;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.enums.BusinessStatus;
+import org.fdkk.bim.mapper.BimFaceMapper;
+import org.fdkk.bim.service.BimFaceService;
+import org.fdkk.bim.util.BimZipUtil;
+import org.fdkk.bim.util.FileUploadUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/9
+ */
+@Slf4j
+@Service
+public class BimFaceServiceImpl extends ServiceImpl<BimFaceMapper, BimFaceEntity> implements BimFaceService {
+
+    @Resource
+    BimFaceClient bimFaceClient;
+
+    @Resource
+    FYunFileServiceInterface ossFileService;
+
+    @Resource
+    BimCallBackClient bimCallBackClient;
+
+    @Autowired
+    BimConfig bimConfig;
+
+
+    @Override
+    public List<BimFaceEntity> getByUploadStatus(String status) {
+        LambdaQueryWrapper<BimFaceEntity> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(BimFaceEntity::getUploadStatus,status);
+        return list(wrapper);
+    }
+
+    @Override
+    public List<BimFaceEntity> getByTranslateStatus(String status) {
+        LambdaQueryWrapper<BimFaceEntity> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(BimFaceEntity::getTranslateStatus,status);
+        return list(wrapper);
+    }
+
+    @Override
+    public List<BimFaceEntity> getByOfflineStatus(String status) {
+        LambdaQueryWrapper<BimFaceEntity> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(BimFaceEntity::getOfflineStatus,status);
+        return list(wrapper);
+    }
+
+    @Override
+    public List<BimFaceEntity> getByCallType(String condition ,String... callType) {
+        LambdaQueryWrapper<BimFaceEntity> wrapper = Wrappers.lambdaQuery();
+        switch (condition){
+            case "eq":
+                wrapper.eq(BimFaceEntity::getCallType,callType);
+                break;
+            case "ne":
+                wrapper.notIn(BimFaceEntity::getCallType,callType);
+                break;
+        }
+        return list(wrapper);
+    }
+
+    @Override
+    public BimFaceEntity getByFiledId(String fileId) {
+        LambdaQueryWrapper<BimFaceEntity> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(BimFaceEntity::getFileId,fileId);
+        return getOne(wrapper);
+    }
+
+    @Override
+    public BimFaceEntity uploadFile(MultipartFile file, BimUploadDTO bimUploadDTO) throws IOException {
+        BimResult<List<ProjectBean>> projectInfo = bimFaceClient.getProjectInfo(bimUploadDTO.getProjectName());
+        String projectId="";
+        if (projectInfo.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(projectInfo.getData())&& projectInfo.getData().size()>0){
+            for (ProjectBean datum : projectInfo.getData()) {
+                if (datum.getName().equals(bimUploadDTO.getProjectName())){
+                    projectId=datum.getId();
+                    break;
+                }
+            }
+        }else {
+            ProjectDTO projectDTO=new ProjectDTO();
+            projectDTO.setName(bimUploadDTO.getProjectName());
+            BimResult<ProjectBean> fileBeanBimResult = bimFaceClient.saveProject(projectDTO);
+            if (fileBeanBimResult.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(fileBeanBimResult.getData())) {
+            projectId=fileBeanBimResult.getData().getId();
+            }
+        }
+        File absFile = FileUploadUtils.uploadAbsPath(bimConfig.getUploadPath(), file);
+        String ossUrl = ossFileService.uploadFile(absFile.getAbsolutePath(), bimConfig.getDefaultFolder() + "/project/"+projectId +"/upload/"+ absFile.getName());
+        absFile.delete();
+
+        BimResult<FileBean> fileBeanBimResult = bimFaceClient.fileItems(ossUrl,projectId,file.getOriginalFilename(), FileUtil.size(absFile), projectId);
+        if (fileBeanBimResult.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(fileBeanBimResult.getData())) {
+            BimFaceEntity bimFaceEntity = new BimFaceEntity();
+            bimFaceEntity.setTask(bimUploadDTO.getTask());
+            bimFaceEntity.setFileUrl(ossUrl);
+            bimFaceEntity.setProjectId(projectId);
+            bimFaceEntity.setCallBack(bimUploadDTO.getCallBack());
+            bimFaceEntity.setProjectName(bimUploadDTO.getProjectName());
+            bimFaceEntity.setFileId(fileBeanBimResult.getData().getId());
+            bimFaceEntity.setFileName(fileBeanBimResult.getData().getName());
+            bimFaceEntity.setUploadStatus(fileBeanBimResult.getData().getStatus());
+            bimFaceEntity.setCallType(BusinessStatus.UPLOAD.getInfo());
+            bimFaceEntity.setSource(bimUploadDTO.getSource());
+            save(bimFaceEntity);
+            return bimFaceEntity;
+//            if (save&& fileBeanBimResult.getCode().equalsIgnoreCase("success")){
+//                rabbitSenderTemplate.sender(RabbitQueue.BIM_TOPIC,RabbitQueue.UPLOAD_QUEUE,bimFaceEntity);
+//            }
+        }
+        return null;
+    }
+
+    @Override
+    public void translate(BimFaceEntity bimFaceEntity) {
+        SourceDTO sourceDTO=new SourceDTO();
+        sourceDTO.setFileId(Long.valueOf(bimFaceEntity.getFileId()));
+        sourceDTO.setCompressed(false);
+        sourceDTO.setRootName(bimFaceEntity.getFileName());
+        TranslateDTO translateDTO=new TranslateDTO();
+        translateDTO.setSource(sourceDTO);
+        translateDTO.setCallback(bimConfig.getWebSite()+"/bim/call/translate/"+bimFaceEntity.getId());
+        Map<String, Object> config=new HashMap<>();
+        config.put("toBimtiles",true);
+        translateDTO.setConfig(config);
+        BimResult<FileBean> translate = bimFaceClient.translate(translateDTO);
+        if (translate.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(translate.getData())) {
+            bimFaceEntity.setCallType(BusinessStatus.TRANSLATE.getInfo());
+            bimFaceEntity.setTranslateStatus(translate.getData().getStatus());
+            boolean b = updateById(bimFaceEntity);
+        }
+    }
+
+
+    @Override
+    public void offlineDatabag(BimFaceEntity bimFaceEntity) {
+        OfflineDatabagDTO offlineDatabagDTO=new OfflineDatabagDTO();
+        offlineDatabagDTO.setCallback(bimConfig.getWebSite()+"/bim/call/offline/"+bimFaceEntity.getId());
+        BimResult<DatabagDerivativeBean> offlineDatabag = bimFaceClient.offlineDatabag(offlineDatabagDTO,Long.valueOf(bimFaceEntity.getFileId()));
+        if (offlineDatabag.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(offlineDatabag.getData())) {
+            bimFaceEntity.setOfflineStatus(offlineDatabag.getData().getStatus());
+            bimFaceEntity.setCallType(BusinessStatus.OFFLINE.getInfo());
+            boolean b = updateById(bimFaceEntity);
+        }
+    }
+
+
+    @Override
+    public void callBack(BusinessStatus upload, BimFaceEntity bimFaceEntity) {
+        if (StrUtil.isNotEmpty(bimFaceEntity.getCallBack())){
+            log.info("进入回调-{}",bimFaceEntity.getCallBack());
+            BimCallBackDTO callBackDTO=new BimCallBackDTO();
+            callBackDTO.setTask(bimFaceEntity.getTask());
+            callBackDTO.setItemId(bimFaceEntity.getId());
+            callBackDTO.setFileId(bimFaceEntity.getFileId());
+            callBackDTO.setCallType(upload.getInfo());
+            bimCallBackClient.postJson(bimFaceEntity.getCallBack(),callBackDTO);
+        }
+    }
+
+    @Override
+    public String downloadOffline(String fileId,String projectId) {
+        BimResult<String> downloadUrl = bimFaceClient.offlineDatabagDownloadUrl(fileId,"offline");
+        if (downloadUrl.getCode().equalsIgnoreCase("success")&& ObjectUtil.isNotNull(downloadUrl.getData())) {
+            String  downloadPath=bimConfig.getUploadPath()+fileId+".zip";
+            long l = HttpUtil.downloadFile(downloadUrl.getData(), downloadPath);
+             return BimZipUtil.UploadDataZip(downloadPath,projectId);
+        }else {
+             return downloadUrl.getCode()+"|"+downloadUrl.getMessage();
+        }
+    }
+}

+ 112 - 0
src/main/java/org/fdkk/bim/task/task.java

@@ -0,0 +1,112 @@
+package org.fdkk.bim.task;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.bimEntity.BimResult;
+import org.fdkk.bim.bimEntity.vo.DatabagDerivativeBean;
+import org.fdkk.bim.bimEntity.vo.FileStatusBean;
+import org.fdkk.bim.bimEntity.vo.FileTranslateBean;
+import org.fdkk.bim.client.BimFaceClient;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.fdkk.bim.enums.BusinessStatus;
+import org.fdkk.bim.service.BimFaceService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2022/10/11
+ */
+@Component
+@Slf4j
+public class task {
+   @Resource
+   BimFaceService bimFaceService;
+    @Resource
+    BimFaceClient bimFaceClient;
+
+   @Scheduled(initialDelay=10*1000, fixedDelay=1000*30)
+   public void handleFileTask(){
+      //检查上传是否完成
+      List<BimFaceEntity> faceEntities = bimFaceService.getByCallType("ne", "done","error");
+      for (BimFaceEntity bimFace : faceEntities) {
+          if (bimFace.getCallType().equals(BusinessStatus.UPLOAD.getInfo())){
+              log.info("开始检查上传状态ID:{}",bimFace.getId());
+              BimResult<FileStatusBean> fileStatusInfo = bimFaceClient.getFileStatusInfo(bimFace.getProjectId(), bimFace.getFileId());
+              log.info("检查上传状态返回:{}",fileStatusInfo);
+              if (fileStatusInfo.getCode().equalsIgnoreCase("success")
+                      && ObjectUtil.isNotNull(fileStatusInfo.getData()) ) {
+                  if (fileStatusInfo.getData().getStatus().equalsIgnoreCase("success")){
+                      bimFace.setUploadStatus(fileStatusInfo.getData().getStatus());
+                      bimFace.setCallType(BusinessStatus.TRANSLATE.getInfo());
+                      bimFaceService.updateById(bimFace);
+                      bimFaceService.callBack(BusinessStatus.UPLOAD,bimFace);
+//                      bimFaceService.translate(bimFace);
+                  } else if (fileStatusInfo.getData().getStatus().equalsIgnoreCase("failed")) {
+                      bimFace.setCallType(BusinessStatus.ERROR.getInfo());
+                      bimFace.setUploadStatus(fileStatusInfo.getData().getStatus());
+                      bimFaceService.updateById(bimFace);
+                      bimFaceService.callBack(BusinessStatus.ERROR,bimFace);
+                  }
+                  break;
+              }
+
+          }
+
+          if (bimFace.getCallType().equals(BusinessStatus.TRANSLATE.getInfo())){
+              log.info("开始检查转换状态ID:{}",bimFace.getId());
+              BimResult<FileTranslateBean> translateInfo = bimFaceClient.getTranslateInfo(bimFace.getFileId());
+              log.info("检查转换状态返回:{}",translateInfo);
+              if (translateInfo.getCode().equalsIgnoreCase("success")
+                      && ObjectUtil.isNotNull(translateInfo.getData()) ) {
+                  if (translateInfo.getData().getStatus().equalsIgnoreCase("success")) {
+                      bimFace.setTranslateStatus(translateInfo.getData().getStatus());
+                      bimFace.setCallType(BusinessStatus.OFFLINE.getInfo());
+                      bimFaceService.updateById(bimFace);
+                      bimFaceService.callBack(BusinessStatus.TRANSLATE,bimFace);
+//                      bimFaceService.offlineDatabag(bimFace);
+                  } else if (translateInfo.getData().getStatus().equalsIgnoreCase("failed")) {
+                      bimFace.setCallType(BusinessStatus.ERROR.getInfo());
+                      bimFace.setTranslateStatus(translateInfo.getData().getStatus());
+                      bimFaceService.updateById(bimFace);
+                      bimFaceService.callBack(BusinessStatus.ERROR,bimFace);
+
+                  }
+                  break;
+              }
+          }
+
+          if (bimFace.getCallType().equals(BusinessStatus.OFFLINE.getInfo())){
+              log.info("开始检查生成离线包状态ID:{}",bimFace.getId());
+              BimResult<List<DatabagDerivativeBean>> offlineDatabag = bimFaceClient.getOfflineDatabagInfo(bimFace.getFileId());
+              log.info("检查离线包状态返回:{}",offlineDatabag);
+              if (offlineDatabag.getCode().equalsIgnoreCase("success")
+                      && ObjectUtil.isNotNull(offlineDatabag.getData()) ) {
+                  for (DatabagDerivativeBean datum : offlineDatabag.getData()) {
+                      if (datum.getStatus().equalsIgnoreCase("success")){
+                          bimFace.setOfflineStatus(datum.getStatus());
+                          bimFace.setCallType(BusinessStatus.DONE.getInfo());
+                          bimFaceService.callBack(BusinessStatus.OFFLINE,bimFace);
+                          String s = bimFaceService.downloadOffline(bimFace.getFileId(), bimFace.getProjectId());
+                          bimFace.setOssUrl(s);
+                          bimFaceService.updateById(bimFace);
+                          bimFaceService.callBack(BusinessStatus.DONE,bimFace);
+                      } else if (datum.getStatus().equalsIgnoreCase("failed")) {
+                          bimFace.setCallType(BusinessStatus.ERROR.getInfo());
+                          bimFace.setOfflineStatus(datum.getStatus());
+                          bimFaceService.updateById(bimFace);
+                          bimFaceService.callBack(BusinessStatus.ERROR,bimFace);
+                      }
+                      break;
+                  }
+              }
+
+          }
+
+      }
+
+   }
+}

+ 100 - 0
src/main/java/org/fdkk/bim/util/BimZipUtil.java

@@ -0,0 +1,100 @@
+package org.fdkk.bim.util;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.ZipUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.aliyun.oss.internal.OSSUtils;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.config.BimConfig;
+import org.fdkk.bim.entity.po.BimFaceEntity;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+/**
+ * @author Xiewj
+ * @date 2022/9/27
+ */
+@Slf4j
+public class BimZipUtil {
+
+    public static String UploadDataZip(String path,String projectId)  {
+        FYunFileServiceInterface ossFileService = SpringUtil.getBean(FYunFileServiceInterface.class);
+        BimConfig bimConfig = SpringUtil.getBean(BimConfig.class);
+        FYunFileConfig fYunFileConfig = SpringUtil.getBean(FYunFileConfig.class);
+        File unzip = ZipUtil.unzip(path);
+        String[] ossUrl = {""};
+        FileUtil.walkFiles(unzip, file -> {
+            String replace = file.getAbsolutePath().replace(unzip.getAbsolutePath(), "").replace("\\","/");
+            String remoteFilePath=bimConfig.getDefaultFolder() + "/project/" + projectId + replace;
+            if (FileUtil.getSuffix(file).equals("gz")){
+                Map<String, String> header=new HashMap<>();
+                header.put("Content-Type","application/gzip");
+                header.put("Content-Encoding","gzip");
+                ossFileService.uploadFile(file.getAbsolutePath(), remoteFilePath,header);
+                log.info("gz/" + projectId + replace);
+            }else {
+                ossFileService.uploadFile(file.getAbsolutePath(), remoteFilePath);
+                log.info("/" + projectId + replace);
+
+            }
+            if (StrUtil.isEmpty(ossUrl[0])&&file.getName().equals("index.html")){
+                ossUrl[0] =remoteFilePath.replace("index.html","");
+            } else if (StrUtil.isEmpty(ossUrl[0])&&file.getName().equals("viewToken.json")) {
+                ossUrl[0] =remoteFilePath.replace("viewToken.json","");
+            }
+        });
+
+        return fYunFileConfig.getHost().concat(ossUrl[0]);
+    }
+
+//   public  static String handDataZip(String path) throws IOException, InterruptedException {
+//      File unzip = ZipUtil.unzip(path);
+//      File[] ls = FileUtil.ls(unzip.getAbsolutePath());
+//      for (File l : ls) {
+//          if (FileUtil.isDirectory(l)){
+//                File[] LSS = FileUtil.ls(l.getParent());
+//                for (File lss : LSS) {
+//                   System.out.println(lss.getAbsolutePath());
+//                   if (lss.getName().equals("index.html")){
+//                       Document document = Jsoup.parse(lss,"UTF-8");
+//                       Elements elements1 = document.selectXpath("/html/head/script[1]").attr("src","https://4dkankan.oss-cn-shenzhen.aliyuncs.com/bim/jssdk/BimfaceSDKLoader%40latest-release.js");
+//                       Elements elements2 = document.selectXpath("/html/head/script[2]").attr("src","https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.1.min.js");
+//                       String jssdk = document.selectXpath("/html/body/script").get(0).html().replace("./jssdk", "../../jssdk");
+//                       document.selectXpath("/html/body/script").get(0).html(jssdk);
+//                       log.info("elements1,{}",elements1);
+//                       log.info("elements2,{}",elements2);
+//                       log.info("elements,{}",document.html());
+//                       String absolutePath = lss.getAbsolutePath();
+//                       lss.delete();
+//                       Thread.sleep(1000);
+//                       FileUtil.writeString(document.html(),absolutePath,"UTF-8");
+//                   }
+//                }
+//          }
+//      }
+//      return "";
+//   }
+
+   public static void main(String[] args) throws IOException, InterruptedException {
+//       UploadDataZip("E:\\imgs\\7dc5cc0bdd3391952d69def9c2083148.zip");
+       System.out.println(FileUtil.getName(FileUtil.file("E:\\imgs\\7dc5cc0bdd3391952d69def9c2083148.zip")));
+       BimFaceEntity bimFaceEntity=new BimFaceEntity();
+       bimFaceEntity.setTask(null);
+       System.out.println(StrUtil.isEmpty(bimFaceEntity.getTask()));
+       }
+}

+ 219 - 0
src/main/java/org/fdkk/bim/util/FileUploadUtils.java

@@ -0,0 +1,219 @@
+package org.fdkk.bim.util;
+
+import java.io.File;
+import java.io.IOException;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.fdkk.bim.config.BimConfig;
+import org.fdkk.bim.constant.HttpStatus;
+import org.fdkk.bim.exception.ServiceException;
+import org.springframework.web.multipart.MultipartFile;
+import org.fdkk.bim.exception.file.FileNameLengthLimitExceededException;
+import org.fdkk.bim.exception.file.FileSizeLimitExceededException;
+import org.fdkk.bim.exception.file.InvalidExtensionException;
+/**
+ * 文件上传工具类
+ *
+ * @author fdkk
+ */
+public class FileUploadUtils
+{
+    /**
+     * 默认大小 GB
+     */
+    public static final int DEFAULT_MAX_SIZE = 5;
+
+    /**
+     * 默认的文件名最大长度 100
+     */
+    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+
+    /**
+     * 根据文件路径上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file    上传的文件
+     * @return 文件名称
+     * @throws IOException
+     */
+    public static final File uploadAbsPath(String baseDir, MultipartFile file) throws IOException
+    {
+        try
+        {
+            return uploadAbs(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+        }
+        catch (Exception e)
+        {
+            throw new IOException(e.getMessage(), e);
+        }
+    }
+    /**
+     * 文件上传
+     *
+     * @param baseDir 相对应用的基目录
+     * @param file 上传的文件
+     * @param allowedExtension 上传文件类型
+     * @return 返回上传成功的文件名
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws FileNameLengthLimitExceededException 文件名太长
+     * @throws IOException 比如读写文件出错时
+     * @throws InvalidExtensionException 文件校验异常
+     */
+    public static final File uploadAbs(String baseDir, MultipartFile file, String[] allowedExtension)
+            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+            InvalidExtensionException
+    {
+        int fileNamelength = file.getOriginalFilename().length();
+        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
+        {
+            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+        }
+
+        assertAllowed(file, allowedExtension);
+        String fileName = extractFilename(file);
+        File desc = getAbsoluteFile(baseDir, fileName);
+        file.transferTo(desc);
+        return desc;
+    }
+    public static final String extractFilename(MultipartFile file)
+    {
+        String extension = getExtension(file);
+        String fileName = DateUtil.format(DateUtil.date(),"yyyy/MM/dd")+ "/" + IdUtil.fastUUID() + "." + extension;
+        return fileName;
+    }
+    public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
+    {
+        File desc = new File(uploadDir + File.separator + fileName);
+
+        if (!desc.exists())
+        {
+            if (!desc.getParentFile().exists())
+            {
+                desc.getParentFile().mkdirs();
+            }
+        }
+        return desc;
+    }
+
+    /**
+     * 判断文件大小
+     *
+     * @param len
+     *            文件长度
+     * @param size
+     *            限制大小
+     * @param unit
+     *            限制单位(B,K,M,G)
+     * @return
+     */
+    public static boolean checkFileSize(Long len, int size, String unit) {
+//        long len = file.length();
+        double fileSize = 0;
+        if ("B".equals(unit.toUpperCase())) {
+            fileSize = (double) len;
+        } else if ("K".equals(unit.toUpperCase())) {
+            fileSize = (double) len / 1024;
+        } else if ("M".equals(unit.toUpperCase())) {
+            fileSize = (double) len / 1048576;
+        } else if ("G".equals(unit.toUpperCase())) {
+            fileSize = (double) len / 1073741824;
+        }
+        if (fileSize > size) {
+            return false ;
+        }
+        return true;
+    }
+
+    public static void main(String[] args) {
+        boolean g = checkFileSize(9594745850L, 5, "G");
+        System.out.println("sg"+g );
+
+    }
+    /**
+     * 文件大小校验
+     *
+     * @param file 上传的文件
+     * @return
+     * @throws FileSizeLimitExceededException 如果超出最大大小
+     * @throws InvalidExtensionException
+     */
+    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+            throws FileSizeLimitExceededException, InvalidExtensionException
+    {
+        long size = file.getSize();
+        if (!checkFileSize( size,FileUploadUtils.DEFAULT_MAX_SIZE,"G"))
+        {
+            throw new ServiceException(String.format(HttpStatus.e502.getMsg(),FileUploadUtils.DEFAULT_MAX_SIZE), HttpStatus.e502.getCode());
+        }
+
+        String fileName = file.getOriginalFilename();
+        String extension = getExtension(file);
+        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
+        {
+            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
+            {
+                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
+                        fileName);
+            }
+            else
+            {
+                throw new InvalidExtensionException(allowedExtension, extension, fileName);
+            }
+        }
+
+    }
+
+    /**
+     * 判断MIME类型是否是允许的MIME类型
+     *
+     * @param extension
+     * @param allowedExtension
+     * @return
+     */
+    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
+    {
+        for (String str : allowedExtension)
+        {
+            if (str.equalsIgnoreCase(extension))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取文件名的后缀
+     *
+     * @param file 表单文件
+     * @return 后缀名
+     */
+    public static final String getExtension(MultipartFile file)
+    {
+        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+        if (StringUtils.isEmpty(extension))
+        {
+            extension = MimeTypeUtils.getExtension(file.getContentType());
+        }
+        return extension;
+    }
+}

+ 26 - 0
src/main/java/org/fdkk/bim/util/MessageUtils.java

@@ -0,0 +1,26 @@
+package org.fdkk.bim.util;
+
+import cn.hutool.extra.spring.SpringUtil;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+
+/**
+ * 获取i18n资源文件
+ *
+ * @author fdkk
+ */
+public class MessageUtils
+{
+    /**
+     * 根据消息键和参数 获取消息 委托给spring messageSource
+     *
+     * @param code 消息键
+     * @param args 参数
+     * @return 获取国际化翻译值
+     */
+    public static String message(String code, Object... args)
+    {
+        MessageSource messageSource = SpringUtil.getBean(MessageSource.class);
+        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+    }
+}

+ 65 - 0
src/main/java/org/fdkk/bim/util/MimeTypeUtils.java

@@ -0,0 +1,65 @@
+package org.fdkk.bim.util;
+
+/**
+ * 媒体类型工具类
+ *
+ * @author fdkk
+ */
+public class MimeTypeUtils {
+    private static final String IMAGE_PNG = "image/png";
+
+    private static final String IMAGE_JPG = "image/jpg";
+
+    private static final String IMAGE_JPEG = "image/jpeg";
+
+    private static final String IMAGE_BMP = "image/bmp";
+
+    private static final String IMAGE_GIF = "image/gif";
+
+    static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"};
+
+    static final String[] FLASH_EXTENSION = {"swf", "flv"};
+
+    static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
+            "asf", "rm", "rmvb"};
+
+    static final String[] VIDEO_EXTENSION = {"mp4", "avi", "rmvb"};
+
+    public static final String[] POINT_EXTENSION = {"las", "ply"};
+
+
+    static final String[] DEFAULT_ALLOWED_EXTENSION = {
+            // 图片
+            "bmp", "gif", "jpg", "jpeg", "png",
+            // word excel powerpoint
+            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
+            // 压缩文件
+            "rar", "zip", "gz", "bz2",
+            // 音、视频格式
+            "mp4", "avi", "rmvb", "mp3", "mov", "wav",
+            // pdf
+            "pdf",
+            //las
+            "las", "ply",
+            //bim
+            "ifc"
+
+    };
+
+    static String getExtension(String prefix) {
+        switch (prefix) {
+            case MimeTypeUtils.IMAGE_PNG:
+                return "png";
+            case MimeTypeUtils.IMAGE_JPG:
+                return "jpg";
+            case MimeTypeUtils.IMAGE_JPEG:
+                return "jpeg";
+            case MimeTypeUtils.IMAGE_BMP:
+                return "bmp";
+            case MimeTypeUtils.IMAGE_GIF:
+                return "gif";
+            default:
+                return "";
+        }
+    }
+}

+ 20 - 0
src/main/java/org/fdkk/bim/util/ObjectAndByteCovertUtil.java

@@ -0,0 +1,20 @@
+package org.fdkk.bim.util;
+
+import com.alibaba.fastjson2.JSON;
+
+
+/**
+ * @author Xiewj
+ * @date 2022/10/10
+ */
+public class ObjectAndByteCovertUtil {
+
+   /**
+    * byte转对象
+    * @param bytes
+    * @return
+    */
+   public static  <T> T ByteToObject(Class<T> clazz,byte[] bytes) {
+      return JSON.to(clazz,new String(bytes));
+   }
+}

+ 32 - 0
src/main/java/org/fdkk/bim/util/SnowIdUtil.java

@@ -0,0 +1,32 @@
+package org.fdkk.bim.util;
+
+import cn.hutool.core.util.IdUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.fdkk.bim.constant.HttpStatus;
+import org.fdkk.bim.exception.ServiceException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author Xiewj
+ * @date 2021/10/22
+ */
+@Slf4j
+@Component
+@Configuration
+public class SnowIdUtil {
+
+    @Value("1")
+    private String wordId;
+
+    public String getNextIdStr() {
+        SnowIdUtil.log.info("wordId{}", wordId);
+        try {
+            return IdUtil.getSnowflake(Long.valueOf(wordId)).nextIdStr();
+
+        } catch (IllegalArgumentException e) {
+            throw new ServiceException(HttpStatus.CLOCK_MOVED_BACKWARDS);
+        }
+    }
+}

+ 88 - 0
src/main/java/org/fdkk/bim/web/GlobalExceptionHandler.java

@@ -0,0 +1,88 @@
+package org.fdkk.bim.web;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import org.fdkk.bim.base.Result;
+import org.fdkk.bim.exception.ServiceException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 全局异常处理器
+ *
+ * @author fdkk
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+
+    /**
+     * 请求方式不支持
+     */
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    public Result handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
+                                                      HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        GlobalExceptionHandler.log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
+        return Result.error(e.getMessage());
+    }
+
+    /**
+     * 业务异常
+     */
+    @ExceptionHandler(ServiceException.class)
+    public Result handleServiceException(ServiceException e, HttpServletRequest request) {
+        GlobalExceptionHandler.log.error(e.getMessage(), e);
+        Integer code = e.getCode();
+        return ObjectUtil.isNotNull(code) ? Result.error(code, e.getMessage()) : Result.error(e.getMessage());
+    }
+
+    /**
+     * 拦截未知的运行时异常
+     */
+    @ExceptionHandler(RuntimeException.class)
+    public Result handleRuntimeException(RuntimeException e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        GlobalExceptionHandler.log.error("请求地址'{}',发生未知异常.", requestURI, e);
+        return Result.error(e.getMessage());
+    }
+
+    /**
+     * 系统异常
+     */
+    @ExceptionHandler(Exception.class)
+    public Result handleException(Exception e, HttpServletRequest request) {
+        String requestURI = request.getRequestURI();
+        GlobalExceptionHandler.log.error("请求地址'{}',发生系统异常.", requestURI, e);
+        return Result.error(e.getMessage());
+    }
+
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(BindException.class)
+    public Result handleBindException(BindException e) {
+        GlobalExceptionHandler.log.error(e.getMessage(), e);
+        String message = e.getAllErrors().get(0).getDefaultMessage();
+        return Result.error(message);
+    }
+
+    /**
+     * 自定义验证异常
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
+        GlobalExceptionHandler.log.error(e.getMessage(), e);
+        String message = e.getBindingResult().getFieldError().getDefaultMessage();
+        return Result.error(message);
+    }
+
+}

+ 92 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,92 @@
+server:
+  port: 8787
+  servlet:
+    context-path: /bim
+
+spring:
+  application:
+    name: bim
+  resources:
+    chain:
+      strategy:
+        content:
+          enabled: true
+          paths: /**
+  servlet:
+    multipart:
+      enabled: true
+      max-request-size: 1024MB
+      max-file-size: 1024MB
+  # redis 配置
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    timeout: 6000ms
+    password: 1234
+    # cluster:
+    #   max-redirects: 3  # 获取失败 最大重定向次数
+    #   nodes:
+    #     - 120.25.146.52:6379
+    jedis:
+      pool:
+        max-active: 10  #连接池最大连接数(使用负值表示没有限制)
+        max-idle: 10 # 连接池中的最大空闲连接
+        min-idle: 5 # 连接池中的最小空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+    lettuce:
+      shutdown-timeout: 0ms
+  # 数据源配置
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://120.25.146.52:13306/fdkk_bim?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: JK123456%JIK
+    hikari:
+      minimum-idle: 5
+      idle-timeout: 600000
+      maximum-pool-size: 10
+      auto-commit: true
+      pool-name: MyHikariCP
+      max-lifetime: 1800000
+      connection-timeout: 30000
+      connection-test-query: SELECT 1
+queue:
+  bim:
+    bim-pre: bim_pre    #计算场景前置处理队列
+    bim-post: bim_post  #计算场景后置处理队列
+
+tlog:
+  enable-invoke-time-print: true
+# 阿里云基本配置
+forest:
+  max-connections: 1000        # 连接池最大连接数
+  connect-timeout: 3000        # 连接超时时间,单位为毫秒
+  read-timeout: 3000           # 数据读取超时时间,单位为毫秒
+logging:
+  config: classpath:logback-spring.xml
+  maxHistory: 1
+  fdkk:
+    level: INFO
+  file:
+    path: D:\gitProject\fdkk_bim\log
+bimface:
+  appKey: 'uOaJWvZKlvGfQkqL6jlntMRC0RifHC8P'
+  appSecret: 'Fe8vmVqKdtfBT9E7v2vNYw7taIX9fClU'
+bim:
+  uploadPath: E://imgs//
+  defaultFolder: bim
+  webSite : https://8h9xtgjn91yg.ngrok.xiaomiqiu123.top
+#    type: oss      阿里云 oss
+#    type: aws      亚马逊
+#    type: local    本地化
+upload:
+  type: oss
+
+fyun:
+  type: oss
+  key: LTAIUrvuHqj8pvry
+  secret: JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+  bucket: 4dkankan
+  endPoint: http://oss-cn-shenzhen.aliyuncs.com
+  host: https://4dkk.4dage.com/

+ 92 - 0
src/main/resources/application-prod.yml

@@ -0,0 +1,92 @@
+server:
+  port: 8787
+  servlet:
+    context-path: /bim
+
+spring:
+  application:
+    name: bim
+  resources:
+    chain:
+      strategy:
+        content:
+          enabled: true
+          paths: /**
+  servlet:
+    multipart:
+      enabled: true
+      max-request-size: 1024MB
+      max-file-size: 1024MB
+  # redis 配置
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    timeout: 6000ms
+    password: 1234
+    # cluster:
+    #   max-redirects: 3  # 获取失败 最大重定向次数
+    #   nodes:
+    #     - 120.25.146.52:6379
+    jedis:
+      pool:
+        max-active: 10  #连接池最大连接数(使用负值表示没有限制)
+        max-idle: 10 # 连接池中的最大空闲连接
+        min-idle: 5 # 连接池中的最小空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+    lettuce:
+      shutdown-timeout: 0ms
+  # 数据源配置
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://120.25.146.52:13306/fdkk_bim?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: JK123456%JIK
+    hikari:
+      minimum-idle: 5
+      idle-timeout: 600000
+      maximum-pool-size: 10
+      auto-commit: true
+      pool-name: MyHikariCP
+      max-lifetime: 1800000
+      connection-timeout: 30000
+      connection-test-query: SELECT 1
+queue:
+  bim:
+    bim-pre: bim_pre    #计算场景前置处理队列
+    bim-post: bim_post  #计算场景后置处理队列
+
+tlog:
+  enable-invoke-time-print: true
+# 阿里云基本配置
+forest:
+  max-connections: 1000        # 连接池最大连接数
+  connect-timeout: 3000        # 连接超时时间,单位为毫秒
+  read-timeout: 3000           # 数据读取超时时间,单位为毫秒
+logging:
+  config: classpath:logback-spring.xml
+  maxHistory: 1
+  fdkk:
+    level: INFO
+  file:
+    path: D:\gitProject\fdkk_bim\log
+bimface:
+  appKey: 'uOaJWvZKlvGfQkqL6jlntMRC0RifHC8P'
+  appSecret: 'Fe8vmVqKdtfBT9E7v2vNYw7taIX9fClU'
+bim:
+  uploadPath: E://imgs//
+  defaultFolder: bim
+  webSite : https://8h9xtgjn91yg.ngrok.xiaomiqiu123.top
+#    type: oss      阿里云 oss
+#    type: aws      亚马逊
+#    type: local    本地化
+upload:
+  type: oss
+
+fyun:
+  type: oss
+  key: LTAIUrvuHqj8pvry
+  secret: JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+  bucket: 4dkankan
+  endPoint: http://oss-cn-shenzhen.aliyuncs.com
+  host: https://4dkk.4dage.com/

+ 92 - 0
src/main/resources/application-uat.yml

@@ -0,0 +1,92 @@
+server:
+  port: 8787
+  servlet:
+    context-path: /bim
+
+spring:
+  application:
+    name: bim
+  resources:
+    chain:
+      strategy:
+        content:
+          enabled: true
+          paths: /**
+  servlet:
+    multipart:
+      enabled: true
+      max-request-size: 1024MB
+      max-file-size: 1024MB
+  # redis 配置
+  redis:
+    host: 127.0.0.1
+    port: 6379
+    timeout: 6000ms
+    password: 1234
+    # cluster:
+    #   max-redirects: 3  # 获取失败 最大重定向次数
+    #   nodes:
+    #     - 120.25.146.52:6379
+    jedis:
+      pool:
+        max-active: 10  #连接池最大连接数(使用负值表示没有限制)
+        max-idle: 10 # 连接池中的最大空闲连接
+        min-idle: 5 # 连接池中的最小空闲连接
+        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
+    lettuce:
+      shutdown-timeout: 0ms
+  # 数据源配置
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://localhost:13306/fdkk_bim?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
+    username: root
+    password: JK123456%JIK
+    hikari:
+      minimum-idle: 5
+      idle-timeout: 600000
+      maximum-pool-size: 10
+      auto-commit: true
+      pool-name: MyHikariCP
+      max-lifetime: 1800000
+      connection-timeout: 30000
+      connection-test-query: SELECT 1
+queue:
+  bim:
+    bim-pre: bim_pre    #计算场景前置处理队列
+    bim-post: bim_post  #计算场景后置处理队列
+
+tlog:
+  enable-invoke-time-print: true
+# 阿里云基本配置
+forest:
+  max-connections: 1000        # 连接池最大连接数
+  connect-timeout: 3000        # 连接超时时间,单位为毫秒
+  read-timeout: 3000           # 数据读取超时时间,单位为毫秒
+logging:
+  config: classpath:logback-spring.xml
+  maxHistory: 1
+  fdkk:
+    level: INFO
+  file:
+    path: D:\gitProject\fdkk_bim\log
+bimface:
+  appKey: 'uOaJWvZKlvGfQkqL6jlntMRC0RifHC8P'
+  appSecret: 'Fe8vmVqKdtfBT9E7v2vNYw7taIX9fClU'
+bim:
+  uploadPath: E://imgs//
+  defaultFolder: bim
+  webSite : https://8h9xtgjn91yg.ngrok.xiaomiqiu123.top
+#    type: oss      阿里云 oss
+#    type: aws      亚马逊
+#    type: local    本地化
+upload:
+  type: oss
+
+fyun:
+  type: oss
+  key: LTAIUrvuHqj8pvry
+  secret: JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+  bucket: 4dkankan
+  endPoint: http://oss-cn-shenzhen.aliyuncs.com
+  host: https://4dkk.4dage.com/

+ 5 - 0
src/main/resources/application.yml

@@ -0,0 +1,5 @@
+spring:
+  profiles:
+    active: dev
+  jackson:
+    time-zone: GMT+8

+ 166 - 0
src/main/resources/logback-spring.xml

@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <springProperty scope="context" name="LOG_MAX_HISTORY" source="logging.maxHistory"/>
+    <!-- 日志根目录-->
+    <springProperty scope="context" name="LOG_HOME" source="logging.path"/>
+
+    <!-- 日志级别 -->
+    <springProperty scope="context" name="LOG_LEVEL" source="logging.fdkk.level" defaultValue="DEBUG"/>
+
+    <!--  标识这个"STDOUT" 将会添加到这个logger -->
+    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
+
+    <!-- 日志文件名称-->
+    <property name="LOG_PREFIX" value="bim"/>
+
+    <!-- 日志文件编码-->
+    <property name="LOG_CHARSET" value="UTF-8"/>
+
+    <!-- 日志文件路径+日期-->
+    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}"/>
+
+    <!--对日志进行格式化-->
+
+    <!--文件大小,默认10MB-->
+    <property name="MAX_FILE_SIZE" value="50MB"/>
+
+    <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+    <property name="MAX_HISTORY" value="10"/>
+
+    <!--输出到控制台-->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+    <!--输出到文件-->
+    <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    </appender>
+
+    <!-- 定义 ALL 日志的输出方式:-->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/${LOG_PREFIX}_all.log</File>
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/${LOG_PREFIX}_all%i.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 定义 INFO 日志的输出方式:-->
+    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 下面为配置只输出error级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <OnMismatch>DENY</OnMismatch>
+            <OnMatch>ACCEPT</OnMatch>
+        </filter>
+        <append>true</append>
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/${LOG_PREFIX}_info.log</File>
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 INFO 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/${LOG_PREFIX}_info%i.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+
+            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <!-- 定义 ERROR 日志的输出方式:-->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 下面为配置只输出error级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <OnMismatch>DENY</OnMismatch>
+            <OnMatch>ACCEPT</OnMatch>
+        </filter>
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/${LOG_PREFIX}_err.log</File>
+
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/${LOG_PREFIX}_err%i.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
+            <cleanHistoryOnStart>true</cleanHistoryOnStart>
+
+            <!--当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB-->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <encoder class="com.yomahub.tlog.core.enhance.logback.AspectLogbackEncoder">
+            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+    <!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR-->
+
+    <logger name="org.springframework" level="ERROR"/>
+    <logger name="org.apache.commons" level="ERROR"/>
+    <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
+    <logger name="com.alibaba.dubbo.remoting" level="ERROR"/>
+    <logger name="com.zaxxer.hikari" level="ERROR"/>
+    <logger name="org.apache.http.impl.conn" level="ERROR"/>
+    <logger name="com.apache.ibatis" level="${LOG_LEVEL}"/>
+    <logger name="java.sql.Connection" level="${LOG_LEVEL}"/>
+    <logger name="java.sql.Statement" level="${LOG_LEVEL}"/>
+    <logger name="java.sql.PreparedStatement" level="${LOG_LEVEL}"/>
+    <logger name="io.lettuce.core.protocol" level="ERROR"/>
+    <logger name="io.lettuce.core" level="ERROR"/>
+
+    <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
+    <root level="${LOG_ROOT_LEVEL}">
+
+        <!-- 标识这个"${STDOUT}"将会添加到这个logger -->
+        <appender-ref ref="${STDOUT}"/>
+
+        <!-- FILE_ALL 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ALL"/>
+
+        <!-- FILE_INFO 日志输出添加到 logger -->
+        <appender-ref ref="FILE_INFO"/>
+
+        <!-- FILE_ERROR 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ERROR"/>
+    </root>
+
+</configuration>