dengsixing пре 2 година
родитељ
комит
9dfff02287

+ 6 - 0
src/main/java/com/fdkankan/contro/entity/ScenePlusExt.java

@@ -125,6 +125,12 @@ public class ScenePlusExt implements Serializable {
     private String sceneKind;
 
     /**
+     * 算法模型类型(dam,3dtiles)
+     */
+    @TableField("model_kind")
+    private String modelKind;
+
+    /**
      * 计算耗时
      */
     @TableField("compute_time")

+ 49 - 11
src/main/java/com/fdkankan/contro/mq/service/impl/BuildObjServiceImpl.java

@@ -1,8 +1,10 @@
 package com.fdkankan.contro.mq.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.ModelKind;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.contro.bean.SceneJsonBean;
 import com.fdkankan.contro.entity.*;
@@ -19,6 +21,8 @@ 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 java.util.List;
+import java.util.Objects;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -45,6 +49,9 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     @Value("${queue.modeling.obj.modeling-post}")
     private String queueObjModelingPost;
 
+    @Value("${model.modelKind:3dtiles}")
+    private String modelKind;
+
     @Autowired
     private RabbitMqProducer mqProducer;
 
@@ -67,6 +74,9 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     private IScenePlusService scenePlusService;
 
     @Autowired
+    private IScenePlusExtService scenePlusextService;
+
+    @Autowired
     private ISceneEditControlsService sceneEditControlsService;
 
     @Autowired
@@ -162,18 +172,43 @@ public class BuildObjServiceImpl implements IBuildSceneService {
 
         String path = message.getPath();
         String projectNum = message.getBuildContext().get("sceneNum").toString();
-
+        ScenePro scenePro = sceneProService.getByNum(projectNum);
+        String imagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, projectNum);
+        String dataPath = String.format(UploadFilePath.DATA_VIEW_PATH, projectNum);
+        //标记激光场景是微服务上线后拍摄或是上线前拍摄(v3-代表上线前拍摄,v4-上线后拍摄),上线前拍摄的场景需要上传到v3目录,通过升级接口进行文件拷贝
+        String version = "v4";
+        if(Objects.nonNull(scenePro)){
+            version = "v3";
+            imagesPath = String.format(ConstantFilePath.IMAGE_PATH_FORMAT, projectNum);
+            dataPath = String.format(ConstantFilePath.DATA_PATH_FORMAT, projectNum);
+        }
         String laserObjFilePath = path;
-        CreateObjUtil.convertTxtToDam(laserObjFilePath + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
-        CreateObjUtil.convertDamToLzma(laserObjFilePath + File.separator + "results/");
-        CreateObjUtil.convertTxtToDam(laserObjFilePath + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
-        File file = new File(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma");
-        while (!file.exists()) {
-            Thread.sleep(60000);
+        String resultsPath = laserObjFilePath + File.separator + "results" + File.separator;
+        if(this.modelKind.equals(ModelKind.DAM.code())){
+            CreateObjUtil.convertTxtToDam(laserObjFilePath + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
+            CreateObjUtil.convertDamToLzma(laserObjFilePath + File.separator + "results/");
+            CreateObjUtil.convertTxtToDam(laserObjFilePath + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
+            File file = new File(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma");
+            while (!file.exists()) {
+                Thread.sleep(60000);
+            }
+            fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma", imagesPath + ConstantFileName.modelUUID + "_50k.dam.lzma");
+            fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam", imagesPath + ConstantFileName.modelUUID + "_50k.dam");
+        }
+        if(this.modelKind.equals(ModelKind.THREE_D_TILE.code())){
+            String threedtilesPath = resultsPath + ModelKind.THREE_D_TILE.code();
+            String oss3dtilesPath = imagesPath + ModelKind.THREE_D_TILE.code();
+            List<String> list = FileUtils.list(new File(threedtilesPath));
+            if(CollUtil.isEmpty(list)){
+                log.error("3dtiles目录异常,3dtiles地址:{}", new File(path + File.separator + "results" + File.separator + ModelKind.THREE_D_TILE.code()));
+                throw new Exception("3dtiles目录异常");
+            }
+            //上传3dtiles文件
+            fYunFileService.uploadFileByCommand(threedtilesPath, oss3dtilesPath);
+            //上传mesh文件
+            fYunFileService.deleteFolder(dataPath + "mesh");
+            fYunFileService.uploadFileByCommand(resultsPath + "mesh", dataPath + "mesh");
         }
-
-        fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma", String.format(UploadFilePath.IMG_VIEW_PATH,  projectNum) + ConstantFileName.modelUUID + "_50k.dam.lzma");
-        fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam", String.format(UploadFilePath.IMG_VIEW_PATH,  projectNum) + ConstantFileName.modelUUID + "_50k.dam");
 
         String texPath = laserObjFilePath + File.separator + "results" + File.separator + "tex";
 
@@ -203,7 +238,6 @@ public class BuildObjServiceImpl implements IBuildSceneService {
         fdkkLaserService.pushBuildStatusToLaserSystem(projectNum, laserObjFilePath + "/laserData/mesh");
 
 
-        ScenePro scenePro = sceneProService.getByNum(projectNum);
         if(!ObjectUtils.isEmpty(scenePro)){
             LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<ScenePro>()
                     .set(ScenePro::getStatus, -2).eq(ScenePro::getNum, projectNum);
@@ -222,6 +256,10 @@ public class BuildObjServiceImpl implements IBuildSceneService {
             sceneEditControls.setShowMap(0);
             sceneEditControlsService.updateById(sceneEditControls);
 
+            ScenePlusExt scenePlusExt = scenePlusextService.getScenePlusExtByPlusId(scenePlus.getId());
+            scenePlusExt.setModelKind(modelKind);
+            scenePlusextService.updateById(scenePlusExt);
+
             // 更新scene.json
             String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, projectNum);
             SceneJsonBean jsonObject =JSONObject.parseObject(fYunFileService.getFileContent(dataViewPath + "scene.json"), SceneJsonBean.class);

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

@@ -72,6 +72,9 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     @Value("${model.type:#{null}}")
     private String modelType;
 
+    @Value("${model.modelKind:3dtiles}")
+    private String modelKind;
+
     @Autowired
     private RabbitMqProducer mqProducer;
 
@@ -213,7 +216,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             scenePlus.setSceneStatus(SceneStatus.NO_DISPLAY.code());
             scenePlusService.updateById(scenePlus);
 
-
             Integer videoVersion = fdageData.getInteger("videoVersion");
             //读取计算结果文件生成videosJson
             JSONObject videosJson = this.getVideosJson(path, videoVersion, sceneCode, cameraType);
@@ -231,16 +233,18 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             //上传全景图俯视图
             this.uploadFloorCad(path, sceneCode, uploadFiles);
 
-            //上传文件
             log.info("开始上传场景计算结果数据,num:{}", sceneCode);
+            //由于3dtiles算法mesh文件发生变化,所以这里需要先清除一下oss的mesh目录,避免存在旧算法obj文件
+            fYunFileService.deleteFolder(String.format(UploadFilePath.DATA_VIEW_PATH, sceneCode) + "mesh");
+            //上传文件
             fYunFileService.uploadMulFiles(uploadFiles);
 
-            Map<String,String> damFileHeaders = new HashMap<>();
-            damFileHeaders.put("Content-Encoding","gzip");
-
-            if (!fYunFileService.getFyunType().equals(FYunTypeEnum.LOCAL.code())) {
-                // dam 文件设置请求头
-                uploadFiles.entrySet().stream().filter(entry -> FileNameUtil.extName(entry.getKey()).equals("dam"))
+            if(modelKind.equals(ModelKind.DAM.code())){
+                Map<String,String> damFileHeaders = new HashMap<>();
+                damFileHeaders.put("Content-Encoding","gzip");
+                if (!fYunFileService.getFyunType().equals(FYunTypeEnum.LOCAL.code())) {
+                    // dam 文件设置请求头
+                    uploadFiles.entrySet().stream().filter(entry -> FileNameUtil.extName(entry.getKey()).equals("dam"))
                         .filter(entry -> new File(entry.getKey()).exists())
                         .forEach(entry -> {
                             // gzip压缩
@@ -249,6 +253,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                             FileUtil.rename(new File(entry.getKey() + ".gzip"), entry.getKey(), true);
                             fYunFileService.uploadFile(entry.getKey(), entry.getValue(), damFileHeaders);
                         });
+                }
             }
 
             //拷贝部分文件到编辑目录,用于用户编辑
@@ -258,9 +263,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             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);
             CameraDetail cameraDetail = cameraDetailService.getByCameraId(scenePlus.getCameraId());
             Company company = !ObjectUtils.isEmpty(cameraDetail.getCompanyId()) ? companyService.getById(cameraDetail.getCompanyId()) : null;
@@ -279,6 +281,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                 sceneEditControls.setShowMap(0);
             }
 
+            //写scene.json
             this.writeSceneJson(sceneCode, videosJson,sceneEditInfo, sceneEditInfoExt, sceneEditControls, scenePlus,scenePlusExt,company);
 
             String qrLogo = !ObjectUtils.isEmpty(company) && !ObjectUtils.isEmpty(company.getQrLogo()) ? company.getQrLogo() : null;
@@ -372,15 +375,26 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             }
         }
 
-
-        if ((fdageData.containsKey("exportMeshObj") && fdageData.getIntValue("exportMeshObj") == 1)
-                || (!ObjectUtils.isEmpty(cameraType) && (!cameraType.equals(14)))) {
+        //exportMeshObj这个是字段由app写入的
+        if (this.modelKind.equals(ModelKind.DAM.code()) &&
+            ((fdageData.containsKey("exportMeshObj") && fdageData.getIntValue("exportMeshObj") == 1)
+            || (!ObjectUtils.isEmpty(cameraType) && (!cameraType.equals(14))))) {
             CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
             CreateObjUtil.convertDamToLzma(path + File.separator + "results/");
             CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
             map.put(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma", imagesPath + ConstantFileName.modelUUID + "_50k.dam.lzma");
             map.put(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam", imagesPath + ConstantFileName.modelUUID + "_50k.dam");
         }
+        if(this.modelKind.equals(ModelKind.THREE_D_TILE.code())){
+            List<String> list = FileUtils.list(new File(path + File.separator + "results" + File.separator + ModelKind.THREE_D_TILE.code()));
+            if(CollUtil.isEmpty(list)){
+                log.error("3dtiles目录异常,3dtiles地址:{}", new File(path + File.separator + "results" + File.separator + ModelKind.THREE_D_TILE.code()));
+                throw new Exception("3dtiles目录异常");
+            }
+            list.stream().forEach(str->{
+                map.put(str, str.replace(path + File.separator + "results" + File.separator, imagesPath));
+            });
+        }
 
         CreateObjUtil.convertTxtToVisionmodeldata(resultsPath + "vision.txt", resultsPath + "vision.modeldata");
         map.put(resultsPath + "vision.txt", imagesPath + "vision.txt");
@@ -749,6 +763,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
 
         String sceneKind = scenePlusExt.getSceneScheme() == 3 ? SceneKind.FACE.code():SceneKind.TILES.code();
         scenePlusExt.setSceneKind(sceneKind);
+        scenePlusExt.setModelKind(modelKind);
 
         scenePlusExtService.updateById(scenePlusExt);
     }

+ 8 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -82,10 +82,14 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     @Value("${v3.controlUrl:#{null}}")
     private String v3controlUrl;
 
+    @Value("${model.modelKind:3dtiles}")
+    private String modelKind;
+
     @Autowired
     private RedisUtil redisUtil;
 
 
+
     @Autowired
     private IScenePlusExtService scenePlusExtService;
 
@@ -724,6 +728,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         scenePlus.setNum(projectNum);
         scenePlus.setSceneSource(1);
         scenePlusExt.setDataSource(dataSource);
+        scenePlusExt.setModelKind(modelKind);
 
         if(resolution == null || resolution.intValue() == 0){
             scenePlusExt.setSceneScheme(cameraType.intValue());
@@ -1114,6 +1119,9 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             .set(ScenePlus::getSceneStatus, SceneStatus.wait.code())
             .eq(ScenePlus::getNum, num));
 
+        scenePlusExt.setModelKind(this.modelKind);
+        scenePlusExtService.updateById(scenePlusExt);
+
         return ResultData.ok();
     }