瀏覽代碼

Merge branch 'release' into feature-v4.1.0-20220620

# Conflicts:
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
dengsixing 3 年之前
父節點
當前提交
dc5870dd0f
共有 16 個文件被更改,包括 408 次插入71 次删除
  1. 0 6
      4dkankan-center-scene-download/src/main/java/com/fdkankan/download/config/TestController.java
  2. 64 35
      4dkankan-center-scene-download/src/main/java/com/fdkankan/download/service/impl/SceneDownloadHandlerServiceImpl.java
  3. 36 0
      4dkankan-center-scene-download/src/main/resources/bootstrap-pro-eur.yml
  4. 35 0
      4dkankan-center-scene-download/src/main/resources/bootstrap-test-eur.yml
  5. 17 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/Interceptor/CheckCooperationPermitAspect.java
  6. 2 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/RequestSceneProV4.java
  7. 34 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/V3Controller.java
  8. 2 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java
  9. 8 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/IScenePlusService.java
  10. 38 4
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
  11. 22 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java
  12. 82 25
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
  13. 10 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneUpgradeToV4Service.java
  14. 26 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/MoveSceneParamVO.java
  15. 24 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/UnbindOrBindCameraParamVO.java
  16. 8 0
      4dkankan-common/src/main/java/com/fdkankan/common/model/SSOUser.java

+ 0 - 6
4dkankan-center-scene-download/src/main/java/com/fdkankan/download/config/TestController.java

@@ -26,12 +26,6 @@ import org.springframework.web.client.RestTemplate;
 @Slf4j
 public class TestController {
 
-    @Value("${download.config.server-url}")
-    private String serverUrl;
-
-    @Autowired
-    private RestTemplate restTemplate;
-
     @Autowired
     UploadToOssUtil uploadToOssUtil;
 

+ 64 - 35
4dkankan-center-scene-download/src/main/java/com/fdkankan/download/service/impl/SceneDownloadHandlerServiceImpl.java

@@ -6,9 +6,12 @@ import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fdkankan.common.bean.DownLoadProgressBean;
 import com.fdkankan.common.bean.DownLoadTaskBean;
 import com.fdkankan.common.constant.SceneDownloadProgressStatus;
+import com.fdkankan.common.constant.SceneFrom;
+import com.fdkankan.common.constant.SceneResolution;
 import com.fdkankan.common.constant.ServerCode;
 import com.fdkankan.common.constant.UploadFilePath;
 import com.fdkankan.common.response.ResultData;
@@ -63,13 +66,26 @@ import org.springframework.web.client.RestTemplate;
 @Service
 public class SceneDownloadHandlerServiceImpl {
 
-    //    @Autowired
-//    private PlatformUserClient platformUserClient;
+    private static final String[] prefixArr = new String[]{
+        UploadFilePath.DATA_VIEW_PATH,
+        UploadFilePath.VOICE_VIEW_PATH,
+        UploadFilePath.VIDEOS_VIEW_PATH,
+        UploadFilePath.IMG_VIEW_PATH,
+        UploadFilePath.USER_VIEW_PATH,
+    };
+
+    private static final List<ImageType> imageTypes = Lists.newArrayList();
+    static{
+        imageTypes.add(ImageType.builder().name("2k_face").size("2048").ranges(new String[]{"0", "511", "1023", "1535"}).build());
+        imageTypes.add(ImageType.builder().name("1k_face").size("1024").ranges(new String[]{"0", "511"}).build());
+        imageTypes.add(ImageType.builder().name("512_face").size("512").ranges(new String[]{"0"}).build());
+    }
+
     @Autowired
     private SceneUserSceneClient sceneUserSceneClient;
 
-    @Value("${path.v3school}")
-    private String v3localPath;
+    @Value("${path.v4school}")
+    private String v4localPath;
 
     @Value("${path.zip-local}")
     private String zipLocalFormat;
@@ -83,25 +99,11 @@ public class SceneDownloadHandlerServiceImpl {
     @Value("${zip.nThreads}")
     private int zipNthreads;
 
-    private static final String[] prefixArr = new String[]{
-        UploadFilePath.DATA_VIEW_PATH,
-        UploadFilePath.VOICE_VIEW_PATH,
-        UploadFilePath.VIDEOS_VIEW_PATH,
-        UploadFilePath.IMG_VIEW_PATH,
-        UploadFilePath.USER_VIEW_PATH,
-    };
-
-    private static final List<ImageType> imageTypes = Lists.newArrayList();
-    static{
-        imageTypes.add(ImageType.builder().name("2k_face").size("2048").ranges(new String[]{"0", "511", "1023", "1535"}).build());
-        imageTypes.add(ImageType.builder().name("1k_face").size("1024").ranges(new String[]{"0", "511"}).build());
-        imageTypes.add(ImageType.builder().name("512_face").size("512").ranges(new String[]{"0"}).build());
-    }
+    @Value("${oss.bucket:4dkankan}")
+    private String bucket;
 
     @Value("${upload.type:oss}")
     private String uploadType;
-    @Value("${download.config.server-url}")
-    private String serverUrl;
     @Value("${download.config.resource-url}")
     private String resourceUrl;
     @Value("${download.config.public-url}")
@@ -159,7 +161,7 @@ public class SceneDownloadHandlerServiceImpl {
         try {
             Set<String> cacheKeys = new ConcurrentHashSet<>();
 
-            Map<String, List<String>> allFiles = this.getAllFiles(num, v3localPath);
+            Map<String, List<String>> allFiles = this.getAllFiles(num, v4localPath);
             List<String> ossFilePaths = allFiles.get("ossFilePaths");
             List<String> v3localFilePaths = allFiles.get("v3localFilePaths");
 
@@ -174,25 +176,35 @@ public class SceneDownloadHandlerServiceImpl {
             }
             ZipOutputStream out = new ZipOutputStream(zipFile);
 
-            JSONObject getInfoJson = this.zipGetInfoJson(out, this.wwwroot, num);
-            String resolution = "2k";
-            if(getInfoJson.getInt("sceneSource") != null &&
-                (getInfoJson.getInt("sceneSource") == 3 || getInfoJson.getInt("sceneSource") == 4)){
-                resolution = "4k";
+//            JSONObject getInfoJson = this.zipGetInfoJson(out, this.wwwroot, num);
+            String sceneJsonData = uploadToOssUtil.getObjectContent(bucket, String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json");
+            JSONObject sceneJson = JSONUtil.parseObj(sceneJsonData);
+            String resolution = "4k";
+            String sceneForm = sceneJson.getStr("sceneFrom");
+            if(StrUtil.isNotEmpty(sceneForm) && SceneFrom.PRO.code().equals(sceneForm)){
+                resolution = "2k";
+            }
+            //国际版存在已经切好图的情况,下载时不需要再切图,只需要把文件直接下载下来打包就可以了
+            String sceneResolution = sceneJson.getStr("sceneResolution");
+            if(SceneResolution.TILES.code().equals(sceneResolution)){
+                resolution = "notNeadCut";
             }
+
             int imagesVersion = -1;
             // TODO: 2022/3/29  V4版本目前没有imagesVersion字段,暂时用version字段替代
 //            if(getInfoJson.getInt("imagesVersion") != null){
 //                imagesVersion = getInfoJson.getInt("imagesVersion");
 //            }
-            if(getInfoJson.getInt("version") != null){
-                imagesVersion = getInfoJson.getInt("version");
+            Integer version = sceneJson.getInt("version");
+            if(Objects.nonNull(version)){
+                imagesVersion = version;
             }
 
 
             long start = Calendar.getInstance().getTimeInMillis();
+
             //固定文件写入
-            this.zipLocalFiles(out, v3localFilePaths, v3localPath, num, count, total);
+            this.zipLocalFiles(out, v3localFilePaths, v4localPath, num, count, total);
             long end1 = Calendar.getInstance().getTimeInMillis();
             log.info("打包固定文件耗时, num:{}, time:{}", num, end1 - start);
 
@@ -201,6 +213,8 @@ public class SceneDownloadHandlerServiceImpl {
             long end2 = Calendar.getInstance().getTimeInMillis();
             log.info("打包oss文件耗时, num:{}, time:{}", num, end2 - end1);
 
+            //重新写入scene.json(去掉密码访问设置)
+            this.zipSceneJson(out, this.wwwroot, num, sceneJson);
 
             //写入启动命令
             this.zipBat(out, num);
@@ -275,14 +289,16 @@ public class SceneDownloadHandlerServiceImpl {
             return;
 
         //切图
-        if((filePath.contains(imageNumPath + "panorama/") && filePath.contains("tiles/" + resolution))
-            || filePath.contains(imageNumPath + "tiles/" + resolution + "/")) {
-            this.processImage(filePath, out, resolution, imagesVersion, cacheKeys);
-            return;
+        if(!"notNeadCut".equals(resolution)){
+            if((filePath.contains(imageNumPath + "panorama/") && filePath.contains("tiles/" + resolution))
+                || filePath.contains(imageNumPath + "tiles/" + resolution + "/")) {
+                this.processImage(filePath, out, resolution, imagesVersion, cacheKeys);
+                return;
+            }
         }
 
         //其他文件打包
-        this.ProcessFiles(filePath, out, this.wwwroot, cacheKeys);
+        this.ProcessFiles(num, filePath, out, this.wwwroot, cacheKeys);
     }
 
     private void zipLocalFiles(ZipOutputStream out, List<String> v3localFilePaths, String v3localPath, String num, AtomicInteger count, int total) throws Exception{
@@ -364,6 +380,16 @@ public class SceneDownloadHandlerServiceImpl {
         return getInfoJson;
     }
 
+    private void zipSceneJson(ZipOutputStream out, String root, String num, JSONObject sceneJson) throws Exception{
+
+        //访问密码置0
+        JSONObject controls = sceneJson.getJSONObject("controls");
+        controls.set("showLock", 0);
+
+        String sceneJsonPath = root + String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json";
+        this.zipBytes(out, sceneJsonPath, sceneJson.toString().getBytes());
+    }
+
     private void processImage(String key, ZipOutputStream out, String resolution, int imagesVersion, Set<String> imgKeys) throws Exception{
 
         String fileName = key.substring(key.lastIndexOf("/")+1, key.indexOf("."));
@@ -427,10 +453,13 @@ public class SceneDownloadHandlerServiceImpl {
 
     }
 
-    public void ProcessFiles(String key, ZipOutputStream out, String prefix, Set<String> cacheKeys) throws Exception{
+    public void ProcessFiles(String num, String key, ZipOutputStream out, String prefix, Set<String> cacheKeys) throws Exception{
         if(cacheKeys.contains(key)){
             return;
         }
+        if(key.equals(String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json")){
+            return;
+        }
         cacheKeys.add(key);
         String url = this.resourceUrl + key + "?t=" + Calendar.getInstance().getTimeInMillis();
         if(key.contains("hot.json") || key.contains("link-scene.json")){

+ 36 - 0
4dkankan-center-scene-download/src/main/resources/bootstrap-pro-eur.yml

@@ -0,0 +1,36 @@
+spring:
+  jackson:
+    serialization:
+      #关闭jackson转换 实体属性空值校验
+      FAIL_ON_EMPTY_BEANS: false
+  application:
+    name: 4dkankan-center-scene-download
+  cloud:
+    nacos:
+      config:
+        server-addr: 172.31.42.151:8848
+        file-extension: yaml
+        namespace: 4dkankan-pro-eur
+        extension-configs:
+          - data-id: 4dkankan-center-scene-download.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+
+          - data-id: common-redis-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
+
+
+

+ 35 - 0
4dkankan-center-scene-download/src/main/resources/bootstrap-test-eur.yml

@@ -0,0 +1,35 @@
+spring:
+  jackson:
+    serialization:
+      #关闭jackson转换 实体属性空值校验
+      FAIL_ON_EMPTY_BEANS: false
+  application:
+    name: 4dkankan-center-scene-download
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-test-eur
+        extension-configs:
+          - data-id: 4dkankan-center-scene-download.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+
+          - data-id: common-redis-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
+
+

+ 17 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/Interceptor/CheckCooperationPermitAspect.java

@@ -2,6 +2,7 @@ package com.fdkankan.scene.Interceptor;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.ServerCode;
 import com.fdkankan.common.exception.BusinessException;
@@ -64,12 +65,27 @@ public class CheckCooperationPermitAspect {
 			throw new BusinessException(ErrorCode.PARAM_REQUIRED);
 		}
 
-
 		//判断是不是场景原用户,如果是,跳出
         ScenePlus scenePlus= scenePlusService.getScenePlusByNum(num);
 		if(Objects.isNull(scenePlus)){
 			throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
 		}
+
+		//判断是否相机登录,是否场景的相机id和相机登录的相机id是否相等,如果都满足,则放行,否则判定为用户登录
+		if(Objects.nonNull(user.getCameraLogin())
+			&& CommonStatus.YES.code().byteValue() == user.getCameraLogin().intValue()){
+			if(scenePlus.getCameraId().equals(user.getCameraId())){
+				return;
+			}else{
+				throw new BusinessException(ErrorCode.FAILURE_CODE_5014);
+			}
+		}
+
+		//走到这里代表是用户账号密码登录,如果查到的场景的userid是空,证明相机解绑了,需要返回无权操作
+		if(Objects.isNull(scenePlus.getUserId())){
+			throw new BusinessException(ErrorCode.FAILURE_CODE_5014);
+		}
+
         if(scenePlus.getUserId().equals(user.getId())){
             return;
         }

+ 2 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/RequestSceneProV4.java

@@ -29,5 +29,7 @@ public class RequestSceneProV4 {
 
     private String sceneName;
 
+    private String sceneDec;
+
 
 }

+ 34 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/V3Controller.java

@@ -1,10 +1,15 @@
 package com.fdkankan.scene.controller;
 
+import com.dtflys.forest.annotation.Post;
 import com.fdkankan.common.controller.BaseController;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusService;
 import com.fdkankan.scene.service.ISceneUpgradeToV4Service;
+import com.fdkankan.scene.vo.MoveSceneParamVO;
+import com.fdkankan.scene.vo.UnbindOrBindCameraParamVO;
 import com.fdkankan.scene.vo.UpgradeToV4ParamVO;
+import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -30,6 +35,8 @@ public class V3Controller extends BaseController {
     private ISceneUpgradeToV4Service sceneUpgradeToV4Service;
     @Autowired
     private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private IScenePlusService scenePlusService;
 
     /**
      * <p>
@@ -75,5 +82,32 @@ public class V3Controller extends BaseController {
         return sceneUpgradeToV4Service.getSceneViewInfo(num);
     }
 
+    /**
+     * <p>
+            v3相机解绑和绑定,需要同步v4场景的userid
+     * </p>
+     * @author dengsixing
+     * @date 2022/6/23
+     * @return com.fdkankan.common.response.ResultData
+     **/
+    @PostMapping(value = "/updateScenePlusUserIdByCameraId")
+    public ResultData updateScenePlusUserIdByCameraId(@RequestBody @Validated UnbindOrBindCameraParamVO param){
+        return scenePlusService.updateScenePlusUserIdByCameraId(param.getCameraIdList(), param.getUserId());
+    }
+
+    /**
+     * <p>
+            场景迁移,修改相机id和用户id
+     * </p>
+     * @author dengsixing
+     * @date 2022/6/23
+     * @return com.fdkankan.common.response.ResultData
+     **/
+    @PostMapping(value = "/moveScene")
+    public ResultData moveScene(
+        @RequestBody @Validated MoveSceneParamVO param){
+        return scenePlusService.moveScene(param.getNumList(), param.getCameraId(), param.getUserId());
+    }
+
 
 }

+ 2 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java

@@ -42,6 +42,8 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     void upgradeVersionById(Long id);
 
+    void upgradeSceneJsonVersion(String num, int version) throws IOException ;
+
     ResultData uploadPanorama(String num, MultipartFile file) throws Exception;
 
     ResultData downloadPanorama(FileParamVO param) throws Exception;

+ 8 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/IScenePlusService.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.scene.entity.ScenePlus;
 import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
+import java.util.List;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 /**
  * <p>
@@ -23,5 +25,11 @@ public interface IScenePlusService extends IService<ScenePlus> {
 
     ResultData checkKey(SceneCheckKeyParamVO param) throws Exception;
 
+    ResultData updateScenePlusUserIdByCameraId(List<Long> cameraIdList, Long userId);
+
+    ResultData moveScene(List<String> numList, Long cameraId, Long userId);
+
+
+
 
 }

+ 38 - 4
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java

@@ -300,7 +300,12 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         // todo 调用v3接口同步场景缩略图url---------------------------------start
         String url = fkankanMiniHost + URL_UPGRADE_TO_V4_RESULT_SYNC;
         fdkankanMiniClient.upgradeToV4ResultSync(url,
-            RequestSceneProV4.builder().id(scenePlus.getId()).thumb(scenePlusExt.getThumb()).sceneName(sceneEditInfo.getTitle()).build(),
+            RequestSceneProV4.builder()
+                .id(scenePlus.getId())
+                .thumb(scenePlusExt.getThumb())
+                .sceneName(sceneEditInfo.getTitle())
+                .sceneDec(sceneEditInfo.getDescription())
+                .build(),
             new FdkkMiniReqSuccessCallback(), new FdkkMiniReqErrorCallback()
         );
         // todo 调用v3接口同步场景缩略图url---------------------------------end
@@ -533,7 +538,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     private SceneInfoVO getSceneInfo4View(String num) throws Exception{
 
         // TODO: 2022/5/19 请求v3的接口,获取场景的状态 待v3停机后要换成v4d的逻辑-------------------------start
-        String url = fkankanMiniHost + URL_GET_SCENEPRO_BY_NUM + num;
+        String url = fkankanMiniHost + URL_GET_SCENEPRO_BY_NUM + num + "&addViewCount=yes";
         Result<SceneProV3> result = fdkankanMiniClient
             .getSceneProByNum(url, new FdkkMiniReqSuccessCallback(),
                 new FdkkMiniReqErrorCallback());
@@ -806,6 +811,29 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     }
 
     @Override
+    public void upgradeSceneJsonVersion(String num, int version) throws IOException {
+
+        //更新redis缓存版本号
+        String key = String.format(RedisKey.SCENE_JSON, num);
+        String sceneJson = redisUtil.get(key);
+        if(StrUtil.isNotEmpty(sceneJson)){
+            SceneJsonBean sceneJsonBean = JSON.parseObject(sceneJson, SceneJsonBean.class);
+            sceneJsonBean.setVersion(version);
+            redisUtil.set(key, JSON.toJSONString(sceneJsonBean));
+        }
+
+        //更新oss scene.json版本号
+        String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "scene.json";
+        sceneJson= uploadToOssUtil.getObjectContent(this.bucket, sceneJsonPath);
+        if(StrUtil.isNotEmpty(sceneJson)){
+            SceneJsonBean sceneJsonBean = JSON.parseObject(sceneJson, SceneJsonBean.class);
+            sceneJsonBean.setVersion(version);
+            uploadToOssUtil.upload(JSON.toJSONString(sceneJsonBean).getBytes(StandardCharsets.UTF_8), sceneJsonPath);
+        }
+
+    }
+
+    @Override
     public ResultData uploadPanorama(String num, MultipartFile file) throws Exception {
 
         //校验压缩包格式
@@ -1030,9 +1058,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             cn.hutool.core.io.FileUtil.copy(srcPath, srcPath.replace(targetImagesPath, cachedImagesPath), true);
         });
 
-        //更新版本号
+        //更新数据库版本号
         SceneEditInfo sceneEditInfo = this.getByScenePlusId(scenePlus.getId());
         this.upgradeVersionById(sceneEditInfo.getId());
+        //更新scenejson缓存和oss文件版本号
+        this.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1);
 
         //如果部分成功,则需要返回成功数量和失败列表
         if(CollUtil.isNotEmpty(notExistFileList)){
@@ -1045,6 +1075,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return ResultData.ok();
     }
 
+
+
     @Override
     public ResultData downloadPanorama(FileParamVO param) throws Exception {
 
@@ -1319,7 +1351,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         this.upgradeVersionById(sceneEditInfo.getId());
 
         //更新scene.json版本号
-        this.upgradeVersionToSceneJson(num);
+//        this.upgradeVersionToSceneJson(num);
+        //更新scenejson缓存和oss文件版本号
+        this.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1);
 
         return ResultData.ok();
     }

+ 22 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/ScenePlusServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.scene.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.PayStatus;
 import com.fdkankan.common.exception.BusinessException;
@@ -18,6 +19,7 @@ import com.fdkankan.scene.service.IScenePlusService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.scene.vo.SceneCheckKeyParamVO;
 import java.util.Calendar;
+import java.util.List;
 import java.util.Objects;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -93,4 +95,24 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
 
         return ResultData.ok();
     }
+
+    @Override
+    public ResultData updateScenePlusUserIdByCameraId(List<Long> cameraIdList, Long userId) {
+        LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<ScenePlus>()
+            .set(ScenePlus::getUserId, userId).in(ScenePlus::getCameraId, cameraIdList);
+        this.update(updateWrapper);
+        return ResultData.ok();
+    }
+
+    @Override
+    public ResultData moveScene(List<String> numList, Long cameraId, Long userId) {
+        LambdaUpdateWrapper<ScenePlus> updateWrapper =
+            new LambdaUpdateWrapper<ScenePlus>()
+                .set(ScenePlus::getUserId, userId)
+                .set(ScenePlus::getCameraId, cameraId)
+                .in(ScenePlus::getNum, numList);
+        this.update(updateWrapper);
+        return ResultData.ok();
+
+    }
 }

+ 82 - 25
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -3,7 +3,6 @@ package com.fdkankan.scene.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import com.alibaba.csp.sentinel.util.StringUtil;
@@ -15,12 +14,33 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fdkankan.common.constant.*;
+import com.fdkankan.common.constant.CameraConstant;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ConstantFileName;
+import com.fdkankan.common.constant.ConstantFilePath;
+import com.fdkankan.common.constant.ConstantUrl;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.OperationType;
+import com.fdkankan.common.constant.PayStatus;
+import com.fdkankan.common.constant.RecStatus;
+import com.fdkankan.common.constant.SceneEditType;
+import com.fdkankan.common.constant.SceneStatus;
+import com.fdkankan.common.constant.SceneType;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.common.constant.UploadFilePath;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.common.user.SSOLoginHelper;
 import com.fdkankan.common.user.SSOUser;
-import com.fdkankan.common.util.*;
+import com.fdkankan.common.util.ComputerUtil;
+import com.fdkankan.common.util.ConvertUtils;
+import com.fdkankan.common.util.CreateObjUtil;
+import com.fdkankan.common.util.DateExtUtil;
+import com.fdkankan.common.util.FileMd5Util;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
+import com.fdkankan.common.util.OkHttpUtils;
 import com.fdkankan.fyun.constant.StorageType;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.platform.api.dto.Camera;
@@ -31,18 +51,65 @@ import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.bean.IconBean;
-import com.fdkankan.scene.bean.RequestSceneProV4;
 import com.fdkankan.scene.bean.TagBean;
-import com.fdkankan.scene.callback.FdkkMiniReqErrorCallback;
-import com.fdkankan.scene.callback.FdkkMiniReqSuccessCallback;
-import com.fdkankan.scene.entity.*;
-import com.fdkankan.scene.httpclient.FdkankanMiniClient;
+import com.fdkankan.scene.entity.SceneDataDownload;
+import com.fdkankan.scene.entity.SceneDownloadLog;
+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.entity.SceneProEdit;
+import com.fdkankan.scene.entity.SceneProEditExt;
+import com.fdkankan.scene.entity.SceneProExt;
+import com.fdkankan.scene.entity.SceneProPO;
 import com.fdkankan.scene.mapper.ISceneProMapper;
-import com.fdkankan.scene.service.*;
-import com.fdkankan.scene.vo.*;
+import com.fdkankan.scene.service.IFdkkLaserService;
+import com.fdkankan.scene.service.ISceneDataDownloadService;
+import com.fdkankan.scene.service.ISceneDownloadLogService;
+import com.fdkankan.scene.service.ISceneEditControlsService;
+import com.fdkankan.scene.service.ISceneEditInfoService;
+import com.fdkankan.scene.service.IScenePlusExtService;
+import com.fdkankan.scene.service.IScenePlusService;
+import com.fdkankan.scene.service.ISceneProEditExtService;
+import com.fdkankan.scene.service.ISceneProEditService;
+import com.fdkankan.scene.service.ISceneProExtService;
+import com.fdkankan.scene.service.ISceneProService;
+import com.fdkankan.scene.service.ISceneService;
+import com.fdkankan.scene.vo.BaseDataParamVO;
+import com.fdkankan.scene.vo.DeleteHotIconParamVO;
+import com.fdkankan.scene.vo.DeleteHotParamVO;
+import com.fdkankan.scene.vo.FileNameAndDataParamVO;
+import com.fdkankan.scene.vo.FileParamVO;
+import com.fdkankan.scene.vo.HotParamVO;
+import com.fdkankan.scene.vo.SaveTagsParamVO;
+import com.fdkankan.scene.vo.SaveTagsVisibleParamVO;
+import com.fdkankan.scene.vo.SceneBySnCodeVo;
+import com.fdkankan.scene.vo.SceneEditParamVO;
+import com.fdkankan.scene.vo.SceneParamVO;
+import com.fdkankan.scene.vo.SceneProVO;
+import com.fdkankan.scene.vo.SceneVO;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import java.nio.charset.StandardCharsets;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
@@ -55,17 +122,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.annotation.Resource;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.stream.Collectors;
-
 /**
  * <p>
  * pro场景表 服务实现类
@@ -142,8 +198,6 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     IFdkkLaserService fdkkLaserService;
     @Resource
     ISceneProMapper sceneProMapper;
-    @Autowired
-    private FdkankanMiniClient fdkankanMiniClient;
 
     @Override
     public List<SceneVO> convert(List<ScenePro> list){
@@ -3070,11 +3124,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             sceneEditInfoService.save(editInfo);
         }else{
             sceneEditInfoService.upgradeVersionById(editInfo.getId());
+            //更新scenejson缓存和oss文件版本号
+            sceneEditInfoService.upgradeSceneJsonVersion(param.getNum(), editInfo.getVersion() + 1);
         }
 
         //更新scene.json版本号
-        sceneEditInfoService.upgradeVersionToSceneJson(param.getNum());
-
+//        sceneEditInfoService.upgradeVersionToSceneJson(param.getNum());
 
         return ResultData.ok();
     }
@@ -3524,6 +3579,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
                     .setSql("floor_publish_ver = floor_publish_ver + 1")
                     .set(SceneEditInfo::getIsUploadObj, CommonStatus.YES.code())
                     .eq(SceneEditInfo::getId, sceneEditInfo.getId()));
+
+            sceneEditInfoService.upgradeSceneJsonVersion(num, sceneEditInfo.getVersion() + 1);
         }
 
         return ResultData.ok();

+ 10 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneUpgradeToV4Service.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.common.constant.ConstantFilePath;
 import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneResolution;
 import com.fdkankan.common.response.ResultData;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
@@ -16,6 +17,7 @@ import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.bean.SceneUpgradeProgressBean;
 import com.fdkankan.scene.entity.ScenePlus;
 import com.fdkankan.scene.entity.ScenePlusExt;
+import com.fdkankan.scene.entity.ScenePro;
 import com.fdkankan.scene.entity.SceneProEdit;
 import com.fdkankan.scene.entity.SceneProEditExt;
 import com.fdkankan.scene.entity.SceneProEditV3;
@@ -138,6 +140,14 @@ public class SceneUpgradeToV4Service implements ISceneUpgradeToV4Service {
             sceneUpgradeMapper.deleteSceneProExt(sceneProV3.getId());
             sceneUpgradeMapper.transferSceneProExt(sceneProV3.getId());
 
+            //国际版需要兼容切片图
+            ScenePro scenePro = sceneProService.getById(sceneProV3.getId());
+            SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
+            if(scenePro.getSceneScheme() == 3){
+                sceneProExt.setSceneResolution(SceneResolution.TILES.code());
+                sceneProExtService.updateById(sceneProExt);
+            }
+
             //同步到scenePlus、scenePlus
             sceneUpgradeMapper.deleteScenePlus(sceneProV3.getId());
             sceneUpgradeMapper.transferScenePlus(sceneProV3.getId());

+ 26 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/MoveSceneParamVO.java

@@ -0,0 +1,26 @@
+package com.fdkankan.scene.vo;
+
+import java.util.List;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/21
+ **/
+@Data
+public class MoveSceneParamVO {
+
+    @NotNull(message = "numList不能为空")
+    private List<String> numList;
+
+    @NotNull(message = "cameraId不能为空")
+    private Long cameraId;
+
+    private Long userId;
+
+}

+ 24 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/UnbindOrBindCameraParamVO.java

@@ -0,0 +1,24 @@
+package com.fdkankan.scene.vo;
+
+import java.util.List;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/21
+ **/
+@Data
+public class UnbindOrBindCameraParamVO {
+
+    @NotNull(message = "cameraIdList不能为空")
+    private List<Long> cameraIdList;
+
+    private Long userId;
+
+}

+ 8 - 0
4dkankan-common/src/main/java/com/fdkankan/common/model/SSOUser.java

@@ -26,4 +26,12 @@ public class SSOUser implements Serializable {
 
     private Set<String> roleSet;
 
+    /**
+     * 是否相机登录,0-否,1-是
+     */
+    private Integer cameraLogin;
+
+    private Long cameraId;
+
+
 }