Jelajahi Sumber

增加复制功能

dsx 2 tahun lalu
induk
melakukan
b54e2ed59a

+ 1 - 1
pom.xml

@@ -23,7 +23,7 @@
         <dependency>
             <groupId>com.fdkankan</groupId>
             <artifactId>4dkankan-utils-fyun</artifactId>
-            <version>2.0.0-SNAPSHOT</version>
+            <version>ZJ-2.0.0-SNAPSHOT</version>
         </dependency>
 
         <dependency>

+ 5 - 3
src/main/java/com/fdkankan/ucenter/bean/SceneJsonBean.java

@@ -2,6 +2,8 @@ package com.fdkankan.ucenter.bean;
 
 import com.alibaba.fastjson.JSONObject;
 import java.util.Date;
+
+import com.fdkankan.ucenter.vo.response.SceneEditControlsVO;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -66,12 +68,12 @@ public class SceneJsonBean {
      */
     private String description;
 
-    private SceneEditControlsBean controls;
+    private SceneEditControlsVO controls;
 
     /**
      * 创建时间
      */
-    private Date createTime;
+    private String createTime;
 
 //    /**
 //     * 点位数量
@@ -143,7 +145,7 @@ public class SceneJsonBean {
     /**
      *点位视频
      */
-    private JSONObject videos;
+    private String videos;
 
     /**
      * 是否有热点数据

+ 3 - 0
src/main/java/com/fdkankan/ucenter/entity/ScenePlusExt.java

@@ -129,6 +129,9 @@ public class ScenePlusExt implements Serializable {
     @TableField("videos")
     private String videos;
 
+    @TableField("yun_file_bucket")
+    private String yunFileBucket;
+
     /**
      * 计算耗时
      */

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

@@ -34,5 +34,5 @@ public interface IScenePlusService extends IService<ScenePlus> {
 
     ScenePlus getByNum(String sceneNum);
 
-    void copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) throws IOException, Exception;
+    Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail,String time) throws IOException, Exception;
 }

+ 3 - 0
src/main/java/com/fdkankan/ucenter/service/ISceneProService.java

@@ -72,4 +72,7 @@ public interface ISceneProService extends IService<ScenePro> {
     void copyLocalSource(String sceneNum, String newNum) throws Exception ;
 
     String setDataSource(String preDataSource,Integer sceneSource) throws Exception;
+
+    void copySceneNoCheck(String sceneNum) throws Exception;
+
 }

+ 129 - 45
src/main/java/com/fdkankan/ucenter/service/impl/ScenePlusServiceImpl.java

@@ -1,21 +1,37 @@
 package com.fdkankan.ucenter.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
 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.UploadFilePath;
 import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.common.util.MatrixToImageWriterUtil;
 import com.fdkankan.fyun.oss.UploadToOssUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.ucenter.bean.SceneJsonBean;
 import com.fdkankan.ucenter.entity.*;
 import com.fdkankan.ucenter.mapper.IScenePlusMapper;
 import com.fdkankan.ucenter.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.ucenter.vo.response.SceneEditControlsVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import java.io.File;
 import java.io.IOException;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
 
 /**
  * <p>
@@ -25,6 +41,7 @@ import java.util.List;
  * @author 
  * @since 2022-07-04
  */
+@Slf4j
 @Service
 public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlus> implements IScenePlusService {
 
@@ -44,6 +61,8 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     UploadToOssUtil uploadToOssUtil;
     @Autowired
     ISceneProService sceneProService;
+    @Autowired
+    RedisUtil redisUtil;
 
     @Override
     public Long getCountByUserId(Long userId, List<Integer> sceneSourceList) {
@@ -110,67 +129,132 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     }
 
     @Override
-    public void copyV4Scene(ScenePlus scenePlus,String newNum, CameraDetail cameraDetail) throws Exception {
+    public Long copyV4Scene(ScenePlus scenePlus,String newNum ,CameraDetail cameraDetail,String time) throws Exception {
         String num = scenePlus.getNum();
         Long plusId = scenePlus.getId();
-        scenePlus.setSceneStatus(0);
+        ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
+        String bucket = plusExt.getYunFileBucket();
+
+        // 拷贝数据
         scenePlus.setNum(newNum);
         scenePlus.setId(null);
-        scenePlus.setTitle(scenePlus.getTitle().concat("(copy)"));
+        scenePlus.setSceneStatus(0);
         this.save(scenePlus);
 
-        ScenePlusExt plusExt = scenePlusExtService.getByPlusId(plusId);
-        String videos ;
-        if(plusExt.getVideos().contains("scene_view_data")){
-            videos = plusExt.getVideos().replace(num,newNum);
-        }else {
-            videos = plusExt.getVideos().replaceAll("https://4dkk.4dage.com/data/data"+num, "https://4dkk.4dage.com/scene_view_data/"+newNum+"/data");
-        }
+        ExecutorService executor = ThreadUtil.newSingleExecutor();
+        try {
+            CompletableFuture.runAsync(() -> {
+                try {
+                    // 拷贝场景编辑资源
+                    String oldEditPath = String.format(UploadFilePath.EDIT_PATH, num);
+                    String newEditPath = String.format(UploadFilePath.EDIT_PATH, newNum);
+                    uploadToOssUtil.copyFiles(bucket, oldEditPath, newEditPath);
+
+                    // 拷贝场景展示资源
+                    String oldViewPath = String.format(UploadFilePath.VIEW_PATH, num);
+                    String newViewPath = String.format(UploadFilePath.VIEW_PATH, newNum);
+                    uploadToOssUtil.copyFiles(bucket, oldViewPath, newViewPath);
 
-        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 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 newDataSource = sceneProService.setDataSource(plusExt.getDataSource(), scenePlus.getSceneSource());
-        plusExt.setDataSource(newDataSource);
-        scenePlusExtService.save(plusExt);
+                    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);
+                    }
 
-        //保存复制日志
-        sceneCopyLogService.saveByNum(num,newNum,scenePlus.getUserId());
-        //复制完成更新相机容量
-        cameraDetail.setUsedSpace(cameraDetail.getUsedSpace() + plusExt.getSpace());
-        cameraDetailService.updateById(cameraDetail);
+                    plusExt.setId(null);
+                    plusExt.setPlusId(scenePlus.getId());
+                    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 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);
 
-        sceneEditInfo.setId(null);
-        sceneEditInfo.setScenePlusId(scenePlus.getId());
-        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);
 
-        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoId);
-        sceneEditInfoExt.setId(null);
-        sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
-        sceneEditInfoExt.setScenePlusId(scenePlus.getId());
-        sceneEditInfoExtService.save(sceneEditInfoExt);
+                    SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
+                    sceneEditControls.setId(null);
+                    sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+                    sceneEditControlsService.save(sceneEditControls);
 
-        SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfoId);
-        sceneEditControls.setId(null);
-        sceneEditControls.setEditInfoId(sceneEditInfo.getId());
-        sceneEditControlsService.save(sceneEditControls);
+                    // 生成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());
 
-        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());
+                    sceneJson.setSceneResolution(plusExt.getSceneResolution());
+                    sceneJson.setSceneFrom(plusExt.getSceneFrom());
+                    sceneJson.setSceneKind(plusExt.getSceneKind());
+                    if(StrUtil.isNotEmpty(plusExt.getVideos())){
+                        sceneJson.setVideos(plusExt.getVideos());
+                    }
 
-        scenePlus.setSceneStatus(-2);
-        this.updateById(scenePlus);
+                    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);
+                    uploadToOssUtil.upload(bucket, 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);
+                    uploadToOssUtil.upload(bucket, outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, newNum) + newNum + ".png");
+                    uploadToOssUtil.upload(bucket, 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);
+
+                    sceneCopyLogService.saveByNum(num,newNum,scenePlus.getUserId());
+
+                }catch (Exception e){
+                    this.removeById(scenePlus.getId());
+                    log.error("复制场景异常", e);
+                }
+            }, executor).whenComplete((reslut, e) -> {
+                log.info("复制场景oldNum:{},newNum:{}结束-{}",num,newNum, new Date());
+            });
+        }catch (Exception e){
+            log.error("线程错误:{}",e);
+        }finally {
+            executor.shutdown();
+        }
 
+        return scenePlus.getId();
     }
 }

+ 37 - 15
src/main/java/com/fdkankan/ucenter/service/impl/SceneProServiceImpl.java

@@ -358,11 +358,6 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
         Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
         Long userId = scenePro == null ? scenePlus.getUserId() :scenePro.getUserId();
-        // 判断是否有绑定会员权益
-        Long count = userIncrementService.getValidCountByCameraId(cameraId);
-        if(count <= 0){
-            throw new BusinessException(LoginConstant.FAILURE_CODE_3030, LoginConstant.FAILURE_MSG_3030);
-        }
         if(userId == null){
             throw new BusinessException(SceneConstant.FAILURE_CODE_5013, SceneConstant.FAILURE_MSG_5013);
         }
@@ -375,15 +370,42 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         if(detailEntity == null){
             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);
+        this.copySceneNoCheck(sceneNum);
+
+    }
+
+    @Override
+    public void copySceneNoCheck(String sceneNum) throws Exception {
+        ScenePro scenePro = this.getByNum(sceneNum);
+        ScenePlus scenePlus = scenePlusService.getByNum(sceneNum);
+        Long cameraId = scenePro == null ? scenePlus.getCameraId() : scenePro.getCameraId();
+        CameraDetail detailEntity = cameraDetailService.getByCameraId(cameraId);
+        if(detailEntity == null){
+            throw new BusinessException(CameraConstant.FAILURE_CODE_6029, CameraConstant.FAILURE_MSG_6029);
         }
+
+        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(scenePlus != null){      //v4场景复制
-            scenePlusService.copyV4Scene(scenePlus,newNum,detailEntity);
+            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("场景复制--完成--sceneId:{}",newSceneId);
+        if(newSceneId != null && folderScene!= null){
+            folderScene.setId(null);
+            folderScene.setSceneId(newSceneId);
+            folderSceneService.save(folderScene);
         }
-
     }
 
     @Override
@@ -472,7 +494,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         if(sceneSource.equals(4)){
             buildModelPath = ConstantFilePath.BUILD_MODEL_LASER_PATH;
         }
-        CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX +newDataSource.replace(buildModelPath, "")+"/", newDataSource);
+        CreateObjUtil.ossUtilCp(null,ConstantFilePath.OSS_PREFIX +newDataSource.replace(buildModelPath, "")+"/", newDataSource);
 
         List<String> urlList = new ArrayList<>();
         FileUtils.readfilePath(newDataSource, urlList);
@@ -480,7 +502,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         for(String url : urlList){
             fileMap.put(url, ConstantFilePath.OSS_PREFIX + url.replace(buildModelPath, ""));
         }
-        uploadToOssUtil.uploadMulFiles(fileMap);
+        uploadToOssUtil.uploadMulFiles(null, fileMap);
 
         FileUtils.delAllFile(newDataSource);
 
@@ -503,7 +525,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             copyList.add(oldViewPath);
         }
         for (String sourcePath : copyList) {
-            uploadToOssUtil.copyFiles(sourcePath,sourcePath.replaceAll(sceneNum,newNum));
+            uploadToOssUtil.copyFiles(null, sourcePath,sourcePath.replaceAll(sceneNum,newNum));
         }
     }
 
@@ -541,7 +563,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         for(String url : urlList){
             map.put(url, url.replace(ConstantFilePath.SCENE_PATH, ""));
         }
-        uploadToOssUtil.uploadMulFiles(map);
+        uploadToOssUtil.uploadMulFiles(null, map);
     }
 
     @Override
@@ -563,7 +585,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
         FileUtils.writeJsonFile(localPath, map);
         if(type.equals("v4")){
-            uploadToOssUtil.upload(localPath,uploadPath);
+            uploadToOssUtil.upload(null,localPath,uploadPath);
         }
     }
 

+ 70 - 0
src/main/java/com/fdkankan/ucenter/vo/response/SceneEditControlsVO.java

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