package com.fdkankan.scene.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; 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.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fdkankan.common.constant.*; import com.fdkankan.common.exception.BusinessException; import com.fdkankan.common.response.ResultData; import com.fdkankan.common.util.*; import com.fdkankan.platform.api.feign.client.PlatformClient; import com.fdkankan.platform.api.feign.vo.Camera; import com.fdkankan.scene.entity.*; import com.fdkankan.scene.mapper.ISceneProMapper; import com.fdkankan.scene.service.*; import com.fdkankan.scene.vo.SceneEditVO; import com.fdkankan.scene.vo.SceneProVO; import com.fdkankan.scene.vo.SceneVO; import lombok.extern.slf4j.Slf4j; import net.coobird.thumbnailator.Thumbnails; import org.joda.time.DateTime; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; import java.util.*; import java.util.stream.Collectors; /** *

* pro场景表 服务实现类 *

* * @author dengsixing * @since 2021-12-23 */ @Slf4j @Service public class SceneProServiceImpl extends ServiceImpl implements ISceneProService { @Value("${prefix.ali}") private String prefixAli; @Value("${oss.type}") private String type; @Value("${hot.domain.list}") private String hotDomainList; @Value("${hot.delete}") private String hotDelete; @Value("${main.url}") private String mainUrl; @Value("${scene.url}") private String sceneUrl; @Value("${scene.pro.url}") private String sceneProUrl; @Value("${scene.pro.new.url}") private String sceneProNewUrl; @Autowired @Qualifier("uploadToOssUtil") UploadToOssUtil uploadToOssUtil; @Autowired ISceneProExtService sceneProExtService; @Autowired ISceneProEditService sceneProEditService; @Autowired ISceneProEditExtService sceneProEditExtService; @Autowired ISceneService sceneService; @Autowired RedisUtil redisUtil; @Autowired ISceneDataDownloadService sceneDataDownloadService; @Override public List convert(List list){ List sceneVOS = list.parallelStream().map(scenePro -> { SceneVO sceneVo = new SceneVO(); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getProId()); BeanUtils.copyProperties(sceneProEditExt, sceneVo); BeanUtils.copyProperties(sceneProEdit, sceneVo); BeanUtils.copyProperties(scenePro, sceneVo); sceneVo.setCreateTime(DateUtil.format(scenePro.getCreateTime(), DateExtUtil.dateStyle4)); sceneVo.setCreateDate(scenePro.getCreateTime().getTime()); return sceneVo; }).collect(Collectors.toList()); return sceneVOS; } @Override public Long getSceneCount(Long cameraId) { return this.count(new QueryWrapper() .eq("camera_id", cameraId) .eq("tb_status",TbStatus.VALID.code()) .eq("rec_status",RecStatus.VALID.code()) .notIn("scene_type", SceneType.YJHZXNFY.code())); } @Override public ScenePro findBySceneNum(String sceneNum) { List list = this.list(new QueryWrapper() .eq("tb_status", TbStatus.VALID.code()) .eq("rec_status", RecStatus.VALID.code()) .eq("scene_code", sceneNum)); if(CollUtil.isEmpty(list)){ return null; } return list.get(0); } @Override public ScenePro findDeleteSceneBySceneNum(String sceneNum) { List list = this.list(new QueryWrapper() .eq("rec_status", RecStatus.DISABLE.code()) .eq("scene_code", sceneNum)); if(CollUtil.isEmpty(list)){ return null; } return list.get(0); } @Override public SceneProPO getSceneStatusByUnicode(String unicode, String recStatus) { return baseMapper.getSceneStatusByUnicode(unicode, recStatus); } @Override public List findByUserIdAndCameraType(Long userId, Integer cameraType) { return baseMapper.findByUserIdAndCameraType(userId, cameraType); } public List findByUserId(Long userId, List excludeNums) { return baseMapper.findByUserId(userId,excludeNums); } @Override public List findBySceneNums(List sceneCodeList, Integer cameraType) { return baseMapper.findBySceneNums(sceneCodeList, cameraType); } @Override public void updateStatus(String sceneNum, int sceneStatus) { List sceneProList = this.list(new QueryWrapper().eq("scene_code", sceneNum)); if(CollUtil.isEmpty(sceneProList)){ return ; } List proIds = sceneProList.stream().map(pro -> { return pro.getId(); }).collect(Collectors.toList()); sceneProExtService.update(new LambdaUpdateWrapper() .in(SceneProExt::getSceneProId, proIds) .set(SceneProExt::getSceneStatus, sceneStatus)); } @Override public ResultData resetUploadFloorJson(SceneEditVO sceneEdit) throws Exception{ if(StrUtil.isEmpty(sceneEdit.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneEdit.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); //更新scene.json文件 String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); }else { new File(dataBuffer.toString() + "scene.json").createNewFile(); } if(!StrUtil.isEmpty(sceneEdit.getSceneData())){ JSONObject sceneObject = JSONObject.parseObject(sceneEdit.getSceneData()); Set set =sceneObject.keySet(); for(String key : set){ scenejson.put(key, sceneObject.get(key)); } } SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); //重置将floorEditVer回归floorPublishVer sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorEditVer()); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); //更新scene.json文件 if(strsceneInfos!=null){ scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer()); scenejson.put("floorPublishVer", sceneProEdit.getFloorEditVer()); scenejson.put("cadInfo", sceneProEditExt.getCadInfo()); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); log.info("写入scene.json文件完成, sceneCode:{}", sceneEdit.getSceneNum()); } log.info("重置画墙重建模型版本成功"); return ResultData.ok(); } @Override public ResultData uploadFloorJson(SceneEditVO sceneEdit) throws Exception { String lockKey = String.format(RedisKey.LOCK_UPLOAD_FLOORJSON_REBUILD, sceneEdit.getSceneNum()); Boolean lock = redisUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR); if(!lock){ throw new BusinessException(ErrorCode.FAILURE_CODE_5036); } try { long start = System.currentTimeMillis(); log.info("画墙重建模型开始时间:" + start); if(StrUtil.isEmpty(sceneEdit.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneEdit.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); if(sceneProEdit == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } //更新scene.json文件 String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneEdit.getSceneNum() + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); }else { new File(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneEdit.getSceneNum() + File.separator + "scene.json").createNewFile(); } if(!StrUtil.isEmpty(sceneEdit.getSceneData())){ JSONObject sceneObject = JSONObject.parseObject(sceneEdit.getSceneData()); Set set =sceneObject.keySet(); for(String key : set){ scenejson.put(key, sceneObject.get(key)); } } //保存floor.json前端下次进入需要使用 if(StrUtil.isEmpty(sceneEdit.getWebFloor())){ sceneEdit.setWebFloor(sceneEdit.getFloor()); } //上传过模型只更新floor.json FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum() + File.separator + "floor.json", new String(sceneEdit.getWebFloor().getBytes(), "UTF-8")); //更新scene.json文件 if(strsceneInfos!=null) { scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer() + 1); scenejson.put("floorPublishVer", sceneProEdit.getFloorPublishVer()); FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum()+File.separator+"scene.json", scenejson.toString()); log.info("写入scene.json文件完成——"+sceneEdit.getSceneNum()); } //floorEditVer字段增加1 sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); String path = sceneProExt.getDataSource(); if(path != null && !"".equals(path) && path.startsWith("http")){ path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2]; } String target = path + "_edit"; File editPath = new File(target); if(!editPath.exists()){ editPath.mkdirs(); } //创建文件夹软连接并且复制data.json和project.json if(new File(target + File.separator + "capture").exists()){ new File(target + File.separator + "capture").delete(); } if(new File(target + File.separator + "caches").exists()){ //删除link new File(target + File.separator + "caches" + File.separator + "images").delete(); //删除所有文件 FileUtils.delAllFile(target + File.separator + "caches"); } if(new File(target + File.separator + "results").exists()){ FileUtils.delAllFile(target + File.separator + "results"); } //创建文件夹,并link文件夹 new File(target + File.separator + "caches").mkdirs(); CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture"); if(new File(path + File.separator + "caches" + File.separator + "images").exists()){ CreateObjUtil.createSoftConnection(path + File.separator + "caches" + File.separator + "images", target + File.separator + "caches" + File.separator + "images"); } FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true); FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true); //data.json增加extras为执行重建算法 String project = FileUtils.readFile(target + File.separator+"project.json"); if(project != null){ JSONObject projectJson = JSONObject.parseObject(project); projectJson.put("parent", projectJson.get("uuid")); projectJson.put("uuid", UUID.randomUUID().toString()); projectJson.put("time", System.currentTimeMillis()); FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString()); } String data = FileUtils.readFile(target + File.separator+"data.json"); if(data != null){ JSONObject floorplanJson = new JSONObject(); floorplanJson.put("has_floorplan_json", true); floorplanJson.put("has_vision_txt", true); JSONObject dataJson = JSONObject.parseObject(data); dataJson.put("extras", floorplanJson); //V5表示不需要生成high,low文件 dataJson.put("skybox_type", "SKYBOX_V5"); dataJson.put("split_type", "SPLIT_V4"); FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8")); } //文件上传的位置可以自定义 log.info("画墙重建模型开始"); File targetFile = new File(target + File.separator + "extras" + File.separator + "floorplan.json"); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } if(targetFile.exists()){ FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "floorplan.json"); } // 保存 FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floorplan.json", new String(sceneEdit.getFloor().getBytes(), "UTF-8")); FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum() + File.separator + "floor.json", new String(sceneEdit.getWebFloor().getBytes(), "UTF-8")); //下载vision.modeldata,解压成vision.txt,并且删除vision.modeldata log.info("下载vision.modeldata文件"); if("s3".equals(type)){ FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getSceneNum() + "/vision.modeldata" + "?m="+new Date().getTime(), "vision.modeldata", target + File.separator + "extras" + File.separator); } if("oss".equals(type)){ FileUtils.downLoadFromUrl(prefixAli + "images/images" + sceneEdit.getSceneNum() + "/vision.modeldata" + "?m="+new Date().getTime(), "vision.modeldata", target + File.separator + "extras" + File.separator); } CreateObjUtil.convertVisionmodeldataToTxt(target + File.separator + "extras" + File.separator + "vision.modeldata", target + File.separator + "extras" + File.separator + "vision.txt"); log.info("解压完成,删除vision.modeldata文件"); FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "vision.modeldata"); log.info("下载vision2.modeldata文件"); if("oss".equals(type)){ FileUtils.downLoadFromUrl(prefixAli + "images/images" + sceneEdit.getSceneNum() + "/vision2.modeldata" + "?m="+new Date().getTime(), "vision2.modeldata", target + File.separator + "extras" + File.separator); } if("s3".equals(type)){ FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getSceneNum() + "/vision2.modeldata" + "?m="+new Date().getTime(), "vision2.modeldata", target + File.separator + "extras" + File.separator); } CreateObjUtil.convertVisionmodeldataToTxt(target + File.separator + "extras" + File.separator + "vision2.modeldata", target + File.separator + "extras" + File.separator + "vision2.txt"); log.info("解压完成,删除vision2.modeldata文件"); FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "vision2.modeldata"); //重新计算算法 log.info("重新计算大场景:开始建模——"+sceneEdit.getSceneNum()); //判断V2还是V3 if("V2".equals(scenePro.getBuildType())){ CreateObjUtil.build3dModelOld(target , "1"); } if("V3".equals(scenePro.getBuildType())){ CreateObjUtil.build3dModel(target , "1"); } log.info("重新计算大场景:开始转换成lzma文件——"+sceneEdit.getSceneNum()); CreateObjUtil.convertTxtToDam( target + File.separator + "results" + File.separator+"tex"+ File.separator+"modeldata.txt", target + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k.dam"); CreateObjUtil.convertDamToLzma(target + File.separator + "results"); CreateObjUtil.convertTxtToDam( target + File.separator + "results" +File.separator+"tex"+ File.separator+"modeldata.txt", target + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k.dam"); File lzmaFile = new File(target + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma"); if(!lzmaFile.exists()) { log.info("lzam文件不存在——"+sceneEdit.getSceneNum()); Thread.sleep(3000); } File sceneFile = new File(ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneEdit.getSceneNum() + File.separator + ConstantFileName.modelUUID + "_50k_texture_jpg_high1"); if(!sceneFile.exists()) { log.info("high1文件夹不存在——"+sceneEdit.getSceneNum()); sceneFile.mkdirs(); } //将重新建模的tex里的文件和lzma文件复制到Message.filePath+"images"+File.separator+"images"+sceneNum下。 List list1 = FileUtils.readfileNamesForDirectory(target+File.separator+ "results" + File.separator +"tex",".jpg"); if(list1 == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } log.info("新生成的贴图有:——"+list1.size()); for(int i=0; i().eq(SceneProExt::getSceneProId, scenePro.getId())); //更新scene.json文件 String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneNum + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); }else { new File(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneNum + File.separator + "scene.json").createNewFile(); } String path = sceneProExt.getDataSource(); if(path != null && !"".equals(path) && path.startsWith("http")){ path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2]; } String target = path + "_ajk"; File editPath = new File(target); if(!editPath.exists()){ editPath.mkdirs(); } //创建文件夹软连接并且复制data.json和project.json if(new File(target + File.separator + "capture").exists()){ new File(target + File.separator + "capture").delete(); } if(new File(target + File.separator + "caches").exists()){ //删除link new File(target + File.separator + "caches" + File.separator + "images").delete(); //删除所有文件 FileUtils.delAllFile(target + File.separator + "caches"); } if(new File(target + File.separator + "results").exists()){ FileUtils.delAllFile(target + File.separator + "results"); } //创建文件夹,并link文件夹 new File(target + File.separator + "caches").mkdirs(); CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture"); if(new File(path + File.separator + "caches" + File.separator + "images").exists()){ CreateObjUtil.createSoftConnection(path + File.separator + "caches" + File.separator + "images", target + File.separator + "caches" + File.separator + "images"); } FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true); FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true); //data.json增加extras为执行重建算法 String project = FileUtils.readFile(target + File.separator+"project.json"); if(project != null){ JSONObject projectJson = JSONObject.parseObject(project); projectJson.put("parent", projectJson.get("uuid")); projectJson.put("uuid", UUID.randomUUID().toString()); projectJson.put("time", System.currentTimeMillis()); FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString()); } String data = FileUtils.readFile(target + File.separator+"data.json"); if(data != null){ JSONObject floorplanJson = new JSONObject(); floorplanJson.put("has_floor_ajk_json", true); floorplanJson.put("has_vision_txt", true); floorplanJson.put("has_floorplan_json", true); JSONObject dataJson = JSONObject.parseObject(data); dataJson.put("extras", floorplanJson); //V5表示不需要生成high,low文件 dataJson.put("skybox_type", "SKYBOX_V8"); dataJson.put("split_type", "SPLIT_V10"); FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8")); } //文件上传的位置可以自定义 log.info("画墙重建模型开始"); File targetFile = new File(target + File.separator + "extras" + File.separator + "floor_ajk.json"); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } if(targetFile.exists()){ FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "floor_ajk.json"); } // 保存 FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floorplan.json", new String(floorPlanJson.getBytes(), "UTF-8")); FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8")); FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8")); FileUtils.writeFile(target + File.separator + "extras" + File.separator + "vision.txt", new String(cameraJson.getBytes(), "UTF-8")); FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum + File.separator + "camera.json", new String(cameraJson.getBytes(), "UTF-8")); for(int i = 0; i < file.length; i ++){ File cadImg = new File(target + File.separator + "extras" + File.separator + "Floorplans/" + file[i].getOriginalFilename()); if(!cadImg.getParentFile().exists()){ cadImg.getParentFile().mkdirs(); } if(cadImg.exists()) { cadImg.delete(); } file[i].transferTo(cadImg); } //下载封面图 FileUtils.downLoadFromUrl(scenePro.getThumb() + "?t=" + System.currentTimeMillis(), "Cover.png", target + File.separator + "extras" + File.separator + "CoverImage"); //转换成jpg FileUtils.pngToJpg(target + File.separator + "extras" + File.separator + "CoverImage/Cover.png", target + File.separator + "extras" + File.separator + "CoverImage/Cover.jpg"); // FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "CoverImage/Cover.png"); //安居客算法运行 log.info("安居客算法:开始建模——"+sceneNum); CreateObjUtil.build3dModel(target , "1"); if(!new File(target + File.separator + "results" + File.separator + "upload.json").exists()){ return ResultData.error(ErrorCode.FAILURE_CODE_5042); } String zipPath = target + File.separator + "results/" + sceneNum + ".zip"; new File(zipPath).delete(); // FileUtils.zipFile(zipPath, target + File.separator + "results/ajk/"); String command = "bash /opt/ossutil/gzip.sh " + zipPath.replace(".zip", "") + " " + target + File.separator + "results/ajk/"; log.info("压缩文件:" + command); CreateObjUtil.callshell(command); if(!new File(zipPath).exists()){ return ResultData.error(ErrorCode.FAILURE_CODE_5043); } String fileMD5 = FileMd5Util.getFileMD5(new File(zipPath)); uploadToOssUtil.upload(zipPath, "data_download/" + sceneNum + ".zip"); SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(sceneNum); if(sceneDataDownload == null){ sceneDataDownload = new SceneDataDownload(); sceneDataDownload.setSceneCode(sceneNum); sceneDataDownload.setDownloadPath(prefixAli + "data_download/" + sceneNum + ".zip"); sceneDataDownload.setFileMd5(fileMD5); sceneDataDownloadService.save(sceneDataDownload); return ResultData.ok(); } sceneDataDownload.setFileMd5(fileMD5); sceneDataDownload.setUpdateTime(Calendar.getInstance().getTime()); sceneDataDownloadService.updateById(sceneDataDownload); }catch (Exception e){ log.error("画墙重建模型失败...", e); throw new BusinessException(ErrorCode.FAILURE_CODE_5039); }finally { redisUtil.unlock(lockKey, Thread.currentThread().getId()); } return ResultData.ok(); } @Override public ResultData addHotMediaInfo(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getType()) || StrUtil.isEmpty(base.getInfo())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String infoData = FileUtils.readFile(dataBuffer.toString() + "mediaInfo.json"); JSONArray medias = null; if(infoData != null){ medias= JSONArray.parseArray(infoData); } if(SceneEditType.ADD.code().equals(base.getType())){ JSONObject jo = JSONObject.parseObject(base.getInfo()); medias.add(jo); } // else if("1".equals(base.getType())){ // // for(int i=0;i-1) { FileUtils.deleteFile(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER + File.separator + strs[i]); } } } } else { file.mkdirs(); } String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap<>(); map.put("screencapLen", "0"); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); } String filePath = dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER+File.separator+ConstantFileName.SCREEN_CRP_DATAFILE+base.getIndex()+"json"; File file = new File(filePath); if(!file.exists()) { file.createNewFile(); } FileUtils.writeFile(filePath, base.getCamerasData()); return ResultData.ok(); } @Override public ResultData saveSceneKey(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getSceneKey())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); sceneProEdit.setSceneKey(base.getSceneKey()); sceneProEdit.setNeedKey(0); sceneProEdit.setVersion(sceneProEdit.getVersion() + 1); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); return ResultData.ok(); } @Override public ResultData saveFloorLogo(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getSize()) || StrUtil.isEmpty(base.getLogoType())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap(); map.put("floorLogo", base.getLogoType()); map.put("floorLogoSize", base.getSize()); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(); } @Override public ResultData saveBackgroundMusic(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getMusicName())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap(); map.put("bgMusic", base.getMusicName()); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(); } @Override public ResultData saveInitialPage(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getInitialPoint())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String path1 = imagesBuffer.toString() + "thumbBigImg.jpg"; String path2 = imagesBuffer.toString() + "thumbSmallImg.jpg"; //生成缩略图 //按指定大小把图片进行缩和放(会遵循原图高宽比例) //此处把图片压成1024×512的缩略图 Thumbnails.of(path1).size(1024,512).toFile(path2);//变为1024×512 String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap(); map.put("entry", JSONObject.parseObject(base.getInitialPoint())); map.put("thumbImg", 1); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(); } @Override public ResultData getScreencapVoice(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String sceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(sceneInfos!=null) { scenejson = JSONObject.parseObject(sceneInfos); } JSONObject result = new JSONObject(); String screencapVoiceFileName = ""; if(scenejson.containsKey("screencapVoiceFileName")) { screencapVoiceFileName = scenejson.getString("screencapVoiceFileName"); } String screencapVoiceSrc = ""; if(scenejson.containsKey("screencapVoiceSrc")) { screencapVoiceSrc = scenejson.getString("screencapVoiceSrc"); } if(!screencapVoiceFileName.trim().equals("")&&!screencapVoiceSrc.trim().equals("")&&screencapVoiceFileName.indexOf(".")>-1) { result.put("screencapVoiceFileName", screencapVoiceFileName); result.put("screencapVoiceSrc1", screencapVoiceSrc); result.put("screencapVoiceSrc2", "voice/voice"+base.getSceneNum()+"/201810" +screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf("."))); } return ResultData.ok(); } @Override public ResultData uploadScreencapVoiceNew(String sceneNum, String type, String fileName, MultipartFile file, String length, String replace) throws Exception{ if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if (!file.isEmpty()&& file.getSize() <= 0) { throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } //文件上传的位置可以自定义 String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum; File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } //获取文件名去掉后缀 String originalFileName = file.getOriginalFilename().substring(0, file.getOriginalFilename().indexOf(".") > 0 ? file.getOriginalFilename().indexOf(".") : file.getOriginalFilename().length()); log.info("上传的音频文件名:" + file.getOriginalFilename()); String soundFileName = "sound201810.wav"; String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } if("soundsync".equals(type) && !"1".equals(replace)){ synchronized(this){ if(scenejson.containsKey("screencapVoiceSoundsync") && !StrUtil.isEmpty(scenejson.getString("screencapVoiceSoundsync"))){ String target = ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSoundsync").substring( scenejson.getString("screencapVoiceSoundsync").indexOf("voice")); if(new File(target).exists()){ targetFile = new File(path + File.separator +soundFileName); if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + soundFileName); } file.transferTo(targetFile); FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + "newSound201810.mp3"); //目标文件改名 new File(target).renameTo(new File(path + File.separator + "oldSound201810.mp3")); //判断音频时长,不够拼接空白音效 double total = Double.parseDouble(length); double now = (FileUtils.getAudioPlayTime(new File(path + File.separator + "oldSound201810.mp3")) + FileUtils.getAudioPlayTime(new File(path + File.separator + "newSound201810.mp3"))) / 1000.0; if(total - now > 0.5){ CreateObjUtil.createMuteViode(total - now, path + File.separator + "muteSound.mp3"); if(new File(path + File.separator + "muteSound.mp3").exists()){ //需要将旧的音频改名 new File(path + File.separator + "oldSound201810.mp3").renameTo(new File(path + File.separator + "oldMuteSound201810.mp3")); log.info("生成新的静音音频和旧的音频合并"); CreateObjUtil.mergeVideo(path + File.separator + "oldMuteSound201810.mp3", path + File.separator + "muteSound.mp3", path + File.separator + "oldSound201810.mp3"); } } //app端和pc端名字不一致,统一文件名字 target = path + File.separator + originalFileName + ".mp3"; CreateObjUtil.mergeVideo(path + File.separator + "oldSound201810.mp3", path + File.separator + "newSound201810.mp3", target); //删除改名后的文件 // new File(path + File.separator + "oldSound201810.mp3").delete(); Map map = new HashMap(); map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3"); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName + ".mp3"; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("screencapVoiceType", type); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName + ".mp3"); } }else { targetFile = new File(path + File.separator +soundFileName); if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + soundFileName); } file.transferTo(targetFile); //判断音频时长,不够拼接空白音效 FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + "newSound201810.mp3"); double total = Double.parseDouble(length); double now = (FileUtils.getAudioPlayTime(new File(path + File.separator + "newSound201810.mp3"))) / 1000.0; log.info("前端传的时长:" + total); log.info("获取文件的时长:" + now); //同步录音前一段没空白,直接生成文件 if(total - now < 0.5){ FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + originalFileName + ".mp3"); Map map = new HashMap(); map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3"); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName + ".mp3"; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("screencapVoiceType", type); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(proVideo); } ////同步录音前一段有空白,生成一段静音后拼接文件 CreateObjUtil.createMuteViode(total - now, path + File.separator + "muteSound.mp3"); //app端和pc端名字不一致,统一文件名字 String target = path + File.separator + originalFileName + ".mp3"; CreateObjUtil.mergeVideo(path + File.separator + "muteSound.mp3", path + File.separator + "newSound201810.mp3", target); Map map = new HashMap(); map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3"); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName + ".mp3"; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("screencapVoiceType", type); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName + ".mp3"); } } } String name = "201810.wav"; targetFile = new File(path + File.separator +name); // 保存 synchronized(this){ if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + name); } file.transferTo(targetFile); } Map map = new HashMap(); if("soundsync".equals(type)){ FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName + ".mp3"); map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3"); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName + ".mp3"; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("version", scenejson.getIntValue("version")+1); map.put("screencapVoiceType", type); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(proVideo); } if("sound".equals(type)){ FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName + ".mp3"); map.put("screencapVoiceSoundFileName", originalFileName + ".mp3"); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName + ".mp3"; map.put("screencapVoiceSound", proVideo); map.put("uploadVoiceSound", 1); map.put("version", scenejson.getIntValue("version")+1); map.put("screencapVoiceType", type); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(proVideo); } FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator +"201810.mp3"); if(StrUtil.isEmpty(fileName)){ map.put("screencapVoiceFileName", originalFileName + ".mp3"); }else { map.put("screencapVoiceFileName", fileName); } String voiceSrc = "voice/voice"+sceneNum+"/"+"201810.mp3"; map.put("screencapVoiceSrc", voiceSrc); map.put("uploadVoiceSrc", 1); map.put("version", scenejson.getIntValue("version")+1); map.put("screencapVoiceType", type); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(voiceSrc); } @Override public ResultData uploadScreencapVoiceNewV3(String sceneNum, String type, String fileName, MultipartFile file, String length, String replace, String times, String index) throws Exception{ if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if (!file.isEmpty()&& file.getSize() <= 0) { throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } //文件上传的位置可以自定义 String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum; File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } String originalFileName = "sound201810.mp3"; String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } if("soundsync".equals(type) && !"1".equals(replace)){ //判断分房间模块文件夹是否存在 String partPath = path + File.separator + "part"; File partFile = new File(partPath); if(!partFile.exists()){ partFile.mkdirs(); } synchronized(this){ targetFile = new File(partPath + File.separator + fileName); if(targetFile.exists()) { FileUtils.deleteFile(partPath + File.separator + fileName); } file.transferTo(targetFile); } //获取总音频多少段,每段时长 String[] time = times.split(","); //遍历判断音频是否存在,不存在生成空白音效 for(int i = 0, len = time.length; i < len; i++){ if(!new File(partPath + File.separator + i + ".mp3").exists()){ //某部分文件不存在,直接生成一段静音后拼接文件 CreateObjUtil.createMuteViode(Double.valueOf(time[i]), partPath + File.separator + i + ".mp3"); } } //拼接所有音频文件 if(time.length > 2){ //若是多部分,两个两个合并,最后合成最终文件 for(int i = 1, len = time.length; i < len; i++){ if(i == 1){ CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + ".mp3", partPath + File.separator + i + ".mp3", partPath + File.separator + i + "muteSound.mp3"); }else if(i == len - 1){ CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3", path + File.separator + originalFileName); }else { CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3", partPath + File.separator + i + "muteSound.mp3"); } } }else { //若只有两部分,直接合并成最终文件 CreateObjUtil.mergeVideo(partPath + File.separator + "0.mp3", partPath + File.separator + "1.mp3", path + File.separator + originalFileName); } Map map = new HashMap(); map.put("screencapVoiceSoundsyncFileName", originalFileName); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("screencapVoiceType", type); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName); } String name = "201810.wav"; targetFile = new File(path + File.separator +name); // 保存 synchronized(this){ if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + name); } file.transferTo(targetFile); } Map map = new HashMap(); if("soundsync".equals(type)){ FileUtils.delAllFile(path + File.separator + "part"); //判断分房间模块文件夹是否存在 String partPath = path + File.separator + "part"; File partFile = new File(partPath); if(!partFile.exists()){ partFile.mkdirs(); } //保存0.mp3文件到part FileUtils.copyFile(path + File.separator +name, partPath + File.separator + fileName, true); FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName); map.put("screencapVoiceSoundsyncFileName", originalFileName); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("version", scenejson.getIntValue("version")+1); map.put("screencapVoiceType", type); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(proVideo); } FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator +"201810.mp3"); map.put("screencapVoiceFileName", file.getOriginalFilename()); String voiceSrc = "voice/voice"+sceneNum+"/"+"201810.mp3"; map.put("screencapVoiceSrc", voiceSrc); map.put("uploadVoiceSrc", 1); map.put("version", scenejson.getIntValue("version")+1); map.put("screencapVoiceType", type); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok(voiceSrc); } @Override public ResultData deleteScreencapVoicePart(String sceneNum, String fileName, String times, String index) throws Exception { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } //文件上传的位置可以自定义 String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum; File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } String originalFileName = "sound201810.mp3"; log.info("上传的音频文件名:" + originalFileName); String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } //判断分房间模块文件夹是否存在 String partPath = path + File.separator + "part"; File partFile = new File(partPath); if(!partFile.exists()){ partFile.mkdirs(); } //删除指定部分音频文件 FileUtils.deleteFile(partPath + File.separator + index + ".mp3"); //获取总音频多少段,每段时长 String[] time = times.split(","); //修改删除的部分视频后面部分音频名字,如删除1.MP3,则将2.mp3修改成1.mp3,往后以此类推 if(Integer.parseInt(index) < time.length) { for(int i = 0, len = time.length - Integer.parseInt(index); i < len; i++){ if(new File(partPath + File.separator + (Integer.parseInt(index) + 1 + i) + ".mp3").exists()){ FileUtils.copyFile(partPath + File.separator + (Integer.parseInt(index) + 1 + i) + ".mp3", partPath + File.separator + (Integer.parseInt(index) + i) + ".mp3", true); } } } //遍历判断音频是否存在,不存在生成空白音效 for(int i = 0, len = time.length; i < len; i++){ if(!new File(partPath + File.separator + i + ".mp3").exists()){ //某部分文件不存在,直接生成一段静音后拼接文件 CreateObjUtil.createMuteViode(Double.valueOf(time[i]), partPath + File.separator + i + ".mp3"); } } //拼接所有音频文件 if(time.length > 2){ //若是多部分,两个两个合并,最后合成最终文件 for(int i = 1, len = time.length; i < len; i++){ if(i == 1){ // FileUtils.deleteFile(partPath + File.separator + i + "muteSound.mp3"); CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + ".mp3", partPath + File.separator + i + ".mp3", partPath + File.separator + i + "muteSound.mp3"); }else if(i == len - 1){ CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3", path + File.separator + originalFileName); }else { CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3", partPath + File.separator + i + "muteSound.mp3"); } } }else if(time.length == 2){ //若只有两部分,直接合并成最终文件 CreateObjUtil.mergeVideo(partPath + File.separator + "0.mp3", partPath + File.separator + "1.mp3", path + File.separator + originalFileName); }else { FileUtils.copyFile(partPath + File.separator + "0.mp3", path + File.separator + originalFileName, true); } Map map = new HashMap(); map.put("screencapVoiceSoundsyncFileName", originalFileName); String proVideo = "voice/voice"+sceneNum+"/"+originalFileName; map.put("screencapVoiceSoundsync", proVideo); map.put("uploadVoiceSoundsync", 1); map.put("screencapVoiceType", "soundsync"); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map); return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName); } @Override public ResultData deleteScreencapVoice(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } String scenePath = ConstantFilePath.SCENE_PATH+ "data" + File.separator+"data"+base.getSceneNum()+File.separator+"scene.json"; String str = FileUtils.readFile(scenePath); JSONObject json = new JSONObject(); if(str!=null){ json = JSONObject.parseObject(str); } else{ File file = new File(scenePath); if(!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } if(!file.exists()) { file.createNewFile(); } } log.info("type:" + base.getType()); if("soundsync".equals(base.getType())){ FileUtils.deleteFile(ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSoundsync")); json.put("screencapVoiceSoundsyncFileName", ""); json.put("screencapVoiceSoundsync", ""); json.put("version", json.getIntValue("version")+1); FileUtils.deleteFile(scenePath); FileUtils.writeFile(scenePath, json.toString()); return ResultData.ok(); } if("sound".equals(base.getType())){ FileUtils.deleteFile(ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSound")); json.put("screencapVoiceSoundFileName", ""); json.put("screencapVoiceSound", ""); json.put("version", json.getIntValue("version")+1); FileUtils.deleteFile(scenePath); FileUtils.writeFile(scenePath, json.toString()); return ResultData.ok(); } String path = ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSrc"); log.info("path:" + ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSrc")); FileUtils.deleteFile(path); json.put("screencapVoiceFileName", ""); json.put("screencapVoiceSrc", ""); json.put("version", json.getIntValue("version")+1); log.info("scenePath:" + scenePath); FileUtils.deleteFile(scenePath); FileUtils.writeFile(scenePath, json.toString()); return ResultData.ok(); } @Override public ResultData deleteScreencap(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String capPath = dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER; File file1 = new File(capPath); String[] strs = file1.list(); //删除screenCap对应的json数据 if(strs!=null) { for(int i=0;i-1) { FileUtils.deleteFile(capPath+File.separator+strs[i]); } } } String imgPath = imagesBuffer.toString() + ConstantFileName.TOURLIST_FOLDER; String tourListPath = dataBuffer.toString() + ConstantFileName.TOUR_LIST; String tourList = FileUtils.readFile(tourListPath); JSONArray tourJsons = new JSONArray(); if(tourList!=null) { tourJsons = JSONArray.parseArray(tourList); } for(int i=0;i map = new HashMap<>(); map.put("screencapLen", 0); map.put("uploadTourList", 1); map.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(); } @Override public ResultData saveTourList(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getTourList()) || StrUtil.isEmpty(base.getScreencapLen())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); log.info("editScene/saveTourList:生成tourList.json文件"); String tourListPath = dataBuffer.toString() + ConstantFileName.TOUR_LIST; FileUtils.writeFile(tourListPath, base.getTourList()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap<>(); map.put("screencapLen", String.valueOf(base.getScreencapLen())); map.put("uploadTourList", 1); map.put("version", scenejson.getIntValue("version")+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(); } @Override public ResultData saveSceneInfo(SceneEditVO base) throws Exception{ if(StrUtil.isEmpty(base.getSceneNum())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(base.getSceneNum()); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); int type = Integer.valueOf(base.getSceneType()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } //上传七牛 Map map = new HashMap<>(); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); //处理漫游数据 this.dealTour(base, scenejson, map, dataBuffer, imagesBuffer); //判断scene.json是否有uploadVoiceSrc上传普通版音频 if(scenejson.containsKey("uploadVoiceSrc") && scenejson.getIntValue("uploadVoiceSrc") == 1) { String screencapVoiceFileName = ""; if(scenejson.containsKey("screencapVoiceFileName")) { screencapVoiceFileName = scenejson.getString("screencapVoiceFileName"); } String screencapVoiceSrc = ""; if(scenejson.containsKey("screencapVoiceSrc")) { screencapVoiceSrc = scenejson.getString("screencapVoiceSrc"); } if(screencapVoiceFileName.indexOf(".")>-1) { String fileName = "201810" + screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf(".")); String path = ConstantFilePath.SCENE_PATH + "voice" + File.separator+"voice"+base.getSceneNum()+File.separator+fileName; map.put(path, "voice/voice"+base.getSceneNum()+"/201810" +screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf("."))); } sceneProEdit.setScreencapVoiceSrc(screencapVoiceSrc); } //判断scene.json是否有uploadVoiceSound上传专业版音频 if(scenejson.containsKey("uploadVoiceSound") && scenejson.getIntValue("uploadVoiceSound") == 1){ if(!StrUtil.isEmpty(scenejson.getString("screencapVoiceSound"))){ map.put(ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSound"), scenejson.getString("screencapVoiceSound")); } sceneProEdit.setScreencapVoiceSound(scenejson.getString("screencapVoiceSound")); } if(scenejson.containsKey("uploadVoiceSoundsync") && scenejson.getIntValue("uploadVoiceSoundsync") == 1){ if(!StrUtil.isEmpty(scenejson.getString("screencapVoiceSoundsync"))){ map.put(ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSoundsync"), scenejson.getString("screencapVoiceSoundsync")); } sceneProEdit.setScreencapVoiceSoundsync(scenejson.getString("screencapVoiceSoundsync")); } if(base.getScreencapVoiceType() != null){ scenejson.put("screencapVoiceType", base.getScreencapVoiceType()); sceneProEdit.setScreencapVoiceType(base.getScreencapVoiceType()); } if(!StrUtil.isEmpty(base.getCapData())){ FileUtils.writeFile(dataBuffer.toString() + "capData.json", new String(base.getCapData().getBytes(), "UTF-8")); scenejson.put("capData", dataBuf.toString() + "capData.json"); } if(!StrUtil.isEmpty(base.getFrameData())){ FileUtils.writeFile(dataBuffer.toString() + "frameData.json", new String(base.getFrameData().getBytes(), "UTF-8")); scenejson.put("frameData", dataBuf.toString() + "frameData.json"); } if(!StrUtil.isEmpty(base.getPlayData())){ FileUtils.writeFile(dataBuffer.toString() + "playData.json", new String(base.getPlayData().getBytes(), "UTF-8")); scenejson.put("playData", dataBuf.toString() + "playData.json"); sceneProEdit.setPlayData(dataBuf.toString() + "playData.json"); map.put(dataBuffer.toString() + "playData.json", dataBuf.toString() + "playData.json"); } if(!StrUtil.isEmpty(base.getScreencapThumb())){ FileUtils.writeFile(dataBuffer.toString() + "screencapThumb.json", new String(base.getScreencapThumb().getBytes(), "UTF-8")); scenejson.put("screencapThumb", dataBuf.toString() + "screencapThumb.json"); sceneProEdit.setScreencapThumb(dataBuf.toString() + "screencapThumb.json"); map.put(dataBuffer.toString() + "screencapThumb.json", dataBuf.toString() + "screencapThumb.json"); } if(!StrUtil.isEmpty(base.getRecordType())){ scenejson.put("recordType", base.getRecordType()); } if(!StrUtil.isEmpty(base.getMapVisi())){ scenejson.put("mapVisi", Integer.parseInt(base.getMapVisi())); sceneProEditExt.setMapVisi(Integer.parseInt(base.getMapVisi())); } if(!StrUtil.isEmpty(base.getTourVisi())){ scenejson.put("tourVisi", Integer.parseInt(base.getTourVisi())); sceneProEditExt.setTourVisi(Integer.parseInt(base.getTourVisi())); } if(!StrUtil.isEmpty(base.getVrVisi())){ scenejson.put("vrVisi", Integer.parseInt(base.getVrVisi())); sceneProEditExt.setVrVisi(Integer.parseInt(base.getVrVisi())); } if(!StrUtil.isEmpty(base.getRulerVisi())){ scenejson.put("rulerVisi", Integer.parseInt(base.getRulerVisi())); sceneProEditExt.setRulerVisi(Integer.parseInt(base.getRulerVisi())); } if(!StrUtil.isEmpty(base.getCadImgVisi())){ scenejson.put("cadImgVisi", Integer.parseInt(base.getCadImgVisi())); sceneProEditExt.setCadImgVisi(Integer.parseInt(base.getCadImgVisi())); } if(!StrUtil.isEmpty(base.getPanoVisi())){ scenejson.put("panoVisi", Integer.parseInt(base.getPanoVisi())); sceneProEditExt.setPanoVisi(Integer.parseInt(base.getPanoVisi())); } if(!StrUtil.isEmpty(base.getM2dVisi())){ scenejson.put("m2dVisi", Integer.parseInt(base.getM2dVisi())); sceneProEditExt.setM2dVisi(Integer.parseInt(base.getM2dVisi())); } if(!StrUtil.isEmpty(base.getM3dVisi())){ scenejson.put("m3dVisi", Integer.parseInt(base.getM3dVisi())); sceneProEditExt.setM3dVisi(Integer.parseInt(base.getM3dVisi())); } if(!StrUtil.isEmpty(base.getMeasureVisi())){ scenejson.put("measureVisi", Integer.parseInt(base.getMeasureVisi())); sceneProEditExt.setMeasureVisi(Integer.parseInt(base.getMeasureVisi())); } if(!StrUtil.isEmpty(base.getFloorPlanAngle())){ scenejson.put("floorPlanAngle", base.getFloorPlanAngle()); sceneProEditExt.setFloorPlanAngle(base.getFloorPlanAngle()); } if(scenejson.containsKey("uploadFloorPlanPng") && scenejson.getIntValue("uploadFloorPlanPng") == 1){ JSONArray floorPlanPngStr = new JSONArray(); JSONArray floorPlanPng = new JSONArray(); switch (scenePro.getBuildType()){ case "V2": floorPlanPng.add(scenejson.getString("floorPlanPng")); break; case "V3": try { floorPlanPng = scenejson.getJSONArray("floorPlanPng"); } catch (Exception e) { // 旧的V3也是String floorPlanPng.add(scenejson.getString("floorPlanPng")); } break; } scenejson.put("uploadFloorPlanPng", 0); for(int i = 0, len = floorPlanPng.size(); i < len; i++){ map.put(ConstantFilePath.SCENE_PATH+floorPlanPng.getString(i), floorPlanPng.getString(i)); floorPlanPngStr.add(floorPlanPng.getString(i) + "?t=" + System.currentTimeMillis()); } sceneProEditExt.setFloorPlanPng(floorPlanPngStr.toJSONString()); } if(scenejson.containsKey("uploadFloorJson") && scenejson.getIntValue("uploadFloorJson") == 1){ map.put(dataBuffer.toString() + "floor.json", dataBuf.toString() + "floor.json"); scenejson.put("uploadFloorJson", 0); } if(StrUtil.isNotEmpty(base.getEntry())) { //上传七牛 map.put(imagesBuffer.toString() + "thumbBigImg.jpg", imagesBuf.toString() + "thumbBigImg.jpg"); map.put(imagesBuffer.toString() + "thumbFishBigImg.jpg",imagesBuf.toString() + "thumbFishBigImg.jpg"); map.put(imagesBuffer.toString() + "thumbSmallImg.jpg", imagesBuf.toString() + "thumbSmallImg.jpg"); map.put(imagesBuffer.toString() + "smallPic.jpg", imagesBuf.toString() + "smallPic.jpg"); sceneProEdit.setEntry(base.getEntry()); scenejson.put("entry", base.getEntry()); if(scenejson.containsKey("thumbImg")) { sceneProEdit.setThumbStatus(scenejson.getIntValue("thumbImg")); } if(sceneProEdit.getThumbStatus() == 1) { scenePro.setThumb(prefixAli + imagesBuf.toString() + "thumbSmallImg.jpg"); if("s3".equals(this.type)){ scenePro.setThumb(ConstantUrl.PREFIX_AWS + imagesBuf.toString() + "thumbSmallImg.jpg"); } } } if(base.getHotFlag() != null && "1".equals(base.getHotFlag())) { String str = FileUtils.readFile(dataBuffer.toString() + "hot.json"); JSONArray jsonhots = new JSONArray(); if(str != null&&!str.trim().equals("")) { jsonhots = JSONArray.parseArray(str); } String hotsids = ""; for(int i=0;i 0){ FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true); FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true); //data.json增加extras为执行重建算法 String data = FileUtils.readFile(target + File.separator+"data.json"); if(data != null){ JSONObject floorplanJson = new JSONObject(); floorplanJson.put("has_source_images", true); floorplanJson.put("has_vision_txt", true); JSONObject dataJson = JSONObject.parseObject(data); dataJson.put("extras", floorplanJson); //V5表示不需要生成high,low文件 dataJson.put("skybox_type", "SKYBOX_V6"); if(scenePro.getSceneScheme() == 11){ dataJson.put("skybox_type", "SKYBOX_V7"); } dataJson.put("split_type", "SPLIT_V8"); //sceneScheme为3切成瓦片图 if(scenePro.getSceneScheme() == 3){ dataJson.put("skybox_type", "SKYBOX_V4"); } FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8")); } //创建文件夹软连接并且复制data.json和project.json if(new File(target + File.separator + "capture").exists()){ new File(target + File.separator + "capture").delete(); } if(new File(target + File.separator + "results").exists()){ FileUtils.delAllFile(target + File.separator + "results"); } //下载data.fdage if("s3".equals(this.type)){ //亚马逊保持旧方式,超链接capture CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture"); } CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") + "/data.fdage", target + File.separator + "capture/"); CreateObjUtil.build3dModel(target , "1"); //读取upload文件,检验需要上传的文件是否存在 String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json"); JSONObject uploadJson = null; JSONArray array = null; if(uploadData!=null) { uploadJson = JSONObject.parseObject(uploadData); array = uploadJson.getJSONArray("upload"); } if(array == null){ throw new Exception("upload.json数据出错"); } JSONObject fileJson = null; String fileName = ""; for(int i = 0, len = array.size(); i < len; i++){ fileJson = array.getJSONObject(i); fileName = fileJson.getString("file"); //文件不存在抛出异常 if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){ throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在"); } //high文件夹 if(fileJson.getIntValue("clazz") == 3){ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+"/pan/high/"+ fileName.replace("high/", "")); continue; } //low文件夹 if(fileJson.getIntValue("clazz") == 4){ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+"/pan/low/"+ fileName.replace("low/", "")); continue; } //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图 if(fileJson.getIntValue("clazz") == 5){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ File.separator + fileName); continue; } //tiles文件夹,亚马逊瓦片图 if(fileJson.getIntValue("clazz") == 7 ){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ File.separator + fileName); continue; } } for(String imagesName : images.list()){ //覆盖原始图片资源 FileUtils.copyFile(target + File.separator + "extras/images/" + imagesName, path + File.separator + "caches/images/" + imagesName, true); FileUtils.deleteFile(target + File.separator + "extras/images/" + imagesName); } } if(video.exists() && video.listFiles() != null && video.listFiles().length > 0){ for(String videoName : video.list()){ uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,"video/video"+ scenePro.getSceneCode()+ File.separator + videoName); CreateObjUtil.mp4ToFlv(target + File.separator + "extras/video/" + videoName, target + File.separator + "extras/video/" + videoName.replace("mp4", "flv")); uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"),"video/video"+ scenePro.getSceneCode()+ File.separator + videoName.replace("mp4", "flv")); //覆盖原始视频资源 FileUtils.copyFile(target + File.separator + "extras/video/" + videoName, path + File.separator + "caches/videos/" + videoName, true); } FileUtils.deleteDirectory(target + File.separator + "extras/video/"); } }else if(scenejson.getIntValue("buildImages") == 2){ if(video.exists() && video.listFiles() != null && video.listFiles().length > 0){ for(String videoName : video.list()){ uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,"video/video"+ scenePro.getSceneCode()+ File.separator + videoName); CreateObjUtil.mp4ToFlv(target + File.separator + "extras/video/" + videoName, target + File.separator + "extras/video/" + videoName.replace("mp4", "flv")); uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"),"video/video"+ scenePro.getSceneCode()+ File.separator + videoName.replace("mp4", "flv")); //覆盖原始视频资源 FileUtils.copyFile(target + File.separator + "extras/video/" + videoName, path + File.separator + "caches/videos/" + videoName, true); } FileUtils.deleteDirectory(target + File.separator + "extras/video/"); } } scenejson.put("imagesVersion", sceneProEditExt.getImagesVersion() + 1); scenejson.put("buildImages", 0); sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1); } if(scenejson.containsKey("uploadBgMusic") && scenejson.getIntValue("uploadBgMusic") == 1){ if(StrUtil.isNotEmpty(scenejson.getString("bgMusicName"))){ map.put(imagesBuffer.toString() + scenejson.getString("bgMusicName"), imagesBuf.toString() + scenejson.getString("bgMusicName")); } scenejson.put("uploadBgMusic", 0); sceneProEditExt.setBgMusicName(scenejson.getString("bgMusicName")); } if(scenejson.containsKey("uploadPanoramaImg") && scenejson.getIntValue("uploadPanoramaImg") == 1){ String targetPath = ConstantFilePath.SCENE_PATH + "images/images" + base.getSceneNum() + "/panorama"; for(File targetFile : new File(targetPath).listFiles()){ if(targetFile.isDirectory()){ String target = targetFile.getAbsolutePath(); String sid = target.substring(target.lastIndexOf(File.separator) + 1); //读取upload文件,检验需要上传的文件是否存在 String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json"); JSONObject uploadJson = null; JSONArray array = null; if(uploadData!=null) { uploadJson = JSONObject.parseObject(uploadData); array = uploadJson.getJSONArray("upload"); } if(array == null){ continue; } JSONObject fileJson = null; String fileName = ""; for(int i = 0, len = array.size(); i < len; i++){ fileJson = array.getJSONObject(i); fileName = fileJson.getString("file"); //文件不存在抛出异常 if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){ throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在"); } //high文件夹 if(fileJson.getIntValue("clazz") == 3){ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+"/panorama/" + sid + "/pan/high/"+ fileName.replace("high/", "")); continue; } //low文件夹 if(fileJson.getIntValue("clazz") == 4){ map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+"/panorama/" + sid + "/pan/low/"+ fileName.replace("low/", "")); continue; } //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图 if(fileJson.getIntValue("clazz") == 5){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ "/panorama/" + sid + File.separator + fileName); continue; } //tiles文件夹,亚马逊瓦片图 if(fileJson.getIntValue("clazz") == 7 ){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ File.separator + fileName); continue; } } } } scenejson.put("uploadPanoramaImg", 0); } if(scenejson.containsKey("uploadPanoramaJson") && scenejson.getIntValue("uploadPanoramaJson") == 1){ scenejson.put("uploadPanoramaJson", 0); map.put(dataBuffer.toString() + "link-scene.json", dataBuf.toString() + "link-scene.json"); sceneProEditExt.setJumpScene(scenejson.getBooleanValue("jumpScene")); } log.info("scene.json路径:" + dataBuffer.toString() + "scene.json"); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); if(map.size()>0) { uploadToOssUtil.uploadMulFiles(map); } scenePro.setUpdateTime(Calendar.getInstance().getTime()); this.updateById(scenePro); sceneProExt.setUpdateTime(Calendar.getInstance().getTime()); sceneProExtService.updateById(sceneProExt); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditExtService.updateById(sceneProEditExt); return ResultData.ok(); } @Override // @SystemServiceLog(description = "上传场景的热点媒体文件") public ResultData uploadHotMedia(String sceneNum, MultipartFile file, String sid) throws Exception { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } String fileName = "hot" + sid + ".mp4"; if (!file.isEmpty()){ String path = ConstantFilePath.SCENE_PATH + "images" + File.separator + "images" + sceneNum; File targetFile = new File(path); if (!targetFile.exists()){ targetFile.mkdirs(); } targetFile = new File(path + File.separator + fileName); if (targetFile.exists()){ FileUtils.deleteFile(path + File.separator + fileName); } file.transferTo(targetFile); if(targetFile.exists()){ FileUtils.executeCodecs(path + File.separator + fileName, path, "hot" + sid + "-cut"); } } return ResultData.ok(fileName); } @Override // @SystemServiceLog(description = "保存场景热点") public ResultData saveHot(SceneEditVO base) throws Exception { if(StrUtil.isEmpty(base.getType())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } String sid = base.getSid(); ScenePro scenePro = findBySceneNum(base.getSceneNum()); if (scenePro == null ) { return ResultData.error(ErrorCode.FAILURE_CODE_5005); } JSONObject jsonhot = JSONObject.parseObject(base.getHotData()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String str = FileUtils.readFile(dataBuffer.toString() + "hot.json"); JSONArray jsonhots = null; if (StrUtil.isNotEmpty(str)) { jsonhots = JSONArray.parseArray(str); }else { File file = new File(dataBuffer.toString() + "hot.json"); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } if(!file.exists()){ file.createNewFile(); } jsonhots = new JSONArray(); } //添加或者修改 if("1".equals(base.getType())){ sid = jsonhot.getString("sid"); if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } jsonhots.add(jsonhot); } else if("0".equals(base.getType())){ sid = jsonhot.getString("sid"); if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } } else if("-1".equals(base.getType())){ if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } } //判断是否需要删除自定义热点样式 String[] styles = null; if(StrUtil.isNotEmpty(base.getStyleName())){ styles = base.getStyleName().split(","); } for(int i=0;i0){ scenejson.put("hots", 1); } else{ scenejson.put("hots", 0); } if(!StrUtil.isEmpty(base.getCapData())){ FileUtils.writeFile(dataBuffer.toString() + "capData.json", new String(base.getCapData().getBytes(), "UTF-8")); scenejson.put("capData", dataBuf.toString() + "capData.json"); } if(!StrUtil.isEmpty(base.getFrameData())){ FileUtils.writeFile(dataBuffer.toString() + "frameData.json", new String(base.getFrameData().getBytes(), "UTF-8")); scenejson.put("frameData", dataBuf.toString() + "frameData.json"); } if(!StrUtil.isEmpty(base.getPlayData())){ FileUtils.writeFile(dataBuffer.toString() + "playData.json", new String(base.getPlayData().getBytes(), "UTF-8")); scenejson.put("playData", dataBuf.toString() + "playData.json"); } if(!StrUtil.isEmpty(base.getScreencapThumb())){ FileUtils.writeFile(dataBuffer.toString() + "screencapThumb.json", new String(base.getScreencapThumb().getBytes(), "UTF-8")); scenejson.put("screencapThumb", dataBuf.toString() + "screencapThumb.json"); } scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); return ResultData.ok(); } @Override // @SystemServiceLog(description = "保存场景热点") public ResultData saveShopHot(SceneEditVO base) throws Exception { if(StrUtil.isEmpty(base.getType())){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } String fileName = "shopHot.json"; String sid = base.getSid(); ScenePro scenePro = findBySceneNum(base.getSceneNum()); if (scenePro == null ) { return ResultData.error(ErrorCode.FAILURE_CODE_5005); } JSONObject jsonhot = JSONObject.parseObject(base.getHotData()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String str = FileUtils.readFile(dataBuffer.toString() + fileName); JSONArray jsonhots = null; if (StrUtil.isNotEmpty(str)) { jsonhots = JSONArray.parseArray(str); }else { File file = new File(dataBuffer.toString() + fileName); if(!file.getParentFile().exists()){ file.getParentFile().mkdirs(); } if(!file.exists()){ file.createNewFile(); } jsonhots = new JSONArray(); } //添加或者修改 if("1".equals(base.getType())){ sid = jsonhot.getString("sid"); if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } jsonhots.add(jsonhot); } else if("0".equals(base.getType())){ sid = jsonhot.getString("sid"); if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } } else if("-1".equals(base.getType())){ if(StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } } for(int i=0;i 0) { //文件上传的位置可以自定义 System.out.println("上传分享的logo"); String path = imagesBuffer.toString(); File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } fileName = file.getOriginalFilename(); targetFile = new File(path + fileName); int count = 1; // 保存 synchronized(this) { file.transferTo(targetFile); } SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); Map map = new HashMap<>(); map.put("shareLogo", imagesBuf.toString() + fileName); map.put("version", sceneProEdit.getVersion()+1); FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); sceneProEdit.setShareLogo(imagesBuf.toString() + fileName); sceneProEdit.setVersion(sceneProEdit.getVersion()+1); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); if("V2".equals(scenePro.getBuildType())){ MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getSceneCode(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+".png", path + File.separator + fileName); MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getSceneCode() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+"_en.png", path + File.separator + fileName); } if("V3".equals(scenePro.getBuildType())){ MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getSceneCode(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+".png", path + File.separator + fileName); MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getSceneCode() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+"_en.png", path + File.separator + fileName); } } return ResultData.ok(imagesBuf.toString() + fileName); } @Override public ResultData uploadPic(String sceneNum, String folderName, MultipartFile file, String toOss) throws Exception{ if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if (file.isEmpty() && file.getSize() <= 0) { throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } //文件上传的位置可以自定义 String path = ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum; if(StrUtil.isNotEmpty(folderName)) { path = path+File.separator + folderName; } File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } String fileName = file.getOriginalFilename(); targetFile = new File(path + File.separator + fileName); // 保存 synchronized(this) { if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + fileName); } file.transferTo(targetFile); } if(toOss != null && "1".equals(toOss)){ uploadToOssUtil.upload(path + File.separator + fileName, "images"+File.separator+"images"+sceneNum + File.separator + fileName); } return ResultData.ok(targetFile.getName()); } @Override public ResultData uploadHotJsonToOss(String sceneNum) throws Exception { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } String path = ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum; uploadToOssUtil.upload(path + File.separator + "hot.json", "data"+File.separator+"data"+sceneNum + File.separator + "hot.json"); return ResultData.ok(); } @Override public ResultData deleteOss(String filePath) throws Exception { uploadToOssUtil.deleteFile(filePath); return ResultData.ok(); } @Override public ResultData uploadFloorplanPng(String sceneNum, MultipartFile[] file, String cadInfo) throws Exception{ if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if (file.length <= 0) { throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); //文件上传的位置可以自定义 String path = ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum; File targetFile = new File(path); if (!targetFile.exists()) { targetFile.mkdirs(); } String fileName = ""; JSONArray floorPlanPngArr = new JSONArray(); for (MultipartFile multipartFile : file) { fileName = multipartFile.getOriginalFilename(); targetFile = new File(path + File.separator + fileName); // 保存 synchronized(this) { if(targetFile.exists()) { FileUtils.deleteFile(path + File.separator + fileName); } multipartFile.transferTo(targetFile); } floorPlanPngArr.add("images"+File.separator+"images"+sceneNum + File.separator + fileName); } String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } Map map = new HashMap<>(); map.put("floorPlanPng", floorPlanPngArr); map.put("uploadFloorPlanPng", 1); map.put("version", scenejson.getIntValue("version")+1); if(StrUtil.isNotEmpty(cadInfo)){ map.put("cadInfo", cadInfo); } FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map); return ResultData.ok(floorPlanPngArr); } @Override public void updateTime(String sceneNum, Long space, int payStatus, String videos, long computeTime) { List list = this.list(new LambdaQueryWrapper().eq(ScenePro::getSceneCode, sceneNum)); if(CollUtil.isEmpty(list)) return; this.update(new LambdaUpdateWrapper() .eq(ScenePro::getSceneCode, sceneNum) .set(ScenePro::getCreateTime, Calendar.getInstance().getTime()) .set(ScenePro::getUpdateTime, Calendar.getInstance().getTime()) .set(ScenePro::getVideos, videos)); //修改场景状态 空间 支付状态 计算时间 List sceneProIds = list.stream().map(scenePro -> { return scenePro.getId(); }).collect(Collectors.toList()); sceneProExtService.update(new LambdaUpdateWrapper() .eq(SceneProExt::getSceneProId, sceneProIds) .set(SceneProExt::getSceneStatus, SceneStatus.NO_DISPLAY.code()) .set(SceneProExt::getSpace, space) .set(SceneProExt::getPayStatus, payStatus) .set(SceneProExt::getComputeTime, computeTime)); } @Override public void updateTime2(String sceneNum, String videos, long computeTime) { List list = this.list(new LambdaQueryWrapper().eq(ScenePro::getSceneCode, sceneNum)); if(CollUtil.isEmpty(list)) return; this.update(new LambdaUpdateWrapper() .eq(ScenePro::getSceneCode, sceneNum) .set(ScenePro::getCreateTime, Calendar.getInstance().getTime()) .set(ScenePro::getUpdateTime, Calendar.getInstance().getTime()) .set(ScenePro::getVideos, videos)); //修改场景状态 空间 支付状态 计算时间 List sceneProIds = list.stream().map(scenePro -> { return scenePro.getId(); }).collect(Collectors.toList()); sceneProExtService.update(new LambdaUpdateWrapper() .eq(SceneProExt::getSceneProId, sceneProIds) .set(SceneProExt::getSceneStatus, SceneStatus.NO_DISPLAY.code()) .set(SceneProExt::getComputeTime, computeTime)); } @Override public SceneVO findLatestOneByUserId(Long userId) { return baseMapper.findLatestOneByUserId(userId); } @Override public void updateUserIdByCameraId(Long userId, Long cameraId) { this.update(new LambdaUpdateWrapper() .eq(ScenePro::getCameraId, cameraId) .set(ScenePro::getUserId, userId)); } @Override public List findByCameraIdPro(Long cameraId) { return baseMapper.findByCameraIdPro(cameraId); } @Override public void updateCameraIdByCameraIdPro(Long oldCameraId, Long cameraId) { List list = this.list(new LambdaQueryWrapper().eq(ScenePro::getCameraId, oldCameraId)); if(CollUtil.isEmpty(list)) return; this.update(new LambdaUpdateWrapper() .eq(ScenePro::getCameraId, oldCameraId) .set(ScenePro::getCameraId, cameraId)); //修改场景状态 空间 支付状态 计算时间 List sceneProIds = list.stream().map(scenePro -> { return scenePro.getId(); }).collect(Collectors.toList()); sceneProExtService.update(new LambdaUpdateWrapper() .eq(SceneProExt::getSceneProId, sceneProIds) .set(SceneProExt::getPayStatus, PayStatus.NO_CAPACITY.code())); } @Override public void updateRecStatus(String unicode) { List list = sceneProExtService.list( new LambdaQueryWrapper() .like(SceneProExt::getDataSource, "%" + unicode + "%")); if(CollUtil.isEmpty(list)){ return ; } List sceneProIds = list.stream().map(sceneProExt -> { return sceneProExt.getSceneProId(); }).collect(Collectors.toList()); this.update(new LambdaUpdateWrapper() .in(ScenePro::getId, sceneProIds) .set(ScenePro::getRecStatus, RecStatus.DISABLE.code())); } @Override public SceneProPO findByFileId(String fileId) { return baseMapper.findByFileId(fileId); } @Override public List findTempScenes() throws Exception { return baseMapper.findTempScenes(); } @Override public List findByCameraId(Long cameraId) throws Exception { List list = this.list(new LambdaQueryWrapper() .select(ScenePro::getWebSite) .eq(ScenePro::getTbStatus, TbStatus.VALID.code()) .eq(ScenePro::getRecStatus, RecStatus.VALID.code()) .eq(ScenePro::getCameraId, cameraId)); if(CollUtil.isEmpty(list)) return null; return list.stream().map(scenePro -> { return scenePro.getWebSite(); }).collect(Collectors.toList()); } @Override public ResultData uploadObjAndImg(String sceneNum, MultipartFile file) throws Exception{ if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); if(sceneProEdit == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if (file == null || file.getSize() <= 0) { throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); //文件上传的位置可以自定义 String path = sceneProExt.getDataSource() + "_obj2txt"; String zipPath = path + "/zip/"; String filePath = path + "/extras/"; FileUtils.delAllFile(path + "/results/"); File targetFile = new File(filePath); if (!targetFile.exists()) { targetFile.mkdirs(); }else { FileUtils.delAllFile(filePath); } targetFile = new File(zipPath); if (!targetFile.exists()) { targetFile.mkdirs(); }else { FileUtils.delAllFile(zipPath); } targetFile = new File(zipPath + file.getOriginalFilename()); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } // 保存 synchronized(this) { if(targetFile.exists()) { FileUtils.deleteFile(zipPath + file.getOriginalFilename()); } file.transferTo(targetFile); } FileUtils.decompress(zipPath + file.getOriginalFilename(), zipPath + "data/"); //源文件数据,判断是否有多个文件夹,有多个就提示错误,有一个就将文件夹里数据迁移到extras目录,无直接迁移到extras目录 boolean flag = false; String targetName = ""; File dataFile = new File(zipPath + "data/"); for(File data : dataFile.listFiles()){ if(data.isDirectory() && flag){ throw new BusinessException(ErrorCode.FAILURE_CODE_5018); } if(data.isDirectory() && !flag){ flag = true; targetName = data.getName(); } } boolean objFlag = false; boolean mtlFlag = false; if(StrUtil.isEmpty(targetName)){ for(File data : dataFile.listFiles()){ if(data.getName().endsWith(".obj") && objFlag){ throw new BusinessException(ErrorCode.FAILURE_CODE_5019); } if(data.getName().endsWith(".jpg") || data.getName().endsWith(".png")){ if(!FileUtils.checkFileSizeIsLimit(data.length(), 1.5, "M")){ throw new BusinessException(ErrorCode.FAILURE_CODE_5020); } } if(data.getName().endsWith(".obj") && !objFlag){ if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){ throw new BusinessException(ErrorCode.FAILURE_CODE_5020); } objFlag = true; FileUtils.copyFile(zipPath + "data/" + data.getName(), filePath + "mesh.obj", true); continue; } if(data.getName().endsWith(".mtl")){ mtlFlag = true; } FileUtils.copyFile(zipPath + "data/" + data.getName(), filePath + data.getName(), true); } }else { for(File data : new File(zipPath + "data/" + targetName).listFiles()){ if(data.isDirectory()){ throw new BusinessException(ErrorCode.FAILURE_CODE_5018); } if(data.getName().endsWith(".obj") && objFlag){ throw new BusinessException(ErrorCode.FAILURE_CODE_5019); } if(data.getName().endsWith(".jpg") || data.getName().endsWith(".png")){ if(!FileUtils.checkFileSizeIsLimit(data.length(), 1.5, "M")){ throw new BusinessException(ErrorCode.FAILURE_CODE_5020); } } if(data.getName().endsWith(".obj") && !objFlag){ if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){ throw new BusinessException(ErrorCode.FAILURE_CODE_5020); } objFlag = true; FileUtils.copyFile(zipPath + "data/" + targetName + File.separator + data.getName(), filePath + "mesh.obj", true); continue; } if(data.getName().endsWith(".mtl")){ mtlFlag = true; } FileUtils.copyFile(zipPath + "data/" + targetName + File.separator + data.getName(), filePath + data.getName(), true); } } if(!mtlFlag && !objFlag){ throw new BusinessException(ErrorCode.FAILURE_CODE_5019); } //创建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(path + "/data.json", dataJson.toString()); //调用objToTxt算法 //判断V2还是V3 if("V2".equals(scenePro.getBuildType())){ CreateObjUtil.objToTxt(path , "1"); } if("V3".equals(scenePro.getBuildType())){ CreateObjUtil.build3dModel(path , "1"); } String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json"); JSONObject uploadJson = null; JSONArray array = null; if(uploadData!=null) { uploadJson = JSONObject.parseObject(uploadData); array = uploadJson.getJSONArray("upload"); } if(array == null){ log.error("upload.json数据出错"); throw new BusinessException(ErrorCode.FAILURE_CODE_5017); } Map map = new HashMap(); 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(path + File.separator + "results" + File.separator + fileName).exists()) { throw new Exception(path + File.separator + "results" + File.separator + fileName + "文件不存在"); } //tex文件夹 if (fileJson.getIntValue("clazz") == 15) { map.put(path + File.separator + "results" + File.separator + fileName, "images/images" + sceneNum + "/" + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/" + fileName.replace("tex/", "")); //复制一份到images本地 FileUtils.copyFile(path + File.separator + "results" +File.separator + fileName, ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/" + fileName.replace("tex/", ""), true); continue; } } CreateObjUtil.convertTxtToDam( path + File.separator + "results" +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+"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", "images/images"+sceneNum+"/"+ConstantFileName.modelUUID+"_50k.dam.lzma"); map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", "images/images"+sceneNum+"/"+ConstantFileName.modelUUID+"_50k.dam"); uploadToOssUtil.uploadMulFiles(map); FileUtils.copyFile(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator + ConstantFileName.modelUUID+"_50k.dam", true); FileUtils.copyFile(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma", ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator + ConstantFileName.modelUUID+"_50k.dam.lzma", true); log.info("文件复制到本地ecs完成——"+sceneNum); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } //更新scene.json文件 if(strsceneInfos!=null) { scenejson.put("isUploadObj", true); scenejson.put("version", sceneProEdit.getVersion() + 1); scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer() + 1); scenejson.put("floorPublishVer", sceneProEdit.getFloorPublishVer() + 1); FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum+File.separator+"scene.json", scenejson.toString()); log.info("写入scene.json文件完成——"+sceneNum); } //floorEditVer字段增加1 sceneProEdit.setVersion(sceneProEdit.getVersion() + 1); sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorPublishVer() + 1); sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditService.updateById(sceneProEdit); return ResultData.ok(); } @Override public ResultData uploadLogoBottomStatus(String sceneNum, String status) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(status)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); if(sceneProEdit == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("showLogoBottom", Integer.valueOf(status)); scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); sceneProEdit.setVersion(scenejson.getIntValue("version") + 1); sceneProEdit.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditExt.setShowLogoBottom(Integer.valueOf(status)); sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditExtService.updateById(sceneProEditExt); sceneProEditService.updateById(sceneProEdit); return ResultData.ok(); } @Override public ResultData saveJsonData(String sceneNum, String fileName, String jsonData) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(jsonData)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); FileUtils.writeFile(dataBuffer.toString() + fileName, jsonData.toString()); return ResultData.ok("scene/" + dataBuf.toString() + fileName); } @Override public String downloadPanoramaOrVideo(String sceneNum, String fileName, String type, String planId) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type)|| StrUtil.isEmpty(planId)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String path = sceneProExt.getDataSource(); String url = ""; if("image".equals(type)){ if(!new File(path + "/caches/images/" + fileName).exists()){ throw new BusinessException(ErrorCode.FAILURE_CODE_3018); } //备份原始数据 if(!new File(imagesBuffer.toString() + "caches/back-" + fileName).exists()){ FileUtils.copyFile(path + "/caches/images/" + fileName, imagesBuffer.toString() + "caches/back-" + fileName, false); } //复制打包数据,并且改名 FileUtils.copyFile(path + "/caches/images/" + fileName, imagesBuffer.toString() + "caches/" + planId + ".jpg", true); url = mainUrl + "scene/" + imagesBuf.toString() + "caches/" + planId + ".jpg"; } if("video".equals(type)){ url = prefixAli + "video/video" + scenePro.getSceneCode() + "/" + planId + ".mp4"; } return url; } @Override public ResultData uploadPanoramaOrVideo(String sceneNum, String fileName, String type, MultipartFile file, String planId) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type) || StrUtil.isEmpty(planId)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); if(!fileName.endsWith(".jpg") && !fileName.endsWith(".mp4")){ throw new BusinessException(ErrorCode.FAILURE_CODE_5023); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String path = sceneProExt.getDataSource(); if(path != null && !"".equals(path) && path.startsWith("http")){ path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2]; } String target = path + "_images"; //文件上传的位置可以自定义 String filePath = ""; if("image".equals(type)){ filePath = target + File.separator + "extras/images" + File.separator + fileName; } if("video".equals(type)){ filePath = target + File.separator + "extras/video" + File.separator + fileName; } File targetFile = new File(filePath); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } //上传文件 file.transferTo(targetFile); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } if(type.equals("video")){ scenejson.put("buildImages", 2); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); }else{ scenejson.put("buildImages", 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); } return ResultData.ok(); } @Override public ResultData uploadROIVideo(String sceneNum, String fileName, MultipartFile file, String planId, String rect, String videoDirMatrix, String dir, String hfov, String vfov) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(planId) || StrUtil.isEmpty(rect)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String path = sceneProExt.getDataSource(); if(path != null && !"".equals(path) && path.startsWith("http")){ path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2]; } String target = path + "_roi"; FileUtils.deleteDirectory(target); //文件上传的位置可以自定义 String filePath = target + File.separator + "extras" + File.separator + fileName; File targetFile = new File(filePath); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } if(file == null){ FileUtils.copyFile(ConstantFilePath.SCENE_PATH + "video/video"+ scenePro.getSceneCode() + File.separator + fileName, filePath, true); }else { //上传文件 file.transferTo(targetFile); FileUtils.copyFile(filePath, ConstantFilePath.SCENE_PATH + "video/video"+ scenePro.getSceneCode() + File.separator + fileName, true); } String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } JSONArray jsonArray = new JSONArray(); JSONObject jsonObject = new JSONObject(); JSONObject rectJson = JSON.parseObject(rect); boolean noPanoId = true; if(scenejson.containsKey("videosUser")){ jsonArray = scenejson.getJSONArray("videosUser"); for(int i = 0, len = jsonArray.size(); i < len; i++){ jsonObject = jsonArray.getJSONObject(i); if(planId.equals(jsonObject.getString("panoId"))){ jsonObject.put("rect", rectJson); jsonObject.put("name", fileName.substring(0, fileName.lastIndexOf("."))); jsonObject.put("dir", JSON.parseObject(dir)); jsonObject.put("hfov", hfov); jsonObject.put("vfov", vfov); noPanoId = false; break; } } } if(noPanoId){ jsonObject = new JSONObject(); jsonObject.put("name", fileName.substring(0, fileName.lastIndexOf("."))); jsonObject.put("panoId", planId); jsonObject.put("rect", rectJson); jsonObject.put("dir", JSON.parseObject(dir)); jsonObject.put("hfov", hfov); jsonObject.put("vfov", vfov); if(!jsonArray.contains(jsonObject)){ jsonArray.add(jsonObject); } } //保存rect的json数据 FileUtils.writeFile(target + File.separator + "extras" + File.separator + "video-ROI.json", jsonObject.toJSONString()); //复制原始图片 FileUtils.copyFile(path + "/caches/images/" + planId + ".jpg", target + File.separator + "extras" + File.separator + planId + ".jpg", true); FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true); FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true); //data.json增加extras为执行重建算法 String project = FileUtils.readFile(target + File.separator+"project.json"); if(project != null){ JSONObject projectJson = JSONObject.parseObject(project); projectJson.put("parent", projectJson.get("uuid")); projectJson.put("uuid", UUID.randomUUID().toString()); projectJson.put("time", System.currentTimeMillis()); FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString()); } String data = FileUtils.readFile(target + File.separator+"data.json"); if(data != null){ JSONObject dataJson = JSONObject.parseObject(data); //V5表示不需要生成high,low文件 dataJson.put("skybox_type", "SKYBOX_V5"); dataJson.put("split_type", "SPLIT_V11"); FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8")); } //进行计算 log.info("绿幕抠图视频:开始建模——" + scenePro.getSceneCode()); CreateObjUtil.build3dModel2(target , "1"); //读取upload文件,检验需要上传的文件是否存在 String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json"); JSONObject uploadJson = null; JSONArray array = null; if(uploadData!=null) { uploadJson = JSONObject.parseObject(uploadData); array = uploadJson.getJSONArray("upload"); } if(array == null){ throw new Exception("upload.json数据出错"); } Map map = new HashMap<>(); JSONObject fileJson = null; for(int i = 0, len = array.size(); i < len; i++){ fileJson = array.getJSONObject(i); fileName = fileJson.getString("file"); //文件不存在抛出异常 if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){ throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在"); } if(fileJson.getIntValue("clazz") == 19 ){ map.put(target + File.separator + "results" + File.separator+ fileName,"video/video"+ scenePro.getSceneCode() + File.separator + fileName.replace("videos/", "")); } } uploadToOssUtil.uploadMulFiles(map); scenejson.put("videosUser", jsonArray.toJSONString()); scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); if(sceneProEdit != null){ SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); sceneProEditExt.setVideosUser(jsonArray.toJSONString()); sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1); sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditExtService.updateById(sceneProEditExt); } return ResultData.ok(); } @Override public ResultData deleteROIVideo(String sceneNum, String fileName, String planId) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(planId)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } JSONArray newArray = new JSONArray(); JSONArray jsonArray = new JSONArray(); JSONObject jsonObject = new JSONObject(); if(scenejson.containsKey("videosUser")){ jsonArray = JSON.parseArray(scenejson.getString("videosUser")); for(int i = 0, len = jsonArray.size(); i < len; i++){ jsonObject = jsonArray.getJSONObject(i); if(planId.equals(jsonObject.getString("panoId"))){ continue; } if(!newArray.contains(jsonObject)){ newArray.add(jsonObject); } } } scenejson.put("videosUser", newArray.toJSONString()); scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId()); if(sceneProEdit != null){ SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId()); sceneProEditExt.setVideosUser(newArray.toJSONString()); sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1); sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime()); sceneProEditExtService.updateById(sceneProEditExt); } uploadToOssUtil.delete("video/video"+ scenePro.getSceneCode() + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4"); uploadToOssUtil.delete("video/video"+ scenePro.getSceneCode() + File.separator + fileName.substring(0, fileName.lastIndexOf(".")) + ".flv"); FileUtils.deleteFile(ConstantFilePath.SCENE_PATH + "video/video"+ scenePro.getSceneCode() + File.separator + fileName); return ResultData.ok(); } @Override public ResultData uploadBgMusic(String sceneNum, String fileName, MultipartFile file) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); File buMusicFile = new File(imagesBuffer.toString() + fileName); if(!buMusicFile.getParentFile().exists()){ buMusicFile.getParentFile().mkdirs(); } //上传文件 file.transferTo(buMusicFile); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("bgMusicName", fileName); scenejson.put("uploadBgMusic", 1); scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); return ResultData.ok(); } @Override public ResultData deleteUploadBgMusic(String sceneNum) throws Exception { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("bgMusicName", ""); scenejson.put("uploadBgMusic", 1); scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); return ResultData.ok(); } @Override public ResultData savePanorama(String sceneNum, String sid, MultipartFile file, String imagesName) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(sid)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String path = sceneProExt.getDataSource(); String target = imagesBuffer.toString() + "panorama/" + sid; FileUtils.deleteDirectory(target); //文件上传的位置可以自定义 String filePath = target + File.separator + "extras/images" + File.separator + imagesName; File targetFile = new File(filePath); if(!targetFile.getParentFile().exists()){ targetFile.getParentFile().mkdirs(); } //上传文件 file.transferTo(targetFile); //调用算法切全景图 FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true); FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true); JSONObject visionJson = new JSONObject(); JSONArray visionArray = new JSONArray(); visionJson.put("uuid", imagesName.substring(0, imagesName.lastIndexOf("."))); visionJson.put("group", 1); visionJson.put("subgroup", 0); visionArray.add(visionJson); JSONObject vision = new JSONObject(); vision.put("sweepLocations", visionArray); FileUtils.writeFile(target + "/extras" + File.separator + "vision.txt", new String(vision.toString().getBytes(), "UTF-8")); //data.json增加extras为执行重建算法 String data = FileUtils.readFile(target + File.separator + "data.json"); if(data != null){ JSONObject floorplanJson = new JSONObject(); floorplanJson.put("has_source_images", true); floorplanJson.put("has_vision_txt", true); JSONObject dataJson = JSONObject.parseObject(data); dataJson.put("extras", floorplanJson); //V5表示不需要生成high,low文件 dataJson.put("skybox_type", "SKYBOX_V6"); if(scenePro.getSceneScheme() == 11){ dataJson.put("skybox_type", "SKYBOX_V7"); } dataJson.put("split_type", "SPLIT_V8"); if(scenePro.getSceneScheme() == 3){ dataJson.put("skybox_type", "SKYBOX_V4"); } FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8")); } //创建文件夹软连接并且复制data.json和project.json if(new File(target + File.separator + "capture").exists()){ new File(target + File.separator + "capture").delete(); } if(new File(target + File.separator + "results").exists()){ FileUtils.delAllFile(target + File.separator + "results"); } //下载data.fdage if("s3".equals(this.type)){ //亚马逊保持旧方式,超链接capture CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture"); } CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") + "/data.fdage", target + File.separator + "capture/"); CreateObjUtil.build3dModel(target , "1"); //读取upload文件,检验需要上传的文件是否存在 String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json"); JSONObject uploadJson = null; JSONArray array = null; if(uploadData!=null) { uploadJson = JSONObject.parseObject(uploadData); array = uploadJson.getJSONArray("upload"); } if(array == null){ log.info("计算全景图失败,没有upload.json"); } Map map = new HashMap<>(); JSONObject fileJson = null; String fileName = ""; String img = ""; for(int i = 0, len = array.size(); i < len; i++){ fileJson = array.getJSONObject(i); fileName = fileJson.getString("file"); //文件不存在抛出异常 if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){ throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在"); } //low文件夹 if(fileJson.getIntValue("clazz") == 4){ img = "/results" + File.separator + fileName; map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+"/pan/low/"+ fileName.replace("low/", "")); continue; } //tiles文件夹,亚马逊没有裁剪图片api,不需要上传4k图 if(fileJson.getIntValue("clazz") == 5){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ "/panorama_edit/" + sid + File.separator + fileName); } //tiles文件夹,亚马逊瓦片图 if(fileJson.getIntValue("clazz") == 7 ){ map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+ scenePro.getSceneCode()+ File.separator + fileName); } } //上传全景图 map.put(filePath, "images/images"+ scenePro.getSceneCode()+ File.separator + "pan/high/" + imagesName); uploadToOssUtil.uploadMulFiles(map); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("uploadPanoramaImg", 1); scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); Map result = new HashMap<>(); result.put("type", scenePro.getSceneScheme() == 11? "2k" : "4k"); result.put("img", "scene/" + imagesBuf.toString() + "panorama/" + sid + img); result.put("path", "images/images"+ scenePro.getSceneCode()+ "/panorama_edit/" + sid); return ResultData.ok(result); } @Override public ResultData savePanoramaJson(String sceneNum, String fileData, String fileName, String sid) throws Exception { if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); FileUtils.writeFile(dataBuffer.toString() + fileName, fileData); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("uploadPanoramaJson", 1); scenejson.put("version", scenejson.getIntValue("version") + 1); if(StrUtil.isNotEmpty(fileData)){ scenejson.put("jumpScene", true); }else { scenejson.put("jumpScene", false); } FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString()); if(StrUtil.isNotEmpty(sid)){ String target = imagesBuffer.toString() + "panorama/" + sid; FileUtils.deleteDirectory(target); uploadToOssUtil.deleteFile(imagesBuf.toString() + "panorama_edit/" + sid); } return ResultData.ok(); } @Override public ResultData copyAndUpdateFloorJson(String sceneNum, String floorJsonData) throws Exception{ if(StrUtil.isEmpty(sceneNum) ){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(sceneNum) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } if(StrUtil.isEmpty(floorJsonData)){ ScenePro scenePro = baseMapper.findByNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); FileUtils.copyFile(sceneProExt.getDataSource() + "/results/floor.json", dataBuffer.toString() + "houst_floor.json", true); uploadToOssUtil.upload(dataBuffer.toString() + "houst_floor.json", dataBuf.toString() + "houst_floor.json"); String result = FileUtils.readFile(dataBuffer.toString() + "houst_floor.json"); return ResultData.ok((Object) result); } FileUtils.writeFile(dataBuffer.toString() + "houst_floor.json", floorJsonData); uploadToOssUtil.upload(dataBuffer.toString() + "houst_floor.json", dataBuf.toString() + "houst_floor.json"); return ResultData.ok(floorJsonData); } @Override public ResultData updateFloorJson(String sceneNum, String floorJsonData) throws Exception{ if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(floorJsonData)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(sceneNum) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json"); JSONObject scenejson = new JSONObject(); if(strsceneInfos!=null) { scenejson = JSONObject.parseObject(strsceneInfos); } scenejson.put("uploadFloorJson", 1); scenejson.put("version", scenejson.getIntValue("version") + 1); FileUtils.writeFile(dataBuffer.toString() + "floor.json", floorJsonData); FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toJSONString()); return ResultData.ok((Object) floorJsonData); } @Override public IPage getAppAllSceneByPage(Long cameraId, Long userId, int cameraType, int pageNum, Integer pageSize, String orderBy, Integer sceneType, List sceneCodeList, String sceneName) { Page page = new Page<>(pageNum, pageSize); List list = baseMapper.getAppAllSceneByPage(page, cameraId, userId, cameraType, sceneType, sceneCodeList, sceneName, orderBy); page.setRecords(list); return page; } @Override public Long findSceneNumByCameraId(Long cameraId) { return this.count(new LambdaQueryWrapper().eq(ScenePro::getRecStatus, RecStatus.VALID.code()).eq(ScenePro::getCameraId, cameraId)); } @Override public SceneProPO findLastSceneByCameraId(Long cameraId) { return baseMapper.findLastSceneByCameraId(cameraId); } @Override public Long findTotalSpaceByCameraId(Long cameraId) { List list = this.list(new LambdaQueryWrapper() .select(ScenePro::getId) .eq(ScenePro::getTbStatus, TbStatus.VALID.code()) .eq(ScenePro::getRecStatus, RecStatus.VALID.code()) .eq(ScenePro::getCameraId, cameraId)); if(CollUtil.isEmpty(list)){ return 0l; } List sceneProIds = list.stream().map(scenePro -> { return scenePro.getId(); }).collect(Collectors.toList()); return sceneProExtService.count(new LambdaQueryWrapper() .in(SceneProExt::getSceneProId, sceneProIds) .eq(SceneProExt::getPayStatus, PayStatus.PAY.code()) .in(SceneProExt::getSceneStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code())); } @Override public void updatePayStatusByCameraId(Integer payStatus, Long cameraId) { List list = this.list(new LambdaQueryWrapper() .select(ScenePro::getId) .eq(ScenePro::getTbStatus, TbStatus.VALID.code()) .eq(ScenePro::getCameraId, cameraId)); if(CollUtil.isEmpty(list)){ return; } List sceneProIds = list.stream().map(scenePro -> { return scenePro.getId(); }).collect(Collectors.toList()); sceneProExtService.update( new LambdaUpdateWrapper() .in(SceneProExt::getSceneProId, sceneProIds) .set(SceneProExt::getPayStatus, payStatus)); } @Override public ResultData downloadPanoramaData(String sceneNum) throws Exception { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } ScenePro scenePro = findBySceneNum(sceneNum); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId()); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String highPath = sceneProExt.getDataSource() + "/results/high"; if(!new File(highPath).exists()){ throw new BusinessException(ErrorCode.FAILURE_CODE_5012); } FileUtils.zipFile(imagesBuffer.toString() + sceneNum + "-high.zip", highPath); uploadToOssUtil.upload(imagesBuffer.toString() + sceneNum + "-high.zip", imagesBuf.toString() + sceneNum + "-high.zip"); return ResultData.ok(prefixAli + imagesBuf.toString() + sceneNum + "-high.zip?t=" + System.currentTimeMillis()); } public ResultData getSceneAndCameras(Long userId,List excludeNums) { List scenes = findByUserId(userId,excludeNums); Map result = new HashMap<>(2); if(ObjectUtils.isEmpty(scenes)){ result.put("scenes",new ArrayList<>()); result.put("cameras",new ArrayList<>()); return ResultData.ok(result); } List ids = scenes.parallelStream().map(scene->String.valueOf(scene.getCameraId())) .collect(Collectors.toList()); // TODO: 2021/12/29 这里需要feign接口 // List cameras = cameraService.getCamerasByIds(ids); // result.put("scenes",scenes); // result.put("cameras",cameras); return ResultData.ok(result); } @Override public SceneProPO findBySceneNumWithOutCheckRecStatus(String sceneNum) throws Exception { return baseMapper.findByNumWithOutCheckRecStatus(sceneNum); } @Override public Integer findFolderIdScence(Long folderId, Long userId) { return baseMapper.findFolderIdScence(SceneProVO.builder().folderId(folderId).userId(userId).build()); } @Override public ResultData downloadVisionData(String sceneCode) throws Exception { if(StrUtil.isEmpty(sceneCode)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } List sceneProList = this.list( new QueryWrapper() .eq("tb_status", TbStatus.VALID.code()) .eq("rec_status", RecStatus.VALID.code()) .eq("scene_code",sceneCode)); if(CollUtil.isEmpty(sceneProList)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } ScenePro scenePro = sceneProList.get(0); StringBuffer dataBuf = new StringBuffer() .append("data").append(File.separator) .append("data").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer imagesBuf = new StringBuffer() .append("images").append(File.separator) .append("images").append(scenePro.getSceneCode()) .append(File.separator); StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString()); StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString()); String modeldataUrl = prefixAli + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis(); if("s3".equals(type)){ modeldataUrl = ConstantUrl.PREFIX_AWS + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis(); } FileUtils.downLoadFromUrl(modeldataUrl, "vision.modeldata", dataBuffer.toString()); File file = new File(dataBuffer.toString() + "vision.modeldata"); if(!file.exists()) { return ResultData.error(ErrorCode.FAILURE_CODE_5012); } ConvertUtils.convertVisionModelDataToTxt(dataBuffer.toString() + "vision.modeldata", dataBuffer.toString() + "vision.json"); uploadToOssUtil.upload(dataBuffer.toString() + "vision.json", dataBuf.toString() + "vision.json"); return ResultData.ok(prefixAli + dataBuf.toString() + "vision.json?t=" + System.currentTimeMillis()); } @Override public SceneVO getInfo(String sceneNum) { if(StrUtil.isEmpty(sceneNum)){ throw new BusinessException(ErrorCode.FAILURE_CODE_3001); } List sceneProList = this.list( new QueryWrapper() .eq("tb_status", TbStatus.VALID.code()) .eq("scene_code",sceneNum)); if(CollUtil.isEmpty(sceneProList)){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } ScenePro scenePro = sceneProList.get(0); if(scenePro == null){ throw new BusinessException(ErrorCode.FAILURE_CODE_5005); } if(scenePro.getRecStatus().equals(RecStatus.DISABLE.code())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5009); } SceneProExt sceneProExt = sceneProExtService.list(new QueryWrapper() .eq("scene_pro_id", scenePro.getId())).get(0); if(!SceneStatus.SUCCESS.code().equals(sceneProExt.getSceneStatus()) && !SceneStatus.NO_DISPLAY.code().equals(sceneProExt.getSceneStatus())){ throw new BusinessException(ErrorCode.FAILURE_CODE_5033); } if(sceneProExt.getPayStatus() != 1){ throw new BusinessException(ErrorCode.FAILURE_CODE_5034); } SceneVO sceneVo = new SceneVO(); SceneProEdit sceneProEdit = sceneProEditService.getOne( new QueryWrapper() .eq("rec_status", RecStatus.VALID.code()) .eq("tb_status", RecStatus.VALID.code()) .eq("pro_id", scenePro.getId()));// .findByProId(scenePro.getId()); SceneProEditExt sceneProEditExt = sceneProEditExtService.getOne( new QueryWrapper() .eq("pro_edit_id", sceneProEdit.getId())); BeanUtils.copyProperties(sceneProEditExt, sceneVo); BeanUtils.copyProperties(sceneProEdit, sceneVo); BeanUtils.copyProperties(scenePro, sceneVo); if(StrUtil.isNotEmpty(sceneProEdit.getEntry())){ sceneVo.setEntry(JSONObject.parseObject(sceneProEdit.getEntry()).toJSONString()); } if(StrUtil.isNotEmpty(scenePro.getGps())){ sceneVo.setGps(JSONObject.parseObject(scenePro.getGps()).toJSONString()); } sceneVo.setCreateTime(new DateTime(scenePro.getCreateTime()).toString("yyyy-MM-dd")); sceneVo.setCreateDate(scenePro.getCreateTime().getTime()); if(StrUtil.isEmpty(sceneProEdit.getSceneKey())){ sceneVo.setIsPublic(0); }else { sceneVo.setIsPublic(1); } //不返回场景访问密码 sceneVo.setSceneKey(""); //查询是否有随心装场景 if(sceneNum.indexOf("vr-")!=-1){ ScenePro vrScenePro= findLikeSceneNum(sceneNum); if(Objects.nonNull(vrScenePro)){ sceneVo.setVrNum(null); sceneVo.setVideosUser(null); sceneVo.setBgMusicName(null); sceneVo.setBgMusic(null); } } //更新访问数量 sceneService.updateViewCount(sceneNum); return sceneVo; } @Override public ScenePro findLikeSceneNum(String sceneNum) { return baseMapper.findLikeNum(sceneNum); } private void dealTour(SceneEditVO base, JSONObject scenejson, Map map, StringBuffer dataBuffer, StringBuffer imagesBuffer) throws IOException { if(!StrUtil.isEmpty(base.getTourList())){ if(scenejson.containsKey("uploadTourList") && scenejson.getIntValue("uploadTourList") == 1){ int screencapLen = 0; File file = new File(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER); String[] strs = file.list(); if(strs!=null) { for(int i=0;i-1) { ++screencapLen; map.put(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER+File.separator+strs[i], "data/data"+base.getSceneNum()+"/tour/"+strs[i]); } } } scenejson.put("screencapLen", screencapLen); String path = imagesBuffer.toString() + ConstantFileName.TOURLIST_FOLDER; JSONArray tourJsons = JSONArray.parseArray(base.getTourList()); for(int i=0;i