lyhzzz %!s(int64=3) %!d(string=hai) anos
pai
achega
c6e037ed33

+ 1 - 1
src/main/java/com/fdkankan/ucenter/config/WebAppConfig.java

@@ -27,7 +27,7 @@ public class WebAppConfig implements WebMvcConfigurer {
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
 		registry.addInterceptor(ucenterInterceptor).addPathPatterns("/**")
-				.excludePathPatterns("/**/api/sso/**","/**/api/app/**");
+				.excludePathPatterns("/**/api/sso/**","/**/api/app/**","/test/**");
 		registry.addInterceptor(appInterceptor).addPathPatterns("/**/api/app/**");
 		WebMvcConfigurer.super.addInterceptors(registry);
 	}

+ 4 - 2
src/main/java/com/fdkankan/ucenter/controller/TestController.java

@@ -1,5 +1,6 @@
 package com.fdkankan.ucenter.controller;
 
+import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.ucenter.common.RedisKeyUtil;
 import com.fdkankan.ucenter.common.Result;
@@ -15,10 +16,11 @@ import java.util.List;
 public class TestController {
 
     @Autowired
-    private RedisUtil redisUtil;
+    private UploadToOssUtil uploadToOssUtil;
 
     @RequestMapping("/test")
-    public Result test() throws InterruptedException {
+    public Result test() throws Exception {
+
         return Result.success( );
     }
 }

+ 1 - 1
src/main/java/com/fdkankan/ucenter/controller/app/SceneController.java

@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping("/api/scene")
-public class SceneController {
+public class SceneApiController {
 
     @Autowired
     ISceneProService sceneProService;

+ 11 - 2
src/main/java/com/fdkankan/ucenter/service/ISceneProService.java

@@ -10,7 +10,6 @@ import com.fdkankan.ucenter.vo.response.GroupByCount;
 import com.fdkankan.ucenter.vo.response.SceneInfoVo;
 import com.fdkankan.ucenter.vo.response.SceneNumVo;
 
-import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 
@@ -50,7 +49,7 @@ public interface ISceneProService extends IService<ScenePro> {
 
     ScenePro getByNum(String sceneNum);
 
-    void copyV3Scene(ScenePro scenePro,String newNum,CameraDetail cameraDetail);
+    void copyV3Scene(ScenePro scenePro,String newNum,CameraDetail cameraDetail) throws Exception;
 
     void updateSceneJson(String type,String videos,String newNum,String sceneName,String webSite,String thumb,Long id) throws Exception;
 
@@ -63,4 +62,14 @@ public interface ISceneProService extends IService<ScenePro> {
     SceneInfoVo getInfo(String num);
 
     void updateViewCount(String num);
+
+    ScenePro findByFileId(String fileId);
+
+    void setQrCode(String buildType,String num) throws Exception ;
+
+    void copyOssSource(String type ,String sceneNum, String newNum) throws Exception ;
+
+    void copyLocalSource(String sceneNum, String newNum) throws Exception ;
+
+    String setDataSource(String preDataSource,Integer sceneSource) throws Exception;
 }

+ 13 - 16
src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java

@@ -112,23 +112,8 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     @Override
     public void copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) throws Exception {
         String num = scenePlus.getNum();
-        // 拷贝场景编辑资源
-        String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
-
-        String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
-        uploadToOssUtil.copyFiles(oldEditPath,newEditPath);
-
-        // 拷贝场景展示资源
-        String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
-        String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
-        uploadToOssUtil.copyFiles(oldViewPath,newViewPath);
-
-        // 拷贝本地资源
-        String oldPath = String.format("/mnt/4Dkankan/scene/%s/caches/images/", num);
-        String newPath = String.format("/mnt/4Dkankan/scene/%s/caches/images/", newNum);
-        FileUtils.copyDirectiory(oldPath,newPath);
-
         Long plusId = scenePlus.getId();
+        scenePlus.setSceneStatus(0);
         scenePlus.setNum(newNum);
         scenePlus.setId(null);
         scenePlus.setTitle(scenePlus.getTitle().concat("(copy)"));
@@ -141,11 +126,16 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         }else {
             videos = plusExt.getVideos().replaceAll("https://4dkk.4dage.com/data/data"+num, "https://4dkk.4dage.com/scene_view_data/"+newNum+"/data");
         }
+
         plusExt.setId(null);
         plusExt.setPlusId(scenePlus.getId());
         plusExt.setWebSite(plusExt.getWebSite().replace(num,newNum));
         plusExt.setThumb(plusExt.getThumb().replace(num,newNum));
         plusExt.setVideos(videos);
+        plusExt.setViewCount(0);
+
+        String newDataSource = sceneProService.setDataSource(plusExt.getDataSource(), scenePlus.getSceneSource());
+        plusExt.setDataSource(newDataSource);
         scenePlusExtService.save(plusExt);
 
         //保存复制日志
@@ -174,6 +164,13 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         sceneEditControls.setEditInfoId(sceneEditInfo.getId());
         sceneEditControlsService.save(sceneEditControls);
 
+        sceneProService.setQrCode("V3",newNum);
+        sceneProService.copyOssSource("v4",num,newNum);
+        sceneProService.copyLocalSource(num,newNum);
         sceneProService.updateSceneJson("v4",plusExt.getVideos(),newNum,scenePlus.getTitle(),plusExt.getWebSite(),plusExt.getThumb(),scenePlus.getId());
+
+        scenePlus.setSceneStatus(-2);
+        this.updateById(scenePlus);
+
     }
 }

+ 116 - 58
src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java

@@ -6,11 +6,10 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.common.constant.ConstantFilePath;
 import com.fdkankan.common.constant.SceneConstant;
+import com.fdkankan.common.constant.UploadFilePath;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.PageInfo;
-import com.fdkankan.common.util.CreateObjUtil;
-import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.common.util.JwtUtil;
+import com.fdkankan.common.util.*;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.ucenter.common.RedisKeyUtil;
@@ -28,14 +27,13 @@ import com.fdkankan.ucenter.vo.response.SceneNumVo;
 import com.fdkankan.ucenter.vo.response.SceneVo;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
@@ -85,6 +83,15 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     RedisUtil redisUtil;
 
+    @Value("${main.url}")
+    private String mainUrl;
+
+    @Value("${scene.pro.url}")
+    private String sceneProUrl;
+
+    @Value("${scene.pro.new.url}")
+    private String sceneProNewUrl;
+
     @Override
     public HashMap<String, SceneNumVo> findSceneNumber(String token) {
         User user = userService.getByUserName(JwtUtil.getUsername(token));
@@ -353,6 +360,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
         }
         String newNum = scene3dNumService.generateSceneNum(detailEntity.getType());
+
         if(scenePro !=null){        //v3场景复制
             this.copyV3Scene(scenePro,newNum,detailEntity);
         }
@@ -376,18 +384,22 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
 
     @Override
-    public void copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail) {
+    public void copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail) throws Exception {
         SceneProEdit oldEditScene = sceneProEditService.getByProId(oldScene.getId());
 
         String oldNum = oldScene.getNum();
         //复制数据库数据
         oldScene.setId(null);
+        oldScene.setStatus(0);
         oldScene.setNum(newNum);
         oldScene.setSceneName(oldScene.getSceneName().concat("(copy)"));
         oldScene.setWebSite(oldScene.getWebSite().replace(oldScene.getNum(), newNum));
         oldScene.setThumb(oldScene.getThumb().replace(oldScene.getNum(), newNum));
         oldScene.setVideos(oldScene.getVideos().replace(oldNum,newNum));
-        //更新video
+        oldScene.setViewCount(0);
+        String preDataSource = oldScene.getDataSource();
+        oldScene.setDataSource(this.setDataSource(preDataSource,oldScene.getSceneSource()));
+
         this.save(oldScene);
 
         sceneCopyLogService.saveByNum(oldNum,newNum,oldScene.getUserId());
@@ -405,33 +417,20 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, newNum));
         sceneProEditService.save(oldEditScene);
 
+        this.setQrCode(oldScene.getBuildType(), oldScene.getNum());
         CompletableFuture.runAsync(() -> {
             try {
                 log.info("开始复制场景-{}", new Date());
 
-                //oss复制源文件
-                String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
-                if(oldScene.getSceneSource().equals(4)){
-                    buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
-                }
-                CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + oldScene.getDataSource().replace(buildModelPath, "")+"/", oldScene.getDataSource());
-
-                List<String> urlList = new ArrayList<>();
-                FileUtils.readfilePath(oldScene.getDataSource(), urlList);
-                Map<String,String> fileMap = new HashMap<>();
-                for(String url : urlList){
-                    fileMap.put(url, ConstantFilePath.OSS_PREFIX + url.replace(buildModelPath, ""));
-                }
-                uploadToOssUtil.uploadMulFiles(fileMap);
-
                 //oss复制计算结果资源
-                downloadFromoldNumFromOss(oldNum, newNum);
+                this.copyOssSource("v3",oldNum,newNum);
+                this.copyLocalSource(oldNum,newNum);
 
-                // 复制本地secen.json
-                copyOldSceneLocalToNew(oldNum, newNum);
                 updateSceneJson("v3",oldScene.getVideos(),newNum,oldScene.getSceneName(),oldScene.getWebSite(),oldScene.getThumb(),oldScene.getId());
                 //上传资源到oss
                 uploadNewSceneToOss(newNum);
+                oldScene.setStatus(-2);
+                this.updateById(oldScene);
                 log.info("复制场景结束-{}", new Date());
             } catch (Exception e) {
                 log.error("复制场景异常", e);
@@ -440,41 +439,78 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
     }
 
-    /**
-     * 从旧场景下载资源
-     * @param sceneNum
-     * @param newNum
-     * @throws Exception
-     */
-    private void downloadFromoldNumFromOss(String sceneNum, String newNum) throws Exception {
-        CreateObjUtil.ossUtilCp("images/images" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "images/images" + newNum);
-        CreateObjUtil.ossUtilCp("data/data" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "data/data" + newNum);
-        CreateObjUtil.ossUtilCp("voice/voice" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
-        CreateObjUtil.ossUtilCp("video/video" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "video/video" + newNum);
-    }
+    @Override
+    public String setDataSource(String preDataSource,Integer sceneSource) throws Exception {
+        String datasourceFix;
+        String newDataSource;
+        // 判断场景是否拷贝过
+        ScenePro entity;
+        do{
+            datasourceFix = RandomUtil.generateShortUuid();
+            entity = this.findByFileId(preDataSource.concat(datasourceFix));
+        }while(!ObjectUtils.isEmpty(entity));
+        newDataSource =  datasourceFix.concat(datasourceFix);
+
+        //oss复制源文件
+        String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
+        if(sceneSource.equals(4)){
+            buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
+        }
+        CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX +newDataSource.replace(buildModelPath, "")+"/", newDataSource);
 
-    /**
-     * 从本地旧场景拷贝资源到新场景
-     * @param sceneNum
-     * @param newNum
-     */
-    private void copyOldSceneLocalToNew(String sceneNum, String newNum) throws IOException {
-        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + "/",
-                ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/", true);
+        List<String> urlList = new ArrayList<>();
+        FileUtils.readfilePath(newDataSource, urlList);
+        Map<String,String> fileMap = new HashMap<>();
+        for(String url : urlList){
+            fileMap.put(url, ConstantFilePath.OSS_PREFIX + url.replace(buildModelPath, ""));
+        }
+        uploadToOssUtil.uploadMulFiles(fileMap);
+
+        FileUtils.delAllFile(newDataSource);
+
+        FileUtils.copyFolderAllFiles(preDataSource+"/",newDataSource+"/", true);
+        return datasourceFix.concat(datasourceFix);
+    }
 
-        // 复制本地视频
-        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "video/video" + sceneNum + "/",
-                ConstantFilePath.SCENE_PATH + "video/video" + newNum + "/", true);
+    @Override
+    public void copyOssSource(String type ,String sceneNum, String newNum) throws Exception {
+        List<String > copyList = new ArrayList<>();
+        if(type.equals("v3")){
+            copyList.add("images/images" + sceneNum);
+            copyList.add("data/data" + sceneNum);
+            copyList.add("voice/voice" + sceneNum);
+            copyList.add("video/video"+ sceneNum);
+        }else if(type.equals("v4")){
+            String oldEditPath = String.format(UploadFilePath.EDIT_PATH, sceneNum);
+            String oldViewPath = String.format(UploadFilePath.VIEW_PATH, sceneNum);
+            copyList.add(oldEditPath);
+            copyList.add(oldViewPath);
+        }
+        for (String sourcePath : copyList) {
+            uploadToOssUtil.copyFiles(sourcePath,sourcePath.replaceAll(sceneNum,newNum));
+        }
+    }
 
-        // 复制本地二维码
-        FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + ".png",
-                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + ".png", true);
+    @Override
+    public void copyLocalSource(String sceneNum, String newNum) throws Exception {
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"images/images" + sceneNum,ConstantFilePath.SCENE_PATH +"images/images" + newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"data/data" + sceneNum,ConstantFilePath.SCENE_PATH +"data/data" + newNum);
+        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",sceneNum, newNum);
+        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",sceneNum, newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"voice/voice" + sceneNum,ConstantFilePath.SCENE_PATH +"voice/voice" + newNum);
+        FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"video/video" + sceneNum,ConstantFilePath.SCENE_PATH +"video/video" + newNum);
+    }
 
-        // 复制本地二维码
-        FileUtils.copyFile(ConstantFilePath.SCENE_QR_CODE_PATH + sceneNum + "_en.png",
-                ConstantFilePath.SCENE_QR_CODE_PATH + newNum + "_en.png", true);
+    private void reloadFile(String filePath,String sceneNum, String newNum) throws Exception {
+        // 修改link-scene.json
+        String content = FileUtils.readFile(filePath);
+        if (!ObjectUtils.isEmpty(content)) {
+            content = content.replaceAll(sceneNum, newNum);
+            FileUtils.writeFile(filePath,content);
+        }
     }
 
+
     /**
      * 上传新场景资源到oss
      * @param newNum
@@ -502,15 +538,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         map.put("thumb",thumb);
         map.put("num",newNum);
         map.put("id",id);
-        String localPath ;
         String uploadPath ;
+        String localPath = ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json";
         if(type.equals("v3")){
-            localPath = ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json";
             uploadPath = localPath.replace(ConstantFilePath.SCENE_PATH, "");
         }else {
-            localPath = ConstantFilePath.SCENE_V4_PATH +"scene_view_data/"+ newNum + File.separator + "data" +File.separator +"scene.json";
             uploadPath =localPath.replace(ConstantFilePath.SCENE_V4_PATH, "");
-
         }
         FileUtils.writeJsonFile(localPath, map);
         if(type.equals("v4")){
@@ -660,4 +693,29 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             redisUtil.incr(redisKey,1);
         }
     }
+
+    @Override
+    public ScenePro findByFileId(String fileId) {
+        LambdaQueryWrapper<ScenePro> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(ScenePro::getDataSource,fileId);
+        List<ScenePro> list = this.list(wrapper);
+        if(list !=null && list.size() >0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Override
+    public void setQrCode(String buildType,String num) throws Exception {
+        String basePath = mainUrl;
+        if("V2".equals(buildType)){
+            basePath += sceneProUrl;
+        }
+        if("V3".equals(buildType)){
+            basePath += sceneProNewUrl;
+        }
+        MatrixToImageWriterUtil.createQRCode(basePath + num, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+".png", false,null);
+        MatrixToImageWriterUtil.createQRCode(basePath + num + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+num+"_en.png", false,null);
+
+    }
 }

+ 0 - 1
src/main/resources/mapper/ucenter/ScenePlusMapper.xml

@@ -33,7 +33,6 @@
         where s.rec_status = 'A'
          and s.user_id = #{userId} and d.goods_id = #{cameraType}
     </select>
-    </select>
 
 
     <sql id="sceneJoinCamera">