Przeglądaj źródła

创建虚拟场景接口

dengsixing 2 lat temu
rodzic
commit
e33456bfd7

+ 165 - 0
src/main/java/com/fdkankan/scene/bean/RequestScene.java

@@ -0,0 +1,165 @@
+package com.fdkankan.scene.bean;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+import lombok.Data;
+
+@Data
+public class RequestScene implements Serializable {
+
+    private static final long serialVersionUID = 3939730189762555357L;
+
+    private Long sceneId;
+
+    private String type;
+
+    private String item;
+
+    private String order;
+
+    private String searchKey;
+
+    private String keywordType;
+
+    private String guideSid;
+
+    private String guideName;
+
+    private String sceneNum;
+
+    private String childName;
+    //场景的二维设计图数据
+    private String geoData;
+    //	场景序号
+    private String index;
+    //模型的中心(可以忽略)
+    private String center;
+    //模型的缩放系数
+    private String zoom;
+    //模型测量线的缩放系数
+    private String realScale;
+    //场景二维设计图
+    private String imgData;
+    //场景标题
+    private String sceneName;
+    //场景描述信息
+    private String sceneDec;
+    //场景所属行业
+    private String sceneType;
+    //场景密码
+    private String sceneKey;
+    //版本号,每编辑一次加1
+    private String version;
+    //场景封面图是否默认
+    private String thumbImg;
+    //场景封面图(大)
+    private String thumbBigImg;
+    //场景封面图(小)
+    private String thumbSmallImg;
+    //初始点的uuid
+    private String currentPanoId;
+    //	地面的logo是否默认
+    private String floorLogo;
+    // 地面logo图片
+    private String floorLogoImg;
+    // 地面logo图片的大小
+    private String floorLogoSize;
+    // 模型贴图的风格
+    private String sceneIndex;
+    // 模型的初始信息:坐标,朝向等
+    private String entry;
+    // 场景封面图(移动端,鱼眼)
+    private String thumbFishBigImg;
+    // 设计页面的元素信息
+    private String floorPlaneInfo;
+
+    private String visiblePanos;
+
+    private String hotData;
+
+    private String data;
+
+    private String solveType;
+
+    private Long feedBackId;
+    // 排序
+    private String sceneInterest;
+
+    private String phone;
+
+    private String message;
+    /**
+     * 普通录屏文件地址
+     */
+    private String screencapMusic;
+
+    private String originalFileName;
+
+    private Integer sceneScheme;
+
+    /**
+     * 源相机sn
+     */
+    private String sourceSn;
+
+    /**
+     * 目标相机sn
+     */
+    private String targetSn;
+
+    /**
+     * 源手机验证码
+     */
+    private String sourceCode;
+
+    /**
+     * 目标手机验证码
+     */
+    private String targetCode;
+
+    private String snCode;
+
+    private String num;
+
+    private String objName;
+
+    /**
+     * mtl文件名称
+     */
+    private String mntName;
+
+    private Long userId;
+
+    private String userName;
+
+    private String userIds;
+
+    private String cameraIds;
+
+    private String nums;
+
+    private Long folderId;
+
+    /**
+     * true,计算成功的,false:计算失败的,null:全部
+     */
+    private Boolean calculated;
+
+    private Integer folderType;
+
+    private String sceneSource;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    /**
+     * 用户拥有的相机id列表
+     */
+    private String ownCameraIds;
+
+    private List<String> sceneNumList;
+
+    private Integer isObj;
+}

+ 28 - 0
src/main/java/com/fdkankan/scene/controller/CustomResponseAdvice.java

@@ -0,0 +1,28 @@
+package com.fdkankan.scene.controller;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+@RestControllerAdvice
+@Slf4j
+public class CustomResponseAdvice implements ResponseBodyAdvice {
+
+    @Override
+    public boolean supports(MethodParameter returnType, Class converterType) {
+        return true;
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body, MethodParameter returnType,
+        MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request,
+        ServerHttpResponse response) {
+        return body;
+    }
+
+}

+ 7 - 0
src/main/java/com/fdkankan/scene/controller/SceneController.java

@@ -7,6 +7,7 @@ import com.fdkankan.common.constant.LoginType;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.JwtUtil;
 import com.fdkankan.common.util.SecurityUtil;
+import com.fdkankan.scene.bean.RequestScene;
 import com.fdkankan.scene.bean.ResponseSceneDataDownload;
 import com.fdkankan.scene.entity.Camera;
 import com.fdkankan.scene.entity.CameraDetail;
@@ -21,6 +22,7 @@ import com.fdkankan.scene.service.ISceneDataDownloadService;
 import com.fdkankan.scene.service.ISceneProEditService;
 import com.fdkankan.scene.service.IUserService;
 import com.fdkankan.web.model.SSOUser;
+import com.fdkankan.web.response.Result;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.scene.bean.RequestRebuildVedioScene;
 import com.fdkankan.scene.bean.RequestSceneCooperation;
@@ -347,4 +349,9 @@ public class SceneController extends BaseController {
         }
     }
 
+    @PostMapping("/createScene")
+    public Result createScene(@RequestBody RequestScene param) throws Exception{
+        return sceneProService.createScene(param);
+    }
+
 }

+ 5 - 0
src/main/java/com/fdkankan/scene/service/ISceneProService.java

@@ -1,11 +1,14 @@
 package com.fdkankan.scene.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fdkankan.scene.bean.RequestScene;
+import com.fdkankan.web.response.Result;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.scene.bean.RequestSceneEdit;
 import com.fdkankan.scene.bean.RequestSceneProV4;
 import com.fdkankan.scene.entity.ScenePro;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -88,4 +91,6 @@ public interface ISceneProService extends IService<ScenePro> {
 
     ResultData uploadObjAndImg(String sceneNum, MultipartFile file) throws Exception;
 
+    Result createScene(RequestScene param) throws Exception;
+
 }

+ 130 - 1
src/main/java/com/fdkankan/scene/service/impl/SceneProServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.scene.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -18,8 +19,10 @@ import com.fdkankan.common.constant.RecStatus;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.model.utils.ComputerUtil;
 import com.fdkankan.model.utils.SceneUtil;
+import com.fdkankan.scene.bean.RequestScene;
 import com.fdkankan.scene.entity.SceneDataDownload;
 import com.fdkankan.scene.service.ISceneDataDownloadService;
+import com.fdkankan.web.response.Result;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.model.utils.ConvertUtils;
 import com.fdkankan.model.utils.CreateObjUtil;
@@ -104,7 +107,7 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
     private String mainUrl;
     @Value("${scene.pro.url}")
     private String sceneProUrl;
-    @Value("${scene.pro.new.url}")
+    @Value("${scene.pro.v3.url}")
     private String sceneProNewUrl;
     @Value("${hot.domain.list}")
     private String hotDomainList;
@@ -3249,4 +3252,130 @@ public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro>
         return ResultData.ok();
     }
 
+    @Override
+    public Result createScene(RequestScene param) throws Exception {
+        if(StrUtil.isEmpty(param.getNum())){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
+        }
+
+        StringBuffer dataBuf = new StringBuffer()
+            .append("data").append(File.separator)
+            .append("data").append(param.getNum());
+
+        StringBuffer imagesBuf = new StringBuffer()
+            .append("images").append(File.separator)
+            .append("images").append(param.getNum());
+
+        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
+        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
+
+        FileUtils.delAllFile(imagesBuffer.toString() + "/results/");
+        FileUtils.delAllFile(imagesBuffer.toString() + "/extras/");
+        //远程复制oss资源
+        fYunFileService.downloadFileByCommand(imagesBuffer.toString() + "/extras/" + param.getObjName(), imagesBuf.toString() + File.separator + param.getObjName());
+        //obj文件修改名字
+        FileUtils.copyFile(imagesBuffer.toString() + "/extras/" + param.getObjName(), imagesBuffer.toString() + "/extras/mesh.obj", true);
+        FileUtils.deleteFile(imagesBuffer.toString() + "/extras/" + param.getObjName());
+
+        fYunFileService.downloadFileByCommand(imagesBuffer.toString() + "/extras/" + param.getMntName(), imagesBuf.toString() + File.separator + param.getMntName());
+        fYunFileService.downloadFileByCommand(imagesBuffer.toString() + "/extras/", imagesBuf.toString() + File.separator + "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1");
+        //将文件复制出去
+        String[] imgs = new File(imagesBuffer.toString() + "/extras/dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1").list();
+        for(String img : imgs){
+            FileUtils.copyFile(imagesBuffer.toString() + "/extras/dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1/" + img,
+                imagesBuffer.toString() + "/extras/" + img, true);
+        }
+        fYunFileService.downloadFileByCommand(imagesBuffer.toString() + File.separator + "vision.txt", imagesBuf.toString() + File.separator + "vision.txt");
+
+        //创建data.json
+        JSONObject dataJson = new JSONObject();
+        dataJson.put("obj2txt", true);
+        dataJson.put("split_type", "SPLIT_V6");
+        dataJson.put("data_describe", "double spherical");
+        dataJson.put("skybox_type", "SKYBOX_V5");
+        FileUtils.writeFile(imagesBuffer.toString() + "/data.json", dataJson.toString());
+
+        //调用objToTxt算法
+        CreateObjUtil.objToTxt(imagesBuffer.toString(), "");
+
+        String uploadJsonPath = imagesBuffer.toString() + File.separator + "results" +File.separator+"upload.json";
+        boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, maxCheckTimes, waitTime);
+        if(!exist){
+            log.error("upload.json数据出错");
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
+        }
+        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_5012);
+        }
+
+        Map<String,String> map = new HashMap<String,String>();
+        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(imagesBuffer.toString() + File.separator + "results" + File.separator + fileName).exists()) {
+                throw new Exception(imagesBuffer.toString() + File.separator + "results" + File.separator + fileName + "文件不存在");
+            }
+
+            //tex文件夹
+            if (fileJson.getIntValue("clazz") == 15) {
+                map.put(imagesBuffer.toString() + File.separator + "results" + File.separator + fileName, "images/images" +
+                    param.getNum() + "/dacf7dfa24ae47fab8fcebfe4dc41ab9_50k_texture_jpg_high1/" + fileName.replace("tex/", ""));
+                continue;
+            }
+        }
+
+        CreateObjUtil.convertTxtToDam(imagesBuffer.toString() + File.separator + "results" +File.separator+"modeldata.txt", imagesBuffer.toString() + File.separator + "results" +File.separator+ "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
+        CreateObjUtil.convertDamToLzma(imagesBuffer.toString() + File.separator + "results" +File.separator+ "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
+        CreateObjUtil.convertTxtToDam(imagesBuffer.toString() + File.separator + "results" +File.separator+"modeldata.txt", imagesBuffer.toString() + File.separator + "results" + File.separator+ "dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
+        map.put(imagesBuffer.toString() + File.separator + "results" +File.separator+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam.lzma", "images/images"+param.getNum()+"/"+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam.lzma");
+        map.put(imagesBuffer.toString() + File.separator + "results" +File.separator+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam", "images/images"+param.getNum()+"/"+"dacf7dfa24ae47fab8fcebfe4dc41ab9_50k.dam");
+
+        FileUtils.deleteFile(imagesBuffer.toString() + "/vision.modeldata");
+        CreateObjUtil.convertTxtToVisionmodeldata(imagesBuffer.toString() + "/vision.txt", imagesBuffer.toString() + "/vision.modeldata");
+        map.put(imagesBuffer.toString() + "/vision.modeldata", "images/images"+param.getNum()+"/vision.modeldata");
+
+        fYunFileService.uploadMulFiles(map);
+
+        ScenePro proEntity = this.findBySceneNum(param.getNum());
+        if(proEntity == null){
+            proEntity = new ScenePro();
+            proEntity.setSceneName("四维看看");
+            proEntity.setSceneDec("<p>四维看看 让空间讲故事</p>");
+            proEntity.setSceneScheme(2);
+            proEntity.setNum(param.getNum());
+            proEntity.setUserId(param.getUserId());
+            proEntity.setWebSite(mainUrl + sceneProNewUrl + param.getNum());
+            proEntity.setStatus(1);
+            proEntity.setPayStatus(1);
+            proEntity.setBuildType("V3");
+
+            if(param.getSceneSource()!=null){
+                proEntity.setSceneSource(Integer.parseInt(param.getSceneSource()));
+            }
+
+            this.save(proEntity);
+
+            SceneProEdit proEditEntity = new SceneProEdit();
+            proEditEntity.setProId(proEntity.getId());
+            sceneProEditService.save(proEditEntity);
+
+            JSONObject scenejson = JSONObject.parseObject(JSONObject.toJSONString(proEntity));
+            scenejson.put("visions", 1);
+            FileUtils.writeFile(dataBuffer.toString() + File.separator+"scene.json", scenejson.toString());
+        }
+
+        return Result.success(mainUrl + sceneProNewUrl + param.getNum());
+
+    }
 }