Kaynağa Gözat

Merge branch 'master' into dev-dsx-plus-20220315

# Conflicts:
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneController.java
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoExtServiceImpl.java
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
#	4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
dengsixing 3 yıl önce
ebeveyn
işleme
ef67f92ee4
22 değiştirilmiş dosya ile 488 ekleme ve 133 silme
  1. 2 1
      4dkankan-center-modeling/src/main/java/com/fdkankan/modeling/receiver/BuildSceneListener.java
  2. 1 1
      4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/service/sso/LoginService.java
  3. 11 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java
  4. 27 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/TagBean.java
  5. 11 38
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneController.java
  6. 1 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneEditController.java
  7. 0 2
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java
  8. 28 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java
  9. 2 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildScenePreMQListener.java
  10. 2 2
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildSceneResultMQListener.java
  11. 7 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/TestListener.java
  12. 5 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java
  13. 5 1
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java
  14. 4 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneService.java
  15. 10 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoExtServiceImpl.java
  16. 271 51
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneEditInfoServiceImpl.java
  17. 8 8
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneFileBuildServiceImpl.java
  18. 47 22
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java
  19. 21 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java
  20. 13 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/SceneDataDownloadVO.java
  21. 12 0
      4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java
  22. 0 2
      4dkankan-center-scene/src/test/java/com/fdkankan/scene/SceneApplicationTests.java

+ 2 - 1
4dkankan-center-modeling/src/main/java/com/fdkankan/modeling/receiver/BuildSceneListener.java

@@ -76,7 +76,8 @@ import org.springframework.web.client.RestTemplate;
         consumerGroup = "${rocketmq.consumer.build-scene-group}",
         topic = "${rocketmq.build-scene.topicName.topic-modeling-a}",
         messageModel = MessageModel.CLUSTERING,//负载均衡模式
-        consumeThreadMax = 1//消费者最大线程数,每次只消费一个
+        consumeThreadMax = 1,//消费者最大线程数,每次只消费一个
+        consumeTimeout = 172801000L
 )
 public class BuildSceneListener implements RocketMQListener<String> {
 

+ 1 - 1
4dkankan-center-platform/src/main/java/com/fdkankan/platform/user/service/sso/LoginService.java

@@ -137,7 +137,7 @@ public class LoginService {
     public JSONObject createLoginQrCode() throws Exception{
         String uuid = NumberUtils.getUUID();
         String filePath = ConstantFilePath.LOGIN_QR_CODE_PATH + uuid + ".png";
-        MatrixToImageWriterUtil.createQRCode(mainUrl + "app/index.html?m="+uuid, filePath, null);
+        MatrixToImageWriterUtil.createQRCode(mainUrl + "app/index.html?m="+uuid, filePath, true, null);
         JSONObject json = new JSONObject();
         json.put("url", filePath.replace(ConstantFilePath.BASE_PATH, ""));
         json.put("uuid", uuid);

+ 11 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/SceneJsonBean.java

@@ -160,4 +160,15 @@ public class SceneJsonBean {
 
     private Integer payStatus;
 
+    /**
+     * 户型角度
+     */
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    private Float floorPlanCompass;
+
+
 }

+ 27 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/bean/TagBean.java

@@ -0,0 +1,27 @@
+package com.fdkankan.scene.bean;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/3/24
+ **/
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TagBean {
+
+    private Long createTime;
+
+    private JSONObject tag;
+
+}

+ 11 - 38
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneController.java

@@ -7,8 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.constant.PayStatus;
 import com.fdkankan.common.constant.SceneInfoReqType;
+import com.fdkankan.common.constant.ServerCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.entity.SceneDataDownload;
 import com.fdkankan.scene.entity.SceneEditInfo;
 import com.fdkankan.scene.entity.ScenePro;
 import com.fdkankan.scene.service.*;
@@ -242,7 +245,7 @@ public class SceneController {
      */
     @PostMapping(value = "/check/key")
     public ResultData checkKey(@RequestBody @Validated SceneCheckKeyParamVO param) throws Exception {
-        return scenePlusService.checkKey(param);
+        return sceneEditInfoService.checkKey(param);
     }
 
 //    /**
@@ -1578,43 +1581,13 @@ public class SceneController {
 //        return Result.success("修改了:" + list.size());
 //    }
 //
-//    /**
-//     * 获取数据对接下载信息
-//     */
-//    @ApiOperation("获取数据对接下载信息")
-//    @PostMapping(value = "/downLoadZSData")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(name = "sceneNum", value = "场景码", dataType = "String")})
-//    public ResultData downLoadZSData(HttpServletRequest request) throws Exception{
-//        String sceneNum = request.getParameter("sceneNum");
-//        if(StringUtil.isEmpty(sceneNum)){
-//            throw new BaseRuntimeException(LoginConstant.FAILURE_CODE_3001, LoginConstant.FAILURE_MSG_3001);
-//        }
-//
-//        Result result = new Result();
-//
-//        SceneProEntity sceneProEntity = sceneProService.findBySceneNum(sceneNum);
-//        if(sceneProEntity == null){
-//            result.setCode(SceneConstant.FAILURE_CODE_5005);
-//            result.setMsg(SceneConstant.FAILURE_MSG_5005);
-//            result.setData(null);
-//            return result;
-//        }
-//
-//        SceneDataDownloadEntity sceneDataDownloadEntity = sceneDataDownloadService.findBySceneNum(sceneNum);
-//        if(sceneDataDownloadEntity == null){
-//            result.setCode(SceneConstant.FAILURE_CODE_5025);
-//            result.setMsg(SceneConstant.FAILURE_MSG_5025);
-//            result.setData(null);
-//            return result;
-//        }
-//
-//        ResponseSceneDataDownload responseSceneDataDownload = new ResponseSceneDataDownload();
-//        BeanUtils.copyProperties(sceneDataDownloadEntity, responseSceneDataDownload);
-////        responseSceneDataDownload.setDownloadPath(responseSceneDataDownload.getDownloadPath() +
-////                "?t=" + System.currentTimeMillis());
-//        return Result.success(responseSceneDataDownload);
-//    }
+    /**
+     * 获取数据对接下载信息
+     */
+    @PostMapping(value = "/downLoadZSData")
+    public ResultData downLoadZSData(@Validated BaseSceneParamVO param) throws Exception{
+        return sceneService.downLoadZSData(param);
+    }
 //
 //    /**
 //     * 增加场景下载次数

+ 1 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/SceneEditController.java

@@ -707,7 +707,7 @@ public class SceneEditController extends BaseController {
      * @return java.util.List<java.lang.String>
      **/
     @PostMapping(value = "/uploadPanorama")
-    public List<String> uploadPanorama(@RequestParam(value = "num") String num,
+    public ResultData uploadPanorama(@RequestParam(value = "num") String num,
         @RequestParam("file") MultipartFile file) throws Exception {
         return sceneEditInfoService.uploadPanorama(num, file);
     }

+ 0 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -120,8 +120,6 @@ public class TestController {
     }
 
     public static void main(String[] args) throws Exception {
-        MatrixToImageWriterUtil.createQRCode("http://baidu.com" + "123123", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+"123123"+".png",
-                null);
 
 //        MatrixToImageWriterUtil.createQRCode("http://baidu.com" + "123123", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+"123123"+".png",
 //                ConstantFilePath.SCENE_PATH + "images/images" + "123123" + "/QRShareLogo.png");

+ 28 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/entity/SceneEditInfoExt.java

@@ -3,8 +3,10 @@ package com.fdkankan.scene.entity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fdkankan.db.base.BaseEntity;
+import java.util.Date;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -19,7 +21,7 @@ import lombok.Setter;
 @Getter
 @Setter
 @TableName("t_scene_edit_info_ext")
-public class SceneEditInfoExt extends BaseEntity {
+public class SceneEditInfoExt {
 
     private static final long serialVersionUID = 1L;
 
@@ -35,11 +37,36 @@ public class SceneEditInfoExt extends BaseEntity {
     @TableField("edit_info_id")
     private Long editInfoId;
 
+    @TableField("floor_plan_angle")
+    private Float floorPlanAngle;
+
+    @TableField("floor_plan_compass")
+    private Float floorPlanCompass;
+
     /**
      * 大场景序号(随心装场景码)  原pro_edit表中的字段
      */
     @TableField("vr_num")
     private String vrNum;
 
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 0-有效,1-删除
+     */
+    @TableField("tb_status")
+    @TableLogic
+    private Integer tbStatus;
+
 
 }

+ 2 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildScenePreMQListener.java

@@ -61,7 +61,8 @@ import org.springframework.stereotype.Component;
         consumerGroup = "${rocketmq.consumer.build-scene-pre-group}",
         topic = "${rocketmq.build-scene.topicName.topic-modeling-a-pre}",
         messageModel = MessageModel.CLUSTERING,//负载均衡模式
-        consumeThreadMax = 10
+        consumeThreadMax = 10,
+        consumeTimeout = 172801000L
 )
 public class BuildScenePreMQListener implements RocketMQListener<String> {
 

+ 2 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/BuildSceneResultMQListener.java

@@ -211,9 +211,9 @@ public class BuildSceneResultMQListener implements RocketMQListener<String> {
             String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneCode+".png";
             String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneCode+"_en.png";
             //生成新的分享的二维码-中文版本
-            MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneCode, outPathZh,null);
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneCode, outPathZh, false,null);
             //生成新的分享的二维码-英文版本
-            MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneCode + "&lang=en", outPathEn, null);
+            MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneCode + "&lang=en", outPathEn, false, null);
             //上传二维码
             uploadToOssUtil.upload(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, sceneCode) + sceneCode + ".png");
             uploadToOssUtil.upload(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, sceneCode) + sceneCode + "_en.png");

+ 7 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/listener/TestListener.java

@@ -17,7 +17,8 @@ import org.springframework.stereotype.Component;
         consumerGroup = "test_group_dsx",
         topic = "test_topic_dsx",
         messageModel = MessageModel.CLUSTERING,
-        consumeThreadMax = 1
+        consumeThreadMax = 1,
+        consumeTimeout = 7200000L
 )
 @Data
 public class TestListener implements RocketMQListener<String> {
@@ -34,6 +35,11 @@ public class TestListener implements RocketMQListener<String> {
 
         buildSceneResultTopic = "123123123123";
 
+
+        Thread.sleep(3600000L);
+
+
+
         System.out.println("结束消费:" + message);
 
 

+ 5 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoExtService.java

@@ -13,6 +13,10 @@ import com.fdkankan.scene.entity.SceneEditInfoExt;
  */
 public interface ISceneEditInfoExtService extends IService<SceneEditInfoExt> {
 
-    public SceneEditInfoExt getByEditInfoId(long editInfoId);
+    SceneEditInfoExt getBySceneProId(long sceneProId);
+
+    SceneEditInfoExt getByScenePlusId(long scenePlusId);
+
+    SceneEditInfoExt getByEditInfoId(long editInfoId);
 
 }

+ 5 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneEditInfoService.java

@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.scene.vo.*;
 import java.io.IOException;
 import java.util.List;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
 /**
@@ -36,7 +38,7 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     void upgradeVersionById(Long id);
 
-    List<String> uploadPanorama(String num, MultipartFile file) throws Exception;
+    ResultData uploadPanorama(String num, MultipartFile file) throws Exception;
 
     ResultData downloadPanorama(FileParamVO param) throws Exception;
 
@@ -52,6 +54,8 @@ public interface ISceneEditInfoService extends IService<SceneEditInfo> {
 
     ResultData sceneSync(String num, String type, String floorPlanJson, String ajkJson, String cameraJson, MultipartFile[] files) throws Exception;
 
+    ResultData checkKey(SceneCheckKeyParamVO param) throws Exception;
+
 
 
 

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

@@ -6,10 +6,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.scene.entity.Scene;
 import com.fdkankan.scene.entity.ScenePO;
 import com.fdkankan.scene.entity.SceneProPO;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
 import com.fdkankan.scene.vo.SceneEditParamVO;
 import com.fdkankan.scene.vo.SceneParamVO;
 import com.fdkankan.scene.vo.SceneVO;
 import com.fdkankan.common.response.ResultData;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -97,6 +99,8 @@ public interface ISceneService extends IService<Scene> {
 
     ResultData querySceneNum(SceneParamVO param);
 
+    ResultData downLoadZSData(BaseSceneParamVO param) throws Exception;
+
 
 
 }

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

@@ -19,6 +19,16 @@ import org.springframework.stereotype.Service;
 public class SceneEditInfoExtServiceImpl extends ServiceImpl<ISceneEditInfoExtMapper, SceneEditInfoExt> implements ISceneEditInfoExtService {
 
     @Override
+    public SceneEditInfoExt getBySceneProId(long sceneProId) {
+        return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getSceneProId, sceneProId));
+    }
+
+    @Override
+    public SceneEditInfoExt getByScenePlusId(long scenePlusId) {
+        return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getScenePlusId, scenePlusId));
+    }
+
+    @Override
     public SceneEditInfoExt getByEditInfoId(long editInfoId) {
         return this.getOne(new LambdaQueryWrapper<SceneEditInfoExt>().eq(SceneEditInfoExt::getEditInfoId, editInfoId));
     }

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

@@ -7,6 +7,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.amazonaws.services.devicefarm.model.UploadType;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.*;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.response.ResultData;
+import com.fdkankan.common.util.ComputerUtil;
 import com.fdkankan.common.util.CreateObjUtil;
 import com.fdkankan.common.util.FileMd5Util;
 import com.fdkankan.common.util.FileUtil;
@@ -33,6 +35,7 @@ import com.fdkankan.scene.bean.SceneJsonBean;
 import com.fdkankan.scene.entity.SceneDataDownload;
 import com.fdkankan.scene.entity.SceneEditControls;
 import com.fdkankan.scene.entity.SceneEditInfo;
+import com.fdkankan.scene.entity.SceneEditInfoExt;
 import com.fdkankan.scene.entity.ScenePlus;
 import com.fdkankan.scene.entity.ScenePlusExt;
 import com.fdkankan.scene.entity.ScenePro;
@@ -43,6 +46,7 @@ import com.fdkankan.scene.factory.ScreenshotHandlerFactory;
 import com.fdkankan.scene.mapper.ISceneEditInfoMapper;
 import com.fdkankan.scene.service.ISceneDataDownloadService;
 import com.fdkankan.scene.service.ISceneEditControlsService;
+import com.fdkankan.scene.service.ISceneEditInfoExtService;
 import com.fdkankan.scene.service.ISceneEditInfoService;
 import com.fdkankan.scene.service.IScenePlusExtService;
 import com.fdkankan.scene.service.IScenePlusService;
@@ -52,6 +56,7 @@ import com.fdkankan.scene.vo.*;
 import com.google.common.collect.Lists;
 import com.google.errorprone.annotations.Var;
 import java.io.File;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -110,6 +115,8 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     @Autowired
     PlatformUserClient platformUserClient;
     @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
     IScenePlusService scenePlusService;
     @Autowired
     IScenePlusExtService scenePlusExtService;
@@ -174,6 +181,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         String num = param.getNum();
 
         //根据场景码查询数据库
+        ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
+        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
+        SceneEditInfo sceneEditInfo = this.getBySceneProId(scenePro.getId());
+        SceneEditInfoExt sceneEditInfoExt = null;
+            SceneEditControls sceneEditControls = null;
 //        ScenePro scenePro = sceneProService.findBySceneNum(num);
 //        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
@@ -185,6 +197,12 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             sceneEditInfo.setSceneProId(scenePlus.getId());
         }else{
             sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
+            sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
+        }
+        if(sceneEditInfoExt == null){
+            sceneEditInfoExt = new SceneEditInfoExt();
+            sceneEditInfoExt.setFloorPlanAngle(0f);
+            sceneEditInfoExt.setFloorPlanCompass(0f);
         }
 
 //        if(sceneEditControls == null){
@@ -192,7 +210,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 //        }
 
         //生成sceneJson
-        SceneJsonBean sceneJson = BeanUtil.copyProperties(sceneEditInfo, SceneJsonBean.class);
+        SceneJsonBean sceneJson = new SceneJsonBean();
+        BeanUtil.copyProperties(sceneEditInfoExt, sceneJson);
+        BeanUtil.copyProperties(sceneEditInfo, sceneJson);
         SceneEditControlsVO sceneEditControlsVO = BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class);
         sceneJson.setControls(sceneEditControlsVO);
         sceneJson.setNum(num);
@@ -208,7 +228,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }
 
         //处理热点数据,生成hot.json
-        this.publicHotData(num, sceneJson, sceneEditInfo);
+        this.publicHotData(num, sceneEditInfo);
 
         // TODO: 2022/3/2 这里的逻辑放在上传球幕视频接口中做了,这里先暂时注释掉,以后要删除
         //处理球幕视频
@@ -241,6 +261,9 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         }else{
             this.updateById(sceneEditInfo);
         }
+        sceneEditInfoExt.setSceneProId(scenePro.getId());
+        sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+        sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
 
 //        sceneEditControls.setEditInfoId(sceneEditInfo.getId());
 //        if(sceneEditControls.getId() == null){
@@ -290,7 +313,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         sceneEditInfo.setBuildVideoStatus(CommonStatus.NO.code());
     }
 
-    private void publicHotData(String sceneNum, SceneJsonBean sceneJson, SceneEditInfo sceneEditInfo) throws IOException {
+    private void publicHotData(String sceneNum, SceneEditInfo sceneEditInfo) throws IOException {
         String hotDataKey = String.format(RedisKey.SCENE_HOT_DATA, sceneNum);
         Map<String, String> hotMap = redisUtil.hmget(hotDataKey);
         List<String> hotList = Lists.newArrayList();
@@ -348,8 +371,17 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         if(Objects.isNull(sceneEditInfo)){
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
         }
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
         SceneEditControls sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
-        SceneInfoVO sceneInfoVO = BeanUtil.copyProperties(sceneEditInfo, SceneInfoVO.class);
+        SceneInfoVO sceneInfoVO = new SceneInfoVO();
+        BeanUtil.copyProperties(sceneEditInfoExt, sceneInfoVO);
+        BeanUtil.copyProperties(sceneEditInfo, sceneInfoVO);
+        if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){
+            sceneInfoVO.setFloorPlanAngle(0f);
+        }
+        if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){
+            sceneInfoVO.setFloorPlanCompass(0f);
+        }
         sceneInfoVO.setControls(BeanUtil.copyProperties(sceneEditControls, SceneEditControlsVO.class));
         sceneInfoVO.setNum(num);
         //生成sceneJson
@@ -416,9 +448,16 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         String sceneJson = redisUtil.get(key);
         SceneInfoVO sceneInfoVO = null;
         //先查询redis
-        if(StrUtil.isNotEmpty(sceneJson)){
+        if(StrUtil.isNotEmpty(sceneJson)) {
             sceneInfoVO = JSON.parseObject(sceneJson, SceneInfoVO.class);
             this.setExtData(sceneInfoVO, scenePlus.getCameraId());
+            sceneInfoVO.setScenePassword(null);
+            if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){
+                sceneInfoVO.setFloorPlanAngle(0f);
+            }
+            if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){
+                sceneInfoVO.setFloorPlanCompass(0f);
+            }
             return sceneInfoVO;
         }
 
@@ -429,6 +468,13 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             return null;
         sceneInfoVO = JSON.parseObject(objectContent, SceneInfoVO.class);
         this.setExtData(sceneInfoVO, scenePlus.getCameraId());
+        sceneInfoVO.setScenePassword(null);
+        if(Objects.isNull(sceneInfoVO.getFloorPlanAngle())){
+            sceneInfoVO.setFloorPlanAngle(0f);
+        }
+        if(Objects.isNull(sceneInfoVO.getFloorPlanCompass())){
+            sceneInfoVO.setFloorPlanCompass(0f);
+        }
         redisUtil.set(key, JSON.toJSONString(sceneInfoVO));
 
         return sceneInfoVO;
@@ -478,8 +524,16 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         String filePathStr = null;
 
         String floors = fileInfoJson.getString("floors");
-        String cadInfo = fileInfoJson.getString("cadInfo");
+        String cadInfo = null;
+        Float angel = null;
+        Float compass = null;
         String floorJsonData = fileInfoJson.getString("floorJsonData");
+        if(StrUtil.isNotBlank(floorJsonData)){
+            JSONObject jsonObject = JSON.parseObject(floorJsonData);
+            cadInfo = jsonObject.getString("cadInfo");
+            angel = jsonObject.getFloat("angle");
+            compass = jsonObject.getFloat("compass");
+        }
 //        String filePaths = fileInfoJson.getString("filePaths");
 //        Byte reSet = fileInfoJson.getByte("reset");
 
@@ -495,6 +549,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 //        }
 
         //处理户型图数据
+        JSONObject floorUserJson = null;
         if(StrUtil.isNotEmpty(floors)) {
             //如果入参是空,则加载服务器的
             if(StrUtil.isEmpty(floorJsonData)){
@@ -507,7 +562,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
             //如果floors不为空,需要根据对应楼层id修改楼层名称
             if (StrUtil.isNotEmpty(floorJsonData)) {
-                JSONObject floorUserJson = this.updateFloorName(floors, floorJsonData);
+                floorUserJson = this.updateFloorName(floors, floorJsonData);
                 floorJsonData = floorUserJson.toJSONString();
             }
         }
@@ -564,6 +619,20 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             this.save(sceneEditInfoDb);
         }
 
+        SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoDb.getId());
+        if(Objects.isNull(sceneEditInfoExt)){
+            sceneEditInfoExt = new SceneEditInfoExt();
+            sceneEditInfoExt.setEditInfoId(sceneEditInfoDb.getId());
+        }
+        if(Objects.nonNull(angel)){
+            sceneEditInfoExt.setFloorPlanAngle(angel);
+        }
+        if(Objects.nonNull(compass)){
+            sceneEditInfoExt.setFloorPlanCompass(compass);
+        }
+        sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
+
+
         return ResultData.ok();
 
     }
@@ -577,18 +646,29 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
 
         SceneEditInfo sceneEditInfoDb = this.getByScenePlusId(scenePlus.getId());
+        SceneEditInfoExt sceneEditInfoExt = null;
         if(Objects.nonNull(sceneEditInfoDb)){
             LambdaUpdateWrapper<SceneEditInfo> updateWrapper = new LambdaUpdateWrapper<SceneEditInfo>()
                 .setSql("version=version+" + 1)
                 .set(SceneEditInfo::getFloorPlanUser, CommonStatus.NO.code())
                 .eq(SceneEditInfo::getId, sceneEditInfoDb.getId());
             this.update(updateWrapper);
+
+            sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfoDb.getId());
         }else{
             sceneEditInfoDb = new SceneEditInfo();
             sceneEditInfoDb.setScenePlusId(scenePlus.getId());
             sceneEditInfoDb.setFloorPlanUser(CommonStatus.NO.code());
             this.save(sceneEditInfoDb);
         }
+        if(Objects.isNull(sceneEditInfoExt)){
+            sceneEditInfoExt = new SceneEditInfoExt();
+            sceneEditInfoExt.setSceneProId(scenePro.getId());
+            sceneEditInfoExt.setEditInfoId(sceneEditInfoDb.getId());
+        }
+        sceneEditInfoExt.setFloorPlanAngle(0f);
+        sceneEditInfoExt.setFloorPlanCompass(0f);
+        sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
 
         return ResultData.ok();
 
@@ -622,31 +702,50 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     }
 
     @Override
-    public List<String> uploadPanorama(String num, MultipartFile file) throws Exception {
+    public ResultData uploadPanorama(String num, MultipartFile file) throws Exception {
+
+        //校验压缩包格式
+        log.info("全景图压缩包文件名:" + file.getOriginalFilename());
+        if(!file.getOriginalFilename().endsWith(".zip")){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7015);
+        }
+
+        ScenePro scenePro = sceneProService.findBySceneNum(num);
+        if(scenePro == null){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
+        }
+        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
+
+        //原始计算根目录
+        String path = sceneProExt.getDataSource();
+        //全景图计算根目录
+        String target = path + "_images";
+        //解压缩文件存放目录
+        String targetImagesPath = target + "/extras/images";
+        //压缩文件保存目录
+        String zipTargetFilePath = targetImagesPath + File.separator + file.getOriginalFilename();
 
         //压缩包保存到本地
-        String path =  String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
+//        String cachePath =  String.format(ConstantFilePath.SCENE_CACHE_IMAGES, num);
 //        String path = "F:\\mnt\\4Dkankan\\scene\\t-ieXdyGl6Md\\caches\\images\\";
 
         //先删除本地文件
-        FileUtils.deleteDirectory(path);
-
-        String targetFilePath = path + File.separator + file.getOriginalFilename();
-        File targetFile = new File(targetFilePath);
+        FileUtils.deleteDirectory(targetImagesPath);
+        File targetFile = new File(zipTargetFilePath);
         if(!targetFile.getParentFile().exists()){
             targetFile.getParentFile().mkdirs();
         }
         file.transferTo(targetFile);
 
         //解压zip包
-        FileUtil.unZip(targetFilePath, path);
+        FileUtil.unZip(zipTargetFilePath, targetImagesPath);
         //删除压缩包
-        FileUtil.delFile(targetFilePath);
+        FileUtil.delFile(zipTargetFilePath);
 
         //获取解压后的文件列表
-        List<String> uploadFileList = FileUtil.getFileList(path);
+        List<String> uploadFileList = FileUtil.getFileList(targetImagesPath);
         if(CollUtil.isEmpty(uploadFileList)){
-            return null;
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7014);
         }
 
         //列出caches/images中的文件列表
@@ -669,18 +768,122 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
         //有文件对不上号,就退出
         if(CollUtil.isNotEmpty(notExistFileList)){
-            return notExistFileList;
+            return ResultData.error(ErrorCode.FAILURE_CODE_7012, notExistFileList);
         }
 
         //上传
         Map<String, String> map = new HashMap<>();
         uploadFileList.stream().forEach(filePath->{
-            map.put(filePath, filePath.replace(path, imgCachePath));
+            map.put(filePath, filePath.replace(targetImagesPath, imgCachePath));
         });
-        uploadToOssUtil.uploadMulFiles(map);
 
-        //删除本地目录
-        FileUtils.deleteDirectory(path);
+        String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+        if(StorageType.AWS.code().equals(this.type)){
+            FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + imgViewPath + "vision.modeldata" + "?m="+new Date().getTime(),
+                "vision.modeldata", target + File.separator + "extras" + File.separator);
+        }
+        if(StorageType.OSS.code().equals(this.type)){
+            FileUtils.downLoadFromUrl(prefixAli + imgViewPath + "vision.modeldata" + "?m="+new Date().getTime(),
+                "vision.modeldata", target + File.separator + "extras" + File.separator);
+        }
+        CreateObjUtil.convertVisionmodeldataToTxt(target + File.separator + "extras" + File.separator + "vision.modeldata",
+            target + File.separator + "extras" + File.separator + "vision.txt");
+
+        FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
+        FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);
+
+        //data.json增加extras为执行重建算法
+        String data = FileUtils.readFile(target + File.separator+"data.json");
+        if(data != null){
+            JSONObject floorplanJson = new JSONObject();
+            floorplanJson.put("has_source_images", true);
+            floorplanJson.put("has_vision_txt", true);
+
+            JSONObject dataJson = JSONObject.parseObject(data);
+            dataJson.put("extras", floorplanJson);
+            //V5表示不需要生成high,low文件
+            dataJson.put("skybox_type", "SKYBOX_V6");
+            if(scenePro.getSceneScheme() == 11){
+                dataJson.put("skybox_type", "SKYBOX_V7");
+            }
+            dataJson.put("split_type", "SPLIT_V8");
+            //sceneScheme为3切成瓦片图
+            if(scenePro.getSceneScheme() == 3){
+                dataJson.put("skybox_type", "SKYBOX_V4");
+            }
+            FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
+        }
+        if(new File(target + File.separator + "capture").exists()){
+            new File(target + File.separator + "capture").delete();
+        }
+        if(new File(target + File.separator + "results").exists()){
+            FileUtils.delAllFile(target + File.separator + "results");
+        }
+        if(StorageType.AWS.code().equals(this.type)){
+            //亚马逊保持旧方式,超链接capture
+            CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
+        }
+        CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") + "/data.fdage", target + File.separator + "capture/");
+        CreateObjUtil.build3dModel(target , "1");
+
+        String uploadJsonPath= target + File.separator + "results" +File.separator+"upload.json";
+        Thread.sleep(2000);
+        boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, 3, 5000);
+        if(!exist){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5042);
+        }
+        String uploadData = FileUtils.readFile(uploadJsonPath);
+        JSONObject uploadJson = null;
+        JSONArray array = null;
+        if(uploadData!=null) {
+            uploadJson = JSONObject.parseObject(uploadData);
+            array = uploadJson.getJSONArray("upload");
+        }
+        if(array == null){
+            throw new Exception("upload.json数据出错");
+        }
+        JSONObject fileJson = null;
+        String fileName = "";
+        for(int i = 0, len = array.size(); i < len; i++) {
+            fileJson = array.getJSONObject(i);
+            fileName = fileJson.getString("file");
+            //文件不存在抛出异常
+            if (!new File(target + File.separator + "results" + File.separator + fileName)
+                .exists()) {
+                throw new Exception(
+                    target + File.separator + "results" + File.separator + fileName + "文件不存在");
+            }
+
+            //high文件夹
+            if (fileJson.getIntValue("clazz") == 3) {
+                map.put(target + File.separator + "results" + File.separator + fileName,
+                    imgViewPath + "pan/high/" + fileName.replace("high/", ""));
+                continue;
+            }
+            //low文件夹
+            if (fileJson.getIntValue("clazz") == 4) {
+                map.put(target + File.separator + "results" + File.separator + fileName,
+                    imgViewPath + "pan/low/" + fileName.replace("low/", ""));
+                continue;
+            }
+
+            //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图
+            if (fileJson.getIntValue("clazz") == 5) {
+                map.put(target + File.separator + "results" + File.separator + fileName,
+                    imgViewPath + fileName);
+                continue;
+            }
+
+            //tiles文件夹,亚马逊瓦片图
+            if (fileJson.getIntValue("clazz") == 7) {
+                map.put(target + File.separator + "results" + File.separator + fileName,
+                    imgViewPath + fileName);
+                continue;
+            }
+        }
+        if(map.size()>0) {
+            uploadToOssUtil.uploadMulFiles(map);
+        }
 
         return null;
     }
@@ -708,24 +911,18 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
                 String imageUrl = ossUrlPrefix + filePath + "?t=" + System.currentTimeMillis();
                 FileUtils.downLoadFromUrl(imageUrl, fileName, localImagesPath);
             }
-            //上传
-            uploadToOssUtil.upload(localImagesPath + fileName, String.format(cacheImageFormat, num) + fileName);
-            String url = ossUrlPrefix + String.format(cacheImageFormat, num) + fileName + "?t=" + Calendar.getInstance().getTimeInMillis();
-            Map<String, Object> map = new HashMap<>();
-            map.put("fileUrl", url + "?t=" + System.currentTimeMillis());
-            map.put("fileName", fileName);
-            return ResultData.ok(map);
+        }else{
+            //先下载到本地
+            List<String> keyList = uploadToOssUtil.listKeys(imgCachePath);
+            if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
+                keyList.stream().forEach(key->{
+                    String file = key.substring(key.lastIndexOf("/") + 1);
+                    String imageUrl = ossUrlPrefix + imgCachePath + file + "?t=" + System.currentTimeMillis();
+                    FileUtils.downLoadFromUrl(imageUrl, file, localImagesPath);
+                });
+            }
         }
 
-        //先下载到本地
-        List<String> keyList = uploadToOssUtil.listKeys(imgCachePath);
-        if (!StorageType.LOCAL.code().equals(this.type)) {// TODO: 2022/2/15 这里有可能有问题,可能还需要考虑本地部署的情况
-            keyList.stream().forEach(key->{
-                String file = key.substring(key.lastIndexOf("/") + 1);
-                String imageUrl = ossUrlPrefix + imgCachePath + file + "?t=" + System.currentTimeMillis();
-                FileUtils.downLoadFromUrl(imageUrl, file, localImagesPath);
-            });
-        }
         //打包
         String zipName = num + "_images.zip";
         String zipPath = cachePath + zipName;
@@ -815,7 +1012,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
 
     @Override
     public DownloadVO downloadBallScreenVideo(BallScreenVideoParamVO param) {
-        String videoPath = String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + param.getFileName();
+        String videoPath = String.format(UploadFilePath.VIDEOS_VIEW_PATH, param.getNum()) + param.getFileName();
         String url = ossUrlPrefix + videoPath + "?t=" + System.currentTimeMillis();
         return DownloadVO.builder()
             .fileName(param.getFileName())
@@ -826,9 +1023,11 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
     @Override
     public ResultData uploadBallScreenVideo(String num, String fileName, MultipartFile file) throws Exception {
 
+        //校验格式
         if(!fileName.endsWith(".mp4")){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_7007.code(), ErrorCode.FAILURE_CODE_7007.formatMessage("mp4"));
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7016);
         }
+        String videosViewPath = String.format(UploadFilePath.VIDEOS_VIEW_PATH, num);
 
 //        ScenePro scenePro = sceneProService.findBySceneNum(num);
         ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
@@ -839,6 +1038,24 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
 
         String path = scenePlusExt.getDataSource();
+        //校验文件名
+        String videos = scenePro.getVideos();
+        if(StrUtil.isEmpty(videos)){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7012);
+        }
+        JSONObject videosJson = JSON.parseObject(videos);
+        JSONArray dataArr = videosJson.getJSONArray("data");
+        boolean exists = false;
+        for (Object o : dataArr) {
+            JSONObject jsonObject =  (JSONObject)o;
+            if(jsonObject.getString("id").equals(fileName.replace(".mp4", ""))){
+                exists = true;
+                break;
+            }
+        }
+        if(!exists){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7012);
+        }
 
         if(path != null && !"".equals(path) && path.startsWith("http")){
             path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
@@ -862,7 +1079,6 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             throw new BusinessException(ErrorCode.FAILURE_CODE_7009);
         }
 
-        String videosViewPath = String.format(UploadFilePath.VIDEOS_VIEW_PATH, num);
         for(String videoName : video.list()){
             log.info("球幕视频名称:{}", videoName);
             uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,videosViewPath + videoName);
@@ -1020,16 +1236,7 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
             String uploadJsonPath = target + File.separator + "results" + File.separator + "upload.json";
             log.info("uploadJsonPath=" + uploadJsonPath);
             //因为共享目录有延迟,这里循环检测算法是否计算完毕3次,每次隔五秒
-            int checkTimes = 1;
-            boolean exist = false;
-            do {
-                if(new File(uploadJsonPath).exists()){
-                    exist = true;
-                    break;
-                }
-                Thread.sleep(5000);
-                ++checkTimes;
-            }while (checkTimes <= 3);
+            boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, 3, 5000);
             if(!exist){
                 throw new BusinessException(ErrorCode.FAILURE_CODE_5042);
             }
@@ -1072,6 +1279,19 @@ public class SceneEditInfoServiceImpl extends ServiceImpl<ISceneEditInfoMapper,
         return ResultData.ok();
     }
 
+    @Override
+    public ResultData checkKey(SceneCheckKeyParamVO param) throws Exception {
+
+        String sceneJson = redisUtil.get(String.format(RedisKey.SCENE_JSON, param.getNum()));
+        SceneJsonBean sceneJsonBean = JSON.parseObject(sceneJson, SceneJsonBean.class);
+
+        if(!param.getPassword().equals(sceneJsonBean.getScenePassword())){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5021);
+        }
+
+        return ResultData.ok();
+    }
+
     private void updateBoxVideos(SceneEditInfo sceneEditInfo, Long scenePlusId, String boxVideos){
         if(Objects.isNull(sceneEditInfo)){
             sceneEditInfo = new SceneEditInfo();

+ 8 - 8
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneFileBuildServiceImpl.java

@@ -1138,10 +1138,10 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
                     //生成新的分享的二维码-中文版本
                     MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+".png",
-                            ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
+                        false, ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
                     //生成新的分享的二维码-英文版本
                     MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+"_en.png",
-                            ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
+                        false,  ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
                 }
 
                 if(StrUtil.isNotEmpty(company.getMarkerLogo())){
@@ -1496,9 +1496,9 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
                             //生成新的分享的二维码
                             MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+".png",
-                                    ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
+                                false, ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
                             MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+"_en.png",
-                                    ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
+                                false,  ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png");
                         }
 
                         if(StrUtil.isNotEmpty(company.getMarkerLogo())){
@@ -1688,8 +1688,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 //        UploadToOssUtil.upload(ConstantFilePath.SCENE_PATH+"data/data"+projectNum+File.separator+"scene.json", "data/data"+projectNum+File.separator+"scene.json");
 
         //生成二维码
-        MatrixToImageWriterUtil.createQRCode(url + projectNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+".png", null);
-        MatrixToImageWriterUtil.createQRCode(url + projectNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+"_en.png", null);
+        MatrixToImageWriterUtil.createQRCode(url + projectNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+".png", false, null);
+        MatrixToImageWriterUtil.createQRCode(url + projectNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+"_en.png", false, null);
         log.info("二维码生成完成");
 
 
@@ -2142,8 +2142,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data/data"+projectNum+File.separator+"scene.json", scenejson.toString());
 
         //生成二维码
-        MatrixToImageWriterUtil.createQRCode(url + projectNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+".png", null);
-        MatrixToImageWriterUtil.createQRCode(url + projectNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+"_en.png", null);
+        MatrixToImageWriterUtil.createQRCode(url + projectNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+".png", false, null);
+        MatrixToImageWriterUtil.createQRCode(url + projectNum + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+projectNum+"_en.png", false, null);
         log.info("二维码生成完成");
 
         //当mq排队数大于指定数量时使用弹性升缩

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

@@ -24,6 +24,7 @@ import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.bean.IconBean;
+import com.fdkankan.scene.bean.TagBean;
 import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneProMapper;
 import com.fdkankan.scene.service.*;
@@ -2318,8 +2319,10 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Override
     public ResultData listTags(String num) throws Exception{
 
+        //保证热点数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
         this.syncHotFromFileToRedis(num);
 
+        //保证icons数据安全性,当redis宕机导致icons数据丢失时,可以从文件中读取,恢复到redis
         this.syncIconsFromFileToRedis(num);
 
         JSONObject result = new JSONObject();
@@ -2328,14 +2331,24 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         String key = String.format(RedisKey.SCENE_HOT_DATA, num);
         Map<String, String> allTagsMap = redisUtil.hmget(key);
         List<JSONObject> tags = Lists.newArrayList();
+        List<TagBean> tagBeanList = new ArrayList<>();
         if(CollUtil.isNotEmpty(allTagsMap)){
-            tags = allTagsMap.entrySet().parallelStream().map(entry -> {
+            allTagsMap.entrySet().stream().forEach(entry -> {
                 JSONObject jsonObject = JSON.parseObject(entry.getValue());
-                return jsonObject;
+                tagBeanList.add(
+                    TagBean.builder()
+                        .createTime(jsonObject.getLong("createTime"))
+                        .tag(jsonObject).build());
+            });
+            //按创建时间倒叙排序
+            tagBeanList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
+
+            //移除createTime字段
+            tags = tagBeanList.stream().map(tagBean -> {
+                JSONObject tag = tagBean.getTag();
+                tag.remove("createTime");
+                return tag;
             }).collect(Collectors.toList());
-            //按时间倒叙排序
-            Collections.sort(tags, Comparator.comparing(t -> t.getLong("createTime")));
-            tags.parallelStream().forEach(t->t.remove("createTime"));
         }
         result.put("tags", tags);
 
@@ -3085,12 +3098,12 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
             sceneProEditService.updateById(sceneProEdit);
             if("V2".equals(scenePro.getBuildType())){
-                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", path + File.separator + fileName);
-                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", path + File.separator + fileName);
+                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", true,  path + File.separator + fileName);
+                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", true, path + File.separator + fileName);
             }
             if("V3".equals(scenePro.getBuildType())){
-                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", path + File.separator + fileName);
-                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", path + File.separator + fileName);
+                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", true, path + File.separator + fileName);
+                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", true, path + File.separator + fileName);
             }
         }
         return ResultData.ok(imagesBuf.toString() + fileName);
@@ -3418,7 +3431,10 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     @Override
     public ResultData uploadObjAndImg(String num, MultipartFile file) throws Exception{
         if(StrUtil.isEmpty(num)){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
+            throw new BusinessException(ServerCode.PARAM_REQUIRED, "num");
+        }
+        if(!file.getOriginalFilename().endsWith(".zip")){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7015);
         }
 
 //        ScenePro scenePro = this.findBySceneNum(num);
@@ -3439,6 +3455,11 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         String filePath =  path + "/extras/";
         String resultPath = path + "/results/";
 
+//        String path = "F:\\uploadModel" + "_obj2txt";
+//        String zipPath = path + "\\zip\\";
+//        String filePath =  path + "\\extras\\";
+//        String resultPath = path + "\\results\\";
+
         //压缩文件处理:解压缩,解压缩后复制等操作
         this.objAndImgFileHandler(resultPath, filePath, zipPath, file);
 
@@ -3479,17 +3500,19 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     }
 
     private void uploadFileofterRebuildPanoram(String path, String sceneNum) throws Exception {
-        String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json");
+        //因为共享目录有延迟,这里循环检测算法是否计算完毕3次,每次隔五秒
+        String uploadJsonPath = path + File.separator + "results" +File.separator+"upload.json";
+        boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, 5, 5000);
+        if(!exist){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_7013);
+        }
+        String uploadData = FileUtils.readFile(uploadJsonPath);
         JSONObject uploadJson = null;
         JSONArray array = null;
         if(uploadData!=null) {
             uploadJson = JSONObject.parseObject(uploadData);
             array = uploadJson.getJSONArray("upload");
         }
-        if(array == null){
-            log.error("upload.json数据出错");
-            throw new BusinessException(ErrorCode.FAILURE_CODE_5017);
-        }
 
         Map<String,String> map = new HashMap<String,String>();
         JSONObject fileJson = null;
@@ -3604,17 +3627,19 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
             if(data.isDirectory()){
                 throw new BusinessException(ErrorCode.FAILURE_CODE_5018);
             }
-            if(data.getName().endsWith(".obj") && objFlag){
-                throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
-            }
 
             if(data.getName().endsWith(".jpg") || data.getName().endsWith(".png")){
                 if(!FileUtils.checkFileSizeIsLimit(data.length(), 1.5, "M")){
                     throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                 }
             }
-
-            if(data.getName().endsWith(".obj") && !objFlag){
+            if(data.getName().endsWith(".obj")){
+                if(objFlag){
+                    throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
+                }
+                if(!data.getName().equals("mesh.obj")){
+                    throw new BusinessException(ErrorCode.FAILURE_CODE_5060);
+                }
                 if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){
                     throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                 }
@@ -3632,8 +3657,8 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         }
 
         //压缩文件中必须有且仅有一个obj和mtl文件,否则抛出异常
-        if(!mtlFlag && !objFlag){
-            throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
+        if(!mtlFlag || !objFlag){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5059);
         }
     }
 

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

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
@@ -27,10 +28,13 @@ import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneMapper;
 import com.fdkankan.scene.mapper.ISceneProMapper;
+import com.fdkankan.scene.service.ISceneDataDownloadService;
 import com.fdkankan.scene.service.ISceneExtService;
 import com.fdkankan.scene.service.ISceneProExtService;
 import com.fdkankan.scene.service.ISceneProService;
 import com.fdkankan.scene.service.ISceneService;
+import com.fdkankan.scene.vo.BaseSceneParamVO;
+import com.fdkankan.scene.vo.SceneDataDownloadVO;
 import com.fdkankan.scene.vo.SceneEditParamVO;
 import com.fdkankan.scene.vo.SceneParamVO;
 import com.fdkankan.scene.vo.SceneVO;
@@ -88,6 +92,8 @@ public class SceneServiceImpl extends ServiceImpl<ISceneMapper, Scene> implement
     PlatformUserClient platformUserClient;
     @Autowired
     ISceneService sceneService;
+    @Autowired
+    private ISceneDataDownloadService sceneDataDownloadService;
 
     @Override
     public void updateUserIdByCameraId(Long userId, Long cameraId) {
@@ -1217,6 +1223,21 @@ public class SceneServiceImpl extends ServiceImpl<ISceneMapper, Scene> implement
         return ResultData.ok(sceneNum);
     }
 
+    @Override
+    public ResultData downLoadZSData(BaseSceneParamVO param) throws Exception {
+        String num = param.getNum();
+        ScenePro scenePro = sceneProService.findBySceneNum(num);
+        if(scenePro == null){
+            throw new BusinessException(ServerCode.PARAM_REQUIRED, "num");
+        }
+
+        SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(num);
+        if(sceneDataDownload == null){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5025);
+        }
+
+        return ResultData.ok(BeanUtil.copyProperties(sceneDataDownload, SceneDataDownloadVO.class));
+    }
 
 
 }

+ 13 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/SceneDataDownloadVO.java

@@ -0,0 +1,13 @@
+package com.fdkankan.scene.vo;
+
+import lombok.Data;
+
+@Data
+public class SceneDataDownloadVO {
+
+    private String num;
+
+    private String fileMd5;
+
+    private String downloadPath;
+}

+ 12 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/vo/SceneInfoVO.java

@@ -147,5 +147,17 @@ public class SceneInfoVO {
      */
     private String dataSync;
 
+    /**
+     * 户型角度
+     */
+    private Float floorPlanAngle;
+
+    /**
+     * 指南针角度
+     */
+    private Float floorPlanCompass;
+
+
+
 
 }

+ 0 - 2
4dkankan-center-scene/src/test/java/com/fdkankan/scene/SceneApplicationTests.java

@@ -27,8 +27,6 @@ class ApplicationTests {
     @Test
     public String test2() throws Exception {
 
-        MatrixToImageWriterUtil.createQRCode("http://baidu.com" + "123123", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+"123123"+".png",
-                null);
 
         return "123";