dengsixing 3 年之前
当前提交
b8d17c25c4
共有 98 个文件被更改,包括 5590 次插入0 次删除
  1. 35 0
      .gitignore
  2. 186 0
      pom.xml
  3. 24 0
      src/main/java/com/fdkankan/scene/SceneV3Application.java
  4. 27 0
      src/main/java/com/fdkankan/scene/bean/RequestSceneProV4.java
  5. 69 0
      src/main/java/com/fdkankan/scene/bean/SceneEditControlsBean.java
  6. 176 0
      src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java
  7. 19 0
      src/main/java/com/fdkankan/scene/bean/SceneRepairParamVO.java
  8. 31 0
      src/main/java/com/fdkankan/scene/bean/SceneUpgradeProgressBean.java
  9. 28 0
      src/main/java/com/fdkankan/scene/callback/FdkkMiniReqErrorCallback.java
  10. 25 0
      src/main/java/com/fdkankan/scene/callback/FdkkMiniReqSuccessCallback.java
  11. 50 0
      src/main/java/com/fdkankan/scene/callback/FdkkMiniReqSuccessCondition.java
  12. 52 0
      src/main/java/com/fdkankan/scene/config/TaskPoolConfig.java
  13. 43 0
      src/main/java/com/fdkankan/scene/constant/ProgressStatus.java
  14. 134 0
      src/main/java/com/fdkankan/scene/controller/SceneController.java
  15. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneCooperationController.java
  16. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneEditControlsController.java
  17. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneEditInfoController.java
  18. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneEditInfoExtController.java
  19. 21 0
      src/main/java/com/fdkankan/scene/controller/ScenePlusController.java
  20. 21 0
      src/main/java/com/fdkankan/scene/controller/ScenePlusExtController.java
  21. 20 0
      src/main/java/com/fdkankan/scene/controller/SceneProController.java
  22. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneProEditController.java
  23. 310 0
      src/main/java/com/fdkankan/scene/controller/SceneRepairController.java
  24. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneRepairLogController.java
  25. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneResourceController.java
  26. 21 0
      src/main/java/com/fdkankan/scene/controller/SceneResourceCooperationController.java
  27. 30 0
      src/main/java/com/fdkankan/scene/controller/TestController.java
  28. 54 0
      src/main/java/com/fdkankan/scene/entity/SceneCooperation.java
  29. 112 0
      src/main/java/com/fdkankan/scene/entity/SceneEditControls.java
  30. 169 0
      src/main/java/com/fdkankan/scene/entity/SceneEditInfo.java
  31. 76 0
      src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java
  32. 115 0
      src/main/java/com/fdkankan/scene/entity/ScenePlus.java
  33. 157 0
      src/main/java/com/fdkankan/scene/entity/ScenePlusExt.java
  34. 231 0
      src/main/java/com/fdkankan/scene/entity/ScenePro.java
  35. 285 0
      src/main/java/com/fdkankan/scene/entity/SceneProEdit.java
  36. 73 0
      src/main/java/com/fdkankan/scene/entity/SceneRepairLog.java
  37. 78 0
      src/main/java/com/fdkankan/scene/entity/SceneResource.java
  38. 54 0
      src/main/java/com/fdkankan/scene/entity/SceneResourceCooperation.java
  39. 99 0
      src/main/java/com/fdkankan/scene/generate/AutoGenerate.java
  40. 29 0
      src/main/java/com/fdkankan/scene/httpclient/FdkankanMiniClient.java
  41. 53 0
      src/main/java/com/fdkankan/scene/listener/RabbitMqListener.java
  42. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneCooperationMapper.java
  43. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneEditControlsMapper.java
  44. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneEditInfoExtMapper.java
  45. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneEditInfoMapper.java
  46. 18 0
      src/main/java/com/fdkankan/scene/mapper/IScenePlusExtMapper.java
  47. 18 0
      src/main/java/com/fdkankan/scene/mapper/IScenePlusMapper.java
  48. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneProEditMapper.java
  49. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneProMapper.java
  50. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneRepairLogMapper.java
  51. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneResourceCooperationMapper.java
  52. 18 0
      src/main/java/com/fdkankan/scene/mapper/ISceneResourceMapper.java
  53. 18 0
      src/main/java/com/fdkankan/scene/service/ISceneCooperationService.java
  54. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneEditControlsService.java
  55. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java
  56. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java
  57. 16 0
      src/main/java/com/fdkankan/scene/service/IScenePlusExtService.java
  58. 16 0
      src/main/java/com/fdkankan/scene/service/IScenePlusService.java
  59. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneProEditService.java
  60. 21 0
      src/main/java/com/fdkankan/scene/service/ISceneProService.java
  61. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneRepairLogService.java
  62. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneResourceCooperationService.java
  63. 16 0
      src/main/java/com/fdkankan/scene/service/ISceneResourceService.java
  64. 18 0
      src/main/java/com/fdkankan/scene/service/ISceneService.java
  65. 15 0
      src/main/java/com/fdkankan/scene/service/ISceneUpgradeToV4Service.java
  66. 28 0
      src/main/java/com/fdkankan/scene/service/impl/SceneCooperationServiceImpl.java
  67. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneEditControlsServiceImpl.java
  68. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoExtServiceImpl.java
  69. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
  70. 20 0
      src/main/java/com/fdkankan/scene/service/impl/ScenePlusExtServiceImpl.java
  71. 20 0
      src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java
  72. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneProEditServiceImpl.java
  73. 100 0
      src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
  74. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneRepairLogServiceImpl.java
  75. 438 0
      src/main/java/com/fdkankan/scene/service/impl/SceneRepairService.java
  76. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneResourceCooperationServiceImpl.java
  77. 20 0
      src/main/java/com/fdkankan/scene/service/impl/SceneResourceServiceImpl.java
  78. 172 0
      src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java
  79. 570 0
      src/main/java/com/fdkankan/scene/service/impl/SceneUpgradeToV4Service.java
  80. 42 0
      src/main/resources/bootstrap-dev-eur.yml
  81. 42 0
      src/main/resources/bootstrap-dev.yml
  82. 42 0
      src/main/resources/bootstrap-pro-eur.yml
  83. 42 0
      src/main/resources/bootstrap-pro.yml
  84. 42 0
      src/main/resources/bootstrap-test-eur.yml
  85. 42 0
      src/main/resources/bootstrap-test.yml
  86. 3 0
      src/main/resources/bootstrap.yml
  87. 324 0
      src/main/resources/logback-spring.xml
  88. 5 0
      src/main/resources/mapper/scene/SceneCooperationMapper.xml
  89. 5 0
      src/main/resources/mapper/scene/SceneEditControlsMapper.xml
  90. 5 0
      src/main/resources/mapper/scene/SceneEditInfoExtMapper.xml
  91. 5 0
      src/main/resources/mapper/scene/SceneEditInfoMapper.xml
  92. 5 0
      src/main/resources/mapper/scene/ScenePlusExtMapper.xml
  93. 5 0
      src/main/resources/mapper/scene/ScenePlusMapper.xml
  94. 5 0
      src/main/resources/mapper/scene/SceneProEditMapper.xml
  95. 5 0
      src/main/resources/mapper/scene/SceneProMapper.xml
  96. 5 0
      src/main/resources/mapper/scene/SceneRepairLogMapper.xml
  97. 5 0
      src/main/resources/mapper/scene/SceneResourceCooperationMapper.xml
  98. 5 0
      src/main/resources/mapper/scene/SceneResourceMapper.xml

+ 35 - 0
.gitignore

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

+ 186 - 0
pom.xml

@@ -0,0 +1,186 @@
+<?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-center-scene-v3</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>com.fdkankan</groupId>
+            <artifactId>4dkankan-common</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>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-redis</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-fyun</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+
+        <dependency>
+            <artifactId>4dkankan-utils-app-push</artifactId>
+            <groupId>com.fdkankan</groupId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-dingtalk</artifactId>
+            <version>2.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-web-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-feign-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>de.codecentric</groupId>
+            <artifactId>spring-boot-admin-client</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+
+        <!--        htt请求工具-->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.19</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>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <testFailureIgnore>true</testFailureIgnore>
+                </configuration>
+            </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>

+ 24 - 0
src/main/java/com/fdkankan/scene/SceneV3Application.java

@@ -0,0 +1,24 @@
+package com.fdkankan.scene;
+
+import com.dtflys.forest.springboot.annotation.ForestScan;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+@SpringBootApplication
+@ComponentScan(basePackages = {"com.fdkankan.*"})
+@MapperScan("com.fdkankan.**.mapper")
+@EnableAsync
+@EnableDiscoveryClient
+@ForestScan(basePackages = "com.fdkankan.scene.httpclient")
+public class SceneV3Application {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SceneV3Application.class, args);
+    }
+
+}

+ 27 - 0
src/main/java/com/fdkankan/scene/bean/RequestSceneProV4.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/24
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RequestSceneProV4 {
+
+    private Long id;
+
+    private String webSite;
+
+
+}

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

@@ -0,0 +1,69 @@
+package com.fdkankan.scene.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;
+
+
+}

+ 176 - 0
src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -0,0 +1,176 @@
+package com.fdkankan.scene.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;
+
+    /**
+     * 切图方式(tiles:瓦片图,face:切片图,pan:全景图 ,local:本地切片,cube:立体图)
+     */
+    private String sceneKind;
+
+    /**
+     * 视频覆盖数据
+     */
+    private String boxVideos;
+
+    /**
+     *点位视频
+     */
+    private JSONObject videos;
+
+    /**
+     * 是否有热点数据
+     */
+    private Integer tags;
+
+    /**
+     * 加载logo名
+     */
+    private String loadingLogo;
+
+    /**
+     * 加载logo文件名
+     */
+    private String loadingLogoFile;
+
+    /**
+     * 户型角度
+     */
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    private Float floorPlanCompass;
+
+
+
+
+}

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

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

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

@@ -0,0 +1,31 @@
+package com.fdkankan.scene.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;
+
+
+
+
+}

+ 28 - 0
src/main/java/com/fdkankan/scene/callback/FdkkMiniReqErrorCallback.java

@@ -0,0 +1,28 @@
+package com.fdkankan.scene.callback;
+
+import com.dtflys.forest.callback.OnError;
+import com.dtflys.forest.exceptions.ForestRuntimeException;
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.http.ForestResponse;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/25
+ **/
+@Slf4j
+public class FdkkMiniReqErrorCallback implements OnError {
+
+    @Override
+    public void onError(ForestRuntimeException e, ForestRequest forestRequest,
+        ForestResponse forestResponse) {
+        log.error("跨服务请求失败!", e);
+        throw new BusinessException(ServerCode.FEIGN_REQUEST_FAILD);
+    }
+}

+ 25 - 0
src/main/java/com/fdkankan/scene/callback/FdkkMiniReqSuccessCallback.java

@@ -0,0 +1,25 @@
+package com.fdkankan.scene.callback;
+
+import com.dtflys.forest.callback.OnSuccess;
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.http.ForestResponse;
+import com.fdkankan.common.response.Result;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/25
+ **/
+@Slf4j
+public class FdkkMiniReqSuccessCallback implements OnSuccess<Result> {
+
+    @Override
+    public void onSuccess(Result result, ForestRequest forestRequest,
+        ForestResponse forestResponse) {
+        log.info("请求v3成功,url:{},result:{}", forestRequest.getUrl(), forestResponse.getContent());
+    }
+}

+ 50 - 0
src/main/java/com/fdkankan/scene/callback/FdkkMiniReqSuccessCondition.java

@@ -0,0 +1,50 @@
+package com.fdkankan.scene.callback;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.dtflys.forest.callback.SuccessWhen;
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.http.ForestResponse;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.response.Result;
+
+/**
+ * <p>
+ *  自定义成功/失败条件实现类
+ *  需要实现 SuccessWhen 接口
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/25
+ **/
+
+public class FdkkMiniReqSuccessCondition implements SuccessWhen {
+
+    /**
+     * 请求成功条件
+     * @param req Forest请求对象
+     * @param res Forest响应对象
+     * @return 是否成功,true: 请求成功,false: 请求失败
+     */
+    @Override
+    public boolean successWhen(ForestRequest req, ForestResponse res) {
+        boolean reqStatus = res.noException() &&   // 请求过程没有异常
+            res.statusOk() &&     // 并且状态码在 100 ~ 399 范围内
+            res.statusIsNot(203);
+        if(!reqStatus){
+            return reqStatus;
+        }
+
+        String content = res.getContent();
+        if(StrUtil.isEmpty(content)){
+            reqStatus = false;
+            return reqStatus;
+        }
+        Result result = JSON.parseObject(content, Result.class);
+        if(result.getCode() != ServerCode.SUCCESS.code()){
+            reqStatus = false;
+            return reqStatus;
+        }
+        return true;
+    }
+}

+ 52 - 0
src/main/java/com/fdkankan/scene/config/TaskPoolConfig.java

@@ -0,0 +1,52 @@
+package com.fdkankan.scene.config;
+
+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.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;
+    }
+
+}

+ 43 - 0
src/main/java/com/fdkankan/scene/constant/ProgressStatus.java

@@ -0,0 +1,43 @@
+package com.fdkankan.scene.constant;
+
+/**
+ * 文件业务类型
+ */
+public enum ProgressStatus {
+
+    WAIT(0, "等待中"),
+    DO_DB(1000, "数据库已生成"),
+    DO_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;
+    }
+
+}

+ 134 - 0
src/main/java/com/fdkankan/scene/controller/SceneController.java

@@ -0,0 +1,134 @@
+package com.fdkankan.scene.controller;
+
+import com.fdkankan.common.controller.BaseController;
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.scene.service.ISceneService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/api/scene")
+public class SceneController extends BaseController {
+
+//    @Autowired
+//    private ISceneService sceneService;
+//    @Autowired
+//    private GoodsFeignClient goodsService;
+//    @Autowired
+//    private ObjectMapper mapper;
+//    @Autowired
+//    private UserFeignClient userService;
+//    @Autowired
+//    private ModelingMsgProducer producer;
+//
+//    @Autowired
+//    private ISceneProService sceneProService;
+//
+//    @Autowired
+//    private ISceneProEditService sceneProEditService;
+//
+//    @Autowired
+//    private IRebuildVideoProgressService rebuildVideoProgressService;
+//
+//
+//    @Autowired
+//    private IRebuildPicProgressService rebuildPicProgressService;
+//
+//    @Autowired
+//    private UploadToOssUtil uploadToOssUtil;
+//
+//    @Autowired
+//    private ICameraService cameraService;
+//
+//    @Autowired
+//    private RubberSheetingUtil rubberSheetingUtil;
+//
+//    @Autowired
+//    private ISceneModuleVideoService sceneModuleVideoService;
+//
+//    @Autowired
+//    private ISceneCooperationService sceneCooperationService;
+//
+//    @Autowired
+//    private ISceneResourceService sceneResourceService;
+//
+//    @Autowired
+//    private ISceneDataDownloadService sceneDataDownloadService;
+//
+//    @Autowired
+//    private ICameraDetailService cameraDetailService;
+//
+//    @Autowired
+//    private IUserIncrementService userIncrementService;
+//
+//    @Autowired
+//    private SceneNumService sceneNumService;
+//
+//    @Autowired
+//    private FdkkLaserService fdkkLaserService;
+//
+//    @Value("${main.url}")
+//    private String mainUrl;
+//
+//    @Value("${scene.url}")
+//    private String sceneUrl;
+//
+//    @Value("${scene.pro.url}")
+//    private String sceneProUrl;
+//
+//    @Value("${scene.pro.new.url}")
+//    private String sceneProNewUrl;
+//
+//    @Value("${scene.pro.v4.url}")
+//    private String sceneProV4Url;
+//
+//    @Value("${oss.type}")
+//    private String type;
+//
+//    @Value("${environment}")
+//    private String environment;
+//
+//    @Value("${formal.home.url}")
+//    private String formalHomeUrl;
+//
+//    @Value("${dev.home.url}")
+//    private String devHomeUrl;
+//
+//    @Value("${prefix.ali}")
+//    private String prefixAli;
+//
+//    @Value("${ecs.type}")
+//    private String ecsType;
+//
+//    @Value("${expected.time}")
+//    private String expectedTime;
+//
+//    @Autowired
+//    private ComputerUtil computerUtil;
+//
+//    @Autowired
+//    private FdkkV4Service fdkkV4Service;
+
+    //多线程共享判断是否正在打包中
+//    private AtomicBoolean isDownload = new AtomicBoolean(false);
+
+    @Autowired
+    private ISceneService sceneService;
+
+    /**
+     * 是否已登录
+     * @return
+     */
+    @PostMapping(value = "/isLogin")
+    public ResultData isLogin(@RequestParam("num") String num) throws Exception{
+        String token = this.getToken();
+        return sceneService.isLogin(num, token);
+    }
+
+
+}

+ 21 - 0
src/main/java/com/fdkankan/scene/controller/SceneCooperationController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@RestController
+@RequestMapping("/scene/sceneCooperation")
+public class SceneCooperationController {
+
+}
+

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

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.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/scene/controller/SceneEditInfoController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.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/scene/controller/SceneEditInfoExtController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.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/scene/controller/ScenePlusController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景主表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-29
+ */
+@RestController
+@RequestMapping("/repair/scenePlus")
+public class ScenePlusController {
+
+}
+

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

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

+ 20 - 0
src/main/java/com/fdkankan/scene/controller/SceneProController.java

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

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

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

+ 310 - 0
src/main/java/com/fdkankan/scene/controller/SceneRepairController.java

@@ -0,0 +1,310 @@
+//package com.fdkankan.scene.controller;
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.io.FileUtil;
+//import cn.hutool.core.util.StrUtil;
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.fdkankan.common.constant.ConstantFilePath;
+//import com.fdkankan.common.constant.SceneKind;
+//import com.fdkankan.common.constant.SceneResolution;
+//import com.fdkankan.common.constant.UploadFilePath;
+//import com.fdkankan.common.response.ResultData;
+//import com.fdkankan.common.util.FileUtils;
+//import com.fdkankan.common.util.MatrixToImageWriterUtil;
+//import com.fdkankan.common.util.SceneUtil;
+//import com.fdkankan.fyun.oss.UploadToOssUtil;
+//import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+//import com.fdkankan.redis.constant.RedisKey;
+//import com.fdkankan.redis.util.RedisUtil;
+//import com.fdkankan.scene.bean.SceneRepairParamVO;
+//import com.fdkankan.scene.bean.SceneUpgradeProgressBean;
+//import com.fdkankan.scene.entity.SceneEditInfo;
+//import com.fdkankan.scene.entity.ScenePlus;
+//import com.fdkankan.scene.entity.ScenePlusExt;
+//import com.fdkankan.scene.entity.ScenePro;
+//import com.fdkankan.scene.httpclient.FdkankanMiniClient;
+//import com.fdkankan.scene.service.ISceneEditInfoService;
+//import com.fdkankan.scene.service.IScenePlusExtService;
+//import com.fdkankan.scene.service.IScenePlusService;
+//import com.fdkankan.scene.service.ISceneProService;
+//import com.fdkankan.scene.service.ISceneResourceService;
+//import com.fdkankan.scene.service.impl.SceneRepairService;
+//import java.io.File;
+//import java.nio.charset.StandardCharsets;
+//import java.util.List;
+//import java.util.Objects;
+//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 {
+//
+//    @Value("${queue.scene.upgrade-to-v4}")
+//    private String upgradeToV4;
+//    @Value("${oss.prefix.url}")
+//    private String ossUrlPrefix;
+//    @Value("${oss.bucket:4dkankan}")
+//    private String bucket;
+//
+//    @Autowired
+//    ISceneProService sceneProService;
+//    @Autowired
+//    private UploadToOssUtil uploadToOssUtil;
+//    @Autowired
+//    private SceneRepairService sceneRepairService;
+//    @Autowired
+//    private ISceneResourceService sceneResourceService;
+//    @Autowired
+//    private RedisUtil redisUtil;
+//    @Autowired
+//    private RabbitMqProducer rabbitMqProducer;
+//    @Autowired
+//    private FdkankanMiniClient fdkankanMiniClient;
+//    @Value("${http.host.4dkankanMini}")
+//    private String fkankanMiniHost;
+//    @Value("${main.url}")
+//    private String mainUrl;
+//    @Value("${scene.pro.new.url}")
+//    private String sceneProNewUrl;
+//    @Autowired
+//    private IScenePlusService scenePlusService;
+//    @Autowired
+//    private IScenePlusExtService scenePlusExtService;
+//    @Autowired
+//    private ISceneEditInfoService sceneEditInfoService;
+//
+//    /**
+//     * 最大线程数
+//     */
+//    @Value("${repair.maxThread:3}")
+//    private int maxThread;
+//
+//    @GetMapping("/testThread")
+//    public ResultData testThread() throws Exception{
+//
+//        for(int i=1; i<=10; i++){
+//            rabbitMqProducer.sendByWorkQueue("upgrade-to-v4-test", i);
+//        }
+//
+//
+//        return ResultData.ok();
+//    }
+//
+//
+//    @GetMapping("/test")
+//    public ResultData test(String num) throws Exception{
+//
+////        String mappingOssPath = String.format(UploadFilePath.DATA_EDIT_PATH, num) + "mapping";
+////        String mappingPath = "/mnt/4Dkankan/scene/data/data" + num + "/mapping";
+////        List<String> mappingList = FileUtils.list(new File(mappingPath));
+////        if(CollUtil.isNotEmpty(mappingList)){
+////            mappingList.parallelStream().forEach(mapping->{
+////                uploadToOssUtil.upload(mapping, mapping.replace(mappingPath, mappingOssPath));
+////            });
+////        }
+//
+//        String localPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num) + "hot.json";
+//        String ossPath = String.format(ConstantFilePath.DATA_PATH_FORMAT, num) + "hot.json";
+//        String objectContent = uploadToOssUtil.getObjectContent(bucket, ossPath);
+//        if(StrUtil.isEmpty(objectContent)){
+//            FileUtils.deleteFile(localPath);
+//        }else{
+//            FileUtils.writeFile(localPath, objectContent);
+//        }
+//        return ResultData.ok();
+//    }
+//
+//    @GetMapping("/createQrCode")
+//    public ResultData createQrCode(String num) throws Exception{
+//        //生成二维码
+//        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");
+//        return ResultData.ok();
+//    }
+//
+//    @PostMapping("repairPan")
+//    public ResultData repairPan(String num){
+//        ScenePro scenePro = sceneProService
+//            .getOne(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getNum, num));
+//        SceneProExt sceneProExt = sceneProExtService.getOne(
+//            new LambdaQueryWrapper<SceneProExt>().eq(SceneProExt::getSceneProId, scenePro.getId()));
+//        String path = sceneProExt.getDataSource();
+//        log.info("计算结果路径:" + path + "/caches/images");
+//        List<String> imagesList = FileUtil.listFileNames(path + "/caches/images");
+//        String cachedImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
+//        String visionPath = path + "/results/vision.txt";
+//        List<String> panoramaImageList = SceneUtil.getPanoramaImageList(visionPath);
+//        imagesList.stream().forEach(fileName -> {
+//            if(panoramaImageList.contains(fileName)){
+//                String srcPath = path + "/caches/images/" + fileName;
+//                String targetPath = cachedImagesPath + fileName;
+//                log.info("源文件:{}, 目标文件:{}", srcPath, targetPath);
+//                cn.hutool.core.io.FileUtil.copy(srcPath, targetPath, true);
+//            }
+//        });
+//        return ResultData.ok();
+//    }
+//
+//    /**
+//     * 更新进度条
+//     * @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()));
+//    }
+//
+//
+//    @PostMapping("/sceneRepair")
+//    public String sceneRepair(@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";
+//    }
+//
+//    @GetMapping("/repairResokutionAndKind")
+//    public ResultData repairResokutionAndKind(String num) throws Exception{
+//
+//        //修复t_scene_plus_ext
+//        String[] numArr = null;
+//        if(StrUtil.isNotEmpty(num)){
+//            numArr = num.split(",");
+//        }
+//
+//        List<ScenePlus> scenePlusList = null;
+//        if(Objects.isNull(numArr)){
+//            scenePlusList = scenePlusService.list();
+//        }else{
+//            scenePlusList = scenePlusService.list(new LambdaQueryWrapper<ScenePlus>().in(ScenePlus::getNum, numArr));
+//        }
+//        if(CollUtil.isEmpty(scenePlusList)){
+//            return ResultData.ok();
+//        }
+//        for (ScenePlus scenePlus : scenePlusList) {
+//
+//            //修复数据库
+//            ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
+//                new LambdaQueryWrapper<ScenePlusExt>()
+//                .eq(ScenePlusExt::getPlusId, scenePlus.getId()));
+//            if(SceneResolution.TILES.code().equals(scenePlusExt.getSceneResolution())){
+//                scenePlusExt.setSceneKind(SceneKind.FACE.code());
+//            }else{
+//                scenePlusExt.setSceneKind(SceneKind.TILES.code());
+//            }
+//
+//            if(scenePlus.getSceneSource() == 1){
+//                scenePlusExt.setSceneResolution("2k");
+//            }else if(scenePlus.getSceneSource() == 2){
+//                scenePlusExt.setSceneResolution("1k");
+//            }else if(scenePlus.getSceneSource() == 3 || scenePlus.getSceneSource() == 4){
+//                scenePlusExt.setSceneResolution("4k");
+//            }
+//            scenePlusExtService.updateById(scenePlusExt);
+//
+//            //更新版本号
+//            SceneEditInfo sceneEditInfo = sceneEditInfoService.getOne(new LambdaQueryWrapper<SceneEditInfo>().eq(SceneEditInfo::getScenePlusId, scenePlus.getId()));
+//            sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
+//            sceneEditInfoService.updateById(sceneEditInfo);
+//
+//            //修复scene.json
+//            String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, scenePlus.getNum()) + "scene.json";
+//            String sceneJsonStr = uploadToOssUtil.getObjectContent(this.bucket, sceneJsonPath);
+//            if(StrUtil.isNotEmpty(sceneJsonStr)){
+//                JSONObject sceneJsonObject = JSON.parseObject(sceneJsonStr);
+//                sceneJsonObject.put("sceneResolution", scenePlusExt.getSceneResolution());
+//                sceneJsonObject.put("sceneKind", scenePlusExt.getSceneKind());
+//                sceneJsonObject.put("version", sceneEditInfo.getVersion());
+//                uploadToOssUtil.upload(sceneJsonObject.toJSONString().getBytes(StandardCharsets.UTF_8), sceneJsonPath);
+//            }else{
+//                log.error("没有找到scene.json,路径=" + sceneJsonPath);
+//            }
+//
+//            //清除scene.json缓存
+//            redisUtil.del(String.format(RedisKey.SCENE_JSON, scenePlus.getNum()));
+//
+//        }
+//
+//        return ResultData.ok();
+//    }
+//
+//
+//
+//}

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

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.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/scene/controller/SceneResourceController.java

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

+ 21 - 0
src/main/java/com/fdkankan/scene/controller/SceneResourceCooperationController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 场景资源和协作用户关联表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@RestController
+@RequestMapping("/scene/sceneResourceCooperation")
+public class SceneResourceCooperationController {
+
+}
+

+ 30 - 0
src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -0,0 +1,30 @@
+package com.fdkankan.scene.controller;
+
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.scene.service.ISceneResourceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/7/4
+ **/
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+    @Autowired
+    private ISceneResourceService sceneResourceService;
+
+    @GetMapping("/test")
+    public ResultData test(){
+        return ResultData.ok(sceneResourceService.list());
+    }
+
+}

+ 54 - 0
src/main/java/com/fdkankan/scene/entity/SceneCooperation.java

@@ -0,0 +1,54 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+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-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_cooperation")
+public class SceneCooperation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("scene_num")
+    private String sceneNum;
+
+    /**
+     * 协作的用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableLogic("A")
+    @TableField("rec_status")
+    private String recStatus;
+
+
+}

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

@@ -0,0 +1,112 @@
+package com.fdkankan.scene.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;
+
+
+}

+ 169 - 0
src/main/java/com/fdkankan/scene/entity/SceneEditInfo.java

@@ -0,0 +1,169 @@
+package com.fdkankan.scene.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;
+
+    /**
+     * 是否有热点数据(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/scene/entity/SceneEditInfoExt.java

@@ -0,0 +1,76 @@
+package com.fdkankan.scene.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;
+
+
+}

+ 115 - 0
src/main/java/com/fdkankan/scene/entity/ScenePlus.java

@@ -0,0 +1,115 @@
+package com.fdkankan.scene.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-06-29
+ */
+@Getter
+@Setter
+@TableName("t_scene_plus")
+public class ScenePlus implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 用户id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 相机id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景名称
+     */
+    @TableField("title")
+    private String title;
+
+    /**
+     * 场景描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 场景状态:0-未建好,1--已建好,-1-计算出错,-2--不在官网显示
+     */
+    @TableField("scene_status")
+    private Integer sceneStatus;
+
+    /**
+     * 场景来源:相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 支付状态:0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 场景类型  0-其他,1-文博,2-地产,3-电商,4-餐饮,5-家居,99-一件换装虚拟房源
+     */
+    @TableField("scene_type")
+    private Integer sceneType;
+
+    /**
+     * 是否推荐:0-否,1-是
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除, 2-禁用
+     */
+    @TableField("tb_status")
+    private Integer tbStatus;
+
+
+}

+ 157 - 0
src/main/java/com/fdkankan/scene/entity/ScenePlusExt.java

@@ -0,0 +1,157 @@
+package com.fdkankan.scene.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-06-29
+ */
+@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;
+
+    /**
+     * 分辨率(2k,4k)
+     */
+    @TableField("scene_resolution")
+    private String sceneResolution;
+
+    /**
+     * 场景来源,lite:双目lite相机,pro:八目相机,minion:双面转台相机,laser:激光相机,virtual:虚拟场景,sketch:图片建模场景
+     */
+    @TableField("scene_from")
+    private String sceneFrom;
+
+    /**
+     * 切图方式(tiles:瓦片图,face:切片图,pan:全景图 ,local:本地切片,cube:立体图)
+     */
+    @TableField("scene_kind")
+    private String sceneKind;
+
+    /**
+     * 点位视频
+     */
+    @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;
+
+
+}

+ 231 - 0
src/main/java/com/fdkankan/scene/entity/ScenePro.java

@@ -0,0 +1,231 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+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-07-04
+ */
+@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;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 0表示未建好,1表示建好,-1表示出错,-2表示不要在官网上显示
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 原始的大场景数据(七牛)
+     */
+    @TableField("data_source")
+    private String dataSource;
+
+    /**
+     * 用户表t_user的id
+     */
+    @TableField("user_id")
+    private Long userId;
+
+    /**
+     * 0表示未付款,1表示付款了,-1表示欠费,-2表示容量不足
+     */
+    @TableField("pay_status")
+    private Integer payStatus;
+
+    /**
+     * 相机主表t_camera的id
+     */
+    @TableField("camera_id")
+    private Long cameraId;
+
+    /**
+     * 手机id
+     */
+    @TableField("phone_id")
+    private String phoneId;
+
+    /**
+     * 场景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;
+
+    /**
+     * 1表示推荐,0表示正常
+     */
+    @TableField("recommend")
+    private Integer recommend;
+
+    /**
+     * 浏览次数
+     */
+    @TableField("view_count")
+    private Integer viewCount;
+
+    /**
+     * 拍摄数量 ps:点位数量
+     */
+    @TableField("shoot_count")
+    private Integer shootCount;
+
+    /**
+     * 所有资源文件名
+     */
+    @TableField("files_name")
+    private String filesName;
+
+    /**
+     * 点位视频
+     */
+    @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;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableLogic("A")
+    @TableField("rec_status")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 算法类型
+     */
+    @TableField("algorithm")
+    private String algorithm;
+
+    /**
+     * 服务器的服务商
+     */
+    @TableField("ecs")
+    private String ecs;
+
+    /**
+     * 使用容量
+     */
+    @TableField("space")
+    private Long space;
+
+    /**
+     * 固件版本
+     */
+    @TableField("firmware_version")
+    private String firmwareVersion;
+
+    /**
+     * 调用V2还是V3的算法
+     */
+    @TableField("build_type")
+    private String buildType;
+
+    /**
+     * 计算时间(秒为单位)
+     */
+    @TableField("compute_time")
+    private Long computeTime;
+
+    /**
+     * 场景来源,相机拍摄10以内表示,1表示八目,2双目,3转台,4 激光  其他来源10以上,11:一键换装,12:123看房,13文通虚拟场景,14上传的matterport场景
+     */
+    @TableField("scene_source")
+    private Integer sceneSource;
+
+    /**
+     * 大场景序号(随心装场景码)
+     */
+    @TableField("vrnum")
+    private String vrnum;
+
+    @TableField("unicode")
+    private String unicode;
+
+    @TableField("mosaics")
+    private String mosaics;
+
+    /**
+     * 是否已升级v4(0-否,1-是)
+     */
+    @TableField("is_upgrade")
+    private Integer isUpgrade;
+
+
+}

+ 285 - 0
src/main/java/com/fdkankan/scene/entity/SceneProEdit.java

@@ -0,0 +1,285 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+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-07-04
+ */
+@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("create_time")
+    private Date createTime;
+
+    /**
+     * 大场景的密钥
+     */
+    @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;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableLogic("A")
+    @TableField("rec_status")
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 普通录屏文件地址
+     */
+    @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("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("vr_thumb")
+    private String vrThumb;
+
+
+}

+ 73 - 0
src/main/java/com/fdkankan/scene/entity/SceneRepairLog.java

@@ -0,0 +1,73 @@
+package com.fdkankan.scene.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.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;
+
+
+}

+ 78 - 0
src/main/java/com/fdkankan/scene/entity/SceneResource.java

@@ -0,0 +1,78 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+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-07-04
+ */
+@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("name")
+    private String name;
+
+    /**
+     * 英文名
+     */
+    @TableField("en_name")
+    private String enName;
+
+    /**
+     * 权限key
+     */
+    @TableField("key_word")
+    private String keyWord;
+
+    /**
+     * 权限图标
+     */
+    @TableField("icon")
+    private String icon;
+
+    /**
+     * 资源描述
+     */
+    @TableField("description")
+    private String description;
+
+    /**
+     * 版本(v3,v4)
+     */
+    @TableField("version")
+    private String version;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableLogic("A")
+    @TableField("rec_status")
+    private String recStatus;
+
+
+}

+ 54 - 0
src/main/java/com/fdkankan/scene/entity/SceneResourceCooperation.java

@@ -0,0 +1,54 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+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-07-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_resource_cooperation")
+public class SceneResourceCooperation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景资源id
+     */
+    @TableField("scene_resource_id")
+    private Long sceneResourceId;
+
+    /**
+     * 协作用户的id
+     */
+    @TableField("scene_cooperation_id")
+    private Long sceneCooperationId;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableLogic("A")
+    @TableField("rec_status")
+    private String recStatus;
+
+
+}

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

@@ -0,0 +1,99 @@
+package com.fdkankan.scene.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,"scene", getTables(new String[]{
+                "t_scene_resource",
+        }));
+
+//        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://120.24.144.164:3306/4dkankan_v4",
+                "root","4Dage@4Dage#@168")
+                .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();
+    }
+}

+ 29 - 0
src/main/java/com/fdkankan/scene/httpclient/FdkankanMiniClient.java

@@ -0,0 +1,29 @@
+package com.fdkankan.scene.httpclient;
+
+import com.dtflys.forest.annotation.Body;
+import com.dtflys.forest.annotation.Post;
+import com.dtflys.forest.annotation.Retry;
+import com.dtflys.forest.annotation.Var;
+import com.dtflys.forest.callback.OnError;
+import com.dtflys.forest.callback.OnSuccess;
+import com.fdkankan.common.response.Result;
+import com.fdkankan.scene.bean.RequestSceneProV4;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/24
+ **/
+public interface FdkankanMiniClient {
+
+    @Post(
+        url = "${url}",
+        contentType = "application/json"
+    )
+    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+    Result upgradeToV4ResultSync(@Var("url") String url, @Body RequestSceneProV4 param, OnSuccess<Result> onSuccess, OnError onError);
+
+}

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

@@ -0,0 +1,53 @@
+package com.fdkankan.scene.listener;
+
+import com.fdkankan.scene.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.scene.upgrade-to-v4}"
+    )
+    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
+        String correlationId = (String) correlation;
+        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/scene/mapper/ISceneCooperationMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.SceneCooperation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ISceneCooperationMapper extends BaseMapper<SceneCooperation> {
+
+}

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

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.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/scene/mapper/ISceneEditInfoExtMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.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/scene/mapper/ISceneEditInfoMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.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/scene/mapper/IScenePlusExtMapper.java

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

+ 18 - 0
src/main/java/com/fdkankan/scene/mapper/IScenePlusMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.ScenePlus;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景主表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-29
+ */
+@Mapper
+public interface IScenePlusMapper extends BaseMapper<ScenePlus> {
+
+}

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

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

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

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

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

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.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/scene/mapper/ISceneResourceCooperationMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.entity.SceneResourceCooperation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景资源和协作用户关联表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Mapper
+public interface ISceneResourceCooperationMapper extends BaseMapper<SceneResourceCooperation> {
+
+}

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

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

+ 18 - 0
src/main/java/com/fdkankan/scene/service/ISceneCooperationService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.SceneCooperation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneCooperationService extends IService<SceneCooperation> {
+
+    SceneCooperation getByNum(String num);
+
+}

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

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.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/scene/service/ISceneEditInfoExtService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.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/scene/service/ISceneEditInfoService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.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/scene/service/IScenePlusExtService.java

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

+ 16 - 0
src/main/java/com/fdkankan/scene/service/IScenePlusService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.ScenePlus;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景主表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-29
+ */
+public interface IScenePlusService extends IService<ScenePlus> {
+
+}

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

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

+ 21 - 0
src/main/java/com/fdkankan/scene/service/ISceneProService.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.scene.bean.RequestSceneProV4;
+import com.fdkankan.scene.entity.ScenePro;
+import org.springframework.validation.annotation.Validated;
+
+/**
+ * <p>
+ * pro场景表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneProService extends IService<ScenePro> {
+
+    ResultData upgradeToV4ResultSync(RequestSceneProV4 param) throws Exception;
+
+}

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

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.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/scene/service/ISceneResourceCooperationService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.entity.SceneResourceCooperation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景资源和协作用户关联表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+public interface ISceneResourceCooperationService extends IService<SceneResourceCooperation> {
+
+}

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

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

+ 18 - 0
src/main/java/com/fdkankan/scene/service/ISceneService.java

@@ -0,0 +1,18 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.common.response.ResultData;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/7/4
+ **/
+public interface ISceneService {
+
+    ResultData isLogin(String num, String token) throws Exception;
+
+}

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

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

+ 28 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneCooperationServiceImpl.java

@@ -0,0 +1,28 @@
+package com.fdkankan.scene.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.common.constant.RecStatus;
+import com.fdkankan.scene.entity.SceneCooperation;
+import com.fdkankan.scene.mapper.ISceneCooperationMapper;
+import com.fdkankan.scene.service.ISceneCooperationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneCooperationServiceImpl extends ServiceImpl<ISceneCooperationMapper, SceneCooperation> implements ISceneCooperationService {
+
+    @Override
+    public SceneCooperation getByNum(String num) {
+        return this.getOne(
+            new LambdaQueryWrapper<SceneCooperation>()
+                .eq(SceneCooperation::getSceneNum, num));
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.SceneEditControls;
+import com.fdkankan.scene.mapper.ISceneEditControlsMapper;
+import com.fdkankan.scene.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/scene/service/impl/SceneEditInfoExtServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.SceneEditInfoExt;
+import com.fdkankan.scene.mapper.ISceneEditInfoExtMapper;
+import com.fdkankan.scene.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/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.SceneEditInfo;
+import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
+import com.fdkankan.scene.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/scene/service/impl/ScenePlusExtServiceImpl.java

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

+ 20 - 0
src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.ScenePlus;
+import com.fdkankan.scene.mapper.IScenePlusMapper;
+import com.fdkankan.scene.service.IScenePlusService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 场景主表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-06-29
+ */
+@Service
+public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
+
+}

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

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

+ 100 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -0,0 +1,100 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.common.constant.RecStatus;
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.RequestSceneProV4;
+import com.fdkankan.scene.entity.SceneCooperation;
+import com.fdkankan.scene.entity.ScenePro;
+import com.fdkankan.scene.entity.SceneResource;
+import com.fdkankan.scene.entity.SceneResourceCooperation;
+import com.fdkankan.scene.mapper.ISceneProMapper;
+import com.fdkankan.scene.service.ISceneCooperationService;
+import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.scene.service.ISceneResourceCooperationService;
+import com.fdkankan.scene.service.ISceneResourceService;
+import com.google.common.collect.Lists;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * pro场景表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {
+
+    @Autowired
+    private ISceneCooperationService sceneCooperationService;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private ISceneResourceCooperationService sceneResourceCooperationService;
+    @Autowired
+    private ISceneResourceService sceneResourceService;
+
+    @Override
+    public ResultData upgradeToV4ResultSync(RequestSceneProV4 param) throws Exception {
+        ScenePro scenePro = this.getById(param.getId());
+        scenePro.setWebSite(param.getWebSite());
+        scenePro.setIsUpgrade(1);
+        this.updateById(scenePro);
+
+        String num = scenePro.getNum();
+
+        //如果场景有协作者,默认勾选上v4所有菜单
+        SceneCooperation SceneCooperation = sceneCooperationService.getByNum(num);
+        if(Objects.nonNull(SceneCooperation)){
+
+            redisUtil.hset(RedisKey.SCENE_COOPERATION_NUM_USERID, num, SceneCooperation.getUserId() + "");
+
+            //判断是否已经有了v4的菜单,如果已经有了,证明已经迁移过,不需要再初始化菜单资源
+            List<SceneResourceCooperation> sceneResourceCooperationList = sceneResourceCooperationService.list(
+                new LambdaQueryWrapper<SceneResourceCooperation>()
+                    .eq(SceneResourceCooperation::getSceneCooperationId, SceneCooperation.getId()));
+
+            if(CollUtil.isNotEmpty(sceneResourceCooperationList)){
+                List<Long> sceneSourceList = sceneResourceCooperationList.stream()
+                    .map(item -> item.getSceneResourceId()).collect(Collectors.toList());
+                List<SceneResource> sceneResourceList
+                    = sceneResourceService.list(
+                        new LambdaQueryWrapper<SceneResource>()
+                            .eq(SceneResource::getVersion, "v4")
+                            .in(SceneResource::getId, sceneSourceList));
+                if(CollUtil.isEmpty(sceneResourceList)){//如果查出来的这个场景的v4资源是空的,证明是第一次升级,需要初始化菜单资源
+                    sceneResourceList = sceneResourceService.list(
+                        new LambdaQueryWrapper<SceneResource>()
+                            .eq(SceneResource::getVersion, "v4"));// 查出所有的v4菜单,给这个场景的协作者初始化所有v4菜单资源
+                    if(CollUtil.isNotEmpty(sceneResourceList)){
+                        List<SceneResourceCooperation> list = Lists.newArrayList();
+                        SceneResourceCooperation sceneResourceCooperation = null;
+                        for (SceneResource sceneResource : sceneResourceList) {
+                            sceneResourceCooperation = new SceneResourceCooperation();
+                            sceneResourceCooperation.setSceneResourceId(sceneResource.getId());
+                            sceneResourceCooperation.setSceneCooperationId(SceneCooperation.getId());
+                            sceneResourceCooperation.setCreateTime(new Date());
+                            sceneResourceCooperation.setUpdateTime(new Date());
+                            sceneResourceCooperation.setRecStatus(RecStatus.VALID.code());
+                            list.add(sceneResourceCooperation);
+                        }
+                        sceneResourceCooperationService.saveBatch(list);
+                    }
+                }
+            }
+        }
+
+        return ResultData.ok();
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.SceneRepairLog;
+import com.fdkankan.scene.mapper.ISceneRepairLogMapper;
+import com.fdkankan.scene.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 {
+
+}

+ 438 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneRepairService.java

@@ -0,0 +1,438 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.scene.entity.ScenePro;
+import com.fdkankan.scene.service.ISceneEditControlsService;
+import com.fdkankan.scene.service.ISceneEditInfoExtService;
+import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusExtService;
+import com.fdkankan.scene.service.ISceneProEditService;
+import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.scene.service.ISceneRepairLogService;
+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;
+
+/**
+ * <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 ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+    @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()));
+//                // TODO: 2022/4/24 这里应该生成floor_user。json文件
+//                //                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/scene/service/impl/SceneResourceCooperationServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.service.impl;
+
+import com.fdkankan.scene.entity.SceneResourceCooperation;
+import com.fdkankan.scene.mapper.ISceneResourceCooperationMapper;
+import com.fdkankan.scene.service.ISceneResourceCooperationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 场景资源和协作用户关联表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-07-04
+ */
+@Service
+public class SceneResourceCooperationServiceImpl extends ServiceImpl<ISceneResourceCooperationMapper, SceneResourceCooperation> implements ISceneResourceCooperationService {
+
+}

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

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

+ 172 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java

@@ -0,0 +1,172 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.model.SSOUser;
+import com.fdkankan.common.response.ResultData;
+import com.fdkankan.common.user.SSOLoginHelper;
+import com.fdkankan.common.util.DateUtil;
+import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.scene.service.ISceneService;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/7/4
+ **/
+@Service
+public class SceneServiceImpl implements ISceneService {
+
+    @Autowired
+    private SSOLoginHelper ssoLoginHelper;
+
+    @Override
+    public ResultData isLogin(String num, String token) throws Exception {
+
+        SSOUser ssoUser = ssoLoginHelper.loginCheckV3(token);
+
+        // 解密获得username,用于和数据库进行对比
+        String username = JwtUtil.getUsername(token);
+
+//        SceneProEntity sceneProEntity = sceneProService.findBySceneNum(num);
+//        if(sceneProEntity == null){
+//            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+//        }
+//        if(sceneProEntity.getPayStatus() != 1){
+//            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+//        }
+//        if(sceneProEntity.getStatus() != 1 && sceneProEntity.getStatus() != -2){
+//            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+//        }
+//
+//        JSONObject jsonObject = new JSONObject();
+//
+//        List<SceneResourceEntity> exclude = new ArrayList<>();
+//        SceneResourceEntity excludeEntity = new SceneResourceEntity();
+//        excludeEntity.setKeyWord("data");
+//        exclude.add(excludeEntity);
+//
+//        CameraEntity cameraEntity = goodsService.findByChildName(username);
+//        jsonObject.put("exclude", exclude);
+//        jsonObject.put("include", new ArrayList<>());
+//        jsonObject.put("company", null);
+//        Result result = Result.success(jsonObject);
+//
+//        //判断该场景是否属于增值权益
+//        boolean isIncrement = false;
+//        //获取该相机是否有权益
+//        boolean isExpired  = false;
+//        CameraEntity sceneCamera = goodsService.findCameraById(sceneProEntity.getCameraId());
+//        if(sceneCamera != null){
+//            UserIncrementEntity userIncrementEntity = userIncrementService.findByCameraId(sceneCamera.getId());
+//
+//            if(userIncrementEntity != null){
+//                if( userIncrementEntity.getIsExpired().intValue() == 0){
+//                    isIncrement = true;
+//                }
+//                if(userIncrementEntity.getIsExpired().intValue() == 1){
+//                    isExpired  = true;
+//                }
+//            }else{
+//                try {
+//                    Date date = DateUtil.string2Date("2021-09-09 00:00:00",null);
+//
+//                    //非07批次的放开
+//                    String pc = sceneCamera.getSnCode().substring(0,2);
+//                    if(!pc.equals("07") ){
+//                        if(sceneCamera.getCreateTime()!=null && date.after(sceneCamera.getCreateTime())){
+//
+//                            isIncrement = true;
+//                            isExpired  = false;
+//                        }
+//                    }
+//                }catch (Exception e){
+//                    e.printStackTrace();
+//                }
+//            }
+//        }
+//
+//        jsonObject.put("isExpired", isExpired );
+//        jsonObject.put("isIncrement", isIncrement);
+//
+//        //判断过期时间
+//        Date date = DateUtil.string2Date(expectedTime,null);
+//
+//        jsonObject.put("isTransition",DateUtil.isBeforeNow2(date));
+//
+//
+//        if(cameraEntity != null){
+//            if(!sceneProEntity.getCameraId().equals(cameraEntity.getId())){
+//                throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5014, SceneConstant.FAILURE_MSG_5014);
+//            }
+//
+//            CameraDetailEntity cameraDetailEntity = goodsService.findCameraDetailByCameraId(cameraEntity.getId());
+//            if(cameraDetailEntity.getCompanyId() != null){
+//                if(cameraDetailEntity.getCompanyId().longValue() == 1 || cameraDetailEntity.getCompanyId().longValue() == 14){
+//                    jsonObject.put("exclude", new ArrayList<>());
+//                    jsonObject.put("company", cameraDetailEntity.getCompanyId().longValue());
+//                }
+//            }
+//            return result;
+//        }
+//
+//        UserEntity userEntity = userService.findUserByUserName(username);
+//        if("18750226207".equals(username)){
+//            log.info("18750226207该账号默认超级管理员,可以操作所有场景");
+//        }
+//        else if(userEntity == null || sceneProEntity.getUserId() == null || userEntity.getId().longValue() != sceneProEntity.getUserId().longValue()){
+//            log.info("user:" + userEntity.getId() + ",scene:" + sceneProEntity.getUserId());
+//
+//            Condition condition = new Condition(SceneCooperationEntity.class);
+//            condition.and().andEqualTo("sceneNum", num);
+//            List<SceneCooperationEntity> list = sceneCooperationService.findAll(condition);
+//            if(list != null && list.size() > 0){
+//                if(list.get(0).getUserId().longValue() != userEntity.getId().longValue()){
+//                    throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5014, SceneConstant.FAILURE_MSG_5014);
+//                }
+//            }else {
+//                throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5014, SceneConstant.FAILURE_MSG_5014);
+//            }
+//        }
+//
+//        if(sceneProEntity.getCameraId() != null){
+//            cameraEntity = goodsService.findCameraById(sceneProEntity.getCameraId());
+//            if(cameraEntity != null){
+//                CameraDetailEntity cameraDetailEntity = goodsService.findCameraDetailByCameraId(cameraEntity.getId());
+//                if(cameraDetailEntity.getCompanyId() != null){
+//                    if(cameraDetailEntity.getCompanyId().longValue() == 1 || cameraDetailEntity.getCompanyId().longValue() == 14){
+//                        jsonObject.put("exclude", new ArrayList<>());
+//                        jsonObject.put("company", cameraDetailEntity.getCompanyId().longValue());
+//                    }
+//                }
+//            }
+//        }
+//
+//        //权限控制完后判断若是协作账号,获取协作权限
+//        SceneCooperationEntity sceneCooperationEntity = sceneCooperationService.findBySceneNum(num);
+//        //若数据为空表示可操作全部资源
+//        if(sceneCooperationEntity == null || sceneCooperationEntity.getUserId().longValue() != ssoUser.getId().longValue()){
+//            return result;
+//        }
+//
+//        if(sceneProEntity.getUserId()!= null && sceneCooperationEntity.getUserId()!= null &&
+//            sceneProEntity.getUserId().equals(sceneCooperationEntity.getUserId())){
+//            return result;
+//        }
+
+//        jsonObject.put("include", sceneResourceService.findByCooperationId(sceneCooperationEntity.getId()));
+
+        return ResultData.ok();
+    }
+}

+ 570 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneUpgradeToV4Service.java

@@ -0,0 +1,570 @@
+package com.fdkankan.scene.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.UploadFilePath;
+import com.fdkankan.common.util.FileUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
+import com.fdkankan.common.util.SceneUtil;
+import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.RequestSceneProV4;
+import com.fdkankan.scene.bean.SceneEditControlsBean;
+import com.fdkankan.scene.bean.SceneJsonBean;
+import com.fdkankan.scene.bean.SceneUpgradeProgressBean;
+import com.fdkankan.scene.constant.ProgressStatus;
+import com.fdkankan.scene.entity.SceneEditControls;
+import com.fdkankan.scene.entity.SceneEditInfo;
+import com.fdkankan.scene.entity.SceneEditInfoExt;
+import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.entity.ScenePro;
+import com.fdkankan.scene.entity.SceneProEdit;
+import com.fdkankan.scene.entity.SceneRepairLog;
+import com.fdkankan.scene.service.ISceneEditControlsService;
+import com.fdkankan.scene.service.ISceneEditInfoExtService;
+import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusExtService;
+import com.fdkankan.scene.service.ISceneProEditService;
+import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.scene.service.ISceneRepairLogService;
+import com.fdkankan.scene.service.ISceneUpgradeToV4Service;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/21
+ **/
+@RefreshScope
+@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;
+    @Value("${http.host.4dkankanMini}")
+    private String fkankanMiniHost;
+    @Value("${http.api-v4.upgradeToV4ResultSync}")
+    private String URL_UPGRADE_TO_V4_RESULT_SYNC;
+
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+    @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;
+
+    @Override
+    public void upgrade(long sceneProId)  throws Exception{
+
+        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.setUpdateTime(Calendar.getInstance().getTime());
+                sceneRepairLog.setReason("");
+                sceneRepairLog.setState(0);
+            }
+            //写入日志
+            sceneRepairLogService.saveOrUpdate(sceneRepairLog);
+
+            SceneProEdit sceneProEdit = sceneProEditService.getOne(
+                new LambdaQueryWrapper<SceneProEdit>()
+                    .eq(SceneProEdit::getProId, scenePro.getId()));
+
+            String path = scenePro.getDataSource();
+
+            //生成热点json文件
+            Integer tags = this.createHotJson(dataPath, num);
+
+            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
+                String music = null;
+                if(!"noMusic".equals(sceneProEdit.getBgMusic()) && !"0".equals(sceneProEdit.getBgMusic())){
+                    music = sceneProEdit.getBgMusic();
+                }
+                if(StrUtil.isNotEmpty(music)){
+                    if(music.equals("无")) music = "";
+                    if(music.equals("欢快")) music = "01";
+                    if(music.equals("空灵")) music = "02";
+                    if(music.equals("节奏")) music = "03";
+                    if(music.equals("怀旧")) music = "04";
+                    if(music.equals("想念")) music = "05";
+                    if(music.equals("复古")) music = "06";
+                    if(music.equals("琴弦")) music = "07";
+                    if(music.equals("愉快")) music = "08";
+                }
+                sceneEditInfo.setMusic(music);
+                //如果bgmusicname 不为空  ,MusicFile = BgMusicName
+                if(StrUtil.isNotEmpty(sceneProEdit.getBgMusicName())){
+                    sceneEditInfo.setMusicFile(sceneProEdit.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(0);
+                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());
+                sceneEditInfoService.save(sceneEditInfo);
+
+                sceneEditInfoExt = new SceneEditInfoExt();
+                sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+                sceneEditInfoExt.setSceneProId(scenePro.getId());
+                sceneEditInfoExt.setScenePlusId(scenePro.getId());
+                sceneEditInfoExt.setFloorPlanAngle(sceneProEdit.getFloorPlanAngle() == null ? 0f : Float.parseFloat(sceneProEdit.getFloorPlanAngle()));
+                sceneEditInfoExt.setFloorPlanCompass(this.getFloorPlanCompass(num));
+                sceneEditInfoExt.setVrNum(sceneProEdit.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(sceneProEdit.getMapVisi());
+                sceneEditControls.setShowLock(sceneProEdit.getNeedKey());
+                sceneEditControls.setShowTitle(Integer.valueOf(CommonStatus.YES.code()));
+                sceneEditControls.setShowPanorama(sceneProEdit.getPanoVisi());
+                sceneEditControls.setShowDollhouse(sceneProEdit.getM3dVisi());
+                sceneEditControls.setShowFloorplan(sceneProEdit.getM2dVisi());
+                sceneEditControls.setShowVR(sceneProEdit.getVrVisi());
+//                sceneEditControls.setShowTour(sceneProEditExt.getTourVisi());
+                sceneEditControls.setShowRule(sceneProEdit.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()));
+
+                sceneEditInfo.setTitle(scenePro.getSceneName());
+                sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
+                sceneEditInfoService.updateById(sceneEditInfo);
+
+            }
+
+            //完成数据库操作更新进度条为10
+            this.updateProgress(num, 10, ProgressStatus.DO_DB.code());
+
+            //oss文件拷贝
+            AtomicInteger count = new AtomicInteger(0);
+            AtomicInteger completeCnt = new AtomicInteger(0);
+            List<String> list = new ArrayList<>();
+            List<String> dataKeys = uploadToOssUtil.listKeys(dataPath);
+            List<String> imageKeys = uploadToOssUtil.listKeys(imagePath);
+            List<String> videoKeys = uploadToOssUtil.listKeys(videoPath);
+            List<String> voiceKeys = uploadToOssUtil.listKeys(voicePath);
+            if(CollUtil.isNotEmpty(dataKeys)) count.addAndGet(dataKeys.size());
+            if(CollUtil.isNotEmpty(imageKeys)) count.addAndGet(imageKeys.size());
+            if(CollUtil.isNotEmpty(videoKeys)) count.addAndGet(videoKeys.size());
+            if(CollUtil.isNotEmpty(voiceKeys)) count.addAndGet(voiceKeys.size());
+            this.copyFileOss(num, completeCnt, count, dataKeys, dataPath, dataViewPath);
+            this.copyFileOss(num, completeCnt, count, imageKeys, imagePath, imageViewPath);
+            this.copyFileOss(num, completeCnt, count, videoKeys, videoPath, videoViewPath);
+            this.copyFileOss(num, completeCnt, count, voiceKeys, voicePath, voiceViewPath);
+
+
+            //将全景图缓存到缓存目录
+            List<String> imagesList = cn.hutool.core.io.FileUtil.listFileNames(path + "/caches/images");
+            String cachedImagesPath = String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
+            //先清除旧的全景图
+            cn.hutool.core.io.FileUtil.del(cachedImagesPath);
+            String visionPath = path + "/results/vision.txt";
+            List<String> panoramaImageList = SceneUtil.getPanoramaImageList(visionPath);
+            imagesList.stream().forEach(fileName -> {
+                if(panoramaImageList.contains(fileName)){
+                    String srcPath = path + "/caches/images/" + fileName;
+                    String targetPath = cachedImagesPath + fileName;
+                    log.info("源文件:{}, 目标文件:{}", srcPath, targetPath);
+                    cn.hutool.core.io.FileUtil.copy(srcPath, targetPath, true);
+                }
+            });
+
+            //户型图上传
+            String  userEditPath = UploadFilePath.USER_EDIT_PATH + "floor-cad-%s.%s";
+            String  userViewPath = UploadFilePath.USER_VIEW_PATH + "floor-cad-%s.%s";
+            String floorCadPath = path + "/results/floorplan_cad";
+            List<String> floorCadList = FileUtil.getFileList(floorCadPath);
+            if(CollUtil.isNotEmpty(floorCadList)){
+                floorCadList.stream().forEach(str->{
+                    String substring = str.substring(str.lastIndexOf(File.separator) + 1);
+                    String[] arr = substring.split("floor");
+                    String[] arr2 = arr[1].split("\\.");
+                    uploadToOssUtil.upload(str, String.format(userEditPath, num, arr2[0], arr2[1]));
+                    uploadToOssUtil.upload(str, String.format(userViewPath, num, arr2[0], arr2[1]));
+                });
+            }
+
+            //拷贝模型文件到用户编辑目录
+            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());
+            }
+
+            //完成数据库操作更新进度条为10
+            this.updateProgress(num, 90, ProgressStatus.DO_OSS.code());
+
+            //生成二维码
+            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 + sceneProEdit.getBgMusicName(), editUsersPath + "music-user.mp3");
+                uploadToOssUtil.copyFiles(imagePath + sceneProEdit.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");
+            }
+            ScenePlusExt scenePlusExt = scenePlusExtService.getOne(
+                new LambdaQueryWrapper<ScenePlusExt>()
+                    .eq(ScenePlusExt::getPlusId, scenePro.getId()));
+            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.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");
+                }
+            }
+
+            //本地mapping文件上传
+            String mappingOssPath = String.format(UploadFilePath.DATA_EDIT_PATH, num) + "mapping";
+            String mappingPath = "/mnt/4Dkankan/scene/data/data" + num + "/mapping";
+            List<String> mappingList = FileUtils.list(new File(mappingPath));
+            if(CollUtil.isNotEmpty(mappingList)){
+                mappingList.parallelStream().forEach(mapping->{
+                    uploadToOssUtil.upload(mapping, mapping.replace(mappingPath, mappingOssPath));
+                });
+            }
+
+            //生成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(scenePlusExt.getSceneResolution());
+            sceneJson.setSceneFrom(scenePlusExt.getSceneFrom());
+            sceneJson.setSceneKind(scenePlusExt.getSceneKind());
+            if(StrUtil.isNotEmpty(scenePro.getVideos())){
+                sceneJson.setVideos(JSON.parseObject(scenePro.getVideos()));
+            }
+            sceneJson.setVersion(sceneEditInfo.getVersion());
+            //上传sceneJson文件
+            String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", num);
+            uploadToOssUtil.upload(JSON.toJSONBytes(sceneJson), sceneJsonPath);
+
+            redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
+
+            //迁移耗时
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+
+            //记录日志
+            sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
+            sceneRepairLog.setState(1);
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+
+            //处理scenepro的升级状态和协作关系
+            sceneProService.upgradeToV4ResultSync(
+                RequestSceneProV4.builder()
+                    .id(sceneProId)
+                    .webSite(scenePro.getWebSite())
+                    .build());
+
+            this.updateProgress(num, 100, ProgressStatus.SUCCESS.code());
+
+        }catch (Exception e){
+            log.error(e.getMessage(), e);
+
+            //完成数据库操作更新进度条为0,状态失败
+            this.updateProgress(num, 0, ProgressStatus.FAIL.code());
+
+            //记录日志
+            consumTime = Calendar.getInstance().getTimeInMillis() - startTime;
+            sceneRepairLog.setUpdateTime(Calendar.getInstance().getTime());
+            sceneRepairLog.setState(2);
+            sceneRepairLog.setReason(ExceptionUtil.stacktraceToString(e));
+            sceneRepairLog.setConsumTime(consumTime);
+            sceneRepairLogService.updateById(sceneRepairLog);
+        } finally {
+            String lockKey = String.format(RedisLockKey.LOCK_SCENE_UPGRADE_V4, num);
+            redisUtil.del(lockKey);
+        }
+    }
+
+    private void copyFileOss(String num, AtomicInteger completeCnt, AtomicInteger count, List<String> keyList, String sourcePath, String targetPah){
+        if(CollUtil.isEmpty(keyList))
+            return;
+        keyList.parallelStream().forEach(key->{
+            try {
+                String targetKey = null;
+                if(key.contains(sourcePath)){
+                    targetKey = key.replace(sourcePath, targetPah);
+                }
+                uploadToOssUtil.copyObject(key, targetKey);
+                this.updateProgress(num,
+                    10 +
+                        (new BigDecimal(completeCnt.incrementAndGet())
+                            .divide(new BigDecimal(count.get()), 6, BigDecimal.ROUND_HALF_UP)
+                            .multiply(new BigDecimal(0.7))
+                            .multiply(new BigDecimal(100))
+                            .setScale(0, RoundingMode.UP)
+                            .intValue()),
+                    ProgressStatus.DO_OSS.code()
+                );
+            } catch (IOException e) {
+                log.error("文件拷贝出错,key:{}", key);
+            }
+        });
+    }
+
+    private Integer createHotJson(String dataPath, String num) throws IOException {
+        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.SCENE_USER_PATH_V4, num) + "hot.json";
+//            FileUtils.writeFile(hotJsonPath, localObject.toJSONString());
+//        }
+        return tags;
+    }
+
+    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()));
+    }
+}

+ 42 - 0
src/main/resources/bootstrap-dev-eur.yml

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev-eur
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.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-dev-eur
+
+
+
+
+
+

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

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-dev
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config-52.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-dev
+
+
+
+
+
+

+ 42 - 0
src/main/resources/bootstrap-pro-eur.yml

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.31.42.151:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro-eur
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.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: 172.31.42.151:8848
+        namespace: 4dkankan-pro-eur
+
+
+
+
+
+

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

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.18.157.42:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.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: 172.18.157.42:8848
+        namespace: 4dkankan-pro
+
+
+
+
+
+

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

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-test-eur
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.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-eur
+
+
+
+
+
+

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

@@ -0,0 +1,42 @@
+spring:
+  application:
+    name: 4dkankan-center-scene-v3
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-test
+        extension-configs:
+          - data-id: 4dkankan-center-scene-v3.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-db-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-redis-config-52.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

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

@@ -0,0 +1,324 @@
+<?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"/>
+
+	<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/scene/SceneCooperationMapper.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.scene.mapper.ISceneCooperationMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneEditControlsMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneEditInfoExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneEditInfoMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.IScenePlusExtMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/ScenePlusMapper.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.scene.mapper.IScenePlusMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneProEditMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneProMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneRepairLogMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/SceneResourceCooperationMapper.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.scene.mapper.ISceneResourceCooperationMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/scene/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.scene.mapper.ISceneResourceMapper">
+
+</mapper>