package com.fdkankan.contro.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; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.constant.CameraConstant; import com.fdkankan.common.constant.CommonStatus; import com.fdkankan.common.constant.ConstantUrl; import com.fdkankan.common.constant.ErrorCode; import com.fdkankan.common.constant.RecStatus; import com.fdkankan.common.constant.SceneStatus; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.util.DateExtUtil; import com.fdkankan.common.util.FileUtils; import com.fdkankan.common.util.SnowflakeIdGenerator; import com.fdkankan.contro.entity.Camera; import com.fdkankan.contro.entity.CameraDetail; import com.fdkankan.contro.entity.Company; import com.fdkankan.contro.entity.SSOUser; import com.fdkankan.contro.entity.SceneCooperation; import com.fdkankan.contro.entity.SceneEditControls; import com.fdkankan.contro.entity.SceneEditInfo; import com.fdkankan.contro.entity.SceneEditInfoExt; import com.fdkankan.contro.entity.SceneFileBuild; import com.fdkankan.contro.entity.ScenePlus; import com.fdkankan.contro.entity.ScenePlusExt; import com.fdkankan.contro.entity.ScenePro; import com.fdkankan.contro.entity.SceneResourceCamera; import com.fdkankan.contro.entity.SceneResourceCooperation; import com.fdkankan.contro.mapper.ISceneFileBuildMapper; import com.fdkankan.contro.service.ICameraDetailService; import com.fdkankan.contro.service.ICameraService; import com.fdkankan.contro.service.ICompanyService; import com.fdkankan.contro.service.IFdkkLaserService; import com.fdkankan.contro.service.IScene3dNumService; import com.fdkankan.contro.service.ISceneCooperationService; import com.fdkankan.contro.service.ISceneEditControlsService; import com.fdkankan.contro.service.ISceneEditInfoExtService; import com.fdkankan.contro.service.ISceneEditInfoService; import com.fdkankan.contro.service.ISceneFileBuildService; import com.fdkankan.contro.service.IScenePlusExtService; import com.fdkankan.contro.service.IScenePlusService; import com.fdkankan.contro.service.ISceneProService; import com.fdkankan.contro.service.ISceneResourceCameraService; import com.fdkankan.contro.service.ISceneResourceCooperationService; import com.fdkankan.contro.service.IUserService; import com.fdkankan.contro.vo.ResponseSceneFile; import com.fdkankan.contro.vo.ScenePlusVO; import com.fdkankan.fyun.config.FYunFileConfig; import com.fdkankan.fyun.constant.FYunTypeEnum; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.image.MatrixToImageWriterUtil; import com.fdkankan.model.constants.ConstantFilePath; import com.fdkankan.model.constants.UploadFilePath; import com.fdkankan.model.utils.ComputerUtil; import com.fdkankan.model.utils.CreateObjUtil; import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage; import com.fdkankan.rabbitmq.util.RabbitMqProducer; import com.fdkankan.redis.util.RedisUtil; import com.fdkankan.web.config.FileRouteConfig; import com.fdkankan.web.response.ResultData; import com.fdkankan.web.util.RSAEncrypt; import java.io.File; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; /** *

* 场景文件建模表 服务实现类 *

* * @author dengsixing * @since 2021-12-23 */ @Slf4j @Service public class SceneFileBuildServiceImpl extends ServiceImpl implements ISceneFileBuildService { private static final String SPLICE = "#"; @Value("${main.url}") private String mainUrl; @Value("${scene.pro.new.url}") private String sceneProNewUrl; @Value("${queue.modeling.modeling-call}") private String queueModelingCall; @Value("${queue.modeling.modeling-pre}") private String queueModelingPre; @Value("${fyun.type}") private String fyunType; @Autowired private RedisUtil redisUtil; @Autowired private FileRouteConfig routeConfig; @Autowired private IScenePlusExtService scenePlusExtService; @Autowired private IScene3dNumService scene3dNumService; @Autowired private IScenePlusService scenePlusService; @Autowired private RabbitMqProducer rabbitMqProducer; @Autowired private ISceneEditInfoService sceneEditInfoService; @Autowired private ISceneEditControlsService sceneEditControlsService; @Autowired private ISceneEditInfoExtService sceneEditInfoExtService; @Autowired private ISceneCooperationService sceneCooperationService; @Autowired private ISceneResourceCameraService sceneResourceCameraService; @Autowired private ISceneResourceCooperationService sceneResourceCooperationService; @Autowired private ICameraService cameraService; @Autowired private ICameraDetailService cameraDetailService; @Autowired private IUserService userService; @Autowired private ICompanyService companyService; @Autowired private FYunFileServiceInterface fYunFileService; @Autowired private FYunFileConfig fYunFileConfig; @Autowired private ISceneProService sceneProService; @Autowired private IFdkkLaserService fdkkLaserService; @Override public SceneFileBuild findByFileId(String fileId) { List list = this.list(new LambdaQueryWrapper().eq(SceneFileBuild::getFileId, fileId) .orderByDesc(SceneFileBuild::getId)); if(CollUtil.isEmpty(list)){ return null; } return list.get(0); } @Override public ResponseSceneFile preUpload(String params) throws Exception { log.info("preUpload-params: "+params); if (StrUtil.isEmpty(params)){ throw new BusinessException(ErrorCode.PARAM_REQUIRED); } params = params.replaceAll("%2B", "+"); Base64 base64 = new Base64(); String cipher = params; // 私钥解密过程 byte[] res = RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile()), base64.decode(cipher)); String restr = new String(res, "UTF-8"); log.debug("preUpload-params解密结果:" + restr); String[] strArr = restr.split(SPLICE); if (strArr.length != 5) { throw new BusinessException(ErrorCode.PARAM_REQUIRED); } String mac = strArr[0]; String totalPicNum = strArr[1]; String chunks = strArr[2]; String folderName = strArr[3]; if (StrUtil.isEmpty(mac)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5044); } if (totalPicNum == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5045); } if (chunks == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5046); } if (folderName == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5047); } log.info("mac:{} 准备上传文件,folderName:{}", mac, folderName); String dataSource = scenePlusService.getDataSourceLikeUnicode("/" + folderName); if(StrUtil.isNotEmpty(dataSource)){ int n = dataSource.split("/").length; if(n > 1){ String fileId = dataSource.split("/")[n - 2]; ResponseSceneFile responseSceneFile = new ResponseSceneFile(); responseSceneFile.setFileId(fileId); //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存) redisUtil.set(fileId, folderName, 1537920000); return responseSceneFile; } }else { SceneFileBuild sceneFileBuild = this.findByUnicode(folderName); if(sceneFileBuild != null){ String fileId = sceneFileBuild.getFileId(); ResponseSceneFile responseSceneFile = new ResponseSceneFile(); responseSceneFile.setFileId(fileId); //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存) redisUtil.set(fileId, folderName, 1537920000); return responseSceneFile; } } log.info("开始新生成build数据"); // 构造方法设置机器码:第0个机房的第0台机器 SnowflakeIdGenerator snowflakeIdGenerator = new SnowflakeIdGenerator(0, 0); long fileId = snowflakeIdGenerator.nextId(); log.info("新生成build数据,{}", fileId); SceneFileBuild sceneFileBuild = new SceneFileBuild(); sceneFileBuild.setChildName(mac); sceneFileBuild.setFileId(String.valueOf(fileId)); sceneFileBuild.setUnicode(folderName); sceneFileBuild.setUploadStatus(0); sceneFileBuild.setBuildStatus(0); sceneFileBuild.setTotalPicNum(Integer.valueOf(totalPicNum)); sceneFileBuild.setChunks(Integer.valueOf(chunks)); this.save(sceneFileBuild); ResponseSceneFile responseSceneFile = new ResponseSceneFile(); responseSceneFile.setFileId(String.valueOf(fileId)); //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存) redisUtil.set(String.valueOf(fileId), folderName, 1537920000); return responseSceneFile; } public SceneFileBuild findByUnicode(String unicode) { List list = this.list(new QueryWrapper() .eq("unicode", unicode) .orderByDesc("id")); if(CollUtil.isEmpty(list)) return null; return list.get(0); } public void buildScene(String filePath, String fileId, boolean fromOss, String prefix) throws Exception{ //获取解压后的资源的data.fdage中的数据 String data = FileUtils.readFile(filePath + "data.fdage"); JSONObject jsonObject = JSONObject.parseObject(data); //调用createScene方法生成scene数据和加入算法队列 if(jsonObject != null){ //有calibration值为标定,1: camera_calibration 2: color_anlysis,0正常计算 if(jsonObject.get("calibration") != null && jsonObject.getString("calibration").equals("1")){ String mac = filePath.replace(ConstantFilePath.BUILD_MODEL_PATH, "").split("/")[0]; String calPath = ConstantFilePath.BUILD_MODEL_PATH + mac + "/camera_calibration"; //生成标定数据 ComputerUtil.createCalibrationData(calPath, filePath); //开始标定计算 rabbitMqProducer.sendByWorkQueue(queueModelingCall, calPath); }else if(jsonObject.get("calibration") != null && jsonObject.getString("calibration").equals("2")){ String mac = filePath.replace(ConstantFilePath.BUILD_MODEL_PATH, "").split("/")[0]; String calPath = ConstantFilePath.BUILD_MODEL_PATH + mac + "/color_anlysis"; //生成标定数据 ComputerUtil.createCalibrationData(calPath, filePath); //开始标定计算 Map map = ComputerUtil.computerCalibration(calPath); }else if(jsonObject.get("calibration") != null && jsonObject.getString("calibration").equals("3")){ String mac = filePath.replace(ConstantFilePath.BUILD_MODEL_PATH, "").split("/")[0]; String calPath = ConstantFilePath.BUILD_MODEL_PATH + mac + "/shading"; //生成标定数据 ComputerUtil.createCalibrationData(calPath, filePath); //开始标定计算 rabbitMqProducer.sendByWorkQueue(queueModelingCall, calPath); }else { String sceneNum = ""; String cameraName = jsonObject.getJSONObject("cam").getString("uuid"); String unicode = jsonObject.getString("creator") + "_" + jsonObject.getString("uuidtime"); log.info("查询相机:" + cameraName); Camera camera = cameraService.getByChildName(cameraName); if(camera == null){ log.error("该相机不存在:" + cameraName); //偶现data.fdage给的相机码多了或少了4DKKPRO_ if(cameraName.contains("4DKKPRO_")){ camera = cameraService.getByChildName(cameraName.replace("4DKKPRO_", "")); }else { camera = cameraService.getByChildName("4DKKPRO_" + cameraName); } if(camera == null){ throw new BusinessException(CameraConstant.FAILURE_6003); } } CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId()); if(cameraDetail == null){ log.error("该相机详情不存在:" + cameraName); throw new BusinessException(CameraConstant.FAILURE_6003); } //查看场景中的文件目录是否有改文件id,有则重新计算改场景,无则新建场景 ScenePlus scenePlus = scenePlusService.getByFileId("/" + fileId + "/"); int rebuild = 1; if(Objects.nonNull(scenePlus)){ sceneNum = scenePlus.getNum(); if(scenePlus.getSceneStatus() == SceneStatus.wait.code()){ log.info(sceneNum + ":场景处于计算中,不能再计算"); return; } }else { sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType()); rebuild = 0; } if(sceneNum == null){ log.error("大场景序号为空:" + sceneNum); throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } String localDataPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, sceneNum); String localImagesPath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, sceneNum); String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum); String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, sceneNum); String userName = null; if(cameraDetail.getUserId() != null){ SSOUser user = userService.getSSOUserByUserId(cameraDetail.getUserId()); if(user != null){ userName = user.getUserName(); } } String icon = null; if(jsonObject.containsKey("icon") && StrUtil.isNotEmpty(jsonObject.getString("icon"))){ fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefix + jsonObject.getString("icon"), filePath); icon = fYunFileConfig.getHost() + "images/images" + sceneNum + "/" + jsonObject.getString("icon"); if(FYunTypeEnum.AWS.code().equals(fYunFileService.getFyunType())){ fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefix + jsonObject.getString("icon"), filePath + jsonObject.getString("icon")); icon = fYunFileConfig.getHost() + imgViewPath + jsonObject.getString("icon"); } fYunFileService.uploadFile(filePath + jsonObject.getString("icon"), imgViewPath + jsonObject.getString("icon")); } JSONObject firmwareVersion = new JSONObject(); if(jsonObject.containsKey("camSoftwareVersion") && StrUtil.isNotEmpty(jsonObject.getString("camSoftwareVersion"))){ firmwareVersion.put("camSoftwareVersion", jsonObject.getString("camSoftwareVersion")); } if(jsonObject.containsKey("version") && StrUtil.isNotEmpty(jsonObject.getString("version"))){ firmwareVersion.put("version", jsonObject.getString("version")); } String sceneUrl = mainUrl +"/"+sceneProNewUrl; String buildType = "V2"; Long cameraType = 10L; //根据videoVersion判断是V2还是V3版本的算法和页面 if(jsonObject.containsKey("videoVersion") && StrUtil.isNotEmpty(jsonObject.getString("videoVersion"))){ if(jsonObject.getIntValue("videoVersion") >= 4){ buildType = "V3"; cameraType = 11L; } } //重算的场景,先移除该场景对应的容量 if(rebuild == 1){ scenePlusService.resetSpace(sceneNum); }else { //上传log-main.png fYunFileService.uploadFile(ConstantFilePath.LOGO_PATH + "logo-main.png", imgViewPath + "logo-main.png"); fYunFileService.uploadFile(ConstantFilePath.LOGO_PATH + "logo-main-en.png", imgViewPath + "logo-main-en.png"); } ScenePlusVO scenePlusVO = null; Object[] objects = null; BuildSceneCallMessage mqMessage = null; if(fromOss){ objects = this.createScenePlus(sceneNum, camera.getId(), camera.getChildName(), jsonObject.getString("creator"), jsonObject.getString("pwd"), unicode, cameraType, fileId, prefix, "", icon, "0", cameraDetail.getUserId(), userName, jsonObject.getString("location") != null && "1".equals(jsonObject.getString("location")) ? "sfm" : "slam", jsonObject.getJSONArray("points").size(), jsonObject.getString("name"), jsonObject.getString("info"), jsonObject.getInteger("scenetype"), jsonObject.getString("gps"), rebuild, jsonObject.getInteger("resolution"), firmwareVersion.toString(), sceneUrl, buildType,cameraDetail.getCooperationUser()); }else { objects = this.createScenePlus(sceneNum, camera.getId(), camera.getChildName(), jsonObject.getString("creator"), jsonObject.getString("pwd"), unicode, cameraDetail.getGoodsId(), String.valueOf(fileId), "", "", icon, "0", cameraDetail.getUserId(), userName, jsonObject.getString("location") != null && "1".equals(jsonObject.getString("location")) ? "sfm" : "slam", jsonObject.getJSONArray("points").size(), jsonObject.getString("name"), jsonObject.getString("info"), jsonObject.getInteger("scenetype"), jsonObject.getString("gps"), rebuild, jsonObject.getInteger("resolution"), firmwareVersion.toString(), sceneUrl, buildType, cameraDetail.getCooperationUser()); } scenePlusVO = (ScenePlusVO)objects[0]; mqMessage = (BuildSceneCallMessage)objects[1]; if(Objects.nonNull(scenePlusVO)){ JSONObject statusJson = new JSONObject(); //临时将-2改成1,app还没完全更新 statusJson.put("status", scenePlusVO.getSceneStatus() == -2 ? 1 : scenePlusVO.getSceneStatus()); statusJson.put("webSite", scenePlusVO.getWebSite()); statusJson.put("sceneNum", scenePlusVO.getNum()); statusJson.put("thumb", scenePlusVO.getThumb()); statusJson.put("payStatus", scenePlusVO.getPayStatus()); statusJson.put("recStatus", scenePlusVO.getRecStatus()); FileUtils.writeFile(localDataPath + "status.json", statusJson.toString()); fYunFileService.uploadFile(localDataPath + "status.json", dataViewPath + "status.json"); } //删除oss的houst_floor.json(国际版可能会卡住) fYunFileService.deleteFile(dataViewPath + "houst_floor.json"); if(cameraDetail.getCompanyId() != null){ Company company = companyService.getById(cameraDetail.getCompanyId()); if(company != null){ log.info("复制企业logo"); SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlusVO.getId()); SceneEditInfoExt sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId()); if(StrUtil.isNotEmpty(company.getTopLogo())){ //复制阿里云主服务器的图片到横琴云副服务器中 if(!new File(ConstantFilePath.BASE_PATH + File.separator + company.getTopLogo()).exists()){ log.info("下载topLogo"); FileUtils.downLoadFromUrl(mainUrl + company.getTopLogo() + "?t=" + System.currentTimeMillis(), company.getTopLogo().substring(company.getTopLogo().lastIndexOf("/") + 1), ConstantFilePath.BASE_PATH + company.getTopLogo().substring(0, company.getTopLogo().lastIndexOf("/"))); } FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getTopLogo(), localImagesPath + "logo-main.png", true); fYunFileService.uploadFile(localImagesPath + "logo-main.png", imgViewPath + "logo-main.png"); } if(StrUtil.isNotEmpty(company.getFloorLogo())){ //复制阿里云主服务器的图片到横琴云副服务器中 if(!new File(ConstantFilePath.BASE_PATH + File.separator + company.getFloorLogo()).exists()){ log.info("下载floorLogo"); FileUtils.downLoadFromUrl(mainUrl + company.getFloorLogo() + "?t=" + System.currentTimeMillis(), company.getFloorLogo().substring(company.getFloorLogo().lastIndexOf("/") + 1), ConstantFilePath.BASE_PATH + company.getFloorLogo().substring(0, company.getFloorLogo().lastIndexOf("/"))); } FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getFloorLogo(), localImagesPath + "floorLogoImg.png", true); fYunFileService.uploadFile(localImagesPath + "floorLogoImg.png", imgViewPath + "floorLogoImg.png"); sceneEditInfo.setFloorLogo("user"); } if(StrUtil.isNotEmpty(company.getQrLogo())){ //生成新的分享的二维码 MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+".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", false, ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png"); } sceneEditInfoService.updateById(sceneEditInfo); } } rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage); } }else { log.info("data.fdage文件不存在"); throw new BusinessException(CameraConstant.FAILURE_6009); } } @Override public ResultData uploadSuccessBuild(String params) throws Exception { log.info("uploadSuccessBuild-params: " + params); if (StringUtils.isEmpty(params)) { throw new BusinessException(ErrorCode.PARAM_REQUIRED); } params = params.replaceAll("%2B", "+"); params = params.replaceAll(" ", "+"); Base64 base64 = new Base64(); String cipher = params; // 私钥解密过程 byte[] res = RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile()), base64.decode(cipher)); String restr = new String(res, "UTF-8"); log.debug("uploadSuccessBuild-params解密结果:" + restr); String[] strArr = restr.split(SPLICE); if (strArr.length != 3) { throw new BusinessException(ErrorCode.PARAM_REQUIRED); } String mac = strArr[0]; String fileId = strArr[1]; Object folderNameObject = redisUtil.get(fileId); String folderName = folderNameObject == null ? null : (String)folderNameObject; if(StringUtils.isEmpty(folderName)){ ScenePlus scenePlus = scenePlusService.getByFileId("/" + fileId + "/"); if(scenePlus != null){ ScenePlusExt plusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); folderName = plusExt.getDataSource().substring(plusExt.getDataSource().lastIndexOf("/") + 1); } if(StringUtils.isEmpty(folderName)){ SceneFileBuild sceneFileBuild = this.findByFileId(fileId); if(sceneFileBuild != null){ folderName = sceneFileBuild.getUnicode(); } } } StringBuilder filePathBuffer = new StringBuilder(routeConfig.getHardDisk()).append(mac).append(File.separator) .append(fileId).append(File.separator).append(folderName).append(File.separator).append("capture") .append(File.separator); StringBuilder prefixBuffer = new StringBuilder(mac).append(File.separator).append(fileId).append(File.separator).append(folderName).append(File.separator); File filePath = new File(filePathBuffer.toString()); if(!filePath.exists()){ filePath.mkdirs(); } fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefixBuffer.toString() + "data.fdage",filePathBuffer.toString() + "data.fdage"); buildScene(filePathBuffer.toString(), fileId, true, prefixBuffer.toString()); return ResultData.ok(); } @Override public ResultData turntableUploadSuccess(String params) throws Exception { log.info("turntableUploadSuccess-params: " + params); if (StringUtils.isEmpty(params)) { throw new BusinessException(ErrorCode.PARAM_REQUIRED); } params = params.replaceAll("%2B", "+"); params = params.replaceAll(" ", "+"); Base64 base64 = new Base64(); String cipher = params; // 私钥解密过程 byte[] res = RSAEncrypt.decrypt(RSAEncrypt.loadPrivateKeyByStr(RSAEncrypt.loadPrivateKeyByFile()), base64.decode(cipher)); String restr = new String(res, "UTF-8"); log.info("uploadSuccessBuild-params解密结果:" + restr); String[] strArr = restr.split(SPLICE); if (strArr.length != 3) { throw new BusinessException(ErrorCode.PARAM_REQUIRED); } String mac = strArr[0]; String fileId = strArr[1]; Object folderNameObject = redisUtil.get(fileId); String folderName = folderNameObject == null ? null : (String)folderNameObject; if(StringUtils.isEmpty(folderName)){ ScenePlusExt scenePlusExt = scenePlusExtService.list( new LambdaQueryWrapper() .like(ScenePlusExt::getDataSource, "%/" + fileId + "/%")).get(0); if(scenePlusExt != null){ folderName = scenePlusExt.getDataSource().substring(scenePlusExt.getDataSource().lastIndexOf("/") + 1); } if(StringUtils.isEmpty(folderName)){ SceneFileBuild sceneFileBuild = this.findByFileId(fileId); if(sceneFileBuild != null){ folderName = sceneFileBuild.getUnicode(); } } } //判断 是否为激光相机 Camera camera = cameraService.getByChildName(mac); CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId()); String hardDisk = routeConfig.getHardDisk(); if(cameraDetail!=null){ if(cameraDetail.getType() == 10){ hardDisk = routeConfig.getHardDiskLaser(); } } log.info("相机 mnt 路径 : " + hardDisk + ", 相机类型 : " + cameraDetail.getType()); //本机目录 StringBuilder filePathBuffer = new StringBuilder(hardDisk).append(mac).append(File.separator).append(fileId).append(File.separator).append(folderName).append(File.separator).append("capture").append(File.separator); //云目录 StringBuilder prefixBuffer = new StringBuilder(mac).append(File.separator).append(fileId).append(File.separator).append(folderName).append(File.separator); File filePath = new File(filePathBuffer.toString()); if(!filePath.exists()){ filePath.mkdirs(); } fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefixBuffer.toString() + "data.fdage", filePathBuffer.toString() + "data.fdage"); turntableBuildScene(filePathBuffer.toString(), fileId, true, prefixBuffer.toString()); return ResultData.ok(); } public void turntableBuildScene(String filePath, String fileId, boolean fromOss, String prefix) throws Exception{ String data = FileUtils.readFile(filePath + "data.fdage"); JSONObject jsonObject = JSONObject.parseObject(data); //调用createScene方法生成scene数据和加入算法队列 if(jsonObject == null) { log.info("data.fdage文件不存在"); throw new BusinessException(CameraConstant.FAILURE_6009); } String sceneNum = ""; String snCode = jsonObject.getJSONObject("cam").getString("uuid"); String unicode = jsonObject.getString("creator") + "_" + jsonObject.getString("uuidtime"); //从data.fage 取出 //查看场景中的文件目录是否有改文件id,有则重新计算改场景,无则新建场景 ScenePlus scene = scenePlusService.getByFileId("/" + fileId + "/"); int rebuild = 1; log.info("查询相机:" + snCode); Camera camera = cameraService.getByChildName(snCode); if(camera == null){ log.error("该相机不存在:" + snCode); camera = cameraService.getBySnCode(snCode); if(camera == null){ throw new BusinessException(CameraConstant.FAILURE_6003); } } CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId()); if(cameraDetail == null){ log.error("该相机详情不存在:" + snCode); throw new BusinessException(CameraConstant.FAILURE_6003); } if(Objects.nonNull(scene)){ sceneNum = scene.getNum(); if(scene.getSceneStatus() == SceneStatus.wait.code()){ log.info(sceneNum + ":场景处于计算中,不能再计算"); return; } }else { sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType()); rebuild = 0; } if(sceneNum == null){ log.error("大场景序号为空:" + sceneNum); throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } log.info("是否是重算,rebuild:{}",rebuild); String localDataPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, sceneNum); String localImagesPath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, sceneNum); String imageViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum); String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, sceneNum); String userName = null; if(cameraDetail.getUserId() != null){ SSOUser user = userService.getSSOUserByUserId(cameraDetail.getUserId()); if(user != null){ userName = user.getUserName(); } } String icon = null; if(jsonObject.containsKey("icon") && StrUtil.isNotEmpty(jsonObject.getString("icon"))){ fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefix + jsonObject.getString("icon"), filePath); icon = fYunFileConfig.getHost() + imageViewPath + jsonObject.getString("icon"); if(FYunTypeEnum.AWS.code().equals(fYunFileService.getFyunType())){ fYunFileService.downloadFile(ConstantFilePath.OSS_PREFIX + prefix + jsonObject.getString("icon"), filePath + jsonObject.getString("icon")); icon = fYunFileConfig.getHost() + imageViewPath + jsonObject.getString("icon"); } fYunFileService.uploadFile(filePath + jsonObject.getString("icon"), imageViewPath + jsonObject.getString("icon")); log.info("上传icon成功...."); } JSONObject firmwareVersion = new JSONObject(); if(jsonObject.containsKey("camSoftwareVersion") && StrUtil.isNotEmpty(jsonObject.getString("camSoftwareVersion"))){ firmwareVersion.put("camSoftwareVersion", jsonObject.getString("camSoftwareVersion")); } if(jsonObject.containsKey("version") && StrUtil.isNotEmpty(jsonObject.getString("version"))){ firmwareVersion.put("version", jsonObject.getString("version")); } String sceneUrl = mainUrl + "/" + sceneProNewUrl; String buildType = "V3"; //13表示转台 Long cameraType = 13L; //激光转台 八目相机占用 10 和 11 if(jsonObject.getJSONObject("cam").getIntValue("type") == 10){ //激光转台 cameraType = 14L; } //重算的场景,先移除该场景对应的容量 if(rebuild == 1){ scenePlusService.resetSpace(sceneNum); }else { //上传log-main.png fYunFileService.uploadFile(ConstantFilePath.LOGO_PATH + "logo-main.png", imageViewPath + "logo-main.png"); fYunFileService.uploadFile(ConstantFilePath.LOGO_PATH + "logo-main-en.png", imageViewPath + "logo-main-en.png"); log.info("第一次计算场景,上传logo-main.png"); } Object[] objects = this.createScenePlus(sceneNum, camera.getId(), camera.getChildName(), jsonObject.getString("creator"), jsonObject.getString("pwd"), unicode, cameraType, String.valueOf(fileId), prefix, "", icon, "0", cameraDetail.getUserId(), userName, jsonObject.getString("location") != null && "1".equals(jsonObject.getString("location")) ? "sfm" : "slam", jsonObject.getJSONArray("points").size(), jsonObject.getString("name"), jsonObject.getString("info"), jsonObject.getInteger("scenetype"), jsonObject.getString("gps"), rebuild, jsonObject.getInteger("resolution"), firmwareVersion.toString(), sceneUrl, buildType, cameraDetail.getCooperationUser()); BuildSceneCallMessage mqMessage = (BuildSceneCallMessage)objects[1]; ScenePlusVO scenePlusVO = (ScenePlusVO) objects[0]; if(scenePlusVO != null){ JSONObject statusJson = new JSONObject(); //临时将-2改成1,app还没完全更新 statusJson.put("status", !ObjectUtils.isEmpty(scenePlusVO.getSceneStatus()) && scenePlusVO.getSceneStatus() == -2? 1 : scene.getSceneStatus()); statusJson.put("webSite", scenePlusVO.getWebSite()); statusJson.put("sceneNum", scenePlusVO.getNum()); statusJson.put("thumb", scenePlusVO.getThumb()); statusJson.put("payStatus", scenePlusVO.getPayStatus()); statusJson.put("recStatus", scenePlusVO.getRecStatus()); FileUtils.writeFile(localDataPath + "status.json", statusJson.toString()); fYunFileService.uploadFile(localDataPath + "status.json", dataViewPath + File.separator+"status.json"); log.info("上传status.json,上传内容:{}" + statusJson.toString()); } if(cameraDetail.getCompanyId() != null){ Company company = companyService.getById(cameraDetail.getCompanyId()); if(company != null){ Map jsonMap = new HashMap<>(); log.info("复制企业logo"); SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlusVO.getId()); // SceneProEdit sceneProEdit = sceneProEditService.findByProId(scene.getId()); // SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); if(StrUtil.isNotEmpty(company.getTopLogo())){ FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getTopLogo(),localImagesPath + "logo-main.png", true); fYunFileService.uploadFile(localImagesPath + "logo-main.png", imageViewPath + "logo-main.png"); } if(StrUtil.isNotEmpty(company.getFloorLogo())){ FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getFloorLogo(), localImagesPath + "floorLogoImg.png", true); fYunFileService.uploadFile(localImagesPath + "floorLogoImg.png", imageViewPath + "floorLogoImg.png"); sceneEditInfo.setFloorLogo("user"); } if(StrUtil.isNotEmpty(company.getQrLogo())){ // TODO: 2022/7/25 目前v4版本不需要生成带logo的二维码,这里先注释掉 dsx-------------------------------start // FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getQrLogo(), // ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png", true); // // uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png", // imageViewPath + "QRShareLogo.png"); // // // TODO: 2022/1/24 暂时保留旧版本,系统稳定后删除 // uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png", // "images/images" + sceneNum + "/QRShareLogo.png"); // //// sceneProEdit.setShareLogo("images/images" + sceneNum + "/QRShareLogo.png");//旧系统代码,先保留 // sceneProEdit.setShareLogo(imageViewPath + "QRShareLogo.png"); // TODO: 2022/7/25 目前v4版本不需要生成带logo的二维码,这里先注释掉 dsx-------------------------------end //生成新的分享的二维码-中文版本 MatrixToImageWriterUtil.createQRCode(sceneUrl + sceneNum, ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+sceneNum+".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", false, ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/QRShareLogo.png"); } // TODO: 2022/7/25 目前v4版本还没开发地面点位log功能,这里先注释掉 dsx-------------------------------start // if(StrUtil.isNotEmpty(company.getMarkerLogo())){ // FileUtils.copyFile(ConstantFilePath.BASE_PATH + File.separator + company.getMarkerLogo(), // ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/marker.png", true); // uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/marker.png", // imageViewPath + "marker.png"); // // // TODO: 2022/1/24 暂时保留旧版本,系统稳定后删除 // uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH + "images/images" + sceneNum + "/marker.png", // "images/images" + sceneNum + "/marker.png"); // // sceneProEdit.setMarkerLogo("user"); // jsonMap.put("markerLogo", "user"); // } // TODO: 2022/7/25 目前v4版本还没开发地面点位log功能,这里先注释掉 dsx-------------------------------end sceneEditInfoService.updateById(sceneEditInfo); } //删除oss的houst_floor.json fYunFileService.deleteFile(dataViewPath + "houst_floor.json"); } //激光转台 八目相机占用 10 和 11 log.info("发送mq,camType:{}", jsonObject.getJSONObject("cam").getIntValue("type")); if(jsonObject.getJSONObject("cam").getIntValue("type") == 10){ // mqProducer.sendOneWay(topicLaserA, mqMessage); // TODO: 2022/3/19 这里应该是发送激光的 ,目前还不清楚,先统一发送同一个mq rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage); }else if(scene != null){ rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage); } } public Object[] createScenePlus(String projectNum, Long cameraId, String cameraName, String phoneId, String sceneKey, String unicode, Long cameraType, String fileId, String prefix, String imgsName, String pic, String isModel, Long userId, String userName, String algorithm, Integer sceneShootCount, String sceneName, String sceneDec, Integer sceneType, String gps,Integer type, Integer resolution, String firmwareVersion, String url, String buildType, Long cooperationUser)throws Exception{ ScenePlusVO scenePlusVO = new ScenePlusVO(); ScenePlus scenePlus = new ScenePlus(); ScenePlusExt scenePlusExt = new ScenePlusExt(); scenePlusExt.setWebSite(url+projectNum); scenePlus.setCameraId(cameraId); scenePlus.setPhoneId(phoneId); scenePlus.setNum(projectNum); String path = ConstantFilePath.BUILD_MODEL_PATH + unicode; scenePlus.setSceneSource(1); if(cameraType.longValue() == 5 || cameraType.longValue() == 6){ //场景来源双目相机 scenePlus.setSceneSource(2); scenePlusExt.setDataSource(ConstantFilePath.BUILD_MODEL_PATH + unicode); }else if(cameraType.longValue() == 14){ scenePlusExt.setDataSource(ConstantFilePath.BUILD_MODEL_LASER_PATH + cameraName.replace("4DKKPRO_", "").replace("-fdage", "").toLowerCase() + File.separator + fileId + File.separator + unicode); path = ConstantFilePath.BUILD_MODEL_LASER_PATH + unicode; log.info("激光相机 dataSource :" + scenePlusExt.getDataSource()); }else if(cameraType.longValue() >= 3){ scenePlusExt.setDataSource(ConstantFilePath.BUILD_MODEL_PATH + cameraName.replace("4DKKPRO_", "").replace("-fdage", "").toLowerCase() + File.separator + fileId + File.separator + unicode); }else { scenePlusExt.setDataSource(prefix+imgsName); } if(resolution == null || resolution.intValue() == 0){ scenePlusExt.setSceneScheme(cameraType.intValue()); }else { scenePlusExt.setSceneScheme(4); } //场景来源双目相机,sceneScheme为4,加载high,low图 if(cameraType.longValue() == 5 || cameraType.longValue() == 6){ scenePlusExt.setSceneScheme(4); } //转台相机用4k图 if(cameraType.longValue() == 13 ){ scenePlus.setSceneSource(3); scenePlusExt.setSceneScheme(10); } //激光相机 if(cameraType.longValue() == 14 ){ scenePlus.setSceneSource(4); scenePlusExt.setSceneScheme(10); } if(pic!=null&&pic.length()>5) { scenePlusExt.setThumb(pic); } else { scenePlusExt.setThumb(ConstantUrl.DEFAULT_SCENE_PIC); } scenePlusExt.setThumb(scenePlusExt.getThumb().concat("?t=")+System.currentTimeMillis()); if(!ObjectUtils.isEmpty(userName)){ scenePlus.setUserId(userId); } if(sceneShootCount == null) { scenePlusExt.setShootCount(0); } else { scenePlusExt.setShootCount(sceneShootCount); } if(sceneName!=null) { scenePlus.setTitle(sceneName); } if(sceneDec!=null) { scenePlus.setDescription("

"+ new String(sceneDec.getBytes("UTF-8"))+"

"); } if(sceneType!=null) { scenePlus.setSceneType(sceneType); } if(gps!=null&&!gps.trim().equals("")) { scenePlusExt.setGps(gps); } scenePlusExt.setAlgorithm(algorithm); if(!org.springframework.util.StringUtils.isEmpty(firmwareVersion)){ scenePlusExt.setFirmwareVersion(firmwareVersion); } scenePlusExt.setBuildType(buildType); log.info("场景记录添加到数据库:"+projectNum); //type=0为新生成场景,其余为重新计算场景 SceneEditInfo sceneEditInfo = new SceneEditInfo(); SceneEditInfoExt sceneEditInfoExt = new SceneEditInfoExt(); SceneEditControls sceneEditControls = new SceneEditControls(); if(type == 0){ scenePlus.setSceneStatus(SceneStatus.wait.code()); scenePlusService.save(scenePlus); scenePlusExt.setPlusId(scenePlus.getId()); scenePlusExtService.save(scenePlusExt); sceneEditInfo.setScenePlusId(scenePlus.getId()); if(StrUtil.isNotBlank(sceneKey)) { sceneEditInfo.setScenePassword(sceneKey); sceneEditControls.setShowLock((int) CommonStatus.YES.code()); } sceneEditInfoService.save(sceneEditInfo); sceneEditControls.setEditInfoId(sceneEditInfo.getId()); sceneEditControlsService.save(sceneEditControls); //新增场景时,同时新增场景协作信息 if(cooperationUser != null){ SceneCooperation sceneCooperationEntity = new SceneCooperation(); sceneCooperationEntity.setNum(projectNum); sceneCooperationEntity.setUserId(cooperationUser); sceneCooperationService.save(sceneCooperationEntity); List resourceCameraList = sceneResourceCameraService.findListByCameraId(cameraId); SceneResourceCooperation sceneResourceCooperation = null; if(resourceCameraList != null && resourceCameraList.size() > 0){ for (SceneResourceCamera sceneResourceCamera : resourceCameraList) { sceneResourceCooperation = new SceneResourceCooperation(); sceneResourceCooperation.setSceneResourceId(sceneResourceCamera.getSceneResourceId()); sceneResourceCooperation.setSceneCooperationId(sceneCooperationEntity.getId()); sceneResourceCooperationService.save(sceneResourceCooperation); } } } }else { ScenePlus oldScene = scenePlusService.getScenePlusByNum(projectNum); scenePlus.setId(oldScene.getId()); scenePlus.setSceneStatus(0); scenePlus.setRecStatus(RecStatus.VALID.code()); scenePlus.setPayStatus(0); scenePlus.setCreateTime(Calendar.getInstance().getTime()); ScenePlusExt oldSceneExt = scenePlusExtService.getScenePlusExtByPlusId(oldScene.getId()); scenePlusExt.setSpace(oldSceneExt.getSpace()); scenePlusExt.setEcs(oldSceneExt.getEcs()); scenePlusExt.setViewCount(oldSceneExt.getViewCount()); if(sceneName!=null) { scenePlus.setTitle(sceneName); } if(sceneType!=null) { scenePlus.setSceneType(sceneType); } scenePlusService.updateById(scenePlus); scenePlusExtService.updateById(scenePlusExt); SceneEditInfo oldSceneEditInfo = sceneEditInfoService.getByScenePlusId(oldScene.getId()); SceneEditInfoExt oldSceneEditeIinfoExt = sceneEditInfoExtService.getByEditInfoId(oldSceneEditInfo.getId()); if(StrUtil.isNotBlank(sceneKey)) { sceneEditInfo.setScenePassword(sceneKey); sceneEditControls.setShowLock((int) CommonStatus.YES.code()); }else{ sceneEditInfo.setScenePassword(""); sceneEditControls.setShowLock((int)CommonStatus.NO.code()); } sceneEditInfo.setId(oldSceneEditInfo.getId()); sceneEditInfo.setScenePlusId(scenePlus.getId()); sceneEditInfo.setFloorLogoSize(100); sceneEditInfo.setRecStatus(RecStatus.VALID.code()); sceneEditInfo.setFloorPublishVer(oldSceneEditInfo.getFloorEditVer() + 1); sceneEditInfo.setFloorEditVer(oldSceneEditInfo.getFloorEditVer() + 1); sceneEditInfo.setVersion(oldSceneEditInfo.getVersion() + 1); sceneEditInfoService.updateById(sceneEditInfo); sceneEditInfoExt.setId(oldSceneEditeIinfoExt.getId()); sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId()); sceneEditInfoExt.setScenePlusId(scenePlus.getId()); sceneEditInfoExtService.updateById(sceneEditInfoExt); } BuildSceneCallMessage buildSceneMqMessage =this.getBuildSceneMqMessage( projectNum, cameraName, unicode, cameraType, fileId, prefix, imgsName, isModel, userName, algorithm, resolution, buildType, path, scenePlus.getId(), scenePlus.getTitle(), scenePlusExt.getWebSite(), scenePlus.getCreateTime(), scenePlus.getUserId(), scenePlusExt.getDataSource(), scenePlus.getSceneStatus(), scenePlus.getPayStatus(), scenePlusExt.getThumb()); BeanUtil.copyProperties(scenePlusExt, scenePlusVO); BeanUtil.copyProperties(scenePlus, scenePlusVO); //当mq排队数大于指定数量时使用弹性升缩 return new Object[]{scenePlusVO, buildSceneMqMessage}; } public BuildSceneCallMessage getBuildSceneMqMessage(String projectNum, String cameraName, String unicode, Long cameraType, String fileId,String prefix, String imgsName, String isModel, String userName,String algorithm, Integer resolution, String buildType, String path, Long sceneProId, String sceneName, String webSite, Date sceneProCreateTime, Long userId, String dataSource, Integer sceneStatus, Integer PayStatus, String thumb) { BuildSceneCallMessage mqMsg = new BuildSceneCallMessage(); mqMsg.setSceneProId(sceneProId); mqMsg.setSceneNum(projectNum); mqMsg.setCameraName(cameraName); mqMsg.setUnicode(unicode); mqMsg.setCameraType(String.valueOf(cameraType)); mqMsg.setFileId(fileId); mqMsg.setPrefix(prefix); mqMsg.setImgsName(imgsName); mqMsg.setIsModel(isModel); mqMsg.setUserName(userName); mqMsg.setAlgorithm(algorithm); mqMsg.setResolution(String.valueOf(resolution)); mqMsg.setBuildType(buildType); mqMsg.setPath(path); mqMsg.setSceneName(sceneName); mqMsg.setWebSite(webSite); mqMsg.setSceneProCreateTime(sceneProCreateTime); mqMsg.setUserId(userId); mqMsg.setDataSource(dataSource); mqMsg.setSceneStatus(sceneStatus); mqMsg.setPayStatus(PayStatus); mqMsg.setCreateTime(DateUtil.format(Calendar.getInstance().getTime(), DateExtUtil.dateStyle)); mqMsg.setThumb(thumb); return mqMsg; } @Override public ResultData rebuildScene(String num) { ScenePro scenePro = sceneProService.getByNum(num); //如果是v3场景,不允许重算,需要升级v4后再调此接口进行重算 if(Objects.nonNull(scenePro) && (Objects.isNull(scenePro.getIsUpgrade()) || scenePro.getIsUpgrade() != CommonStatus.YES.code().intValue())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5064); } ScenePlusVO scenePlusVO = null; ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num); if(Objects.isNull(scenePlus)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if(scenePlus.getSceneStatus() == 0){ throw new BusinessException(ErrorCode.FAILURE_CODE_5033); } ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId()); String path = scenePlusExt.getDataSource(); Integer sceneSource = scenePlus.getSceneSource(); String dataSource = scenePlusExt.getDataSource(); Long sceneUserId = scenePlus.getUserId(); String buildType = scenePlusExt.getBuildType(); Integer sceneStatus = scenePlus.getSceneStatus(); String webSite = scenePlusExt.getWebSite(); String thumb = scenePlusExt.getThumb(); Integer payStatus = scenePlus.getPayStatus(); Integer sceneScheme = scenePlusExt.getSceneScheme(); Long sceneId = scenePlus.getId(); String sceneName = scenePlus.getTitle(); Date createTime = scenePlus.getCreateTime(); String bucket = scenePlusExt.getYunFileBucket(); //重新计算时需要删除文件夹,否知使用缓存 FileUtils.delAllFile(path + File.separator + "results"); String fileId = path.split("/")[path.split("/").length - 2]; log.info("fileId:" + fileId); //获取解压后的资源的data.fdage中的数据 File folderPath = new File(path); if (fyunType.equals(FYunTypeEnum.AWS.code())) { fYunFileService.downloadFileByCommand(bucket, path + "/capture/", ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "")); } else { String dataFdageOssPath = ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "") + "/data.fdage"; fYunFileService.downloadFileByCommand(bucket, path + "/capture/data.fdage", dataFdageOssPath); } String data = FileUtils.readFile(folderPath.getAbsolutePath() + File.separator + "capture" + File.separator + "data.fdage"); com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(data); if(ObjectUtils.isEmpty(jsonObject)){ log.error("data.fdage文件不存在"); return ResultData.error(CameraConstant.FAILURE_6009.code(), CameraConstant.FAILURE_6009.message()); } String sceneUrl = mainUrl +"/"+sceneProNewUrl; //有points字段的是八目 String cameraName = jsonObject.getJSONObject("cam").getString("uuid"); String userName = null; if (!ObjectUtils.isEmpty(sceneUserId)) { SSOUser user = userService.getSSOUserByUserId(sceneUserId); userName = user.getUserName(); } //重算的场景,先移除该场景对应的容量 scenePlusService.resetSpace(num); JSONObject statusJson = new JSONObject(); //临时将-2改成1,app还没完全更新 statusJson.put("status", sceneStatus == -2 ? 1 : sceneStatus); statusJson.put("webSite", webSite); statusJson.put("sceneNum", num); statusJson.put("thumb", thumb); statusJson.put("payStatus", payStatus); String statusJsonLocalPath = ConstantFilePath.SCENE_PATH + "data/data" + num + File.separator + "status.json"; String statusJsonOssPath = String.format(UploadFilePath.DATA_VIEW_PATH, num) + "status.json"; FileUtils.writeFile(statusJsonLocalPath, statusJson.toString()); fYunFileService.uploadFile(bucket, statusJsonLocalPath, statusJsonOssPath); String unicode = jsonObject.getString("creator") + "_" + jsonObject.getString("uuidtime"); Long cameraType = (long)sceneScheme == 3 ? 12 : (long)sceneScheme; //判断是否转台相机 if(sceneSource == 3){ cameraType = 13L; } if(sceneSource == 4){ cameraType = 14L; } if(sceneSource == 4){ fdkkLaserService.updateSceneStatus(num,0); BuildSceneCallMessage buildSceneMqMessage =this.getBuildSceneMqMessage( num, cameraName, unicode, cameraType, fileId, dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, "") .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH,"")+ File.separator, "zip.Zip", "0", userName, jsonObject.getString("location") != null && "1".equals(jsonObject.getString("location")) ? "sfm" : "slam", jsonObject.getInteger("resolution"), buildType, ConstantFilePath.BUILD_MODEL_LASER_PATH + unicode, sceneId, sceneName, webSite, createTime, sceneUserId, dataSource, sceneStatus, payStatus, thumb); rabbitMqProducer.sendByWorkQueue(queueModelingPre, buildSceneMqMessage); }else{ BuildSceneCallMessage buildSceneMqMessage =this.getBuildSceneMqMessage( num, cameraName, unicode, cameraType, fileId, dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, "") .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH,"")+ File.separator, "zip.Zip", "0", userName, jsonObject.getString("location") != null && "1".equals(jsonObject.getString("location")) ? "sfm" : "slam", jsonObject.getInteger("resolution"), buildType, ConstantFilePath.BUILD_MODEL_PATH + unicode, sceneId, sceneName, webSite, createTime, sceneUserId, dataSource, sceneStatus, payStatus, thumb); rabbitMqProducer.sendByWorkQueue(queueModelingPre, buildSceneMqMessage); } scenePlusService.update(new LambdaUpdateWrapper() .set(ScenePlus::getSceneStatus, SceneStatus.wait.code()) .eq(ScenePlus::getNum, num)); return ResultData.ok(); } }