Ver código fonte

修改V3场景构建逻辑

tianboguang 2 anos atrás
pai
commit
35c726c08d

+ 5 - 1
src/main/java/com/fdkankan/contro/entity/ScenePro.java

@@ -227,5 +227,9 @@ public class ScenePro implements Serializable {
     @TableField("is_upgrade")
     private Integer isUpgrade;
 
-
+    /**
+     * 是否生成过OBJ
+     */
+    @TableField("is_obj")
+    private Integer isObj;
 }

+ 1 - 1
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java

@@ -252,7 +252,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
 
             if (cameraType == 14) {
                 //计算成功  激光转台相机 同步 请求
-                fdkkLaserService.syncBuildResult(scenePlus, scenePlusExt);
+                fdkkLaserService.syncBuildResult(scenePlus.getNum(), scenePlusExt.getDataSource());
             }
 
             CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/") + "/capture");

+ 53 - 180
src/main/java/com/fdkankan/contro/mq/service/impl/BuildV3SceneServiceImpl.java

@@ -1,6 +1,5 @@
 package com.fdkankan.contro.mq.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileNameUtil;
@@ -11,14 +10,16 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.fdkankan.common.constant.*;
+import com.fdkankan.common.constant.ExpiredStatus;
+import com.fdkankan.common.constant.PayStatus;
+import com.fdkankan.common.constant.SceneStatus;
 import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.contro.bean.SceneJsonBean;
-import com.fdkankan.contro.entity.*;
+import com.fdkankan.contro.entity.CameraDetail;
+import com.fdkankan.contro.entity.ScenePro;
+import com.fdkankan.contro.entity.UserIncrement;
 import com.fdkankan.contro.mq.service.IBuildSceneService;
 import com.fdkankan.contro.service.*;
 import com.fdkankan.contro.service.impl.FdkkV4Service;
-import com.fdkankan.contro.vo.SceneEditControlsVO;
 import com.fdkankan.fyun.config.FYunFileConfig;
 import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
@@ -33,7 +34,6 @@ import com.fdkankan.push.utils.PushMsgUtil;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
-import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -74,22 +74,12 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
     private FYunFileServiceInterface fYunFileService;
     @Autowired
     private ICameraDetailService cameraDetailService;
-    @Autowired
-    private ISceneEditInfoService sceneEditInfoService;
-    @Autowired
-    private ISceneEditControlsService sceneEditControlsService;
 
     @Autowired
     private FYunFileConfig fYunFileConfig;
 
     @Autowired
-    private RedisUtil redisUtil;
-    @Autowired
-    private IScenePlusService scenePlusService;
-    @Autowired
-    private IScenePlusExtService scenePlusExtService;
-    @Autowired
-    private ISceneEditInfoExtService sceneEditInfoExtService;
+    private ISceneProService sceneProService;
 
     @Autowired
     private IUserIncrementService userIncrementService;
@@ -166,9 +156,9 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
 
             if (!buildSuccess) {
                 log.error("建模失败,修改状态为失败状态");
-                scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>()
-                        .set(ScenePlus::getSceneStatus, SceneStatus.FAILD.code())
-                        .eq(ScenePlus::getNum, sceneCode));
+                sceneProService.update(new LambdaUpdateWrapper<ScenePro>()
+                        .set(ScenePro::getStatus, SceneStatus.FAILD.code())
+                        .eq(ScenePro::getNum, sceneCode));
                 throw new RuntimeException("建模失败!");
             }
 
@@ -190,36 +180,16 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
             JSONObject videosJson = this.getVideosJson(path, videoVersion, sceneCode, cameraType);
 
             //写入数据库
-            ScenePlus scenePlus = this.updateDbPlus(sceneCode, space, videosJson.toJSONString(), computeTime,fdageData.containsKey("exportMeshObj") && fdageData.getIntValue("exportMeshObj") == 1);
-            ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+            ScenePro scenePro = this.updateDbPlus(sceneCode, space, videosJson.toJSONString(), computeTime,fdageData.containsKey("exportMeshObj") && fdageData.getIntValue("exportMeshObj") == 1);
 
             //变更容量,arrearCap为true时,代表容量不足
-            boolean arrearCap = this.updateSpace(scenePlus.getCameraId(), space);
+            boolean arrearCap = this.updateSpace(scenePro.getCameraId(), space);
 
             //如果相机容量不足,需要把场景的paystatus改为容量不足状态
             if (arrearCap && cameraType != 14) {
-                this.sealScene(arrearCap, scenePlus.getId(), scenePlus.getId());
+                this.sealScene(arrearCap, scenePro.getId(), scenePro.getId());
             }
 
-            Object[] editInfoArr = this.updateEditInfo(scenePlus);
-            SceneEditInfo sceneEditInfo = (SceneEditInfo)editInfoArr[0];
-            SceneEditInfoExt sceneEditInfoExt = (SceneEditInfoExt)editInfoArr[1];
-            SceneEditControls sceneEditControls = (SceneEditControls)editInfoArr[2];
-
-            String outPathZh = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneCode+".png";
-            String outPathEn = ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneCode+"_en.png";
-            //生成新的分享的二维码-中文版本
-            MatrixToImageWriterUtil.createQRCode(scenePlusExt.getWebSite(), outPathZh, false,null);
-            //生成新的分享的二维码-英文版本
-            MatrixToImageWriterUtil.createQRCode(scenePlusExt.getWebSite() + "&lang=en", outPathEn, false, null);
-            //上传二维码
-            fYunFileService.uploadFile(outPathZh, String.format(UploadFilePath.DOWNLOADS_QRCODE, sceneCode) + sceneCode + ".png");
-            fYunFileService.uploadFile(outPathEn, String.format(UploadFilePath.DOWNLOADS_QRCODE, sceneCode) + sceneCode + "_en.png");
-
-            //上传全景图俯视图
-            this.uploadFloorCad(path, sceneCode, uploadFiles);
-
-
             //上传文件
             log.info("开始上传场景计算结果数据,num:{}", sceneCode);
             fYunFileService.uploadMulFiles(uploadFiles);
@@ -240,26 +210,22 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
                         });
             }
 
-            //拷贝部分文件到编辑目录,用于用户编辑
-            this.copyToEditDir(sceneCode);
-
             //生成houseTypejson并上传
             uploadFiles.entrySet().stream().filter(entry-> FileNameUtil.getName(entry.getKey()).equals("floorplan_cad.json"))
                     .forEach(entry-> uploadHouseTypeJson(sceneCode,entry.getKey()));
 
             //写scene.json
             log.info("生成scene.json上传oss并设置缓存,num:{}", sceneCode);
-            this.writeSceneJson(sceneCode, videosJson,sceneEditInfo, sceneEditInfoExt, sceneEditControls, scenePlus,
-                    scenePlusExt, arrearCap);
+            this.writeSceneJson(sceneCode, videosJson,scenePro, arrearCap);
 
             //计算成功,通知APP
             Integer pushChannel = fdageData.getInteger("pushChannel");
             String pushToken = fdageData.getString("pushToken");
-            this.pushMsgToApp(pushChannel,pushToken, cameraType, scenePlus.getTitle(), scenePlusExt.getWebSite());
+            this.pushMsgToApp(pushChannel,pushToken, cameraType, scenePro.getSceneName(), scenePro.getWebSite());
 
             if (cameraType == 14) {
                 //计算成功  激光转台相机 同步 请求
-                fdkkLaserService.syncBuildResult(scenePlus, scenePlusExt);
+                fdkkLaserService.syncBuildResult(scenePro.getNum(), scenePro.getDataSource());
             }
 
             CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/") + "/capture");
@@ -287,12 +253,13 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
     }
 
     private Map<String, String> getUploadFiles(String path,Integer cameraType,JSONObject fdageData) throws Exception {
-        ScenePlus scenePlus = scenePlusService.getByFileId(path);
-        if (ObjectUtils.isEmpty(scenePlus)) {
+        ScenePro scenePro = sceneProService.getOne(
+                new LambdaQueryWrapper<ScenePro>().like(ScenePro::getDataSource, path));
+        if (ObjectUtils.isEmpty(scenePro)) {
             throw new Exception("未找到场景信息:" + path);
         }
 
-        String projectNum = scenePlus.getNum();
+        String projectNum = scenePro.getNum();
 
 
         String dataViewPath = String.format(ConstantFilePath.DATA_PATH_FORMAT, projectNum);
@@ -398,61 +365,30 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
         return dataJson;
     }
 
-    private void uploadFloorCad(String path, String num, Map<String, String> uploadFiles){
-
-        //户型图上传
-        String  userEditPath = UploadFilePath.USER_EDIT_PATH + "floor-cad-%s.%s";
-        String  userViewPath = UploadFilePath.USER_VIEW_PATH + "floor-cad-%s.%s";
-        String floorCadPath = path + "/results/floorplan_cad";
-        List<String> floorCadList = FileUtils.getFileList(floorCadPath);
-        if(CollUtil.isNotEmpty(floorCadList)){
-            floorCadList.stream().forEach(str->{
-                String substring = str.substring(str.lastIndexOf(File.separator) + 1);
-                String[] arr = substring.split("floor");
-                String[] arr2 = arr[1].split("\\.");
-                uploadFiles.put(str, String.format(userEditPath, num, arr2[0], arr2[1]));
-                uploadFiles.put(str, String.format(userViewPath, num, arr2[0], arr2[1]));
-            });
-        }
-
-    }
-
-    private void writeSceneJson(String num, JSONObject videosJson, SceneEditInfo sceneEditInfo, SceneEditInfoExt sceneEditInfoExt,
-                                SceneEditControls sceneEditControls, ScenePlus scenePlus, ScenePlusExt scenePlusExt, boolean arrearCap)  throws Exception{
-        String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
+    private void writeSceneJson(String num, JSONObject videosJson, ScenePro scenePro,boolean arrearCap)  throws Exception{
+        String dataViewPath = String.format(ConstantFilePath.DATA_PATH_FORMAT, num);
 
         String sceneJsonKey = dataViewPath + "scene.json";
         boolean exist = fYunFileService.fileExist(sceneJsonKey);
         //如果云端没有scene.json文件,生成一份
         if(!exist){
-            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);
-            sceneJson.setCreateTime(scenePlus.getCreateTime());
-            sceneJson.setSceneResolution(scenePlusExt.getSceneResolution());
-            sceneJson.setSceneFrom(scenePlusExt.getSceneFrom());
-            sceneJson.setVideos(JSON.toJSONString(videosJson));
+            JSONObject sceneJson = JSONObject.parseObject(JSONObject.toJSONString(scenePro));
+            sceneJson.put("videos",videosJson);
             if(arrearCap) {
-                sceneJson.setPayStatus(PayStatus.NO_CAPACITY.code());
+                sceneJson.put("payStatus",PayStatus.NO_CAPACITY.code());
             }
-
             String sceneJsonStr = JSON.toJSONString(sceneJson);
             //上传sceneJson文件
             fYunFileService.uploadFile(sceneJsonStr.getBytes(), sceneJsonKey);
-            //scenejson写入缓存
-            redisUtil.set(String.format(RedisKey.SCENE_JSON, num), sceneJsonStr);
         }
         // 上传status JSON.
 
         JSONObject statusJson = new JSONObject();
         //临时将-2改成1,app还没完全更新
         statusJson.put("status", 1);
-        statusJson.put("webSite", scenePlusExt.getWebSite());
+        statusJson.put("webSite", scenePro.getWebSite());
         statusJson.put("sceneNum", num);
-        statusJson.put("thumb", scenePlusExt.getThumb());
+        statusJson.put("thumb", scenePro.getThumb());
         statusJson.put("payStatus", 1);
         FileUtils.writeFile(ConstantFilePath.SCENE_PATH + "data/data" + num + File.separator + "status.json", statusJson.toString());
 
@@ -611,10 +547,10 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
     }
 
     private void sealScene(boolean arrearCap, Long scenePlusId, Long sceneProId){
-        scenePlusService.update(
-            new LambdaUpdateWrapper<ScenePlus>()
-                .set(ScenePlus::getPayStatus, PayStatus.NO_CAPACITY.code())
-                .eq(ScenePlus::getId, scenePlusId));
+        sceneProService.update(
+            new LambdaUpdateWrapper<ScenePro>()
+                .set(ScenePro::getPayStatus, PayStatus.NO_CAPACITY.code())
+                .eq(ScenePro::getId, scenePlusId));
     }
 
     /**
@@ -627,72 +563,40 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
      * @param space
      **/
     private void updateDb4Sm(String num, long space){
-        List<ScenePlus> ScenePlusList = scenePlusService.list(
-            new LambdaQueryWrapper<ScenePlus>().select(ScenePlus::getId).eq(ScenePlus::getNum, num));
+        List<ScenePro> ScenePlusList = sceneProService.list(
+            new LambdaQueryWrapper<ScenePro>().select(ScenePro::getId).eq(ScenePro::getNum, num));
 
         if(CollUtil.isEmpty(ScenePlusList)){
             return ;
         }
 
-        List<Long> sceneIds = ScenePlusList.stream().map(ScenePlus::getId).collect(Collectors.toList());
+        List<Long> sceneIds = ScenePlusList.stream().map(ScenePro::getId).collect(Collectors.toList());
 
         //更新场景创建时间
-        scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>().in(ScenePlus::getId, sceneIds)
-            .set(ScenePlus::getSceneStatus, SceneStatus.NO_DISPLAY.code()));
-
-        //更新使用容量
-        scenePlusExtService.update(new LambdaUpdateWrapper<ScenePlusExt>().in(ScenePlusExt::getPlusId, sceneIds)
-                .set(ScenePlusExt::getSpace, space)
-                .set(ScenePlusExt::getAlgorithmTime, Calendar.getInstance().getTime()));
+        sceneProService.update(new LambdaUpdateWrapper<ScenePro>().in(ScenePro::getId, sceneIds)
+            .set(ScenePro::getStatus, SceneStatus.NO_DISPLAY.code())
+                .set(ScenePro::getSpace,space)
+                .set(ScenePro::getCreateTime,new Date())
+        );
     }
 
-    private ScenePlus updateDbPlus(String num, Long space, String videosJson, Long computeTime,boolean isObj){
-        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
-        ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
-        List<ScenePlus> list = scenePlusService.list(new LambdaQueryWrapper<ScenePlus>()
-                .select(ScenePlus::getId).eq(ScenePlus::getNum, num));
-        if (CollUtil.isEmpty(list)) {
+    private ScenePro updateDbPlus(String num, Long space, String videosJson, Long computeTime,boolean isObj){
+        ScenePro scenePro = sceneProService.getByNum(num);
+        if (ObjectUtils.isEmpty(scenePro)) {
             return null;
         }
 
-        //修改场景状态 空间 支付状态 计算时间
-        List<Long> scenePlusIds = list.stream().map(ScenePlus::getId).collect(Collectors.toList());
-
-        scenePlusService.update(new LambdaUpdateWrapper<ScenePlus>()
-            .in(ScenePlus::getId, scenePlusIds)
-            .set(ScenePlus::getSceneStatus, SceneStatus.NO_DISPLAY.code())
-            .set(ScenePlus::getUpdateTime, new Date())
-            .set(ScenePlus::getPayStatus, PayStatus.PAY.code()));
-
-        scenePlusExt.setSpace(space);
-        scenePlusExt.setComputeTime(computeTime.toString());
-        scenePlusExt.setAlgorithmTime(new Date());
-        scenePlusExt.setVideos(videosJson);
-        scenePlusExt.setIsObj(isObj ? 1 : 0);
-
-        SceneSource sceneSource = SceneSource.get(scenePlus.getSceneSource());
-        switch (sceneSource){
-            case BM:
-                scenePlusExt.setSceneResolution(SceneResolution.TILES_2K.code());
-                scenePlusExt.setSceneFrom(SceneFrom.PRO.code());
-                break;
-            case SM:
-                scenePlusExt.setSceneResolution(SceneResolution.TILES_1K.code());
-                scenePlusExt.setSceneFrom(SceneFrom.LITE.code());
-                break;
-            case ZT:
-                scenePlusExt.setSceneResolution(SceneResolution.TILES_4K.code());
-                scenePlusExt.setSceneFrom(SceneFrom.MINION.code());
-                break;
-            case JG:
-                scenePlusExt.setSceneResolution(SceneResolution.TILES_4K.code());
-                scenePlusExt.setSceneFrom(SceneFrom.LASER.code());
-                break;
-        }
-        scenePlusExtService.updateById(scenePlusExt);
-
-
-        return scenePlus;
+        sceneProService.update(new LambdaUpdateWrapper<ScenePro>()
+                .in(ScenePro::getId, scenePro.getId())
+                .set(ScenePro::getStatus, SceneStatus.NO_DISPLAY.code())
+                .set(ScenePro::getUpdateTime, new Date())
+                .set(ScenePro::getSpace, space)
+                .set(ScenePro::getComputeTime, computeTime)
+                .set(ScenePro::getVideos, videosJson)
+                .set(ScenePro::getIsObj, isObj ? 1 : 0)
+                .set(ScenePro::getPayStatus, PayStatus.PAY.code()));
+
+        return scenePro;
     }
 
     private boolean updateSpace(Long cameraId, Long space) throws Exception{
@@ -708,37 +612,6 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
         return false;
     }
 
-    private Object[] updateEditInfo(ScenePlus scenePlus){
-        SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
-        SceneEditControls sceneEditControls = null;
-        SceneEditInfoExt sceneEditInfoExt = null;
-        if(sceneEditInfo == null){
-            sceneEditInfo = new SceneEditInfo();
-            sceneEditInfo.setScenePlusId(scenePlus.getId());
-            sceneEditInfo.setDescription(scenePlus.getDescription());
-            sceneEditInfo.setTitle(scenePlus.getTitle());
-            sceneEditInfoService.save(sceneEditInfo);
-
-        }else{
-            sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
-            sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
-            sceneEditInfo.setVersion(sceneEditInfo.getVersion() + 1);
-            sceneEditInfoService.updateById(sceneEditInfo);
-        }
-        if(sceneEditControls == null){
-            sceneEditControls = new SceneEditControls();
-            sceneEditControls.setEditInfoId(sceneEditInfo.getId());
-            sceneEditControlsService.save(sceneEditControls);
-        }
-        if(sceneEditInfoExt == null){
-            sceneEditInfoExt = new SceneEditInfoExt();
-            sceneEditInfoExt.setScenePlusId(scenePlus.getId());
-            sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
-            sceneEditInfoExtService.save(sceneEditInfoExt);
-        }
-        return new Object[]{sceneEditInfo, sceneEditInfoExt, sceneEditControls};
-    }
-
     public void uploadHouseTypeJson(String num, String floorPlanCardFilePath) {
         if (!new File(floorPlanCardFilePath).exists()) {
             log.error("floorplan_cad.json 文件不存在,文件路径:{}", floorPlanCardFilePath);

+ 1 - 1
src/main/java/com/fdkankan/contro/service/IFdkkLaserService.java

@@ -14,7 +14,7 @@ import com.fdkankan.contro.entity.ScenePro;
  * @since 2022/1/14
  **/
 public interface IFdkkLaserService {
-    void syncBuildResult(ScenePlus scenePlus, ScenePlusExt scenePlusExt);
+    void syncBuildResult(String sceneNum, String dataSource);
 
     void pushBuildStatusToLaserSystem(String projectNum, String laserObjFilePath);
 

+ 7 - 7
src/main/java/com/fdkankan/contro/service/impl/IFdkkLaserServiceImpl.java

@@ -57,12 +57,12 @@ public class IFdkkLaserServiceImpl implements IFdkkLaserService {
         }
     }
 
-    public void syncBuildResult(ScenePlus scenePlus, ScenePlusExt scenePlusExt) {
+    public void syncBuildResult(String sceneNum, String dataSource) {
         log.info("激光转台相机构建结果 同步 请求 ");
         try {
-            String jgPath = scenePlusExt.getDataSource();
+            String jgPath = dataSource;
             //创建目录
-            if (scenePlusExt.getDataSource().lastIndexOf("/") != -1) {
+            if (dataSource.lastIndexOf("/") != -1) {
                 jgPath = jgPath + "_laserData";
             } else {
                 jgPath = jgPath.substring(0, jgPath.length() - 1) + "_laserData";
@@ -80,12 +80,12 @@ public class IFdkkLaserServiceImpl implements IFdkkLaserService {
 
             // result/mesh/mesh.obj  --> jgPath/laserData/laser.obj
             log.info("开始拷贝obj文件");
-            FileUtils.copyDirectiory(scenePlusExt.getDataSource() + "/results/mesh", jgPath + "/laserData/mesh");
+            FileUtils.copyDirectiory(dataSource + "/results/mesh", jgPath + "/laserData/mesh");
 
-            FileUtils.copyDirectiory(scenePlusExt.getDataSource() + "/results/laserData/cover", jgPath + "/extras");
-            FileUtils.copyFile(scenePlusExt.getDataSource() + "/results/laserData", jgPath, true);
+            FileUtils.copyDirectiory(dataSource + "/results/laserData/cover", jgPath + "/extras");
+            FileUtils.copyFile(dataSource + "/results/laserData", jgPath, true);
 
-            updateSceneStatus(scenePlus.getNum(), 2, jgPath + File.separator + "laserData");
+            updateSceneStatus(sceneNum, 2, jgPath + File.separator + "laserData");
         } catch (Exception e) {
             log.error("激光转台相机同步失败", e);
         }