Sfoglia il codice sorgente

复制场景,不复制原始资源。app云端场景不展示复制场景

lyhzzz 2 anni fa
parent
commit
422c2c22c4

+ 4 - 0
src/main/java/com/fdkankan/ucenter/common/constants/ResultCode.java

@@ -1,5 +1,7 @@
 package com.fdkankan.ucenter.common.constants;
 
+import com.fdkankan.common.constant.CameraConstant;
+
 public class ResultCode {
     public static final int FAILURE_CODE_400001 = 400001;
     public static final String FAILURE_MSG_400001 = "场景码池为空";
@@ -11,4 +13,6 @@ public class ResultCode {
     public static final String FAILURE_MSG_400004 = "获取深时下载链接失败";
     public static final int FAILURE_CODE_400005 = 400005;
     public static final String FAILURE_MSG_400005 = "获取邮件模板错误";
+    public static final int FAILURE_CODE_400006  = 400006 ;
+    public static final String FAILURE_MSG_400006  = "复制失败,场景资源文件不对" ;
 }

+ 4 - 0
src/main/java/com/fdkankan/ucenter/entity/SceneEditInfoExt.java

@@ -70,6 +70,10 @@ public class SceneEditInfoExt implements Serializable {
     @TableField("links")
     private Integer links;
 
+
+    @TableField("share_logo_img")
+    private String shareLogoImg;
+
     /**
      * 创建时间
      */

+ 4 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneCopyLogService.java

@@ -3,6 +3,8 @@ package com.fdkankan.ucenter.service;
 import com.fdkankan.ucenter.entity.SceneCopyLog;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.Set;
+
 /**
  * <p>
  *  服务类
@@ -14,4 +16,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
 public interface ISceneCopyLogService extends IService<SceneCopyLog> {
 
     void saveByNum(String oldNum, String newNum, Long userId);
+
+    Set<String> getCopyNumSet();
 }

+ 1 - 1
src/main/java/com/fdkankan/ucenter/service/IScenePlusService.java

@@ -39,7 +39,7 @@ public interface IScenePlusService extends IService<ScenePlus> {
 
     ScenePlus getByNum(String sceneNum);
 
-    Long copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail,String time) throws IOException, Exception;
+    Long copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) ;
 
     List<ScenePlus> getByIds(List<Long> plusIds);
 

+ 1 - 9
src/main/java/com/fdkankan/ucenter/service/ISceneProService.java

@@ -55,7 +55,7 @@ public interface ISceneProService extends IService<ScenePro> {
 
     ScenePro getByNum(String sceneNum);
 
-    Long copyV3Scene(ScenePro scenePro, String newNum, CameraDetail cameraDetail, String time) throws Exception;
+    Long copyV3Scene(ScenePro scenePro, String newNum, CameraDetail cameraDetail) throws Exception;
 
 
     void delete(String sceneNum,Long userId);
@@ -70,18 +70,10 @@ public interface ISceneProService extends IService<ScenePro> {
 
     ScenePro findByFileId(String fileId);
 
-    void setQrCode(String buildType, String num) throws Exception;
-
-    String setDataSource(String preDataSource, String time) throws Exception;
-
     void generateObjFile(String num);
 
     void updateDbViewCount(String num, String count);
 
-    String setVideos(String videos, String oldNum, String newNum);
-
-     void copyFdage(String oldDataSource, String newDataSource, String buildModelPath, String time) throws Exception;
-
     void copySceneNoCheck(String sceneNum) throws Exception;
 
     ResponseScene getSceneDetail(String sceneNum);

+ 6 - 1
src/main/java/com/fdkankan/ucenter/service/impl/AppSceneService.java

@@ -55,6 +55,8 @@ public class AppSceneService {
     ISceneCooperationService sceneCooperationService;
     @Autowired
     LaserService laserService;
+    @Autowired
+    ISceneCopyLogService sceneCopyLogService;
 
     @Autowired
     IScenePlusMapper scenePlusMapper;
@@ -92,7 +94,10 @@ public class AppSceneService {
             }
             param.setUserId(user.getId());
         }
-
+        //云端场景不展示复制场景
+        Set<String> copyNumSet = sceneCopyLogService.getCopyNumSet();
+        param.setCopyNumSet(copyNumSet);
+        
         Page<AppSceneVo> page =  scenePlusMapper.pageList(new Page<>(param.getPageNum(),param.getPageSize()),param);
 
         Set<Long> cameraIdSet = page.getRecords().stream().map(AppSceneVo::getCameraId).collect(Collectors.toSet());

+ 188 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneCommonService.java

@@ -0,0 +1,188 @@
+package com.fdkankan.ucenter.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.SceneVersionType;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.SnowflakeIdGenerator;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.ucenter.common.constants.ResultCode;
+import com.fdkankan.ucenter.service.IScene3dNumService;
+import com.fdkankan.ucenter.util.SceneResourcePath;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.util.Date;
+
+@Service
+@Slf4j
+public class SceneCommonService {
+
+    @Autowired
+    FYunFileServiceInterface fYunFileServiceInterface;
+    @Autowired
+    IScene3dNumService scene3dNumService;
+
+    public String getNewNum(String oldNum ){
+        String newNum = scene3dNumService.generateSceneNum(1);
+        if(oldNum.contains("-")){
+            String pre = oldNum.split("-")[0];
+            if(!"t".equals(pre) && !"jp".equals(pre)){
+                return pre +"-"+ newNum;
+            }
+        }
+        return newNum;
+    }
+
+    /**
+     * 生成新的dataSouce
+     */
+    public String getNewDataSource(String oldDataSource){
+        if(true){
+            return oldDataSource;
+        }
+
+        String newDataSource = null;
+        if(StringUtils.isBlank(oldDataSource)){
+            throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+        }
+        File oldDataSouceFile = new File(oldDataSource);
+        if(!oldDataSouceFile.exists()){
+            throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+        }
+        if(!oldDataSource.contains("/")){
+            throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+        }
+
+        String time = com.fdkankan.common.util.DateUtil.date2String(new Date(), com.fdkankan.common.util.DateUtil.YYYYMMDDHHMMSSSSS_DATA_FORMAT);
+        String[] split = oldDataSource.split("/");
+        if(split.length == 6 ){
+            String oldFileId = split[4];
+            Long fileId = new SnowflakeIdGenerator(1,1).nextId();
+            newDataSource = oldDataSource.replace(oldFileId,fileId.toString());
+
+            String snCodeTime = split[5];
+            if(!snCodeTime.contains("_") || snCodeTime.split("_").length <= 1){
+                throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+            }
+            newDataSource = newDataSource.replace(snCodeTime.split("_")[1],time);
+            this.copyFdage(oldDataSource,newDataSource,time);
+        }
+        if(newDataSource == null){
+            throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+        }
+        return newDataSource;
+    }
+
+  public  void createNewQrCode(String sceneVersion,String logoPath ,String newNum, String webSite){
+      String localLogoPath = null;
+      try {
+          if(StringUtils.isNotBlank(logoPath)){
+              if(sceneVersion.equals(SceneVersionType.V3.code())){
+                  localLogoPath =SceneResourcePath.nasBasePath + logoPath;
+              }else{
+                  localLogoPath = SceneResourcePath.qrCodeBasePath + newNum +"/logo/logo.png";
+                  fYunFileServiceInterface.downloadFile(logoPath,localLogoPath);
+              }
+          }
+          String outPathZh = SceneResourcePath.qrCodeBasePath + newNum + ".png";
+          String outPathEn = SceneResourcePath.qrCodeBasePath + newNum + "_en.png";
+          QrConfig qrConfig = QrConfig.create();
+          qrConfig.setWidth(1024);
+          qrConfig.setHeight(1024);
+          if(!ObjectUtils.isEmpty(localLogoPath)){
+              qrConfig.setImg(localLogoPath);
+          }
+          QrCodeUtil.generate(webSite, qrConfig, FileUtil.file(outPathZh));
+          QrCodeUtil.generate(webSite + "&lang=en", qrConfig, FileUtil.file(outPathEn));
+
+          fYunFileServiceInterface.uploadFile(outPathZh, String.format(SceneResourcePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
+          fYunFileServiceInterface.uploadFile(outPathEn, String.format(SceneResourcePath.DOWNLOADS_QRCODE, newNum) + newNum + "_en.png");
+        }catch (Exception e){
+            log.info("copy-scene-error:{},newNum:{},error:{}",newNum,e);
+        }
+
+    }
+
+
+    public void updateNasSceneJson(String targetPath, String oldNum, String newNum,String oldSceneName,String newSceneName,String sceneVersion) {
+        String localPath = SceneResourcePath.nasBasePath + targetPath + "/" + "scene.json";
+        File file = new File(localPath);
+        if(!file.exists()){
+            log.error("sceneCopy-error--localFileExist:localPath:{},oldNum:{},newNum:{}",localPath,oldNum,newNum);
+            return;
+        }
+        String fileContent = FileUtil.readUtf8String(file);
+
+
+        if(StringUtils.isNotBlank(fileContent)){
+            String newJson = fileContent.replaceAll(oldNum,newNum);
+            newJson = newJson.replaceAll(oldSceneName,newSceneName);
+            try {
+                com.fdkankan.ucenter.util.FileUtil.writeFile(localPath,newJson);
+
+            }catch (Exception e){
+                log.error("writeFile-error:{}",e);
+            }
+        }
+        if("v3".equals(sceneVersion)){
+            String sceneJsonPath = String.format(SceneResourcePath.dataPath+"/scene.json", newNum);
+            fYunFileServiceInterface.uploadFile(localPath, sceneJsonPath);
+        }
+        if("v4".equals(sceneVersion)){
+            String sceneJsonPath = String.format(SceneResourcePath.DATA_VIEW_PATH+"scene.json", newNum);
+            fYunFileServiceInterface.uploadFile(localPath, sceneJsonPath);
+        }
+
+    }
+
+    public void updateOssJson(String targetPath,String oldNum, String newNum,String sceneVersion) {
+        String ossStatusJsonPath =  targetPath + "/" + "status.json";
+
+        if(!fYunFileServiceInterface.fileExist(ossStatusJsonPath)){
+            log.error("sceneCopy-error--ossFileExist:targetPath:{},oldNum:{},newNum:{}",ossStatusJsonPath,oldNum,newNum);
+            return;
+        }
+        String localPath = SceneResourcePath.nasBasePath + ossStatusJsonPath;
+        File file = new File(localPath);
+        if(!file.getParentFile().exists()){
+            file.mkdirs();
+        }
+        String fileContent = fYunFileServiceInterface.getFileContent(ossStatusJsonPath);
+        if(StringUtils.isNotBlank(fileContent)){
+            String newJson = fileContent.replaceAll(oldNum,newNum);
+            try {
+                com.fdkankan.ucenter.util.FileUtil.writeFile(localPath,newJson);
+                fYunFileServiceInterface.uploadFile(localPath,ossStatusJsonPath);
+            }catch (Exception e){
+                log.error("writeFile-error:{}",e);
+            }
+        }
+
+    }
+
+    public void copyFdage(String oldDataSource,String newDataSource,String time){
+        String ossOldPath = oldDataSource.replace("/mnt/data","home");
+        String ossNewPath = newDataSource.replace("/mnt/data","home");
+        fYunFileServiceInterface.copyFileInBucket(ossOldPath,ossNewPath);
+
+        String fileName = "/data.fdage";
+
+        String fileContent = fYunFileServiceInterface.getFileContent(ossNewPath + fileName);
+        if(StringUtils.isNotBlank(fileContent)){
+            JSONObject jsonObject = JSONObject.parseObject(fileContent);
+            jsonObject.put("uuidtime",time);
+            FileUtils.writeFile(newDataSource +fileName, jsonObject.toJSONString());
+            fYunFileServiceInterface.uploadFile(newDataSource +fileName,ossNewPath +fileName);
+
+        }
+
+    }
+}

+ 9 - 0
src/main/java/com/fdkankan/ucenter/service/impl/SceneCopyLogServiceImpl.java

@@ -6,6 +6,9 @@ import com.fdkankan.ucenter.service.ISceneCopyLogService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import java.util.Set;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -25,4 +28,10 @@ public class SceneCopyLogServiceImpl extends ServiceImpl<ISceneCopyLogMapper, Sc
         sceneCopyLog.setCopyUserId(userId);
         this.save(sceneCopyLog);
     }
+
+    @Override
+    public Set<String> getCopyNumSet() {
+
+        return this.list().stream().map(SceneCopyLog::getNewNum).collect(Collectors.toSet());
+    }
 }

+ 138 - 159
src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.ucenter.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
@@ -10,6 +11,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneVersionType;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.image.MatrixToImageWriterUtil;
@@ -19,6 +22,7 @@ import com.fdkankan.ucenter.common.PageInfo;
 import com.fdkankan.ucenter.common.Result;
 import com.fdkankan.ucenter.common.constants.ConstantFilePath;
 import com.fdkankan.ucenter.common.constants.NacosProperty;
+import com.fdkankan.ucenter.common.constants.ResultCode;
 import com.fdkankan.ucenter.common.constants.UploadFilePath;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.util.RedisUtil;
@@ -36,6 +40,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
 import com.fdkankan.ucenter.util.RoamingPointUtil;
+import com.fdkankan.ucenter.util.SceneResourcePath;
 import com.fdkankan.ucenter.vo.ResponseScene;
 import com.fdkankan.ucenter.vo.SceneEditControlsVO;
 import com.fdkankan.ucenter.vo.request.RequestScene;
@@ -65,6 +70,8 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     @Autowired
     private IScenePlusExtService scenePlusExtService;
     @Autowired
+    private SceneCommonService sceneCommonService;
+    @Autowired
     private ISceneEditInfoService sceneEditInfoService;
     @Autowired
     private ISceneEditInfoExtService sceneEditInfoExtService;
@@ -165,177 +172,149 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     }
 
     @Override
-    public Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail,String time) throws Exception {
-        String num = scenePlus.getNum();
+    public Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail)  {
+        String oldNum = scenePlus.getNum();
+
         Long plusId = scenePlus.getId();
-        ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
+        String oldSceneName = scenePlus.getTitle();
 
-        // 拷贝数据
+        ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
+        if(plusExt == null){
+            throw new BusinessException(ResultCode.FAILURE_CODE_400002,ResultCode.FAILURE_MSG_400002);
+        }
         scenePlus.setNum(newNum);
-        scenePlus.setId(null);
+        scenePlus.setTitle(scenePlus.getTitle() +"(copy)");
         scenePlus.setSceneStatus(0);
+        scenePlus.setId(null);
         this.save(scenePlus);
 
         ExecutorService executor = ThreadUtil.newSingleExecutor();
-        try {
-            CompletableFuture.runAsync(() -> {
-                try {
-                    // 拷贝场景编辑资源
-                    String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
-                    String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
-                    fYunFileServiceInterface.copyFileInBucket(oldEditPath, newEditPath);
-
-                    // 拷贝场景展示资源
-                    String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
-                    String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
-                    fYunFileServiceInterface.copyFileInBucket(oldViewPath, newViewPath);
-
-                    //复制计算结果文件
-                    String oldResultPath = String.format(UploadFilePath.SCENE_RESULT_DATA_PATH, num);
-                    String newResultPath = String.format(UploadFilePath.SCENE_RESULT_DATA_PATH, newNum);
-                    fYunFileServiceInterface.copyFileInBucket(oldResultPath, newResultPath);
-
-                    // 拷贝本地资源
-                    String oldPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", num);
-                    String newPath = String.format("/mnt/4Dkankan/scene/%s/caches/images", newNum);
-                    if(new File(oldPath).exists()){
-                        FileUtils.copyDirectiory(oldPath, newPath);
-                    }
-
-                    String scenePath = ConstantFilePath.SCENE_V4_PATH + num;
-                    File file = new File(scenePath);
-                    if(file.exists()){
-                        String newScenePath = ConstantFilePath.SCENE_V4_PATH + newNum;
-                        FileUtils.copyDirectiory(scenePath, newScenePath);
-                    }
-                    String newVideos = plusExt.getVideos();
-                    if(StrUtil.isNotEmpty(newVideos)){
-                        newVideos = plusExt.getVideos().replaceAll("/data/data" + num, "/scene_view_data/" + newNum + "/data").replaceAll(num, newNum);
-                    }
-
-                    String oldDataSource  = plusExt.getDataSource();
-                    String newDataSource =  sceneProService.setDataSource(plusExt.getDataSource(),time);
-
-                    String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
-                    if(scenePlus.getSceneSource().equals(4)){
-                        buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
-                    }
-                    sceneProService.copyFdage(oldDataSource,newDataSource,buildModelPath,time);
-
-                    plusExt.setId(null);
-                    plusExt.setPlusId(scenePlus.getId());
-                    plusExt.setDataSource(newDataSource);
-                    plusExt.setWebSite(plusExt.getWebSite().replace(num, newNum));
-                    plusExt.setThumb(plusExt.getThumb().replace(num, newNum));
-                    plusExt.setVideos(newVideos);
-                    plusExt.setViewCount(0);
-                    scenePlusExtService.save(plusExt);
-
-                    SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
-                    Long sceneEditInfoId = sceneEditInfo.getId();
-
-                    sceneEditInfo.setId(null);
-                    sceneEditInfo.setScenePlusId(scenePlus.getId());
-                    sceneEditInfo.setSceneProId(null);
-                    sceneEditInfo.setTitle(scenePlus.getTitle());
-                    sceneEditInfoService.save(sceneEditInfo);
-
-                    SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
-                    sceneEditInfoExt.setId(null);
-                    sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
-                    sceneEditInfoExt.setScenePlusId(scenePlus.getId());
-                    sceneEditInfoExt.setSceneProId(null);
-                    sceneEditInfoExtService.save(sceneEditInfoExt);
-
-                    SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
-                    sceneEditControls.setId(null);
-                    sceneEditControls.setEditInfoId(sceneEditInfo.getId());
-                    sceneEditControlsService.save(sceneEditControls);
-
-                    if(scenePlus.getSceneSource() == 4){  //深时复制
-                        laserService.copy(num,scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,0,null,
-                                sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4",plusExt.getIsObj());
-                    }
-
-                    List<Surveillance> list = surveillanceService.list(new LambdaQueryWrapper<Surveillance>().eq(Surveillance::getNum, num));
-                    if (!Objects.isNull(list)) {
-                        list.stream().forEach(item -> {
-                            item.setNum(newNum);
-                            item.setId(null);
-                            surveillanceService.save(item);
-                        });
-                    }
-
-                    // 生成scene.json
-                    SceneJsonBean sceneJson = new SceneJsonBean();
-                    BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
-                    BeanUtil.copyProperties(sceneEditInfo, sceneJson);
-                    SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
-                    sceneJson.setControls(sceneEditControlsVO);
-                    sceneJson.setNum(newNum);
-                    sceneJson.setCreateTime(scenePlus.getCreateTime());
-
-                    sceneJson.setSceneResolution(plusExt.getSceneResolution());
-                    sceneJson.setSceneFrom(plusExt.getSceneFrom());
-                    sceneJson.setSceneKind(plusExt.getSceneKind());
-                    sceneJson.setModelKind(plusExt.getModelKind());
-                    if(StrUtil.isNotEmpty(plusExt.getVideos())){
-                        sceneJson.setVideos(plusExt.getVideos());
-                    }
-                    sceneJson.setMosaicList(sceneEditInfoService.getMosaicList(num));
-
-                    log.info("开始生成本地json文件……");
-                    String sceneJsonLocalPath = ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + newNum + File.separator + "scene.json";
-                    FileUtils.writeFile(sceneJsonLocalPath, JSON.toJSONString(sceneJson));
-
-                    String sceneJsonPath = String.format(UploadFilePath.DATA_VIEW_PATH+"scene.json", newNum);
-                    fYunFileServiceInterface.uploadFile(JSON.toJSONBytes(sceneJson), sceneJsonPath);
-
-                    //删除scenejson缓存
-                    redisUtil.del(String.format(RedisKey.SCENE_JSON, num));
-
-                    // 生成二维码
-                    String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + ".png";
-                    String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/" + newNum + "_en.png";
-                    MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite(), outPathZh, false,null);
-                    MatrixToImageWriterUtil.createQRCode(plusExt.getWebSite() + "&lang=en", outPathEn, false, null);
-                    fYunFileServiceInterface.uploadFile(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
-                    fYunFileServiceInterface.uploadFile(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + "_en.png");
-                    scenePlus.setSceneStatus(-2);
-                    this.updateById(scenePlus);
-
-                    cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
-                    cameraDetailService.updateById(cameraDetail);
-
-                    if(scenePlus.getPayStatus() == -2){
-                        sceneProService.updateOssStatus(String.format(OssPath.v4_statusPath,scenePlus.getNum()),-2);
-                    }
-
-                    if(scenePlus.getSceneSource() == 4){  //深时复制
-                        String laserPath = laserService.copyDataSource(oldDataSource,plusExt.getDataSource());
-                        laserService.copy(num,scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,2,laserPath,
-                                sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4",plusExt.getIsObj());
-                    } else if(!"aws".equals(NacosProperty.uploadType)){
-                        laserService.cloudPointBuild(num,newNum);
-                    }
-                    sceneCopyLogService.saveByNum(num,newNum,scenePlus.getUserId());
-
-                }catch (Exception e){
-                    this.removeById(scenePlus.getId());
-                    log.error("复制场景异常", e);
+        CompletableFuture.runAsync(() -> {
+            String oldDataSource = plusExt.getDataSource();
+
+            String newDataSource = sceneCommonService.getNewDataSource(oldDataSource);
+
+            log.info("sceneCopy-V4-oldNum:{},oldDataSource:{},newNum:{},newDataSource:{}",
+                    oldNum,oldDataSource,newNum,newDataSource);
+
+            String newVideos = plusExt.getVideos();
+            if(StrUtil.isNotEmpty(newVideos)){
+                newVideos = plusExt.getVideos().replaceAll("/data/data" + oldNum, "/scene_view_data/" + newNum + "/data").replaceAll(oldNum, newNum);
+            }
+            plusExt.setId(null);
+            plusExt.setPlusId(scenePlus.getId());
+            plusExt.setDataSource(newDataSource);
+            plusExt.setWebSite(plusExt.getWebSite().replace(oldNum, newNum));
+            plusExt.setThumb(plusExt.getThumb().replace(oldNum, newNum));
+            plusExt.setVideos(newVideos);
+            plusExt.setViewCount(0);
+            scenePlusExtService.save(plusExt);
+
+            SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(plusId);
+            Long sceneEditInfoId = sceneEditInfo.getId();
+
+            sceneEditInfo.setId(null);
+            sceneEditInfo.setScenePlusId(scenePlus.getId());
+            sceneEditInfo.setSceneProId(null);
+            sceneEditInfo.setTitle(scenePlus.getTitle());
+            sceneEditInfoService.save(sceneEditInfo);
+
+            SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
+            sceneEditInfoExt.setId(null);
+            sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+            sceneEditInfoExt.setScenePlusId(scenePlus.getId());
+            sceneEditInfoExt.setSceneProId(null);
+            sceneEditInfoExtService.save(sceneEditInfoExt);
+
+            SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
+            sceneEditControls.setId(null);
+            sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+            sceneEditControlsService.save(sceneEditControls);
+
+            List<Surveillance> list = surveillanceService.list(new LambdaQueryWrapper<Surveillance>().eq(Surveillance::getNum, oldNum));
+            if (!Objects.isNull(list)) {
+                list.stream().forEach(item -> {
+                    item.setNum(newNum);
+                    item.setId(null);
+                    surveillanceService.save(item);
+                });
+            }
+
+            if(scenePlus.getSceneSource() == 4){  //深时复制
+                laserService.copy(oldNum,scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,0,null,
+                        sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4",plusExt.getIsObj());
+            }else {
+                laserService.cloudPointBuild(oldNum,newNum);
+            }
+
+            try {
+                //重新生成编辑页基础设置二维码
+                sceneCommonService.createNewQrCode(SceneVersionType.V4.code(),sceneEditInfoExt.getShareLogoImg(),newNum,plusExt.getWebSite());
+                //copyDataSource
+                //cn.hutool.core.io.FileUtil.copyContent(new File(oldDataSource),new File(newDataSource),true);
+
+                this.copyOssAndNas(oldNum,newNum);
+
+                //修改 oss status.json ,nas scene.json
+                String targetData = String.format(SceneResourcePath.DATA_VIEW_PATH,newNum);
+                sceneCommonService.updateOssJson(targetData,oldNum,newNum,"v4");
+
+                sceneCommonService.updateNasSceneJson(targetData,oldNum,newNum,oldSceneName,scenePlus.getTitle(),"v4");
+
+                if(scenePlus.getSceneSource() == 4){  //深时复制
+                    String laserPath = laserService.copyDataSource(oldDataSource,plusExt.getDataSource());
+                    laserService.copy(oldNum,scenePlus.getCameraId(),scenePlus.getCreateTime(),newNum,2,laserPath,
+                            sceneEditInfo.getScenePassword(),scenePlus.getTitle(),scenePlus.getUserId(),"V4",plusExt.getIsObj());
                 }
-            }, executor).whenComplete((reslut, e) -> {
-                log.info("复制场景oldNum:{},newNum:{}结束-{}",num,newNum, new Date());
-            });
-        }catch (Exception e){
-            log.error("线程错误:{}",e);
-        }finally {
-            executor.shutdown();
-        }
+                scenePlus.setSceneStatus(-2);
+                this.updateById(scenePlus);
+                cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
+                cameraDetailService.updateById(cameraDetail);
+                sceneCopyLogService.saveByNum(oldNum,newNum,scenePlus.getUserId());
+            }catch (Exception e){
+                log.error("复制场景失败-V4-sceneNum:{},error:{}",oldNum,e);
+                scenePlus.setSceneStatus(-1);
+                this.updateById(scenePlus);
+                throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+            }
+        }, executor).whenComplete((reslut, e) -> {
+            log.info("copy-success-");
+        });
+
 
         return scenePlus.getId();
     }
 
+    private  void copyOssAndNas(String oldNum,String newNum){
+        // 拷贝场景编辑资源
+        String oldEditPath = String.format(SceneResourcePath.EDIT_PATH_v4, oldNum);
+        String newEditPath = String.format(SceneResourcePath.EDIT_PATH_v4, newNum);
+        fYunFileServiceInterface.copyFileInBucket(oldEditPath, newEditPath);
+
+        // 拷贝场景展示资源
+        String oldViewPath = String.format(SceneResourcePath.VIEW_PATH_v4, oldNum);
+        String newViewPath = String.format(SceneResourcePath.VIEW_PATH_v4, newNum);
+        fYunFileServiceInterface.copyFileInBucket(oldViewPath, newViewPath);
+
+        //复制计算结果文件
+        String oldResultPath = String.format(SceneResourcePath.SCENE_RESULT_DATA_PATH, oldNum);
+        String newResultPath = String.format(SceneResourcePath.SCENE_RESULT_DATA_PATH, newNum);
+        fYunFileServiceInterface.copyFileInBucket(oldResultPath, newResultPath);
+
+        // 拷贝本地资源
+        String oldPath = SceneResourcePath.nasBasePath + oldNum;
+        String newPath = SceneResourcePath.nasBasePath + newNum;
+        if(new File(oldPath).exists()){
+            FileUtil.copyContent(new File(oldPath), new File(newPath),true);
+        }
+        String oldPath_v4 = SceneResourcePath.nasBasePath_v4 + oldNum;
+        String newPath_v4 = SceneResourcePath.nasBasePath_v4 + newNum;
+        if(new File(oldPath_v4).exists()){
+            FileUtil.copyContent(new File(oldPath_v4), new File(newPath_v4),true);
+        }
+    }
+
+
     @Override
     public Result pageSceneWithHouseType(RequestScene param, String token) {
         User ssoUser = userService.getByToken(token);

+ 113 - 237
src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.SceneConstant;
 import com.fdkankan.common.constant.SceneKind;
+import com.fdkankan.common.constant.SceneVersionType;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.*;
 import com.fdkankan.model.constants.UploadFilePath;
@@ -24,6 +25,7 @@ import com.fdkankan.image.MatrixToImageWriterUtil;
 import com.fdkankan.ucenter.common.constants.ConstantFilePath;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.ucenter.common.constants.NacosProperty;
+import com.fdkankan.ucenter.common.constants.ResultCode;
 import com.fdkankan.ucenter.common.utils.ShellUtil;
 import com.fdkankan.ucenter.constant.CameraConstant;
 import com.fdkankan.ucenter.constant.LoginConstant;
@@ -33,6 +35,7 @@ import com.fdkankan.ucenter.mapper.ISceneProMapper;
 import com.fdkankan.ucenter.mapper.ISceneUpgradeMapper;
 import com.fdkankan.ucenter.service.*;
 import com.fdkankan.ucenter.util.DateUserUtil;
+import com.fdkankan.ucenter.util.SceneResourcePath;
 import com.fdkankan.ucenter.vo.ResponseScene;
 import com.fdkankan.ucenter.vo.request.RequestScene;
 import com.fdkankan.ucenter.vo.request.SceneParam;
@@ -112,6 +115,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     private ISceneProEditService sceneProEditService;
     @Autowired
+    private SceneCommonService sceneCommonService;
+    @Autowired
     private RedisUtil redisUtil;
     @Autowired
     private ISceneUpgradeMapper sceneUpgradeMapper;
@@ -120,6 +125,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Autowired
     LaserService laserService;
     @Autowired
+    private FYunFileServiceInterface fYunFileServiceInterface;
+    @Autowired
     ISceneDelLogService sceneDelLogService;
 
     @Value("${scene.pro.url}")
@@ -697,27 +704,23 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
 
         String newNum = scene3dNumService.generateSceneNum(detailEntity.getType());
-        String title = scenePro == null ? scenePlus.getTitle() : scenePro.getSceneName();
-        String newTitle = title.concat("(copy)");
 
         Long sceneId = scenePro == null ? scenePlus.getId() :scenePro.getId();
         Long newSceneId = null;
         FolderScene folderScene = folderSceneService.getByType(sceneId, null);
-        String time = DateUtil.date2String(new Date(),DateUtil.YYYYMMDDHHMMSSSSS_DATA_FORMAT);
 
         if(scenePro !=null){        //v3场景复制
-            log.info("场景复制--V3--OldNum:{},oldTitle:{},newNum:{},newTitle:{}",
-                    scenePro.getNum(),scenePro.getSceneName(),newNum,newTitle);
-            scenePro.setSceneName(newTitle);
-            newSceneId = this.copyV3Scene(scenePro, newNum, detailEntity,time);
+            log.info("场景复制--V3--OldNum:{},oldTitle:{},newNum:{},", scenePro.getNum(),scenePro.getSceneName(),newNum);
+
+            newSceneId = this.copyV3Scene(scenePro, newNum, detailEntity);
         }
         if(scenePlus != null){      //v4场景复制
-            log.info("场景复制--V4--OldNum:{},oldTitle:{},newNum:{},newTitle:{}",
-                    scenePlus.getNum(),scenePlus.getTitle(),newNum,newTitle);
-            scenePlus.setTitle(newTitle);
-            newSceneId =  scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity,time);
+            log.info("场景复制--V4--OldNum:{},oldTitle:{},newNum:{}", scenePlus.getNum(),scenePlus.getTitle(),newNum);
+
+            newSceneId =  scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity);
         }
         log.info("场景复制--完成--sceneId:{}",newSceneId);
+
         if(newSceneId != null && folderScene!= null){
             folderScene.setId(null);
             folderScene.setSceneId(newSceneId);
@@ -739,221 +742,109 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
 
     @Override
-    public Long copyV3Scene(ScenePro oldScene,String newNum,CameraDetail cameraDetail,String time) throws Exception {
-        SceneProEdit oldEditScene = sceneProEditService.getByProId(oldScene.getId());
-
-        String oldNum = oldScene.getNum();
-        //复制数据库数据
-        oldScene.setId(null);
-        oldScene.setStatus(0);
-        oldScene.setNum(newNum);
-        oldScene.setWebSite(oldScene.getWebSite().replace(oldNum, newNum));
-        oldScene.setThumb(oldScene.getThumb().replace(oldNum, newNum));
-        oldScene.setVideos(this.setVideos(oldScene.getVideos(),oldNum,newNum));
-        oldScene.setViewCount(0);
-        String preDataSource = oldScene.getDataSource();
-        String newDataSource = this.setDataSource(preDataSource,time);
-        oldScene.setDataSource(newDataSource);
-
-        this.save(oldScene);
-        if(oldScene.getSceneSource() == 4){  //深时复制
-            laserService.copy(oldNum,oldScene.getCameraId(),oldScene.getCreateTime(),newNum,0,null,
-                    oldEditScene.getSceneKey(),oldScene.getSceneName(),oldScene.getUserId(),"V3",oldScene.getIsObj());
-        }
-        //更新video
-        Map map = new HashMap();
-        JSONObject object = new JSONObject();
-        if(StringUtils.isNotEmpty(oldScene.getVideos())){
-            object = JSONObject.parseObject(oldScene.getVideos());
-            if(object.containsKey("upPath")){
-                String upPath = object.getString("upPath");
-                upPath = upPath.replace(oldNum,newNum);
-                object.put("upPath",upPath);
-            }
-            oldScene.setVideos(object.toJSONString());
-            log.info("更新 scene.json");
-            map.put("videos",oldScene.getVideos());
-        }
-        map.put("sceneName",oldScene.getSceneName());
-        map.put("webSite",oldScene.getWebSite());
-        map.put("thumb",oldScene.getThumb());
-        map.put("num",oldScene.getNum());
-        map.put("id",oldScene.getId());
-        map.put("dataSource",oldScene.getDataSource());
-
-        //复制完成更新相机容量
-
-        oldEditScene.setId(null);
-        oldEditScene.setProId(oldScene.getId());
-        oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, newNum));
-        oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, newNum));
-        oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, newNum));
-        oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, newNum));
-        oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, newNum));
-        oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, newNum));
-        sceneProEditService.save(oldEditScene);
-
-        this.setQrCode(oldScene.getBuildType(), oldScene.getNum());
-        ExecutorService executor = ThreadUtil.newSingleExecutor();
-        try {
-            CompletableFuture.runAsync(() -> {
-                try {
-                    log.info("开始复制场景-{}", new Date());
-                    String buildModelPath = ConstantFilePath.BUILD_MODEL_PATH;
-                    if(oldScene.getSceneSource().equals(4)){
-                        buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
-                    }
-                    this.copyFdage(preDataSource,newDataSource,buildModelPath,time);
-                    //oss复制计算结果资源
-                    downloadFromOldNumFromOss(oldNum, newNum);
-                    // 复制本地secen.json
-                    copyOldSceneLocalToNew(oldNum, newNum);
-                    FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json", map);
-                    //上传资源到oss
-                    uploadNewSceneToOss(newNum);
-
-                    FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "images/images" + newNum);
-                    FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "data/data" + newNum);
-                    FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
-                    FileUtils.delFolder(ConstantFilePath.SCENE_PATH + "video/video" + newNum);
-
-                    FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"images/images" + oldNum,ConstantFilePath.SCENE_PATH +"images/images" + newNum);
-                    FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"data/data" + oldNum,ConstantFilePath.SCENE_PATH +"data/data" + newNum);
-                    FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + File.separator + "scene.json", map);
-                    reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",oldNum, newNum);
-                    reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",oldNum, newNum);
-                    FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"voice/voice" + oldNum,ConstantFilePath.SCENE_PATH +"voice/voice" + newNum);
-                    FileUtils.copyDirectiory(ConstantFilePath.SCENE_PATH +"video/video" + oldNum,ConstantFilePath.SCENE_PATH +"video/video" + newNum);
-                    oldScene.setStatus(-2);
-                    this.updateById(oldScene);
-
-                    cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + oldScene.getSpace());
-                    cameraDetailService.updateById(cameraDetail);
-                    if(oldScene.getPayStatus() == -2){
-                        this.updateOssStatus(String.format(OssPath.v3_statusPath,oldScene.getNum()),-2);
-                    }
-                    if(oldScene.getSceneSource() == 4){  //深时复制
-                        String laserPath = laserService.copyDataSource(preDataSource,oldScene.getDataSource());
-                        laserService.copy(oldNum,oldScene.getCameraId(),oldScene.getCreateTime(),newNum,2,laserPath,
-                                oldEditScene.getSceneKey(),oldScene.getSceneName(),oldScene.getUserId(),"V3",oldScene.getIsObj());
-                    }
-                    sceneCopyLogService.saveByNum(oldNum,newNum,oldScene.getUserId());
+    public Long copyV3Scene(ScenePro scenePro,String newNum,CameraDetail cameraDetail) throws Exception {
 
-                } catch (Exception e) {
-                    this.removeById(oldScene.getId());
-                    log.error("复制场景异常", e);
-                }
-            }, executor).whenComplete((reslut, e) -> {
-                log.info("复制场景oldNum:{},newNum:{}结束-{}",oldNum,newNum, new Date());
-            });
-        }catch (Exception e){
-            log.error("线程错误:{}",e);
-        }finally {
-            executor.shutdown();
-        }
+        String oldNum = scenePro.getNum();
+        Long sceneProId = scenePro.getId();
+        String oldSceneName = scenePro.getSceneName();
 
-        return oldScene.getId();
-    }
+        scenePro.setNum(newNum);
+        scenePro.setId(null);
+        scenePro.setSceneName(scenePro.getSceneName() +"(copy)");
+        scenePro.setViewCount(0);
+        scenePro.setThumb(scenePro.getThumb().replaceAll(oldNum,scenePro.getNum()));
+        scenePro.setWebSite(scenePro.getWebSite().replaceAll(oldNum,scenePro.getNum()));
+        scenePro.setStatus(0);
+        this.save(scenePro);
 
-    /**
-     * 从旧场景下载资源
-     * @param sceneNum
-     * @param newNum
-     * @throws Exception
-     */
-    private void downloadFromOldNumFromOss(String sceneNum, String newNum) {
-        ShellUtil.yunDownload("images/images" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "images/images" + newNum);
-        ShellUtil.yunDownload("data/data" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "data/data" + newNum);
-        ShellUtil.yunDownload("voice/voice" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "voice/voice" + newNum);
-        ShellUtil.yunDownload("video/video" + sceneNum + "/", ConstantFilePath.SCENE_PATH + "video/video" + newNum);
-    }
+        ExecutorService executor = ThreadUtil.newSingleExecutor();
+        CompletableFuture.runAsync(() -> {
+
+            String oldDataSource = scenePro.getDataSource();
+            String newDataSource = sceneCommonService.getNewDataSource(oldDataSource);
+
+            log.info("sceneCopy--oldNum:{},oldDataSource:{},newNum:{},newDataSource:{}",
+                    oldNum,oldDataSource,newNum,newDataSource);
+
+            scenePro.setDataSource(newDataSource);
+            this.updateById(scenePro);
+
+            SceneProEdit oldEditScene = sceneProEditService.getByProId(sceneProId);
+            oldEditScene.setId(null);
+            oldEditScene.setProId(scenePro.getId());
+            oldEditScene.setScreencapVoiceSrc(oldEditScene.getScreencapVoiceSrc() == null ? null : oldEditScene.getScreencapVoiceSrc().replace(oldNum, scenePro.getNum()));
+            oldEditScene.setScreencapVoiceSound(oldEditScene.getScreencapVoiceSound() == null ? null : oldEditScene.getScreencapVoiceSound().replace(oldNum, scenePro.getNum()));
+            oldEditScene.setScreencapVoiceSoundsync(oldEditScene.getScreencapVoiceSoundsync() == null ? null : oldEditScene.getScreencapVoiceSoundsync().replace(oldNum, scenePro.getNum()));
+            oldEditScene.setPlayData(oldEditScene.getPlayData() == null ? null : oldEditScene.getPlayData().replace(oldNum, scenePro.getNum()));
+            oldEditScene.setScreencapThumb(oldEditScene.getScreencapThumb() == null ? null : oldEditScene.getScreencapThumb().replace(oldNum, scenePro.getNum()));
+            oldEditScene.setFloorPlanPng(oldEditScene.getFloorPlanPng() == null ? null : oldEditScene.getFloorPlanPng().replace(oldNum, scenePro.getNum()));
+            sceneProEditService.save(oldEditScene);
+
+            if(scenePro.getSceneSource() == 4){  //深时复制
+                laserService.copy(oldNum,scenePro.getCameraId(),scenePro.getCreateTime(),newNum,0,null,
+                        oldEditScene.getSceneKey(),scenePro.getSceneName(),scenePro.getUserId(),"V3",scenePro.getIsObj());
+            }
 
-    /**
-     * 从本地旧场景拷贝资源到新场景
-     * @param sceneNum
-     * @param newNum
-     */
-    private void copyOldSceneLocalToNew(String sceneNum, String newNum) throws Exception {
-        FileUtils.copyFolderAllFiles(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + "/",
-                ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/", true);
+            try {
+                //重新生成编辑页基础设置二维码
+                sceneCommonService.createNewQrCode(SceneVersionType.V3.code(),oldEditScene.getShareLogo(),newNum,scenePro.getWebSite());
+                //copyDataSource
+                cn.hutool.core.io.FileUtil.copyContent(new File(oldDataSource),new File(newDataSource),true);
+
+                String sourceData = String.format(SceneResourcePath.dataPath, oldNum);
+                String targetData = String.format(SceneResourcePath.dataPath, scenePro.getNum());
+                this.copyOssAndNas(oldNum,scenePro.getNum(),sourceData,targetData);
+                //修改 oss status.json ,nas scene.json
+                sceneCommonService.updateOssJson(targetData,oldNum,newNum,"v3");
+                sceneCommonService.updateNasSceneJson(targetData,oldNum,newNum,oldSceneName,scenePro.getSceneName(),"v3");
+
+                String sourceImages = String.format(SceneResourcePath.imagesPath, oldNum);
+                String targetImages = String.format(SceneResourcePath.imagesPath, scenePro.getNum());
+                this.copyOssAndNas(oldNum,scenePro.getNum(),sourceImages,targetImages);
+
+                String sourceVideo = String.format(SceneResourcePath.videoPath, oldNum);
+                String targetVideo = String.format(SceneResourcePath.videoPath, scenePro.getNum());
+                this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVideo,targetVideo);
+
+                String sourceVoice = String.format(SceneResourcePath.voicePath, oldNum);
+                String targetVoice = String.format(SceneResourcePath.voicePath, scenePro.getNum());
+                this.copyOssAndNas(oldNum,scenePro.getNum(),sourceVoice,targetVoice);
+
+                if(scenePro.getSceneSource() == 4){  //深时复制
+                    String laserPath = laserService.copyDataSource(oldDataSource,scenePro.getDataSource());
+                    laserService.copy(oldNum,scenePro.getCameraId(),scenePro.getCreateTime(),newNum,2,laserPath,
+                            oldEditScene.getSceneKey(),scenePro.getSceneName(),scenePro.getUserId(),"V3",scenePro.getIsObj());
+                }
+                scenePro.setStatus(-2);
+                this.updateById(scenePro);
+                cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + scenePro.getSpace());
+                cameraDetailService.updateById(cameraDetail);
+                sceneCopyLogService.saveByNum(oldNum,newNum,scenePro.getUserId());
+
+            }catch ( Exception e){
+                log.error("复制场景失败-sceneNum:{},error:{}",oldNum,e);
+                scenePro.setStatus(-1);
+                this.updateById(scenePro);
+                throw new BusinessException(ResultCode.FAILURE_CODE_400006,ResultCode.FAILURE_MSG_400006);
+            }
+        }, executor).whenComplete((reslut, e) -> {
+            log.info("copy-success-");
+        });
 
-        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/link-scene.json",sceneNum, newNum);
-        reloadFile(ConstantFilePath.SCENE_PATH + "data/data" + newNum + "/hot.json",sceneNum, newNum);
+        return scenePro.getId();
     }
-
-    public void copyFdage(String oldDataSource,String newDataSource,String buildModelPath,String time) throws Exception {
-
-        ShellUtil.yunDownload(ConstantFilePath.OSS_PREFIX + oldDataSource.replace(buildModelPath, "")+"/", newDataSource);
-        // 修改data.fdage
-        String data = FileUtils.readFile(newDataSource + "/data.fdage");
-        JSONObject jsonObject = JSONObject.parseObject(data);
-        if(ObjectUtils.isEmpty(jsonObject)){
-            log.error("data.fdage文件不存在");
-            throw new BusinessException(-1,"拷贝场景出错,data.fdage文件不存在");
+    private void copyOssAndNas(String oldNum ,String newNum ,String sourcePath,String targetPath){
+        log.info("sceneCopy-ossSource-oldNum:{},newNum:{},sourcePath:{},targetPath:{}",oldNum,newNum,sourcePath,targetPath);
+        fYunFileServiceInterface.copyFileInBucket(sourcePath,targetPath);
+        File fileData = new File(SceneResourcePath.nasBasePath + sourcePath);
+        if(fileData.exists()){
+            cn.hutool.core.io.FileUtil.copyContent(fileData,new File(SceneResourcePath.nasBasePath + targetPath),true);
         }
-        jsonObject.put("uuidtime",time);
-        FileUtils.writeFile(newDataSource + "/data.fdage", jsonObject.toJSONString());
-        ShellUtil.yunUpload(newDataSource,  ConstantFilePath.OSS_PREFIX + newDataSource.replace(buildModelPath, ""));
-
-        // 复制计算结果
-        ShellUtil.yunDownload(ConstantFilePath.OSS_PREFIX + oldDataSource.concat("_results/").replace(buildModelPath, ""), newDataSource.concat("_results"));
-        if(new File(newDataSource.concat("_results")).exists()){
-            ShellUtil.yunUpload(newDataSource.concat("_results"), ConstantFilePath.OSS_PREFIX + newDataSource.concat("_results").replace(buildModelPath, ""));
-            FileUtils.delAllFile(newDataSource.concat("_results"));
-        }
-        FileUtils.delAllFile(newDataSource);
-
-        try {
-            FileUtils.copyFolderAllFiles(oldDataSource+"/",newDataSource+"/", true);
-        }catch (Exception e){
-            log.error("dataSource复制失败,{}不存在",oldDataSource);
-        }
-
-    }
-    @Override
-    public String setDataSource(String preDataSource,String time) throws Exception {
-        SnowflakeIdGenerator snowflakeIdGenerator = new SnowflakeIdGenerator(0,1);
-        String[] datasource = preDataSource.split("/");
-        datasource[4] = snowflakeIdGenerator.nextId()+"";
-        datasource[5] = datasource[5].split("_")[0] + "_" + time;
-        return Arrays.stream(datasource).collect(Collectors.joining("/"));
     }
 
-    @Override
-    public String setVideos(String videos,String oldNum,String newNum) {
-        JSONObject object = new JSONObject();
-        if(StringUtils.isNotEmpty(videos)){
-            object = JSONObject.parseObject(videos);
-            if(object.containsKey("upPath")){
-                String upPath = object.getString("upPath");
-                upPath = upPath.replace(oldNum,newNum);
-                object.put("upPath",upPath);
-            }
-            log.info("更新 scene.json");
-        }
-        return object.toJSONString();
-    }
 
-    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
-     */
-    private void uploadNewSceneToOss(String newNum) {
-        ShellUtil.yunUpload("/mnt/4Dkankan/scene/images/images" + newNum, "images/images" + newNum);
-        ShellUtil.yunUpload("/mnt/4Dkankan/scene/data/data" + newNum, "data/data" + newNum);
-        ShellUtil.yunUpload("/mnt/4Dkankan/scene/voice/voice" + newNum, "voice/voice" + newNum);
-        ShellUtil.yunUpload("/mnt/4Dkankan/scene/video/video" + newNum, "video/video" + newNum);
-    }
 
     @Override
     public void delete(String sceneNum,Long userId) {
@@ -1149,19 +1040,6 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return sceneSource;
     }
 
-    @Override
-    public void setQrCode(String buildType,String num) throws Exception {
-        String basePath = NacosProperty.getMainUrl();
-        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);
-
-    }
 
     @Override
     public void generateObjFile(String num) {
@@ -1182,16 +1060,9 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
         // 拷贝文件
         String path = sceneProEntity.getDataSource();
-        if (!new File(path + "/caches/reconstruction/final.bin").exists()
-                || !new File(path + "/caches/reconstruction/chunk.json").exists()
-                || !new File(path + "/caches/images").exists()
-                || !new File(path + "/caches/depthmap").exists()
-                || !new File(path + "/caches/depthmap_csc").exists()
-                || !new File(path + "/caches/floor_group_fix.json").exists()
-                || !new File(path + "/caches/panorama.json").exists()
-                || !new File(path + "/results/laserData/laser.ply").exists()) {
-            log.error("生成obj缺少必要文件,生成失败!");
-            throw new BusinessException(SceneConstant.FAILURE_CODE_5038, SceneConstant.FAILURE_MSG_5038);
+        String ossPath = path.replace("/mnt/data","home");
+        if(!fYunFileService.fileExist(ossPath)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3003, "原始资源不存在");
         }
 
         // 获取最新的场景名称
@@ -1241,6 +1112,11 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
 
         ScenePlusExt scenePlusExt = scenePlusExtService.getByPlusId(scenePlus.getId());
 
+        String ossPath = scenePlusExt.getDataSource().replace("/mnt/data","home");
+        if(!fYunFileService.fileExist(ossPath)){
+            throw new BusinessException(LoginConstant.FAILURE_CODE_3003, "原始资源不存在");
+        }
+
         // 拷贝文件
         String ossResultPath = String.format(UploadFilePath.scene_result_data_path, num);
         String ossReconstruction = ossResultPath + "caches/reconstruction/";

+ 21 - 0
src/main/java/com/fdkankan/ucenter/util/FileUtil.java

@@ -0,0 +1,21 @@
+package com.fdkankan.ucenter.util;
+
+import java.io.*;
+
+public class FileUtil {
+
+    public static void writeFile(String filePath,String str) throws IOException {
+
+        File fout = new File(filePath);
+        if(!fout.getParentFile().exists()){
+            fout.getParentFile().mkdirs();
+        }
+        if(!fout.exists()){
+            fout.createNewFile();
+        }
+        FileOutputStream fos = new FileOutputStream(fout);
+        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
+        bw.write(str);
+        bw.close();
+    }
+}

+ 30 - 0
src/main/java/com/fdkankan/ucenter/util/SceneResourcePath.java

@@ -0,0 +1,30 @@
+package com.fdkankan.ucenter.util;
+
+public class SceneResourcePath {
+    /*
+     * data/data{SceneNum}
+     * images/images{SceneNum}
+     * video/video{SceneNum}
+     * voice/voice{SceneNum}
+     */
+    public static String nasBasePath = "/mnt/4Dkankan/scene/";
+    public static String nasBasePath_v4 = "/mnt/4Dkankan/scene_v4/";
+    public static String qrCodeBasePath = "/mnt/4Dkankan/sceneQRcode/";
+
+    public static String dataPath = "data/data%s";
+    public static String imagesPath = "images/images%s";
+    public static String videoPath = "video/video%s";
+    public static String voicePath = "voice/voice%s";
+
+
+    public static final String EDIT_PATH_v4 =  "scene_edit_data/%s/";
+    public static final String VIEW_PATH_v4 =  "scene_view_data/%s/";
+
+    public static final String SCENE_RESULT_DATA_PATH = "scene_result_data/%s/";
+
+    public static final String DATA_EDIT_PATH =  "scene_edit_data/%s/data/";
+    public static final String DATA_VIEW_PATH =  "scene_view_data/%s/data/";
+
+    public static final String DOWNLOADS_QRCODE = "downloads/scene/%s/QRcode/";
+
+}

+ 2 - 0
src/main/java/com/fdkankan/ucenter/vo/request/AppSceneParam.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
+import java.util.Set;
 
 @Data
 public class AppSceneParam extends RequestBase {
@@ -31,5 +32,6 @@ public class AppSceneParam extends RequestBase {
     private String endTime;
     private String sceneNum;
 
+    private Set<String> copyNumSet;
 
 }

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

@@ -60,6 +60,12 @@
         <if test= 'param.cameraType != null' >
             and tcd.goods_id = #{param.cameraType}
         </if>
+        <if test="param.copyNumSet !=null and param.copyNumSet.size >0">
+            and  p.num not in
+            <foreach collection="param.copyNumSet" item="num" open="("  separator="," close=")">
+                #{num}
+            </foreach>
+        </if>
     </sql>