dengsixing 3 lat temu
rodzic
commit
520576049b
80 zmienionych plików z 4498 dodań i 0 usunięć
  1. 182 0
      pom.xml
  2. 22 0
      src/main/java/com/fdkankan/repair/DataRepairApplication.java
  3. 19 0
      src/main/java/com/fdkankan/repair/SceneRepairParamVO.java
  4. 69 0
      src/main/java/com/fdkankan/repair/bean/SceneEditControlsBean.java
  5. 169 0
      src/main/java/com/fdkankan/repair/bean/SceneJsonBean.java
  6. 31 0
      src/main/java/com/fdkankan/repair/bean/SceneUpgradeProgressBean.java
  7. 22 0
      src/main/java/com/fdkankan/repair/config/MybatisPlusPageConfig.java
  8. 55 0
      src/main/java/com/fdkankan/repair/config/TaskPoolConfig.java
  9. 45 0
      src/main/java/com/fdkankan/repair/constant/ProgressStatus.java
  10. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneEditControlsController.java
  11. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneEditInfoController.java
  12. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneEditInfoExtController.java
  13. 21 0
      src/main/java/com/fdkankan/repair/controller/ScenePlusExtController.java
  14. 22 0
      src/main/java/com/fdkankan/repair/controller/SceneProController.java
  15. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneProEditController.java
  16. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneProEditExtController.java
  17. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneProExtController.java
  18. 114 0
      src/main/java/com/fdkankan/repair/controller/SceneRepairController.java
  19. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneRepairLogController.java
  20. 21 0
      src/main/java/com/fdkankan/repair/controller/SceneResourceController.java
  21. 112 0
      src/main/java/com/fdkankan/repair/entity/SceneEditControls.java
  22. 172 0
      src/main/java/com/fdkankan/repair/entity/SceneEditInfo.java
  23. 76 0
      src/main/java/com/fdkankan/repair/entity/SceneEditInfoExt.java
  24. 151 0
      src/main/java/com/fdkankan/repair/entity/ScenePlusExt.java
  25. 138 0
      src/main/java/com/fdkankan/repair/entity/ScenePro.java
  26. 169 0
      src/main/java/com/fdkankan/repair/entity/SceneProEdit.java
  27. 169 0
      src/main/java/com/fdkankan/repair/entity/SceneProEditExt.java
  28. 154 0
      src/main/java/com/fdkankan/repair/entity/SceneProExt.java
  29. 74 0
      src/main/java/com/fdkankan/repair/entity/SceneRepairLog.java
  30. 79 0
      src/main/java/com/fdkankan/repair/entity/SceneResource.java
  31. 99 0
      src/main/java/com/fdkankan/repair/generate/AutoGenerate.java
  32. 53 0
      src/main/java/com/fdkankan/repair/listener/RabbitMqListener.java
  33. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneEditControlsMapper.java
  34. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneEditInfoExtMapper.java
  35. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneEditInfoMapper.java
  36. 18 0
      src/main/java/com/fdkankan/repair/mapper/IScenePlusExtMapper.java
  37. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneProEditExtMapper.java
  38. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneProEditMapper.java
  39. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneProExtMapper.java
  40. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneProMapper.java
  41. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneRepairLogMapper.java
  42. 18 0
      src/main/java/com/fdkankan/repair/mapper/ISceneResourceMapper.java
  43. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneEditControlsService.java
  44. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneEditInfoExtService.java
  45. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneEditInfoService.java
  46. 16 0
      src/main/java/com/fdkankan/repair/service/IScenePlusExtService.java
  47. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneProEditExtService.java
  48. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneProEditService.java
  49. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneProExtService.java
  50. 18 0
      src/main/java/com/fdkankan/repair/service/ISceneProService.java
  51. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneRepairLogService.java
  52. 16 0
      src/main/java/com/fdkankan/repair/service/ISceneResourceService.java
  53. 15 0
      src/main/java/com/fdkankan/repair/service/ISceneUpgradeToV4Service.java
  54. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneEditControlsServiceImpl.java
  55. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneEditInfoExtServiceImpl.java
  56. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneEditInfoServiceImpl.java
  57. 20 0
      src/main/java/com/fdkankan/repair/service/impl/ScenePlusExtServiceImpl.java
  58. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneProEditExtServiceImpl.java
  59. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneProEditServiceImpl.java
  60. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneProExtServiceImpl.java
  61. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneProServiceImpl.java
  62. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneRepairLogServiceImpl.java
  63. 475 0
      src/main/java/com/fdkankan/repair/service/impl/SceneRepairService.java
  64. 20 0
      src/main/java/com/fdkankan/repair/service/impl/SceneResourceServiceImpl.java
  65. 468 0
      src/main/java/com/fdkankan/repair/service/impl/SceneUpgradeToV4Service.java
  66. 95 0
      src/main/resources/bootstrap-dev.yml
  67. 98 0
      src/main/resources/bootstrap-pro.yml
  68. 42 0
      src/main/resources/bootstrap-test.yml
  69. 3 0
      src/main/resources/bootstrap.yml
  70. 325 0
      src/main/resources/logback-spring.xml
  71. 5 0
      src/main/resources/mapper/SceneEditControlsMapper.xml
  72. 5 0
      src/main/resources/mapper/SceneEditInfoExtMapper.xml
  73. 5 0
      src/main/resources/mapper/SceneEditInfoMapper.xml
  74. 5 0
      src/main/resources/mapper/ScenePlusExtMapper.xml
  75. 5 0
      src/main/resources/mapper/SceneProEditExtMapper.xml
  76. 5 0
      src/main/resources/mapper/SceneProEditMapper.xml
  77. 5 0
      src/main/resources/mapper/SceneProExtMapper.xml
  78. 5 0
      src/main/resources/mapper/SceneProMapper.xml
  79. 5 0
      src/main/resources/mapper/SceneRepairLogMapper.xml
  80. 5 0
      src/main/resources/mapper/SceneResourceMapper.xml

+ 182 - 0
pom.xml

@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.12.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>com.fdkankan</groupId>
+    <artifactId>4dkankan-data-repair</artifactId>
+    <version>2.0.0-SNAPSHOT</version>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <spring.cloud-version>Hoxton.SR8</spring.cloud-version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>releases</id>
+            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
+        </repository>
+        <repository>
+            <id>snapshots</id>
+            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
+        </repository>
+        <repository>
+            <id>nexus-aliyun</id>
+            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.25</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <scope>compile</scope>
+            <version>3.4.3.4</version>
+        </dependency>
+
+        <!--mybatis-plus代码生成器-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <scope>compile</scope>
+            <version>3.5.1</version>
+        </dependency>
+
+        <!--velocity模板-->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-redis</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-common-utils</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-db</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-rabbitmq</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <dependencyManagement>
+
+        <dependencies>
+
+            <dependency>
+                <groupId>com.alibaba.cloud</groupId>
+                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
+                <version>2.2.7.RELEASE</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring.cloud-version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <dependency>
+                <groupId>com.fdkankan</groupId>
+                <artifactId>4dkankan-utils-fyun</artifactId>
+                <version>2.0.0-SNAPSHOT</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <distributionManagement>
+        <repository>
+            <id>releases</id>
+            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/releases/</url>
+        </repository>
+
+        <snapshotRepository>
+            <id>snapshots</id>
+            <url>http://192.168.0.115:8081/nexus-2.14.2-01/content/repositories/snapshots/</url>
+        </snapshotRepository>
+    </distributionManagement>
+
+</project>

+ 22 - 0
src/main/java/com/fdkankan/repair/DataRepairApplication.java

@@ -0,0 +1,22 @@
+package com.fdkankan.repair;
+
+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.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScans;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.fdkankan"})
+@MapperScan("com.fdkankan.**.mapper")
+@EnableAsync
+public class DataRepairApplication {
+
+    public static void main(String[] args) {
+        ConfigurableApplicationContext context = SpringApplication.run(DataRepairApplication.class, args);
+    }
+
+}

+ 19 - 0
src/main/java/com/fdkankan/repair/SceneRepairParamVO.java

@@ -0,0 +1,19 @@
+package com.fdkankan.repair;
+
+import java.util.List;
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/23
+ **/
+@Data
+public class SceneRepairParamVO {
+
+    private List<String> numList;
+
+}

+ 69 - 0
src/main/java/com/fdkankan/repair/bean/SceneEditControlsBean.java

@@ -0,0 +1,69 @@
+package com.fdkankan.repair.bean;
+
+import java.io.Serializable;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/1/18
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneEditControlsBean implements Serializable {
+
+    /**
+     * 是否展示小地图(0-不展示,1-展示)
+     */
+    private Integer showMap;
+
+    /**
+     * 是否需要密码(0-不需要,1-需要)
+     */
+    private Integer showLock;
+
+    /**
+     * 是否展示标题(0-不需要,1-需要)
+     */
+    private Integer showTitle;
+
+    /**
+     * 是否展示漫游按钮(0-不需要,1-需要)
+     */
+    private Integer showPanorama;
+
+    /**
+     * 是否展示3D按钮(0-不需要,1-需要)
+     */
+    private Integer showDollhouse;
+
+    /**
+     * 是否展示2D按钮(0-不需要,1-需要)
+     */
+    private Integer showFloorplan;
+
+    /**
+     * 是否展示VR(0-不需要,1-需要)
+     */
+    private Integer showVR;
+
+    /**
+     * 是否展示自动导览(0-不需要,1-需要)
+     */
+    private Integer showTour;
+
+    /**
+     * 是否展示测量线(0-不需要,1-需要)
+     */
+    private Integer showRule;
+
+
+}

+ 169 - 0
src/main/java/com/fdkankan/repair/bean/SceneJsonBean.java

@@ -0,0 +1,169 @@
+package com.fdkankan.repair.bean;
+
+import com.alibaba.fastjson.JSONObject;
+import java.util.Date;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * scene.json实体类
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/1/19
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneJsonBean {
+
+    /**
+     * 场景码
+     */
+    private String num;
+
+    /**
+     * 地面logo名称
+     */
+    private String floorLogo;
+
+    /**
+     * 地面logo大小
+     */
+    private Integer floorLogoSize;
+
+    /**
+     * 地面logo文件名称
+     */
+    private String floorLogoFile;
+
+    /**
+     * 背景音乐名称
+     */
+    private String music;
+
+    /**
+     * 背景音乐文件名称
+     */
+    private String musicFile;
+
+    /**
+     * 浏览密码
+     */
+    private String scenePassword;
+
+    /**
+     * 场景标题
+     */
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    private String description;
+
+    private SceneEditControlsBean controls;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+//    /**
+//     * 点位数量
+//     */
+//    private Integer panoCount;
+//
+//    /**
+//     * 球幕视频数量
+//     */
+//    private Integer videoCount;
+
+    /**
+     * 版本
+     */
+    private Integer version;
+
+//    /**
+//     * 户型图文件路径集合
+//     */
+//    private String[] floorPlanPaths;
+
+    /**
+     * 是否上传了户型图(0-否,1-是)
+     */
+    private Byte floorPlanUser;
+
+//    private String cadInfo;
+
+//    /**
+//     * 是否上传模型
+//     */
+//    private Byte isUploadObj;
+//
+//    /**
+//     * 重新建模的版本
+//     */
+//    private Integer floorEditVer;
+//
+//    /**
+//     * 正式发布重新建模的版本
+//     */
+//    private Integer floorPublishVer;
+
+    /**
+     * 初始点信息
+     */
+    private String entry;
+
+    /**
+     * 全景图加载方式,tiles/1k:1k瓦片图,tiles/2:2k瓦片图,tiles/4k:4k瓦片图,pan:全景图 ,local:本地切片,cube:立体图
+     */
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    private String sceneFrom;
+
+    /**
+     * 视频覆盖数据
+     */
+    private String boxVideos;
+
+    /**
+     *点位视频
+     */
+    private JSONObject videos;
+
+    /**
+     * 是否有热点数据
+     */
+    private Integer tags;
+
+    /**
+     * 加载logo名
+     */
+    private String loadingLogo;
+
+    /**
+     * 加载logo文件名
+     */
+    private String loadingLogoFile;
+
+    /**
+     * 户型角度
+     */
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    private Float floorPlanCompass;
+
+
+}

+ 31 - 0
src/main/java/com/fdkankan/repair/bean/SceneUpgradeProgressBean.java

@@ -0,0 +1,31 @@
+package com.fdkankan.repair.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * 场景升级进度
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/22
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneUpgradeProgressBean {
+
+    private String num;
+
+    private Integer status;
+
+    private Integer progress;
+
+
+
+
+}

+ 22 - 0
src/main/java/com/fdkankan/repair/config/MybatisPlusPageConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.repair.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+    /**
+     * mybatisPlus配置分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 55 - 0
src/main/java/com/fdkankan/repair/config/TaskPoolConfig.java

@@ -0,0 +1,55 @@
+package com.fdkankan.repair.config;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorCompletionService;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/2/22
+ **/
+@Configuration
+public class TaskPoolConfig {
+
+    @Bean("sceneDownLoadExecutror")
+    public ThreadPoolTaskExecutor sceneDownLoadExecutror(){
+        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
+        taskExecutor.setCorePoolSize(3);
+        taskExecutor.setMaxPoolSize(3);
+        taskExecutor.setQueueCapacity(3);
+        taskExecutor.setKeepAliveSeconds(60);
+        taskExecutor.setThreadNamePrefix("sceneRepairThread--");
+        taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
+        taskExecutor.setAwaitTerminationSeconds(60);
+        return taskExecutor;
+    }
+
+//    @Bean
+//    public ExecutorCompletionService completionService(ThreadPoolTaskExecutor sceneDownLoadExecutror){
+//        return new ExecutorCompletionService<Integer>(sceneDownLoadExecutror);
+//    }
+
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+        return new RestTemplate(factory);
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setReadTimeout(5000);//ms
+        factory.setConnectTimeout(15000);//ms
+        return factory;
+    }
+
+}

+ 45 - 0
src/main/java/com/fdkankan/repair/constant/ProgressStatus.java

@@ -0,0 +1,45 @@
+package com.fdkankan.repair.constant;
+
+import com.fdkankan.common.constant.FileBizType;
+
+/**
+ * 文件业务类型
+ */
+public enum ProgressStatus {
+
+    WAIT(0, "等待中"),
+    SUCESS_DB(1000, "数据库已生成"),
+    SUCCESS_OSS(1001, "数据拷贝完成"),
+    SUCCESS(1002, "升级成功"),
+    FAIL(1003, "升级失败")
+    ;
+
+    private Integer code;
+    private String message;
+
+    private ProgressStatus(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static ProgressStatus get(Integer code){
+        ProgressStatus[] values = ProgressStatus.values();
+        Integer enumValue = null;
+        for(ProgressStatus eachValue : values){
+            enumValue = eachValue.code();
+            if(enumValue.equals(code)){
+                return eachValue;
+            }
+        }
+        return null;
+    }
+
+}

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneEditControlsController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneEditControls")
+public class SceneEditControlsController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneEditInfoController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneEditInfo")
+public class SceneEditInfoController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneEditInfoExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneEditInfoExt")
+public class SceneEditInfoExtController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/ScenePlusExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-30
+ */
+@RestController
+@RequestMapping("/test/scenePlusExt")
+public class ScenePlusExtController {
+
+}
+

+ 22 - 0
src/main/java/com/fdkankan/repair/controller/SceneProController.java

@@ -0,0 +1,22 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@RestController
+@RequestMapping("/test/scenePro")
+public class SceneProController {
+
+
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneProEditController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景编辑数据表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneProEdit")
+public class SceneProEditController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneProEditExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景编辑数据表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneProEditExt")
+public class SceneProEditExtController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneProExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * pro场景表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneProExt")
+public class SceneProExtController {
+
+}
+

+ 114 - 0
src/main/java/com/fdkankan/repair/controller/SceneRepairController.java

@@ -0,0 +1,114 @@
+package com.fdkankan.repair.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ConcurrentHashSet;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.repair.SceneRepairParamVO;
+import com.fdkankan.repair.entity.ScenePro;
+import com.fdkankan.repair.entity.SceneResource;
+import com.fdkankan.repair.service.ISceneProService;
+import com.fdkankan.repair.service.ISceneResourceService;
+import com.fdkankan.repair.service.impl.SceneRepairService;
+import java.util.List;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/23
+ **/
+@Slf4j
+@RestController
+@RequestMapping("/test")
+public class SceneRepairController {
+
+    @Autowired
+    ISceneProService sceneProService;
+    @Autowired
+    private UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    private SceneRepairService sceneRepairService;
+    @Autowired
+    private ISceneResourceService sceneResourceService;
+    @Autowired
+    private RedisUtil redisUtil;
+
+    /**
+     * 最大线程数
+     */
+    @Value("${repair.maxThread:3}")
+    private int maxThread;
+
+
+    @PostMapping("/sceneRepair")
+    public String test(@RequestBody SceneRepairParamVO param) throws Exception{
+
+        //
+        String key = "scene:repair:index";
+        Integer index = 0;
+        String indexStr = redisUtil.get(key);
+        if(StrUtil.isNotBlank(indexStr)){
+            index = Integer.valueOf(indexStr);
+        }
+
+
+
+        List<ScenePro> sceneProList = null;
+
+        do {
+            int sceneCnt = maxThread - sceneRepairService.getCurrentThreadCnt();
+            if(sceneCnt == 0){
+                Thread.sleep(2000);
+                continue;
+            }
+
+            LambdaQueryWrapper<ScenePro> queryWrapper = new LambdaQueryWrapper<ScenePro>()
+                .last("limit " + index + "," + sceneCnt);
+            if(CollUtil.isNotEmpty(param.getNumList())){
+                queryWrapper.in(ScenePro::getNum, param.getNumList());
+            }
+            sceneProList = sceneProService.list(queryWrapper);
+
+            index += sceneProList.size();
+            if(CollUtil.isEmpty(sceneProList)){
+                log.info("场景资源数据迁移完毕。。。。。");
+                break;
+            }
+            for (ScenePro scenePro : sceneProList) {
+                sceneRepairService.repair(scenePro);
+            }
+
+            //场景码下标写入缓存,防止任务中断了,无法继续迁移
+            redisUtil.set("scene:repair:index", index+"");
+
+            Thread.sleep(2000);
+
+        }while (true);
+
+        return "ok";
+    }
+
+    @GetMapping("/test1")
+    public String test1() throws Exception{
+
+        uploadToOssUtil.copyFilesFromAws("test", "test1");
+
+        return "ok";
+    }
+
+
+
+}

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneRepairLogController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景数据迁移日志--V4版本稳定后可删除 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@RestController
+@RequestMapping("/test/sceneRepairLog")
+public class SceneRepairLogController {
+
+}
+

+ 21 - 0
src/main/java/com/fdkankan/repair/controller/SceneResourceController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.repair.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景资源表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@RestController
+@RequestMapping("/test/sceneResource")
+public class SceneResourceController {
+
+}
+

+ 112 - 0
src/main/java/com/fdkankan/repair/entity/SceneEditControls.java

@@ -0,0 +1,112 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_controls")
+public class SceneEditControls implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * t_scene_edit_info表id
+     */
+    @TableField("edit_info_id")
+    private Long editInfoId;
+
+    /**
+     * 是否展示小地图(0-不展示,1-展示)
+     */
+    @TableField("show_map")
+    private Integer showMap;
+
+    /**
+     * 是否需要密码(0-不需要,1-需要)
+     */
+    @TableField("show_lock")
+    private Integer showLock;
+
+    /**
+     * 是否展示标题(0-不需要,1-需要)
+     */
+    @TableField("show_title")
+    private Integer showTitle;
+
+    /**
+     * 是否展示漫游按钮(0-不需要,1-需要)
+     */
+    @TableField("show_panorama")
+    private Integer showPanorama;
+
+    /**
+     * 是否展示3D按钮(0-不需要,1-需要)
+     */
+    @TableField("show_dollhouse")
+    private Integer showDollhouse;
+
+    /**
+     * 是否展示2D按钮(0-不需要,1-需要)
+     */
+    @TableField("show_floorplan")
+    private Integer showFloorplan;
+
+    /**
+     * 是否展示VR(0-不需要,1-需要)
+     */
+    @TableField("show_VR")
+    private Integer showVR;
+
+    /**
+     * 是否展示自动导览(0-不需要,1-需要)
+     */
+    @TableField("show_tour")
+    private Integer showTour;
+
+    /**
+     * 是否展示测量线(0-不需要,1-需要)
+     */
+    @TableField("show_rule")
+    private Integer showRule;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 172 - 0
src/main/java/com/fdkankan/repair/entity/SceneEditInfo.java

@@ -0,0 +1,172 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_info")
+public class SceneEditInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    @TableField("scene_plus_id")
+    private Long scenePlusId;
+
+    /**
+     * 地面logo名称
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 地面logo大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 地面logo文件名称
+     */
+    @TableField("floor_logo_file")
+    private String floorLogoFile;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("music")
+    private String music;
+
+    /**
+     * 背景音乐文件名称
+     */
+    @TableField("music_file")
+    private String musicFile;
+
+    /**
+     * 浏览密码
+     */
+    @TableField("scene_password")
+    private String scenePassword;
+
+    /**
+     * 场景标题
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 用户是否上传户型图(0-否,1-是)
+     */
+    @TableField("floor_plan_user")
+    private Integer floorPlanUser;
+
+    @TableField("cad_info")
+    private String cadInfo;
+
+    /**
+     * 是否有热点数据(0-否,1-是)
+     */
+    @TableField("tags")
+    private Integer tags;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 是否上传模型
+     */
+    @TableField("is_upload_obj")
+    private Integer isUploadObj;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    @TableField("box_videos")
+    private String boxVideos;
+
+    /**
+     * 是否需要处理球幕视频
+     */
+    @TableField("build_video_status")
+    private Integer buildVideoStatus;
+
+    /**
+     * 初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 加载logo名
+     */
+    @TableField("loading_logo")
+    private String loadingLogo;
+
+    /**
+     * 加载logo文件名
+     */
+    @TableField("loading_logo_file")
+    private String loadingLogoFile;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 76 - 0
src/main/java/com/fdkankan/repair/entity/SceneEditInfoExt.java

@@ -0,0 +1,76 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_edit_info_ext")
+public class SceneEditInfoExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    @TableField("scene_plus_id")
+    private Long scenePlusId;
+
+    @TableField("edit_info_id")
+    private Long editInfoId;
+
+    /**
+     * 户型角度
+     */
+    @TableField("floor_plan_angle")
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    @TableField("floor_plan_compass")
+    private Float floorPlanCompass;
+
+    /**
+     * 大场景序号(随心装场景码)  原pro_edit表中的字段
+     */
+    @TableField("vr_num")
+    private String vrNum;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 151 - 0
src/main/java/com/fdkankan/repair/entity/ScenePlusExt.java

@@ -0,0 +1,151 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-30
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus_ext")
+public class ScenePlusExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * t_scene_plus主键
+     */
+    @TableField("plus_id")
+    private Long plusId;
+
+    /**
+     * 场景数据目录
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 场景链接
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 缩略图链接
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 使用用量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 云服务器类型
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 点位数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 算法类型(slam、sfm)
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 算法类型(V2,V3)
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 全景图加载方式,tiles/1k:1k瓦片图,tiles/2:2k瓦片图,tiles/4k:4k瓦片图,pan:全景图 ,local:本地切片,cube:立体图
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * 计算耗时
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 138 - 0
src/main/java/com/fdkankan/repair/entity/ScenePro.java

@@ -0,0 +1,138 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/23
+ **/
+@Getter
+@Setter
+@TableName("t_scene_pro")
+public class ScenePro implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景名称
+     */
+    @TableField("scene_name")
+    private String sceneName;
+
+    /**
+     * 场景描述
+     */
+    @TableField("scene_dec")
+    private String sceneDec;
+
+    /**
+     * 场景的链接地址
+     */
+    @TableField("web_site")
+    private String webSite;
+
+    /**
+     * 场景缩略图
+     */
+    @TableField("thumb")
+    private String thumb;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 场景logo
+     */
+    @TableField("scene_logo")
+    private String sceneLogo;
+
+    /**
+     * 大场景序号
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 点位视频
+     */
+    @TableField("videos")
+    private String videos;
+
+    /**
+     * 要gps定位
+     */
+    @TableField("gps")
+    private String gps;
+
+    /**
+     * 方案:1-双目,2-转台,3-六目,4-八目,10-获取4k图,11-获取2k,12-获取1k
+     */
+    @TableField("scene_scheme")
+    private Integer sceneScheme;
+
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    @TableField("scene_status")
+    private Integer sceneStatus;
+
+    /**
+     * 算法类型(V2,V3)
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+}

+ 169 - 0
src/main/java/com/fdkankan/repair/entity/SceneProEdit.java

@@ -0,0 +1,169 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * pro场景编辑数据表
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_pro_edit")
+public class SceneProEdit implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * pro场景id
+     */
+    @TableField("pro_id")
+    private Long proId;
+
+    /**
+     * 大场景的密钥
+     */
+    @TableField("scene_key")
+    private String sceneKey;
+
+    /**
+     * 展示页面密码,0不需要,1需要
+     */
+    @TableField("need_key")
+    private Integer needKey;
+
+    /**
+     * 版本
+     */
+    @TableField("version")
+    private Integer version;
+
+    /**
+     * 表示缩略图是否存在
+     */
+    @TableField("thumb_status")
+    private Integer thumbStatus;
+
+    /**
+     * 地面点位标志
+     */
+    @TableField("marker_logo")
+    private String markerLogo;
+
+    /**
+     * 0表示默认,1表示自己上传
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 标记大小
+     */
+    @TableField("floor_logo_size")
+    private Integer floorLogoSize;
+
+    /**
+     * 要上传的热点的id集合,用逗号隔开
+     */
+    @TableField("hots_ids")
+    private String hotsIds;
+
+    /**
+     * 表示初始点信息
+     */
+    @TableField("entry")
+    private String entry;
+
+    /**
+     * 背景音乐名称
+     */
+    @TableField("bg_music")
+    private String bgMusic;
+
+    /**
+     * 普通录屏文件地址
+     */
+    @TableField("screencap_voice_src")
+    private String screencapVoiceSrc;
+
+    /**
+     * 录音文件地址
+     */
+    @TableField("screencap_voice_sound")
+    private String screencapVoiceSound;
+
+    /**
+     * 同步录音地址
+     */
+    @TableField("screencap_voice_soundsync")
+    private String screencapVoiceSoundsync;
+
+    /**
+     * 选择的类型,sound为screencapVoiceSound,file为screencapVoiceSrc,soundsync为screencap_voice_soundsync
+     */
+    @TableField("screencap_voice_type")
+    private String screencapVoiceType;
+
+    /**
+     * 录屏文件地址
+     */
+    @TableField("play_data")
+    private String playData;
+
+    /**
+     * 重新建模的版本
+     */
+    @TableField("floor_edit_ver")
+    private Integer floorEditVer;
+
+    /**
+     * 正式发布重新建模的版本
+     */
+    @TableField("floor_publish_ver")
+    private Integer floorPublishVer;
+
+    /**
+     * 录屏图片存放文件
+     */
+    @TableField("screencap_thumb")
+    private String screencapThumb;
+
+    /**
+     * 分享的logo和生成二维码的logo
+     */
+    @TableField("share_logo")
+    private String shareLogo;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 169 - 0
src/main/java/com/fdkankan/repair/entity/SceneProEditExt.java

@@ -0,0 +1,169 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * pro场景编辑数据表
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_pro_edit_ext")
+public class SceneProEditExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * pro场景编辑数据表id
+     */
+    @TableField("pro_edit_id")
+    private Long proEditId;
+
+    /**
+     * 场景proid
+     */
+    @TableField("pro_id")
+    private Long proId;
+
+    /**
+     * 小地图浏览
+     */
+    @TableField("map_visi")
+    private Integer mapVisi;
+
+    /**
+     * 自动导览
+     */
+    @TableField("tour_visi")
+    private Integer tourVisi;
+
+    /**
+     * vr模式
+     */
+    @TableField("vr_visi")
+    private Integer vrVisi;
+
+    /**
+     * 展示页面是否显示标尺
+     */
+    @TableField("ruler_visi")
+    private Integer rulerVisi;
+
+    /**
+     * 展示页面cad图在平面图是否显示
+     */
+    @TableField("cad_img_visi")
+    private Integer cadImgVisi;
+
+    /**
+     * cad平面图
+     */
+    @TableField("floor_plan_png")
+    private String floorPlanPng;
+
+    /**
+     * cad平面图参数
+     */
+    @TableField("cad_info")
+    private String cadInfo;
+
+    @TableField("pano_visi")
+    private Integer panoVisi;
+
+    @TableField("m2d_visi")
+    private Integer m2dVisi;
+
+    @TableField("m3d_visi")
+    private Integer m3dVisi;
+
+    @TableField("measure_visi")
+    private Integer measureVisi;
+
+    /**
+     * 肖安需求,场景于场景之间的关联
+     */
+    @TableField("link_scene")
+    private String linkScene;
+
+    @TableField("overlay")
+    private String overlay;
+
+    /**
+     * 是否显示底部logo,1显示,0不显示
+     */
+    @TableField("show_logo_bottom")
+    private Boolean showLogoBottom;
+
+    /**
+     * 全景图版本号
+     */
+    @TableField("images_version")
+    private Integer imagesVersion;
+
+    /**
+     * 上传的背景音乐
+     */
+    @TableField("bg_music_name")
+    private String bgMusicName;
+
+    @TableField("jump_scene")
+    private Boolean jumpScene;
+
+    /**
+     * 旋转角度
+     */
+    @TableField("floor_plan_angle")
+    private String floorPlanAngle;
+
+    /**
+     * 场景下载次数
+     */
+    @TableField("download_num")
+    private Integer downloadNum;
+
+    /**
+     * 绿幕抠图json数据
+     */
+    @TableField("videos_user")
+    private String videosUser;
+
+    /**
+     * 大场景序号(随心装场景码)
+     */
+    @TableField("vr_num")
+    private String vrNum;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 154 - 0
src/main/java/com/fdkankan/repair/entity/SceneProExt.java

@@ -0,0 +1,154 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * pro场景表
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_pro_ext")
+public class SceneProExt implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 外键id,t_scene_pro_id
+     */
+    @TableField("scene_pro_id")
+    private Long sceneProId;
+
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 1表示推荐,0表示正常
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 所有资源文件名
+     */
+    @TableField("files_name")
+    private String filesName;
+
+    /**
+     * 算法类型
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 服务器的服务商
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 使用容量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 计算时间(秒为单位)
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 场景来源,相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 全景图加载方式,tiles/1k:1k瓦片图,tiles/2:2k瓦片图,tiles/4k:4k瓦片图,pan:全景图 ,local:本地切片,cube:立体图
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 大场景序号(随心装场景码)
+     */
+    @TableField("vrnum")
+    private String vrnum;
+
+    @TableField("unicode")
+    private String unicode;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * 拍摄数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 相机类型,0表示双目,1四维看看pro,2 四维看看lite,9 双目转台,10 激光转台
+     */
+    @TableField("camera_type")
+    private Integer cameraType;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 74 - 0
src/main/java/com/fdkankan/repair/entity/SceneRepairLog.java

@@ -0,0 +1,74 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景数据迁移日志--V4版本稳定后可删除
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Getter
+@Setter
+@TableName("t_scene_repair_log")
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SceneRepairLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 0-迁移中,1-成功,2-失败
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 失败原因
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 迁移耗时
+     */
+    @TableField("consum_time")
+    private Long consumTime;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 79 - 0
src/main/java/com/fdkankan/repair/entity/SceneResource.java

@@ -0,0 +1,79 @@
+package com.fdkankan.repair.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景资源表
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@Getter
+@Setter
+@TableName("t_scene_resource")
+public class SceneResource implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 权限名称
+     */
+    @TableField("resource_name")
+    private String resourceName;
+
+    /**
+     * 英文名
+     */
+    @TableField("en_name")
+    private String enName;
+
+    /**
+     * 权限key
+     */
+    @TableField("key_word")
+    private String keyWord;
+
+    /**
+     * 权限图标
+     */
+    @TableField("icon")
+    private String icon;
+
+    /**
+     * 资源描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 99 - 0
src/main/java/com/fdkankan/repair/generate/AutoGenerate.java

@@ -0,0 +1,99 @@
+package com.fdkankan.repair.generate;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class AutoGenerate {
+
+
+    public static void main(String[] args) {
+
+        System.out.println("相对路径指定到:"+ System.getProperty("user.dir"));
+
+
+        String path =System.getProperty("user.dir");
+
+        generate(path,"test", getTables(new String[]{
+                "t_scene_plus_ext",
+        }));
+
+//        generate(path,"goods", getTables(new String[]{
+//                        "t_camera","t_camera_detail","t_camera_out","t_camera_space","t_camera_version",
+//                        "t_company","t_goods","t_goods_sku","t_cart","t_goods_spec",
+//                        "t_goods_spec_value","t_goods_spu_spec","t_sn_code"
+//        }));
+//
+//        generate(path,"order", getTables(new String[]{
+//                        "t_increment_order","t_invoice","t_order","t_order_item",
+//                        "t_pre_sale","t_space_sdk","t_trade_log","t_commerce_order","t_download_order","t_expansion_order"
+//        }));
+//        generate(path,"order", getTables(new String[]{
+//                        "t_virtual_order"
+//        }));
+//
+//        generate(path,"user", getTables(new String[]{
+//                        "t_user","t_user_increment","t_manager","t_province","t_increment_type","t_intercom_message","t_receiver_info"
+//        }));
+    }
+
+    public static List<String> getTables(String [] tableNames){
+        return new ArrayList<>(Arrays.asList(tableNames));
+    }
+
+
+    public static void  generate(String path,String moduleName,  List<String> tables){
+        FastAutoGenerator.create("jdbc:mysql://192.168.0.47:13306/4dkankan-center-scene",
+                "root","4dkk2020cuikuan%")
+                .globalConfig(builder -> {
+                    builder.author("")               //作者
+                            .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)
+                            //.enableSwagger()           //开启swagger
+                            .commentDate("yyyy-MM-dd")
+                            .dateType(DateType.ONLY_DATE)
+                            .fileOverride();            //开启覆盖之前生成的文件
+
+                })
+                .packageConfig(builder -> {
+                    builder.parent("com.fdkankan")
+                            .moduleName(moduleName)
+                            .entity("entity")
+                            .service("service")
+                            .serviceImpl("service.impl")
+                            .controller("controller")
+                            .mapper("mapper")
+                            .xml("test.mapper")
+                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,path+"\\src\\main\\resources\\mapper\\"+moduleName));
+                })
+                .strategyConfig(builder -> {
+                    builder.addInclude(tables)
+                            .addTablePrefix("t_")
+
+                            .serviceBuilder()
+                            .formatServiceFileName("I%sService")
+                            .formatServiceImplFileName("%sServiceImpl")
+
+                            .entityBuilder()
+                            .enableLombok()
+//                            .logicDeleteColumnName("tb_status")
+                            .enableTableFieldAnnotation()
+
+                            .controllerBuilder()
+                            .formatFileName("%sController")
+                            .enableRestStyle()
+
+                            .mapperBuilder()
+                            .superClass(BaseMapper.class)
+                            .formatMapperFileName("I%sMapper")
+                            .enableMapperAnnotation()
+                            .formatXmlFileName("%sMapper");
+                })
+                // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
+                .execute();
+    }
+}

+ 53 - 0
src/main/java/com/fdkankan/repair/listener/RabbitMqListener.java

@@ -0,0 +1,53 @@
+package com.fdkankan.repair.listener;
+
+import com.fdkankan.repair.service.ISceneUpgradeToV4Service;
+import com.rabbitmq.client.Channel;
+import java.nio.charset.StandardCharsets;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/19
+ **/
+@Slf4j
+@Component
+public class RabbitMqListener {
+
+    @Value("${queue.scene.upgrade-to-v4}")
+    private String upgradeToV4;
+    @Autowired
+    private ISceneUpgradeToV4Service sceneUpgradeToV4Service;
+
+    /**
+     * 场景计算前置资源准备处理
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+        queuesToDeclare = @Queue("${queue.scene.upgrade-to-v4}")
+//        concurrency = "${maxThread.modeling.modeling-pre}"
+    )
+    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+            String correlationId = message.getMessageProperties().getCorrelationId();
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            log.info("场景升级开始,队列名:{},id:{},消息体:{}", upgradeToV4, correlationId, msg);
+            long sceneProId = Long.parseLong(msg);
+            //迁移数据
+            sceneUpgradeToV4Service.upgrade(sceneProId);
+            log.info("场景升级结束,队列名:{},id:{}", upgradeToV4, correlationId);
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+    }
+
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneEditControlsMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneEditControls;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneEditControlsMapper extends BaseMapper<SceneEditControls> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneEditInfoExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneEditInfoExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneEditInfoExtMapper extends BaseMapper<SceneEditInfoExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneEditInfoMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneEditInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneEditInfoMapper extends BaseMapper<SceneEditInfo> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/IScenePlusExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-30
+ */
+@Mapper
+public interface IScenePlusExtMapper extends BaseMapper<ScenePlusExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneProEditExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneProEditExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * pro场景编辑数据表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneProEditExtMapper extends BaseMapper<SceneProEditExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneProEditMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneProEdit;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * pro场景编辑数据表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneProEditMapper extends BaseMapper<SceneProEdit> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneProExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneProExt;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * pro场景表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneProExtMapper extends BaseMapper<SceneProExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneProMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fdkankan.repair.entity.ScenePro;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * pro场景表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@Mapper
+public interface ISceneProMapper extends BaseMapper<ScenePro> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneRepairLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneRepairLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景数据迁移日志--V4版本稳定后可删除 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Mapper
+public interface ISceneRepairLogMapper extends BaseMapper<SceneRepairLog> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/mapper/ISceneResourceMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.mapper;
+
+import com.fdkankan.repair.entity.SceneResource;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景资源表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@Mapper
+public interface ISceneResourceMapper extends BaseMapper<SceneResource> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneEditControlsService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneEditControls;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneEditControlsService extends IService<SceneEditControls> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneEditInfoExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneEditInfoExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneEditInfoExtService extends IService<SceneEditInfoExt> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneEditInfoService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneEditInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneEditInfoService extends IService<SceneEditInfo> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/IScenePlusExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.ScenePlusExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-30
+ */
+public interface IScenePlusExtService extends IService<ScenePlusExt> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneProEditExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneProEditExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneProEditExtService extends IService<SceneProEditExt> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneProEditService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneProEdit;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneProEditService extends IService<SceneProEdit> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneProExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneProExt;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * pro场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneProExtService extends IService<SceneProExt> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/repair/service/ISceneProService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.repair.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.repair.entity.ScenePro;
+
+/**
+ * <p>
+ * pro场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+public interface ISceneProService extends IService<ScenePro> {
+
+
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneRepairLogService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneRepairLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景数据迁移日志--V4版本稳定后可删除 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+public interface ISceneRepairLogService extends IService<SceneRepairLog> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/repair/service/ISceneResourceService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.repair.service;
+
+import com.fdkankan.repair.entity.SceneResource;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景资源表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+public interface ISceneResourceService extends IService<SceneResource> {
+
+}

+ 15 - 0
src/main/java/com/fdkankan/repair/service/ISceneUpgradeToV4Service.java

@@ -0,0 +1,15 @@
+package com.fdkankan.repair.service;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/21
+ **/
+public interface ISceneUpgradeToV4Service {
+
+    void upgrade(long sceneProId);
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneEditControlsServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneEditControls;
+import com.fdkankan.repair.mapper.ISceneEditControlsMapper;
+import com.fdkankan.repair.service.ISceneEditControlsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneEditControlsServiceImpl extends ServiceImpl<ISceneEditControlsMapper, SceneEditControls> implements ISceneEditControlsService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneEditInfoExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneEditInfoExt;
+import com.fdkankan.repair.mapper.ISceneEditInfoExtMapper;
+import com.fdkankan.repair.service.ISceneEditInfoExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneEditInfoExtServiceImpl extends ServiceImpl<ISceneEditInfoExtMapper, SceneEditInfoExt> implements ISceneEditInfoExtService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneEditInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneEditInfo;
+import com.fdkankan.repair.mapper.ISceneEditInfoMapper;
+import com.fdkankan.repair.service.ISceneEditInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper, SceneEditInfo> implements ISceneEditInfoService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/ScenePlusExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.ScenePlusExt;
+import com.fdkankan.repair.mapper.IScenePlusExtMapper;
+import com.fdkankan.repair.service.IScenePlusExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-30
+ */
+@Service
+public class ScenePlusExtServiceImpl extends ServiceImpl<IScenePlusExtMapper, ScenePlusExt> implements IScenePlusExtService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneProEditExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneProEditExt;
+import com.fdkankan.repair.mapper.ISceneProEditExtMapper;
+import com.fdkankan.repair.service.ISceneProEditExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneProEditExtServiceImpl extends ServiceImpl<ISceneProEditExtMapper, SceneProEditExt> implements ISceneProEditExtService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneProEditServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneProEdit;
+import com.fdkankan.repair.mapper.ISceneProEditMapper;
+import com.fdkankan.repair.service.ISceneProEditService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * pro场景编辑数据表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneProEditServiceImpl extends ServiceImpl<ISceneProEditMapper, SceneProEdit> implements ISceneProEditService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneProExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneProExt;
+import com.fdkankan.repair.mapper.ISceneProExtMapper;
+import com.fdkankan.repair.service.ISceneProExtService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * pro场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneProExtServiceImpl extends ServiceImpl<ISceneProExtMapper, SceneProExt> implements ISceneProExtService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneProServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.ScenePro;
+import com.fdkankan.repair.mapper.ISceneProMapper;
+import com.fdkankan.repair.service.ISceneProService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * pro场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@Service
+public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneRepairLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneRepairLog;
+import com.fdkankan.repair.mapper.ISceneRepairLogMapper;
+import com.fdkankan.repair.service.ISceneRepairLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 场景数据迁移日志--V4版本稳定后可删除 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-24
+ */
+@Service
+public class SceneRepairLogServiceImpl extends ServiceImpl<ISceneRepairLogMapper, SceneRepairLog> implements ISceneRepairLogService {
+
+}

+ 475 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneRepairService.java

@@ -0,0 +1,475 @@
+package com.fdkankan.repair.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.SceneFrom;
+import com.fdkankan.common.constant.SceneResolution;
+import com.fdkankan.common.constant.SceneSource;
+import com.fdkankan.common.constant.UploadFilePath;
+import com.fdkankan.common.util.FileUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.repair.bean.SceneEditControlsBean;
+import com.fdkankan.repair.bean.SceneJsonBean;
+import com.fdkankan.repair.entity.SceneEditControls;
+import com.fdkankan.repair.entity.SceneEditInfo;
+import com.fdkankan.repair.entity.SceneEditInfoExt;
+import com.fdkankan.repair.entity.ScenePlusExt;
+import com.fdkankan.repair.entity.ScenePro;
+import com.fdkankan.repair.entity.SceneProEdit;
+import com.fdkankan.repair.entity.SceneProEditExt;
+import com.fdkankan.repair.entity.SceneProExt;
+import com.fdkankan.repair.entity.SceneRepairLog;
+import com.fdkankan.repair.service.ISceneEditControlsService;
+import com.fdkankan.repair.service.ISceneEditInfoExtService;
+import com.fdkankan.repair.service.ISceneEditInfoService;
+import com.fdkankan.repair.service.IScenePlusExtService;
+import com.fdkankan.repair.service.ISceneProEditExtService;
+import com.fdkankan.repair.service.ISceneProEditService;
+import com.fdkankan.repair.service.ISceneProExtService;
+import com.fdkankan.repair.service.ISceneProService;
+import com.fdkankan.repair.service.ISceneRepairLogService;
+import java.io.File;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import sun.rmi.runtime.Log;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/23
+ **/
+@Slf4j
+@Service
+public class SceneRepairService {
+
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Value("${scene.pro.new.url}")
+    private String sceneProNewUrl;
+
+    @Value("${oss.prefix.url}")
+    private String ossUrlPrefix;
+
+    @Autowired
+    private ISceneProExtService sceneProExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+    @Autowired
+    private ISceneProEditExtService sceneProEditExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+    @Autowired
+    private ISceneRepairLogService sceneRepairLogService;
+    @Value("${oss.bucket:4dkankan}")
+    private String bucket;
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+
+
+    /**
+     * 当前正在执行的线程数
+     */
+    private int currentThreadCnt = 0;
+    @Autowired
+    private UploadToOssUtil uploadToOssUtil;
+    @Value("${upload.type:oss}")
+    private String uploadType;
+
+    private static final String[] prefixArr = new String[]{
+        "data/data%s/",
+        "voice/voice%s/",
+        "video/video%s/",
+        "images/images%s/"
+    };
+
+    @Async("sceneDownLoadExecutror")
+    public void repair(ScenePro scenePro) throws Exception {
+        //线程开始,正在执行线程数+1
+        this.addCurrentThreadCnt();
+        String num = scenePro.getNum();
+        long consumTime = 0;
+        long startTime = Calendar.getInstance().getTimeInMillis();
+        SceneRepairLog sceneRepairLog = null;
+        try {
+
+            sceneRepairLog = sceneRepairLogService.getOne(new LambdaQueryWrapper<SceneRepairLog>().eq(SceneRepairLog::getNum, num));
+            if(sceneRepairLog == null){
+                sceneRepairLog = SceneRepairLog.builder()
+                    .num(scenePro.getNum())
+                    .reason("")
+                    .state(0).build();
+            }else{
+                sceneRepairLog.setReason("");
+                sceneRepairLog.setState(0);
+            }
+            //写入日志
+            sceneRepairLogService.saveOrUpdate(sceneRepairLog);
+
+            SceneProExt sceneProExt = sceneProExtService.getOne(
+                new LambdaQueryWrapper<SceneProExt>()
+                    .eq(SceneProExt::getSceneProId, scenePro.getId()));
+            SceneProEdit sceneProEdit = sceneProEditService.getOne(
+                new LambdaQueryWrapper<SceneProEdit>()
+                    .eq(SceneProEdit::getProId, scenePro.getId()));
+            SceneProEditExt sceneProEditExt = sceneProEditExtService
+                .getOne(new LambdaQueryWrapper<SceneProEditExt>()
+                    .eq(SceneProEditExt::getProEditId, sceneProEdit.getId()));
+
+            String path = sceneProExt.getDataSource();
+
+            System.out.println("开始处理场景:" + num);
+
+            //oss文件拷贝
+            String dataPath = String.format("data/data%s/", num);
+            String imagePath = String.format("images/images%s/", num);
+            String videoPath = String.format("video/video%s/", num);
+            String voicePath = String.format("voice/voice%s/", num);
+            String dataViewPath = String.format("scene_view_data/%s/data/", num);
+            String imageViewPath = String.format("scene_view_data/%s/images/", num);
+            String videoViewPath = String.format("scene_view_data/%s/video/", num);
+            String voiceViewPath = String.format("scene_view_data/%s/voice/", num);
+            uploadToOssUtil.copyFiles(dataPath, dataViewPath);
+            uploadToOssUtil.copyFiles(imagePath, imageViewPath);
+            uploadToOssUtil.copyFiles(videoPath, videoViewPath);
+            uploadToOssUtil.copyFiles(voicePath, voiceViewPath);
+
+            //全景图上传、球幕视频
+            Map<String, String> map = new HashMap<>();
+            String sceneNumPAth = String.format("scene/%s", num);
+            List<String> imagesList = FileUtil.getFileList(path + "/caches/images");
+            if(CollUtil.isNotEmpty(imagesList)){
+                imagesList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+            }
+            List<String> videosList = FileUtil.getFileList(path + "/caches/videos");
+            if(CollUtil.isNotEmpty(videosList)){
+                videosList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+            }
+            uploadToOssUtil.uploadMulFiles(map);
+
+            //拷贝模型文件到用户编辑目录
+            String editImagesPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
+            String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+            String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
+            String viewDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
+            Map<String, String> map2 = new HashMap<>();
+            map2.put(editImagesPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
+            map2.put(editImagesPath + "vision2.modeldata", viewImagesPath + "vision2.modeldata");
+            map2.put(editDataPath + "floorplan_cad.json", viewDataPath + "floorplan_cad.json");
+            for (Entry<String, String> entry : map2.entrySet()) {
+                uploadToOssUtil.copyFiles(entry.getValue(), entry.getKey());
+            }
+
+            //生成二维码
+            String sceneUrl = mainUrl + "/" + sceneProNewUrl;
+            String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + ".png";
+            String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + "_en.png";
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + num, outPathZh, false,null);
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + num + "&lang=en", outPathEn, false, null);
+            uploadToOssUtil.upload(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
+            uploadToOssUtil.upload(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
+
+            //生成热点json文件
+            Integer tags =  Integer.parseInt(CommonStatus.NO.code().toString());
+            Set<String> icons = new HashSet<>();
+            String hotJson = uploadToOssUtil.getObjectContent("4dkankan", dataPath + "hot.json");
+            JSONArray newHotArr = new JSONArray();
+            if(StrUtil.isNotBlank(hotJson)){
+                JSONArray hotArr = JSON.parseArray(hotJson);
+                if(hotArr.size() > 0){
+                    tags = Integer.parseInt(CommonStatus.YES.code().toString());
+                    for(int i=0; i < hotArr.size(); i++){
+                        JSONObject oldHot = (JSONObject)hotArr.get(i);
+                        String styleId = oldHot.getString("styleId");
+
+                        JSONObject newHot = new JSONObject();
+                        newHot.put("createTime", Calendar.getInstance().getTimeInMillis() + i);
+                        newHot.put("icon", styleId);
+
+                        newHot.put("position", oldHot.getJSONObject("position"));
+
+                        JSONObject media = new JSONObject();
+                        newHot.put("media", media);
+                        JSONObject fileName = oldHot.getJSONObject("fileName");
+                        Set<Entry<String, Object>> entries = null;
+                        if(fileName != null){
+                            entries = fileName.entrySet();
+                        }
+                        if(CollUtil.isNotEmpty(entries)){
+                            for (Entry<String, Object> entry : entries) {
+                                JSONArray arr = new JSONArray();
+                                media.put(entry.getKey(), arr);
+                                JSONObject o = new JSONObject();
+                                arr.add(o);
+                                String fileSrc = ((String) entry.getValue());
+                                o.put("src", oldHot.getString("sid") + fileSrc.substring(fileSrc.lastIndexOf(".")));
+                                o.put("name", fileSrc);
+                            }
+                        }
+                        newHot.put("type", oldHot.getString("mediaType"));
+                        newHot.put("title", oldHot.getString("label"));
+                        newHot.put("content", oldHot.getString("description"));
+                        newHot.put("sid", oldHot.getString("sid"));
+
+                        if(StrUtil.isNotBlank(styleId)){
+                            icons.add(styleId);
+                        }
+
+                    }
+                }
+                String hotJsonEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "hot.json";
+                String hotJsonViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num) + "hot.json";
+                uploadToOssUtil.upload(hotJson.getBytes(), hotJsonEditPath);
+                uploadToOssUtil.upload(hotJson.getBytes(), hotJsonViewPath);
+
+                //写到本地文件
+                JSONObject localObject = new JSONObject();
+                localObject.put("tags", newHotArr);
+                localObject.put("icons", icons);
+                String hotJsonPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num) + "hot.json";
+                FileUtils.writeFile(hotJsonPath, localObject.toJSONString());
+            }
+
+            boolean existLoadingLogo = false;
+            //生成编辑表
+            SceneEditInfo sceneEditInfo = sceneEditInfoService.getOne(
+                new LambdaQueryWrapper<SceneEditInfo>()
+                    .eq(SceneEditInfo::getSceneProId, scenePro.getId()));
+            SceneEditInfoExt sceneEditInfoExt = null;
+            SceneEditControls sceneEditControls = null;
+            if(sceneEditInfo == null){
+
+                List<String> loadingLogoFile = uploadToOssUtil.listKeys(imagePath + "logo-main.png");
+                if(CollUtil.isNotEmpty(loadingLogoFile)){
+                    existLoadingLogo = true;
+                }
+
+                sceneEditInfo = new SceneEditInfo();
+                sceneEditInfo.setSceneProId(scenePro.getId());
+                sceneEditInfo.setScenePlusId(scenePro.getId());
+                sceneEditInfo.setFloorLogo(sceneProEdit.getFloorLogo());
+                sceneEditInfo.setFloorLogoSize(sceneProEdit.getFloorLogoSize());
+                sceneEditInfo.setFloorLogoFile("user".equals(sceneProEdit.getFloorLogo()) ? "floorLogo-user.png" : null);    //floorLogoImg.png -> floorLogo-user.png
+                sceneEditInfo.setMusic(sceneProEdit.getBgMusic());
+                //如果bgmusicname 不为空  ,MusicFile = BgMusicName
+                if(StrUtil.isNotEmpty(sceneProEditExt.getBgMusicName())){
+                    sceneEditInfo.setMusicFile(sceneProEditExt.getBgMusicName());
+                }
+                //bgmusic=user, music=musicfile
+                if("user".equals(sceneProEdit.getBgMusic())){
+                    sceneEditInfo.setMusic(sceneEditInfo.getMusicFile());
+                }
+                sceneEditInfo.setScenePassword(sceneProEdit.getSceneKey());
+                sceneEditInfo.setTitle(scenePro.getSceneName());
+                sceneEditInfo.setDescription(scenePro.getSceneDec());
+                sceneEditInfo.setFloorPlanUser(sceneProEdit.getFloorLogo() == null ? 0 : Integer.parseInt(sceneProEdit.getFloorLogo()));
+                sceneEditInfo.setCadInfo(sceneProEditExt.getCadInfo());
+                sceneEditInfo.setTags(tags);
+                sceneEditInfo.setVersion(sceneProEdit.getVersion());
+                sceneEditInfo.setIsUploadObj(Integer.parseInt(CommonStatus.NO.code().toString()));
+                sceneEditInfo.setFloorEditVer(sceneProEdit.getFloorEditVer());
+                sceneEditInfo.setFloorPublishVer(sceneProEdit.getFloorPublishVer());
+                sceneEditInfo.setBoxVideos(sceneProEditExt.getOverlay());
+                sceneEditInfo.setEntry(sceneProEdit.getEntry());
+                sceneEditInfo.setLoadingLogo(existLoadingLogo ? "user" : null);
+                sceneEditInfo.setLoadingLogoFile(existLoadingLogo ? "loadingLogo-user.png" : null);
+                sceneEditInfo.setCreateTime(sceneProEdit.getCreateTime());
+                sceneEditInfo.setUpdateTime(sceneProEdit.getUpdateTime());
+                sceneEditInfo.setTbStatus(sceneProEdit.getTbStatus());
+                sceneEditInfoService.save(sceneEditInfo);
+
+                sceneEditInfoExt = new SceneEditInfoExt();
+                sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+                sceneEditInfoExt.setSceneProId(scenePro.getId());
+                sceneEditInfoExt.setScenePlusId(scenePro.getId());
+                sceneEditInfoExt.setFloorPlanAngle(sceneProEditExt.getFloorPlanAngle() == null ? 0f : Float.parseFloat(sceneProEditExt.getFloorPlanAngle()));
+                sceneEditInfoExt.setFloorPlanCompass(this.getFloorPlanCompass(num));
+                sceneEditInfoExt.setVrNum(sceneProEditExt.getVrNum());
+                sceneEditInfoExt.setCreateTime(sceneEditInfo.getCreateTime());
+                sceneEditInfoExt.setUpdateTime(sceneEditInfo.getUpdateTime());
+                sceneEditInfoExt.setTbStatus(sceneEditInfo.getTbStatus());
+                sceneEditInfoExtService.save(sceneEditInfoExt);
+
+                sceneEditControls = new SceneEditControls();
+                sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+                sceneEditControls.setShowMap(sceneProEditExt.getMapVisi());
+                sceneEditControls.setShowLock(sceneProEdit.getNeedKey());
+                sceneEditControls.setShowTitle(Integer.valueOf(CommonStatus.YES.code()));
+                sceneEditControls.setShowPanorama(sceneProEditExt.getPanoVisi());
+                sceneEditControls.setShowDollhouse(sceneProEditExt.getM3dVisi());
+                sceneEditControls.setShowFloorplan(sceneProEditExt.getM2dVisi());
+                sceneEditControls.setShowVr(sceneProEditExt.getVrVisi());
+                sceneEditControls.setShowTour(sceneProEditExt.getTourVisi());
+                sceneEditControls.setShowRule(sceneProEditExt.getRulerVisi());
+                sceneEditControls.setCreateTime(sceneEditInfo.getCreateTime());
+                sceneEditControls.setUpdateTime(sceneEditInfo.getUpdateTime());
+                sceneEditControls.setTbStatus(sceneEditInfo.getTbStatus());
+                sceneEditControlsService.save(sceneEditControls);
+            }else{
+                sceneEditInfoExt = sceneEditInfoExtService.getOne(
+                    new LambdaQueryWrapper<SceneEditInfoExt>()
+                        .eq(SceneEditInfoExt::getEditInfoId, sceneEditInfo.getId()));
+                sceneEditControls = sceneEditControlsService.getOne(
+                    new LambdaQueryWrapper<SceneEditControls>()
+                        .eq(SceneEditControls::getEditInfoId, sceneEditInfo.getId()));
+            }
+
+            //根据编辑表 上传用户目录  包括编辑目录 查看目录
+            String editUsersPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
+            String viewUsersPath = String.format(UploadFilePath.USER_VIEW_PATH, num);
+            if("user".equals(sceneProEdit.getFloorLogo())){
+                uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", editUsersPath + "floorLogo-user.png");
+                uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", viewUsersPath + "floorLogo-user.png");
+            }
+            if("user".equals(sceneProEdit.getBgMusic())){
+                uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), editUsersPath + "music-user.mp3");
+                uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), viewUsersPath + "music-user.mp3");
+            }
+            if(existLoadingLogo){
+                uploadToOssUtil.copyFiles(imagePath + "logo-main.png", editUsersPath + "loadingLogo-user.png");
+                uploadToOssUtil.copyFiles(imagePath + "logo-main.png", viewUsersPath + "loadingLogo-user.png");
+            }
+            if(StrUtil.isNotEmpty(scenePro.getThumb())
+                && scenePro.getThumb().contains(imagePath)){
+                String thumbUrl = null;
+                if(scenePro.getThumb().contains("thumbSmallImg.jpg")){
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-1k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-1k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-2k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-2k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", editUsersPath + "thumb-128.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", viewUsersPath + "thumb-128.jpg");
+                    thumbUrl = this.ossUrlPrefix + String.format(UploadFilePath.USER_VIEW_PATH, num) + "thumb-128.jpg";
+                }else{
+                    thumbUrl = scenePro.getThumb().replace(imagePath, viewImagesPath);
+                }
+
+                scenePro.setThumb(thumbUrl);
+                sceneProService.updateById(scenePro);
+
+                ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
+                    new LambdaQueryWrapper<ScenePlusExt>()
+                        .eq(ScenePlusExt::getPlusId, scenePro.getId()));
+                scenePlusExt.setThumb(thumbUrl);
+                scenePlusExtService.updateById(scenePlusExt);
+            }
+            if(StrUtil.isNotEmpty(sceneEditInfo.getBoxVideos())){
+                JSONArray boxVideoArr = JSON.parseArray(sceneEditInfo.getBoxVideos());
+                for(int i = 0; i < boxVideoArr.size(); i++){
+                    JSONObject boxVideo = boxVideoArr.getJSONObject(i);
+                    String sid = boxVideo.getString("sid");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", editUsersPath + sid + ".mp4");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", viewUsersPath + sid + ".mp4");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", editUsersPath + sid + ".flv");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", viewUsersPath + sid + ".flv");
+                }
+            }
+
+
+            //生成scene.json
+//        生成新的scene.json,上传至scene_view_data/<num>/data
+            SceneJsonBean sceneJson = new SceneJsonBean();
+            BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
+            BeanUtil.copyProperties(sceneEditInfo, sceneJson);
+            SceneEditControlsBean sceneEditControlsBean = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsBean.class);
+            sceneJson.setControls(sceneEditControlsBean);
+            sceneJson.setNum(num);
+            sceneJson.setCreateTime(scenePro.getCreateTime());
+            sceneJson.setSceneResolution(sceneProExt.getSceneResolution());
+            sceneJson.setSceneFrom(sceneProExt.getSceneFrom());
+            if(StrUtil.isNotEmpty(scenePro.getVideos())){
+                sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
+            }
+            //本地写sceneJson文件
+            String localSceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, num);
+            FileUtils.writeFile(localSceneJsonPath, JSON.toJSONString(sceneJson));
+            //上传sceneJson文件
+            String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
+            uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
+
+            //迁移耗时
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+
+            //记录日志
+            sceneRepairLog.setState(1);
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+
+            System.out.println(Thread.currentThread().getName());
+            Thread.sleep(20000);
+
+
+            System.out.println("处理场景结束:" + num);
+        }catch (Exception e){
+            log.error(e.getMessage(), e);
+            //记录日志
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+            sceneRepairLog.setState(2);
+            sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+        }finally {
+            //线程结束,正在执行线程数-1
+            this.decCurrentThreadCnt();
+        }
+    }
+
+    private Float getFloorPlanCompass(String num){
+        String objectContent =
+            uploadToOssUtil.getObjectContent(bucket, "data/data" + num + "/houst_floor.json");
+        if(StrUtil.isEmpty(objectContent)){
+            return null;
+        }
+        JSONObject jsonObject = JSON.parseObject(objectContent);
+        JSONArray floors = jsonObject.getJSONArray("floors");
+        if(CollUtil.isEmpty(floors)){
+            return null;
+        }
+        Object o = floors.get(0);
+        JSONObject object = (JSONObject)o;
+        return object.getFloat("dire");
+    }
+
+    public int getCurrentThreadCnt(){
+        return this.currentThreadCnt;
+    }
+
+    public synchronized void addCurrentThreadCnt(){
+        ++this.currentThreadCnt;
+    }
+
+    public synchronized void decCurrentThreadCnt(){
+        --this.currentThreadCnt;
+    }
+
+}

+ 20 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneResourceServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.repair.service.impl;
+
+import com.fdkankan.repair.entity.SceneResource;
+import com.fdkankan.repair.mapper.ISceneResourceMapper;
+import com.fdkankan.repair.service.ISceneResourceService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 场景资源表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-03-23
+ */
+@Service
+public class SceneResourceServiceImpl extends ServiceImpl<ISceneResourceMapper, SceneResource> implements ISceneResourceService {
+
+}

+ 468 - 0
src/main/java/com/fdkankan/repair/service/impl/SceneUpgradeToV4Service.java

@@ -0,0 +1,468 @@
+package com.fdkankan.repair.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fasterxml.jackson.databind.annotation.JsonAppend.Prop;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.UploadFilePath;
+import com.fdkankan.common.util.FileUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.repair.bean.SceneEditControlsBean;
+import com.fdkankan.repair.bean.SceneJsonBean;
+import com.fdkankan.repair.bean.SceneUpgradeProgressBean;
+import com.fdkankan.repair.constant.ProgressStatus;
+import com.fdkankan.repair.entity.SceneEditControls;
+import com.fdkankan.repair.entity.SceneEditInfo;
+import com.fdkankan.repair.entity.SceneEditInfoExt;
+import com.fdkankan.repair.entity.ScenePlusExt;
+import com.fdkankan.repair.entity.ScenePro;
+import com.fdkankan.repair.entity.SceneProEdit;
+import com.fdkankan.repair.entity.SceneProEditExt;
+import com.fdkankan.repair.entity.SceneProExt;
+import com.fdkankan.repair.entity.SceneRepairLog;
+import com.fdkankan.repair.service.ISceneEditControlsService;
+import com.fdkankan.repair.service.ISceneEditInfoExtService;
+import com.fdkankan.repair.service.ISceneEditInfoService;
+import com.fdkankan.repair.service.IScenePlusExtService;
+import com.fdkankan.repair.service.ISceneProEditExtService;
+import com.fdkankan.repair.service.ISceneProEditService;
+import com.fdkankan.repair.service.ISceneProExtService;
+import com.fdkankan.repair.service.ISceneProService;
+import com.fdkankan.repair.service.ISceneRepairLogService;
+import com.fdkankan.repair.service.ISceneUpgradeToV4Service;
+import java.io.File;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/21
+ **/
+@Slf4j
+@Service
+public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
+
+    @Value("${main.url}")
+    private String mainUrl;
+    @Value("${scene.pro.new.url}")
+    private String sceneProNewUrl;
+    @Value("${oss.prefix.url}")
+    private String ossUrlPrefix;
+
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneProExtService sceneProExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+    @Autowired
+    private ISceneProEditExtService sceneProEditExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+    @Autowired
+    private ISceneRepairLogService sceneRepairLogService;
+    @Value("${oss.bucket:4dkankan}")
+    private String bucket;
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private UploadToOssUtil uploadToOssUtil;
+    @Autowired
+    RedisUtil redisUtil;
+
+    private static final String[] prefixArr = new String[]{
+        "data/data%s/",
+        "voice/voice%s/",
+        "video/video%s/",
+        "images/images%s/"
+    };
+
+    @Override
+    public void upgrade(long sceneProId){
+
+        ScenePro scenePro = sceneProService.getById(sceneProId);
+        //线程开始,正在执行线程数+1
+        String num = scenePro.getNum();
+        String dataPath = String.format("data/data%s/", num);
+        String imagePath = String.format("images/images%s/", num);
+        String videoPath = String.format("video/video%s/", num);
+        String voicePath = String.format("voice/voice%s/", num);
+        String dataViewPath = String.format("scene_view_data/%s/data/", num);
+        String imageViewPath = String.format("scene_view_data/%s/images/", num);
+        String videoViewPath = String.format("scene_view_data/%s/video/", num);
+        String voiceViewPath = String.format("scene_view_data/%s/voice/", num);
+        long consumTime = 0;
+        long startTime = Calendar.getInstance().getTimeInMillis();
+        SceneRepairLog sceneRepairLog = null;
+        try {
+            sceneRepairLog = sceneRepairLogService.getOne(new LambdaQueryWrapper<SceneRepairLog>().eq(SceneRepairLog::getNum, num));
+            if(sceneRepairLog == null){
+                sceneRepairLog = SceneRepairLog.builder()
+                    .num(scenePro.getNum())
+                    .reason("")
+                    .state(0).build();
+            }else{
+                sceneRepairLog.setReason("");
+                sceneRepairLog.setState(0);
+            }
+            //写入日志
+            sceneRepairLogService.saveOrUpdate(sceneRepairLog);
+
+            SceneProExt sceneProExt = sceneProExtService.getOne(
+                new LambdaQueryWrapper<SceneProExt>()
+                    .eq(SceneProExt::getSceneProId, scenePro.getId()));
+            SceneProEdit sceneProEdit = sceneProEditService.getOne(
+                new LambdaQueryWrapper<SceneProEdit>()
+                    .eq(SceneProEdit::getProId, scenePro.getId()));
+            SceneProEditExt sceneProEditExt = sceneProEditExtService
+                .getOne(new LambdaQueryWrapper<SceneProEditExt>()
+                    .eq(SceneProEditExt::getProEditId, sceneProEdit.getId()));
+
+            String path = sceneProExt.getDataSource();
+
+            //生成热点json文件
+            Integer tags =  Integer.valueOf(CommonStatus.NO.code());
+            Set<String> icons = new HashSet<>();
+            String hotJson = uploadToOssUtil.getObjectContent("4dkankan", dataPath + "hot.json");
+            JSONArray newHotArr = new JSONArray();
+            if(StrUtil.isNotBlank(hotJson)){
+                JSONArray hotArr = JSON.parseArray(hotJson);
+                if(hotArr.size() > 0){
+                    tags = Integer.valueOf(CommonStatus.YES.code());
+                    for(int i=0; i < hotArr.size(); i++){
+                        JSONObject oldHot = (JSONObject)hotArr.get(i);
+                        String styleId = oldHot.getString("styleId");
+
+                        JSONObject newHot = new JSONObject();
+                        newHot.put("createTime", Calendar.getInstance().getTimeInMillis() + i);
+                        newHot.put("icon", styleId);
+
+                        newHot.put("position", oldHot.getJSONObject("position"));
+
+                        JSONObject media = new JSONObject();
+                        newHot.put("media", media);
+                        JSONObject fileName = oldHot.getJSONObject("fileName");
+                        Set<Entry<String, Object>> entries = null;
+                        if(fileName != null){
+                            entries = fileName.entrySet();
+                        }
+                        if(CollUtil.isNotEmpty(entries)){
+                            for (Entry<String, Object> entry : entries) {
+                                JSONArray arr = new JSONArray();
+                                media.put(entry.getKey(), arr);
+                                JSONObject o = new JSONObject();
+                                arr.add(o);
+                                String fileSrc = ((String) entry.getValue());
+                                o.put("src", oldHot.getString("sid") + fileSrc.substring(fileSrc.lastIndexOf(".")));
+                                o.put("name", fileSrc);
+                            }
+                        }
+                        newHot.put("type", oldHot.getString("mediaType"));
+                        newHot.put("title", oldHot.getString("label"));
+                        newHot.put("content", oldHot.getString("description"));
+                        newHot.put("sid", oldHot.getString("sid"));
+
+                        if(StrUtil.isNotBlank(styleId)){
+                            icons.add(styleId);
+                        }
+
+                    }
+                }
+                String hotJsonEditPath = String.format(UploadFilePath.USER_EDIT_PATH, num) + "hot.json";
+                String hotJsonViewPath = String.format(UploadFilePath.USER_VIEW_PATH, num) + "hot.json";
+                uploadToOssUtil.upload(hotJson.getBytes(), hotJsonEditPath);
+                uploadToOssUtil.upload(hotJson.getBytes(), hotJsonViewPath);
+
+                //写到本地文件
+                JSONObject localObject = new JSONObject();
+                localObject.put("tags", newHotArr);
+                localObject.put("icons", icons);
+                String hotJsonPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num) + "hot.json";
+                FileUtils.writeFile(hotJsonPath, localObject.toJSONString());
+            }
+
+            boolean existLoadingLogo = false;
+            //生成编辑表
+            SceneEditInfo sceneEditInfo = sceneEditInfoService.getOne(
+                new LambdaQueryWrapper<SceneEditInfo>()
+                    .eq(SceneEditInfo::getSceneProId, scenePro.getId()));
+            SceneEditInfoExt sceneEditInfoExt = null;
+            SceneEditControls sceneEditControls = null;
+            if(sceneEditInfo == null){
+
+                List<String> loadingLogoFile = uploadToOssUtil.listKeys(imagePath + "logo-main.png");
+                if(CollUtil.isNotEmpty(loadingLogoFile)){
+                    existLoadingLogo = true;
+                }
+
+                sceneEditInfo = new SceneEditInfo();
+                sceneEditInfo.setSceneProId(scenePro.getId());
+                sceneEditInfo.setScenePlusId(scenePro.getId());
+                sceneEditInfo.setFloorLogo(sceneProEdit.getFloorLogo());
+                sceneEditInfo.setFloorLogoSize(sceneProEdit.getFloorLogoSize());
+                sceneEditInfo.setFloorLogoFile("user".equals(sceneProEdit.getFloorLogo()) ? "floorLogo-user.png" : null);    //floorLogoImg.png -> floorLogo-user.png
+                sceneEditInfo.setMusic(sceneProEdit.getBgMusic());
+                //如果bgmusicname 不为空  ,MusicFile = BgMusicName
+                if(StrUtil.isNotEmpty(sceneProEditExt.getBgMusicName())){
+                    sceneEditInfo.setMusicFile(sceneProEditExt.getBgMusicName());
+                }
+                //bgmusic=user, music=musicfile
+                if("user".equals(sceneProEdit.getBgMusic())){
+                    sceneEditInfo.setMusic(sceneEditInfo.getMusicFile());
+                }
+                sceneEditInfo.setScenePassword(sceneProEdit.getSceneKey());
+                sceneEditInfo.setTitle(scenePro.getSceneName());
+                sceneEditInfo.setDescription(scenePro.getSceneDec());
+                sceneEditInfo.setFloorPlanUser(sceneProEdit.getFloorLogo() == null ? 0 : Integer.valueOf(sceneProEdit.getFloorLogo()));
+                sceneEditInfo.setTags(tags);
+                sceneEditInfo.setVersion(sceneProEdit.getVersion());
+                sceneEditInfo.setIsUploadObj(Integer.parseInt(CommonStatus.NO.code().toString()));
+                sceneEditInfo.setFloorEditVer(sceneProEdit.getFloorEditVer());
+                sceneEditInfo.setFloorPublishVer(sceneProEdit.getFloorPublishVer());
+                sceneEditInfo.setBoxVideos(sceneProEditExt.getOverlay());
+                sceneEditInfo.setEntry(sceneProEdit.getEntry());
+                sceneEditInfo.setLoadingLogo(existLoadingLogo ? "user" : null);
+                sceneEditInfo.setLoadingLogoFile(existLoadingLogo ? "loadingLogo-user.png" : null);
+                sceneEditInfo.setCreateTime(sceneProEdit.getCreateTime());
+                sceneEditInfo.setUpdateTime(sceneProEdit.getUpdateTime());
+                sceneEditInfo.setTbStatus(sceneProEdit.getTbStatus());
+                sceneEditInfoService.save(sceneEditInfo);
+
+                sceneEditInfoExt = new SceneEditInfoExt();
+                sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+                sceneEditInfoExt.setSceneProId(scenePro.getId());
+                sceneEditInfoExt.setScenePlusId(scenePro.getId());
+                sceneEditInfoExt.setFloorPlanAngle(sceneProEditExt.getFloorPlanAngle() == null ? 0f : Float.parseFloat(sceneProEditExt.getFloorPlanAngle()));
+                sceneEditInfoExt.setFloorPlanCompass(this.getFloorPlanCompass(num));
+                sceneEditInfoExt.setVrNum(sceneProEditExt.getVrNum());
+                sceneEditInfoExt.setCreateTime(sceneEditInfo.getCreateTime());
+                sceneEditInfoExt.setUpdateTime(sceneEditInfo.getUpdateTime());
+                sceneEditInfoExt.setTbStatus(sceneEditInfo.getTbStatus());
+                sceneEditInfoExtService.save(sceneEditInfoExt);
+
+                sceneEditControls = new SceneEditControls();
+                sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+                sceneEditControls.setShowMap(sceneProEditExt.getMapVisi());
+                sceneEditControls.setShowLock(sceneProEdit.getNeedKey());
+                sceneEditControls.setShowTitle(Integer.valueOf(CommonStatus.YES.code()));
+                sceneEditControls.setShowPanorama(sceneProEditExt.getPanoVisi());
+                sceneEditControls.setShowDollhouse(sceneProEditExt.getM3dVisi());
+                sceneEditControls.setShowFloorplan(sceneProEditExt.getM2dVisi());
+                sceneEditControls.setShowVR(sceneProEditExt.getVrVisi());
+                sceneEditControls.setShowTour(sceneProEditExt.getTourVisi());
+                sceneEditControls.setShowRule(sceneProEditExt.getRulerVisi());
+                sceneEditControls.setCreateTime(sceneEditInfo.getCreateTime());
+                sceneEditControls.setUpdateTime(sceneEditInfo.getUpdateTime());
+                sceneEditControls.setTbStatus(sceneEditInfo.getTbStatus());
+                sceneEditControlsService.save(sceneEditControls);
+            }else{
+                sceneEditInfoExt = sceneEditInfoExtService.getOne(
+                    new LambdaQueryWrapper<SceneEditInfoExt>()
+                        .eq(SceneEditInfoExt::getEditInfoId, sceneEditInfo.getId()));
+                sceneEditControls = sceneEditControlsService.getOne(
+                    new LambdaQueryWrapper<SceneEditControls>()
+                        .eq(SceneEditControls::getEditInfoId, sceneEditInfo.getId()));
+            }
+
+            //完成数据库操作更新进度条为10
+            this.updateProgress(num, 10, ProgressStatus.SUCESS_DB.code());
+
+            //oss文件拷贝
+            uploadToOssUtil.copyFiles(dataPath, dataViewPath);
+            uploadToOssUtil.copyFiles(imagePath, imageViewPath);
+            uploadToOssUtil.copyFiles(videoPath, videoViewPath);
+            uploadToOssUtil.copyFiles(voicePath, voiceViewPath);
+
+            //全景图上传、球幕视频
+            Map<String, String> map = new HashMap<>();
+            String sceneNumPAth = String.format("scene/%s", num);
+            List<String> imagesList = FileUtil.getFileList(path + "/caches/images");
+            if(CollUtil.isNotEmpty(imagesList)){
+                imagesList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+            }
+//            List<String> videosList = FileUtil.getFileList(path + "/caches/videos");
+//            if(CollUtil.isNotEmpty(videosList)){
+//                videosList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+//            }
+//            uploadToOssUtil.uploadMulFiles(map);
+
+            //拷贝模型文件到用户编辑目录
+            String editImagesPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
+            String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+            String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
+            String viewDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
+            Map<String, String> map2 = new HashMap<>();
+            map2.put(editImagesPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
+            map2.put(editImagesPath + "vision2.modeldata", viewImagesPath + "vision2.modeldata");
+            map2.put(editDataPath + "floorplan_cad.json", viewDataPath + "floorplan_cad.json");
+            for (Entry<String, String> entry : map2.entrySet()) {
+                uploadToOssUtil.copyFiles(entry.getValue(), entry.getKey());
+            }
+
+            //生成二维码
+            String sceneUrl = mainUrl + "/" + sceneProNewUrl;
+            String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + ".png";
+            String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + num + "_en.png";
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + num, outPathZh, false,null);
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + num + "&lang=en", outPathEn, false, null);
+            uploadToOssUtil.upload(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + ".png");
+            uploadToOssUtil.upload(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, num) + num + "_en.png");
+
+            //根据编辑表 上传用户目录  包括编辑目录 查看目录
+            String editUsersPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
+            String viewUsersPath = String.format(UploadFilePath.USER_VIEW_PATH, num);
+            if("user".equals(sceneProEdit.getFloorLogo())){
+                uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", editUsersPath + "floorLogo-user.png");
+                uploadToOssUtil.copyFiles(imagePath + "floorLogoImg.png", viewUsersPath + "floorLogo-user.png");
+            }
+            if("user".equals(sceneProEdit.getBgMusic())){
+                uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), editUsersPath + "music-user.mp3");
+                uploadToOssUtil.copyFiles(imagePath + sceneProEditExt.getBgMusicName(), viewUsersPath + "music-user.mp3");
+            }
+            if(existLoadingLogo){
+                uploadToOssUtil.copyFiles(imagePath + "logo-main.png", editUsersPath + "loadingLogo-user.png");
+                uploadToOssUtil.copyFiles(imagePath + "logo-main.png", viewUsersPath + "loadingLogo-user.png");
+            }
+            if(StrUtil.isNotEmpty(scenePro.getThumb())
+                && scenePro.getThumb().contains(imagePath)){
+                String thumbUrl = null;
+                if(scenePro.getThumb().contains("thumbSmallImg.jpg")){
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-1k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-1k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", editUsersPath + "thumb-2k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbBigImg.jpg", viewUsersPath + "thumb-2k.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", editUsersPath + "thumb-128.jpg");
+                    uploadToOssUtil.copyFiles(imagePath + "thumbSmallImg.jpg", viewUsersPath + "thumb-128.jpg");
+                    thumbUrl = this.ossUrlPrefix + String.format(UploadFilePath.USER_VIEW_PATH, num) + "thumb-128.jpg";
+                }else{
+                    thumbUrl = scenePro.getThumb().replace(imagePath, viewImagesPath);
+                }
+
+                String webSite = sceneUrl + num;
+                scenePro.setThumb(thumbUrl);
+                scenePro.setWebSite(webSite);
+                sceneProService.updateById(scenePro);
+
+                ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
+                    new LambdaQueryWrapper<ScenePlusExt>()
+                        .eq(ScenePlusExt::getPlusId, scenePro.getId()));
+                scenePlusExt.setThumb(thumbUrl);
+                scenePlusExt.setWebSite(webSite);
+                scenePlusExtService.updateById(scenePlusExt);
+            }
+            if(StrUtil.isNotEmpty(sceneEditInfo.getBoxVideos())){
+                JSONArray boxVideoArr = JSON.parseArray(sceneEditInfo.getBoxVideos());
+                for(int i = 0; i < boxVideoArr.size(); i++){
+                    JSONObject boxVideo = boxVideoArr.getJSONObject(i);
+                    String sid = boxVideo.getString("sid");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", editUsersPath + sid + ".mp4");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".mp4", viewUsersPath + sid + ".mp4");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", editUsersPath + sid + ".flv");
+                    uploadToOssUtil.copyFiles(imagePath + "overlay" + sid + ".flv", viewUsersPath + sid + ".flv");
+                }
+            }
+
+
+            //生成scene.json
+//        生成新的scene.json,上传至scene_view_data/<num>/data
+            SceneJsonBean sceneJson = new SceneJsonBean();
+            BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
+            BeanUtil.copyProperties(sceneEditInfo, sceneJson);
+            SceneEditControlsBean sceneEditControlsBean = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsBean.class);
+            sceneJson.setControls(sceneEditControlsBean);
+            sceneJson.setNum(num);
+            sceneJson.setCreateTime(scenePro.getCreateTime());
+            sceneJson.setSceneResolution(sceneProExt.getSceneResolution());
+            sceneJson.setSceneFrom(sceneProExt.getSceneFrom());
+            if(StrUtil.isNotEmpty(scenePro.getVideos())){
+                sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
+            }
+            //上传sceneJson文件
+            String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
+            uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
+
+            //迁移耗时
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+
+            //记录日志
+            sceneRepairLog.setState(1);
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+
+            // TODO: 2022/4/22 调用v3接口回写数据
+
+
+        }catch (Exception e){
+            log.error(e.getMessage(), e);
+            //记录日志
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+            sceneRepairLog.setState(2);
+            sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+        }
+    }
+
+    private Float getFloorPlanCompass(String num){
+        String objectContent =
+            uploadToOssUtil.getObjectContent(bucket, "data/data" + num + "/houst_floor.json");
+        if(StrUtil.isEmpty(objectContent)){
+            return null;
+        }
+        JSONObject jsonObject = JSON.parseObject(objectContent);
+        JSONArray floors = jsonObject.getJSONArray("floors");
+        if(CollUtil.isEmpty(floors)){
+            return null;
+        }
+        Object o = floors.get(0);
+        JSONObject object = (JSONObject)o;
+        return object.getFloat("dire");
+    }
+
+    /**
+     * 更新进度条
+     * @param num
+     * @param progress
+     * @param status
+     */
+    private void updateProgress(String num, int progress, int status){
+        String key = String.format(RedisKey.scene_upgrade_progress_num, num);
+        redisUtil.set(key,
+            JSON.toJSONString(
+                SceneUpgradeProgressBean.builder()
+                    .num(num).status(status)
+                    .progress(progress).build()));
+    }
+}

+ 95 - 0
src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,95 @@
+spring:
+#  jackson:
+#    serialization:
+#      #关闭jackson转换 实体属性空值校验
+#      FAIL_ON_EMPTY_BEANS: false
+#    date-format: yyyy-MM-dd HH:mm:ss
+#    time-zone: GMT+8
+  application:
+    name: 4dkankan-data-repair
+#  servlet:
+#    multipart:
+#      # 设置单个文件大小
+#      max-file-size: 50MB
+#      # 设置单次请求文件的总大小
+#      max-request-size: 50MB
+#  mvc:
+#    throw-exception-if-no-handler-found: true
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-scene.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+#          - data-id: common-mq-config.yaml
+#            group: DEFAULT_GROUP
+#            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-dev
+    sentinel:
+      transport:
+        dashboard: 192.168.0.47:8888
+#        dashboard: localhost:8888
+        heartbeat-interval-ms: 500
+        port: 8719
+      eager: true #取消sentinel控制台懒加载
+      #sentinel配置持久化nacos
+      datasource:
+        #流控规则
+        flow:
+          nacos:
+            server-addr: ${spring.cloud.nacos.config.server-addr}
+            dataId: ${spring.application.name}-flow-rules
+            groupId: SENTINEL_GROUP
+            namespace: 4dkankan-dev
+            rule-type: flow
+        #熔断规则
+        degrade:
+          nacos:
+            server-addr: ${spring.cloud.nacos.config.server-addr}
+            dataId: ${spring.application.name}-degrade-rules
+            groupId: SENTINEL_GROUP
+            namespace: 4dkankan-dev
+            rule-type: degrade
+#      log:
+#        dir: ./logs # 默认值${home}/logs/csp/
+#        switch-pid: true # 日志带上线程id
+
+#开启feign熔断降级,如果没有开启,feign调用链路不会显示再sentinel控制中
+#feign:
+#  sentinel:
+#    enabled: true
+
+feign:
+  httpclient:
+    connection-timeout: 200000
+
+
+
+

+ 98 - 0
src/main/resources/bootstrap-pro.yml

@@ -0,0 +1,98 @@
+spring:
+#  jackson:
+#    serialization:
+#      #关闭jackson转换 实体属性空值校验
+#      FAIL_ON_EMPTY_BEANS: false
+#    date-format: yyyy-MM-dd HH:mm:ss
+#    time-zone: GMT+8
+  application:
+    name: 4dkankan-center-scene
+#  servlet:
+#    multipart:
+#      # 设置单个文件大小
+#      max-file-size: 50MB
+#      # 设置单次请求文件的总大小
+#      max-request-size: 50MB
+#  mvc:
+#    throw-exception-if-no-handler-found: true
+  cloud:
+    nacos:
+      config:
+        server-addr: 192.168.0.47:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro
+        extension-configs:
+          - data-id: 4dkankan-center-scene.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+#          - data-id: common-mq-config.yaml
+#            group: DEFAULT_GROUP
+#            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 192.168.0.47:8848
+        namespace: 4dkankan-pro
+    sentinel:
+      transport:
+        dashboard: 192.168.0.47:8888
+#        dashboard: localhost:8888
+        heartbeat-interval-ms: 500
+        port: 8719
+      eager: true #取消sentinel控制台懒加载
+      #sentinel配置持久化nacos
+      datasource:
+        #流控规则
+        flow:
+          nacos:
+            server-addr: ${spring.cloud.nacos.config.server-addr}
+            dataId: ${spring.application.name}-flow-rules
+            groupId: SENTINEL_GROUP
+            namespace: 4dkankan-pro
+            rule-type: flow
+        #熔断规则
+        degrade:
+          nacos:
+            server-addr: ${spring.cloud.nacos.config.server-addr}
+            dataId: ${spring.application.name}-degrade-rules
+            groupId: SENTINEL_GROUP
+            namespace: 4dkankan-pro
+            rule-type: degrade
+#      log:
+#        dir: ./logs # 默认值${home}/logs/csp/
+#        switch-pid: true # 日志带上线程id
+
+#开启feign熔断降级,如果没有开启,feign调用链路不会显示再sentinel控制中
+#feign:
+#  sentinel:
+#    enabled: true
+
+feign:
+  httpclient:
+    connection-timeout: 200000
+
+tlog:
+  enable-invoke-time-print: true
+
+
+
+

+ 42 - 0
src/main/resources/bootstrap-test.yml

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-data-repair
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-test
+        extension-configs:
+          - data-id: 4dkankan-data-repair.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-rabbitmq-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: other-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-upload-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+      discovery:
+        server-addr: 120.24.144.164:8848
+        namespace: 4dkankan-test
+
+
+
+
+
+

+ 3 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: dev

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

@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
+<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
+<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
+<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
+<configuration scan="true" scanPeriod="10 seconds">
+
+	<springProperty scope="context" name="LOG_PATH" source="logging.path"/>
+	<define name="hostName" class = "com.fdkankan.common.config.LogPathHostNameProperty"/>
+
+	<contextName>logback</contextName>
+	<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
+	<property name="log.path" value="${LOG_PATH}/repair" />
+
+	<!-- 彩色日志 -->
+	<!-- 彩色日志依赖的渲染类 -->
+	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
+	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
+	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
+	<!-- 彩色日志格式 -->
+	<property name="CONSOLE_LOG_PATTERN"
+		value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
+
+	<!--输出到控制台 -->
+	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+		<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息 -->
+		<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+			<level>info</level>
+		</filter>
+		<encoder>
+			<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
+			<!-- 设置字符集 -->
+			<charset>UTF-8</charset>
+		</encoder>
+	</appender>
+	<!--输出到文件 -->
+
+	<!-- 时间滚动输出 level为 DEBUG 日志 -->
+	<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_debug.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 日志归档 -->
+			<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录debug级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>debug</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<appender name="ASYNC_DEBUG_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
+		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
+		<discardingThreshold>0</discardingThreshold>
+		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
+		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
+		<queueSize>2048</queueSize>
+		<includeCallerData>false</includeCallerData>
+		<appender-ref ref="DEBUG_FILE"/>
+	</appender>
+
+	<!-- 时间滚动输出 level为 INFO 日志 -->
+	<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_info.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset>
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<!-- 每天日志归档路径以及格式 -->
+			<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录info级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>info</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<appender name="ASYNC_INFO_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
+		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
+		<discardingThreshold>0</discardingThreshold>
+		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
+		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
+		<queueSize>2048</queueSize>
+		<includeCallerData>false</includeCallerData>
+		<appender-ref ref="INFO_FILE"/>
+	</appender>
+
+	<!-- 时间滚动输出 level为 WARN 日志 -->
+	<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_warn.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录warn级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>warn</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<appender name="ASYNC_WARN_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
+		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
+		<discardingThreshold>0</discardingThreshold>
+		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
+		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
+		<queueSize>2048</queueSize>
+		<includeCallerData>false</includeCallerData>
+		<appender-ref ref="WARN_FILE"/>
+	</appender>
+
+
+	<!-- 时间滚动输出 level为 ERROR 日志 -->
+	<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/log_error.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录ERROR级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>ERROR</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+
+	<appender name="ASYNC_ERROR_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
+		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
+		<discardingThreshold>0</discardingThreshold>
+		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
+		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
+		<queueSize>2048</queueSize>
+		<includeCallerData>false</includeCallerData>
+		<appender-ref ref="ERROR_FILE"/>
+	</appender>
+
+
+	<appender name="VISIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<!-- 正在记录的日志文件的路径及文件名 -->
+		<file>${log.path}/visit/log_visit.log</file>
+		<!--日志文件输出格式 -->
+		<encoder>
+			<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
+			<charset>UTF-8</charset> <!-- 此处设置字符集 -->
+		</encoder>
+		<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+			<fileNamePattern>${log.path}/visit/log-visit-%d{yyyy-MM-dd}.%i.log
+			</fileNamePattern>
+
+			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+				<maxFileSize>100MB</maxFileSize>
+			</timeBasedFileNamingAndTriggeringPolicy>
+			<!--日志文件保留天数 -->
+			<maxHistory>15</maxHistory>
+		</rollingPolicy>
+		<!-- 此日志文件只记录info级别的 -->
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+			<level>info</level>
+			<onMatch>ACCEPT</onMatch>
+			<onMismatch>DENY</onMismatch>
+		</filter>
+	</appender>
+	<appender name="ASYNC_VISIT_FILE" class="com.yomahub.tlog.core.enhance.logback.async.AspectLogbackAsyncAppender">
+		<!--默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。-->
+		<discardingThreshold>0</discardingThreshold>
+		<!--queue配置最大容量为256个events。如果队列被填满,应用程序线程被阻止记录新的events,直到工作线程有机会来转发一个或多个events。
+		因此队列深度需要根据业务场景进行相应的测试,做出相应的更改,以达到较好的性能。-->
+		<queueSize>2048</queueSize>
+		<includeCallerData>false</includeCallerData>
+		<appender-ref ref="VISIT_FILE"/>
+	</appender>
+	<logger name="visitLog" level="INFO" additivity="false">
+		<appender-ref ref="ASYNC_VISIT_FILE"/>
+	</logger>
+
+	<!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、 以及指定<appender>。<logger>仅有一个name属性, 一个可选的level和一个可选的addtivity属性。 name:用来指定受此logger约束的某一个包或者具体的某一个类。 level:用来设置打印级别,大小写无关:TRACE,
+		DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前logger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 -->
+	<!--<logger name="org.springframework.web" level="info"/> -->
+	<!--<logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/> -->
+	<!-- 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作: 第一种把<root level="info">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息 第二种就是单独给dao下目录配置debug模式,代码如下,这样配置sql语句会打印,其他还是正常info级别: -->
+	<!-- root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性 level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF, 不能设置为INHERITED或者同义词NULL。默认是DEBUG 可以包含零个或多个元素,标识这个appender将会添加到这个logger。 -->
+
+	<root level="info">
+		<appender-ref ref="CONSOLE" />
+		<appender-ref ref="ASYNC_DEBUG_FILE" />
+		<appender-ref ref="ASYNC_INFO_FILE" />
+		<appender-ref ref="ASYNC_WARN_FILE" />
+		<appender-ref ref="ASYNC_ERROR_FILE" />
+	</root>
+
+	<springProfile name="dev">
+		<root level="info">
+			<appender-ref ref="CONSOLE" />
+			<appender-ref ref="ASYNC_DEBUG_FILE" />
+			<appender-ref ref="ASYNC_INFO_FILE" />
+			<appender-ref ref="ASYNC_WARN_FILE" />
+			<appender-ref ref="ASYNC_ERROR_FILE" />
+		</root>
+	</springProfile>
+
+	<springProfile name="test">
+		<root level="info">
+			<appender-ref ref="CONSOLE" />
+			<appender-ref ref="ASYNC_DEBUG_FILE" />
+			<appender-ref ref="ASYNC_INFO_FILE" />
+			<appender-ref ref="ASYNC_WARN_FILE" />
+			<appender-ref ref="ASYNC_ERROR_FILE" />
+		</root>
+	</springProfile>
+
+	<springProfile name="pro">
+		<root level="info">
+			<appender-ref ref="CONSOLE" />
+			<appender-ref ref="ASYNC_DEBUG_FILE" />
+			<appender-ref ref="ASYNC_INFO_FILE" />
+			<appender-ref ref="ASYNC_WARN_FILE" />
+			<appender-ref ref="ASYNC_ERROR_FILE" />
+		</root>
+	</springProfile>
+
+<!--	<springProfile name="dev">-->
+<!--		<root level="info">-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="debug"/>开发环境, 指定某包日志为debug级 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+<!--	<springProfile name="test">-->
+<!--		<root level="info">-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="info"/> 测试环境, 指定某包日志为info级 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+<!--	<springProfile name="pro">-->
+<!--		<root level="error">-->
+<!--			&lt;!&ndash; 生产环境最好不配置console写文件 &ndash;&gt;-->
+<!--			<appender-ref ref="CONSOLE" />-->
+<!--			<appender-ref ref="DEBUG_FILE" />-->
+<!--			<appender-ref ref="INFO_FILE" />-->
+<!--			<appender-ref ref="WARN_FILE" />-->
+<!--			<appender-ref ref="ERROR_FILE" />-->
+<!--			<appender-ref ref="ALL_FILE" />-->
+<!--		</root>-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo" level="warn"/> 生产环境, 指定某包日志为warn级 &ndash;&gt;-->
+<!--		&lt;!&ndash; <logger name="com.xusanduo.demo.MyApplication" level="info"/> 特定某个类打印info日志, 比如application启动成功后的提示语 &ndash;&gt;-->
+<!--	</springProfile>-->
+
+	<!--生产环境:输出到文件 -->
+	<!--<springProfile name="pro"> -->
+	<!--<root level="info"> -->
+	<!--<appender-ref ref="CONSOLE" /> -->
+	<!--<appender-ref ref="DEBUG_FILE" /> -->
+	<!--<appender-ref ref="INFO_FILE" /> -->
+	<!--<appender-ref ref="ERROR_FILE" /> -->
+	<!--<appender-ref ref="WARN_FILE" /> -->
+	<!--</root> -->
+	<!--</springProfile> -->
+
+</configuration>
+
+

+ 5 - 0
src/main/resources/mapper/SceneEditControlsMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneEditControlsMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneEditInfoExtMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneEditInfoExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneEditInfoMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneEditInfoMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/ScenePlusExtMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.IScenePlusExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneProEditExtMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneProEditExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneProEditMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneProEditMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneProExtMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneProExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneProMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneProMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneRepairLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneRepairLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/SceneResourceMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.repair.mapper.ISceneResourceMapper">
+
+</mapper>