package com.fdkankan.scene.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.csp.sentinel.util.StringUtil;
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.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.user.SSOLoginHelper;
import com.fdkankan.common.user.SSOUser;
import com.fdkankan.common.util.*;
import com.fdkankan.fyun.constant.StorageType;
import com.fdkankan.fyun.oss.UploadToOssUtil;
import com.fdkankan.platform.api.dto.Camera;
import com.fdkankan.platform.api.dto.CameraDetail;
import com.fdkankan.platform.api.feign.PlatformGoodsClient;
import com.fdkankan.redis.constant.RedisKey;
import com.fdkankan.redis.constant.RedisLockKey;
import com.fdkankan.redis.util.RedisLockUtil;
import com.fdkankan.redis.util.RedisUtil;
import com.fdkankan.scene.bean.IconBean;
import com.fdkankan.scene.bean.TagBean;
import com.fdkankan.scene.entity.*;
import com.fdkankan.scene.mapper.ISceneProMapper;
import com.fdkankan.scene.service.*;
import com.fdkankan.scene.vo.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
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.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
/**
*
* pro场景表 服务实现类
*
*
* @author dengsixing
* @since 2021-12-23
*/
@Slf4j
@Service
public class SceneProServiceImpl extends ServiceImpl implements ISceneProService {
@Value("${oss.prefix.ali}")
private String prefixAli;
@Value("${oss.prefix.url}")
private String ossUrlPrefix;
@Value("${upload.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;
@Value("${ecs.checkFile.maxTimes:5}")
private int maxCheckTimes;
@Value("${ecs.checkFile.waitTime:5000}")
private int waitTime;
@Autowired
@Qualifier("uploadToOssUtil")
UploadToOssUtil uploadToOssUtil;
@Autowired
ISceneProExtService sceneProExtService;
@Autowired
ISceneProEditService sceneProEditService;
@Autowired
ISceneProEditExtService sceneProEditExtService;
@Autowired
ISceneService sceneService;
@Autowired
RedisLockUtil redisLockUtil;
@Autowired
private RedisUtil redisUtil;
@Autowired
ISceneDataDownloadService sceneDataDownloadService;
@Autowired
PlatformGoodsClient platformGoodsClient;
@Autowired
ISceneProService sceneProService;
@Autowired
ISceneEditInfoService sceneEditInfoService;
@Autowired
ISceneEditControlsService sceneEditControlsService;
@Autowired
IScenePlusService scenePlusService;
@Autowired
IScenePlusExtService scenePlusExtService;
@Autowired
ISceneDownloadLogService sceneDownloadLogService;
@Autowired
SSOLoginHelper ssoLoginHelper;
@Autowired
IFdkkLaserService fdkkLaserService;
@Resource
ISceneProMapper sceneProMapper;
@Override
public List convert(List list){
List sceneVOS = list.parallelStream().map(scenePro -> {
SceneVO sceneVo = new SceneVO();
SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
BeanUtils.copyProperties(sceneProEditExt, sceneVo);
BeanUtils.copyProperties(sceneProEdit, sceneVo);
BeanUtils.copyProperties(sceneProExt, 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 List convert2(List list){
List sceneVOS = list.parallelStream().map(po -> {
SceneVO sceneVo = new SceneVO();
SceneProEdit sceneProEdit = sceneProEditService.findByProId(po.getId());
SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
BeanUtils.copyProperties(sceneProEditExt, sceneVo);
BeanUtils.copyProperties(sceneProEdit, sceneVo);
BeanUtils.copyProperties(po, sceneVo);
sceneVo.setCreateTime(DateUtil.format(po.getCreateTime(), DateExtUtil.dateStyle4));
sceneVo.setCreateDate(po.getCreateTime().getTime());
return sceneVo;
}).collect(Collectors.toList());
return sceneVOS;
}
@Override
public Long getSceneCount(Long cameraId,Long userId) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper()
.eq(ScenePro::getTbStatus, TbStatus.VALID.code())
.notIn(ScenePro::getSceneType, SceneType.YJHZXNFY.code());
if(cameraId !=null){
queryWrapper.eq(ScenePro::getCameraId ,cameraId);
}
if(userId !=null){
queryWrapper.eq(ScenePro::getUserId ,userId);
}
return this.count(queryWrapper);
}
@Override
public ScenePro findBySceneNum(String sceneNum) {
return this.getOne(new LambdaQueryWrapper()
.eq(ScenePro::getTbStatus, TbStatus.VALID.code())
.eq(ScenePro::getNum, sceneNum));
}
@Override
public ScenePro findDeleteSceneBySceneNum(String sceneNum) {
List list = this.list(new LambdaQueryWrapper()
.eq(ScenePro::getTbStatus, TbStatus.DELETE.code())
.eq(ScenePro::getNum, sceneNum));
if(CollUtil.isEmpty(list)){
return null;
}
return list.get(0);
}
@Override
public SceneProPO getSceneStatusByUnicode(String unicode, Integer tbStatus) {
return baseMapper.getSceneStatusByUnicode(unicode, tbStatus);
}
@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) {
this.update(new LambdaUpdateWrapper()
.eq(ScenePro::getNum, sceneNum)
.set(ScenePro::getSceneStatus, sceneStatus));
}
@Override
public ResultData resetUploadFloorJson(SceneEditParamVO sceneEdit) throws Exception{
if(StrUtil.isEmpty(sceneEdit.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(sceneEdit.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
StringBuffer dataBuf = new StringBuffer()
.append("data").append(File.separator)
.append("data").append(scenePro.getNum())
.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.getNum());
}
log.info("重置画墙重建模型版本成功");
return ResultData.ok();
}
@Override
public ResultData uploadFloorJson(SceneEditParamVO sceneEdit) throws Exception {
String lockKey = String.format(RedisLockKey.LOCK_UPLOAD_FLOORJSON_REBUILD, sceneEdit.getNum());
Boolean lock = redisLockUtil.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.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(sceneEdit.getNum());
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.getNum() + 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.getNum() + 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.getNum() + 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.getNum()+File.separator+"scene.json", scenejson.toString());
log.info("写入scene.json文件完成——"+sceneEdit.getNum());
}
//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.getNum() + File.separator + "floor.json", new String(sceneEdit.getWebFloor().getBytes(), "UTF-8"));
//下载vision.modeldata,解压成vision.txt,并且删除vision.modeldata
log.info("下载vision.modeldata文件");
if("aws".equals(type)){
FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getNum() + "/vision.modeldata" + "?m="+new Date().getTime(),
"vision.modeldata", target + File.separator + "extras" + File.separator);
}
if("oss".equals(type)){
FileUtils.downLoadFromUrl(prefixAli + "images/images" + sceneEdit.getNum() + "/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.getNum() + "/vision2.modeldata" + "?m="+new Date().getTime(),
"vision2.modeldata", target + File.separator + "extras" + File.separator);
}
if("aws".equals(type)){
FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getNum() + "/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.getNum());
//判断V2还是V3
if("V2".equals(scenePro.getBuildType())){
CreateObjUtil.build3dModelOld(target , "1");
}
if("V3".equals(scenePro.getBuildType())){
CreateObjUtil.build3dModel(target , "1");
}
log.info("重新计算大场景:开始转换成lzma文件——"+sceneEdit.getNum());
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.getNum());
Thread.sleep(3000);
}
File sceneFile = new File(ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneEdit.getNum() + File.separator + ConstantFileName.modelUUID + "_50k_texture_jpg_high1");
if(!sceneFile.exists())
{
log.info("high1文件夹不存在——"+sceneEdit.getNum());
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();// /mnt/data/0662c5389/831989883441512448/4898cab04f8c_202104141602356060/
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"; // /mnt/data/0662c5389/831989883441512448/4898cab04f8c_202104141602356060_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");
//安居客算法运行
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.setNum(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 {
redisLockUtil.unlock(lockKey);
}
return ResultData.ok();
}
@Override
public ResultData addHotMediaInfo(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getType()) ||
StrUtil.isEmpty(base.getInfo())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String mediaInfoPath = String.format(ConstantFilePath.MEDIAINFO_PATH_FORMAT, scenePro.getNum());
String infoData = FileUtils.readFile(mediaInfoPath);
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{
throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
}
FileUtils.writeFile(mediaInfoPath, medias.toString());
return ResultData.ok();
}
@Override
public ResultData saveScreencapFile(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getIndex()) ||
StrUtil.isEmpty(base.getCamerasData())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String tourlistfolderPath = String.format(ConstantFilePath.TOURLIST_FOLDER_PATH_FORMAT, scenePro.getNum());
if("1".equals(base.getIndex())){
File file = new File(tourlistfolderPath);
if(file.isDirectory()){
String[] strs = file.list();
if(strs!=null){
for(int i=0;i-1) {
FileUtils.deleteFile(tourlistfolderPath + File.separator + strs[i]);
}
}
}
} else {
file.mkdirs();
}
String strsceneInfos = FileUtils.readFile(sceneJsonPath);
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(sceneJsonPath, map);
}
String filePath = tourlistfolderPath+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(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getSceneKey())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
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(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getSize()) ||
StrUtil.isEmpty(base.getLogoType())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String strsceneInfos = FileUtils.readFile(sceneJsonPath);
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(sceneJsonPath, map);
return ResultData.ok();
}
@Override
public ResultData saveBackgroundMusic(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getMusicName())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String strsceneInfos = FileUtils.readFile(sceneJsonPath);
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(sceneJsonPath, map);
return ResultData.ok();
}
@Transactional
@Override
public ResultData saveInitialPage(FileNameAndDataParamVO param) throws Exception{
ScenePro scenePro = this.findBySceneNum(param.getNum());
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if(scenePlus == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
//更新缩略图url
String thumbUrl = this.ossUrlPrefix + String.format(UploadFilePath.USER_EDIT_PATH, param.getNum()) + param.getFileName();
scenePlusExt.setThumb(thumbUrl);
scenePlusExtService.updateById(scenePlusExt);
scenePro.setThumb(thumbUrl);
sceneProService.updateById(scenePro);
SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
if(sceneEditInfo == null){
sceneEditInfo = new SceneEditInfo();
sceneEditInfo.setScenePlusId(scenePlus.getId());
sceneEditInfo.setEntry(param.getData());
sceneEditInfoService.save(sceneEditInfo);
}else{
sceneEditInfoService.update(
new LambdaUpdateWrapper()
.set(SceneEditInfo::getEntry, param.getData())
.setSql("version = version + 1")
.eq(SceneEditInfo::getId, sceneEditInfo.getId()));
}
return ResultData.ok();
}
@Override
public ResultData getScreencapVoice(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String sceneInfos = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
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.getNum()+"/201810" +screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf(".")));
}
return ResultData.ok();
}
@Override
public ResultData uploadScreencapVoiceNew(FileParamVO param, MultipartFile file) throws Exception{
String sceneNum = param.getNum();
String fileName = param.getFileName();
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 lockKey = String.format(RedisLockKey.LOCK_UPLOAD_PRO_VOICE, sceneNum);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_30_MINUTE);
if(!lock){
throw new BusinessException(ErrorCode.FAILURE_CODE_5036);
}
String voiceSrc = null;
try{
//文件上传的位置可以自定义
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(param.getReplace())){
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 = param.getLength();
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 = param.getLength();
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);
// 保存
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);
}
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);
}finally {
redisLockUtil.unlock(lockKey);
}
return ResultData.ok(voiceSrc);
}
@Override
public ResultData uploadScreencapVoiceNewV3(FileParamVO param, MultipartFile file) throws Exception{
String sceneNum = param.getNum();
String fileName = param.getFileName();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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 lockKey = String.format(RedisLockKey.LOCK_UPLOAD_PRO_VOICE, sceneNum);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_30_MINUTE);
if(!lock){
throw new BusinessException(ErrorCode.FAILURE_CODE_5036);
}
String voiceSrc = null;
try{
//文件上传的位置可以自定义
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(param.getReplace())){
//判断分房间模块文件夹是否存在
String partPath = path + File.separator + "part";
File partFile = new File(partPath);
if(!partFile.exists()){
partFile.mkdirs();
}
targetFile = new File(partPath + File.separator + fileName);
if(targetFile.exists())
{
FileUtils.deleteFile(partPath + File.separator + fileName);
}
file.transferTo(targetFile);
//获取总音频多少段,每段时长
String[] time = param.getTimes().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);
// 保存
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());
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);
}finally {
redisLockUtil.unlock(lockKey);
}
return ResultData.ok(voiceSrc);
}
@Override
public ResultData deleteScreencapVoicePart(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String index = param.getIndex();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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 scenePath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String strsceneInfos = FileUtils.readFile(scenePath);
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 = param.getTimes().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(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String scenePath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
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(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String imagesPath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, scenePro.getNum());
String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String tourListPath = String.format(ConstantFilePath.TOURLIST_PATH_FORMAT, scenePro.getNum());
String capPath = String.format(ConstantFilePath.TOURLIST_FOLDER_PATH_FORMAT, scenePro.getNum());
String imgPath = imagesPath + 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 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(sceneJsonPath, map);
return ResultData.ok();
}
@Override
public ResultData saveTourList(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum()) || StrUtil.isEmpty(base.getTourList()) ||
StrUtil.isEmpty(base.getScreencapLen())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
log.info("editScene/saveTourList:生成tourList.json文件");
String tourListPath = String.format(ConstantFilePath.TOURLIST_PATH_FORMAT, scenePro.getNum());
FileUtils.writeFile(tourListPath, base.getTourList());
String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, scenePro.getNum());
String strsceneInfos = FileUtils.readFile(sceneJsonPath);
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(sceneJsonPath, map);
return ResultData.ok();
}
@Override
public ResultData saveSceneInfo(SceneEditParamVO base) throws Exception{
if(StrUtil.isEmpty(base.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = this.findBySceneNum(base.getNum());
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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.getNum()+File.separator+fileName;
map.put(path, "voice/voice"+base.getNum()+"/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("aws".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("aws".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.getNum()+"/pan/high/"+ fileName.replace("high/", ""));
continue;
}
//low文件夹
if(fileJson.getIntValue("clazz") == 4){
map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
scenePro.getNum()+"/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.getNum()+ File.separator + fileName);
continue;
}
//tiles文件夹,亚马逊瓦片图
if(fileJson.getIntValue("clazz") == 7 ){
map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
scenePro.getNum()+ 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.getNum()+ 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.getNum()+ 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.getNum()+ 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.getNum()+ 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.getNum() + "/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.getNum()+"/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.getNum()+"/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.getNum()+ "/panorama/" + sid + File.separator + fileName);
continue;
}
//tiles文件夹,亚马逊瓦片图
if(fileJson.getIntValue("clazz") == 7 ){
map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
scenePro.getNum()+ 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(FileParamVO param, MultipartFile file) throws Exception {
String sceneNum = param.getNum();
String sid = param.getSid();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = this.findBySceneNum(sceneNum);
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
String fileName = "hot" + sid + ".mp4";
if (file.isEmpty())
return ResultData.ok(fileName);
String path = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, 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
public ResultData tagSave(SaveTagsParamVO param) throws Exception {
ScenePro scenePro = this.findBySceneNum(param.getNum());
if (scenePro == null)
return ResultData.error(ErrorCode.FAILURE_CODE_5005);
List hotDataList = param.getHotDataList();
Map addOrUpdateMap = new HashMap<>();
List deleteSidList = Lists.newArrayList();
hotDataList.stream().forEach(hotData -> {
if(hotData.getType().equals(OperationType.DELETE.code()))
deleteSidList.add(hotData.getSid());
else
addOrUpdateMap.put(hotData.getSid(), hotData.getHotData());
});
//处理删除状态数据
this.deleteHotData(param.getNum(), deleteSidList);
//处理新增和修改数据
this.addOrUpdateHotDataHandler(param.getNum(), addOrUpdateMap);
//保存数据库
// sceneEditInfoService.saveTagsToSceneEditInfo(param.getNum(), scenePro.getId());
return ResultData.ok();
}
@Override
public ResultData addOrUpdateTag(SaveTagsParamVO param) throws Exception {
// ScenePro scenePro = this.findBySceneNum(param.getNum());
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if (scenePlus == null)
return ResultData.error(ErrorCode.FAILURE_CODE_5005);
this.addOrUpdateHotData(param.getNum(), param.getHotDataList());
this.addOrUpdateIcons(param.getNum(), param.getIcons());
//写入本地文件,作为备份
this.writeHotJson(param.getNum());
//保存数据库
// sceneEditInfoService.saveTagsToSceneEditInfo(param.getNum(), scenePro.getId());
return ResultData.ok();
}
private void addOrUpdateHotData(String num, List hotDataList) throws Exception{
Map addOrUpdateMap = new HashMap<>();
// hotDataList.stream().forEach(hotData -> {
// JSONObject jsonObject = JSON.parseObject(hotData.getHotData());
// jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis());
// addOrUpdateMap.put(hotData.getSid(), jsonObject.toJSONString());
// });
int i = 0;
for (HotParamVO hotParamVO : hotDataList) {
JSONObject jsonObject = JSON.parseObject(hotParamVO.getHotData());
jsonObject.put("createTime", Calendar.getInstance().getTimeInMillis() + i++);
addOrUpdateMap.put(hotParamVO.getSid(), jsonObject.toJSONString());
}
this.syncHotFromFileToRedis(num);
//处理新增和修改数据
this.addOrUpdateHotDataHandler(num, addOrUpdateMap);
}
private void addOrUpdateIcons(String num, List icons) throws Exception{
this.syncIconsFromFileToRedis(num);
String key = String.format(RedisKey.SCENE_HOT_ICONS, num);
redisUtil.sSet(key, icons.toArray());
// Map addOrUpdateMap = new HashMap<>();
// hotDataList.stream().forEach(hotData -> {
// addOrUpdateMap.put(hotData.getSid(), hotData.getHotData());
// });
//处理新增和修改数据
// this.addOrUpdateHotData(num, addOrUpdateMap);
}
@Override
public ResultData deleteTag(DeleteHotParamVO param) throws Exception {
// ScenePro scenePro = this.findBySceneNum(param.getNum());
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if (scenePlus == null)
return ResultData.error(ErrorCode.FAILURE_CODE_5005);
List deleteSidList = param.getSidList();
//处理删除状态数据
this.deleteHotData(param.getNum(), deleteSidList);
//写入本地文件,作为备份
this.writeHotJson(param.getNum());
//保存数据库
// sceneEditInfoService.saveTagsToSceneEditInfo(param.getNum(), scenePro.getId());
return ResultData.ok();
}
@Override
public ResultData deleteIcons(DeleteHotIconParamVO param) throws Exception {
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if (scenePlus == null)
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
List fileNameList = param.getFileNameList();
this.syncIconsFromFileToRedis(param.getNum());
String key = String.format(RedisKey.SCENE_HOT_ICONS, param.getNum());
redisUtil.setRemove(key, fileNameList.toArray());
//写入本地文件,作为备份
this.writeHotJson(param.getNum());
return ResultData.ok();
}
@Override
public ResultData listTags(String num) throws Exception{
//保证热点数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
this.syncHotFromFileToRedis(num);
//保证icons数据安全性,当redis宕机导致icons数据丢失时,可以从文件中读取,恢复到redis
this.syncIconsFromFileToRedis(num);
JSONObject result = new JSONObject();
//查询缓存是否包含热点数据
String key = String.format(RedisKey.SCENE_HOT_DATA, num);
Map allTagsMap = redisUtil.hmget(key);
List tags = Lists.newArrayList();
List tagBeanList = new ArrayList<>();
if(CollUtil.isNotEmpty(allTagsMap)){
allTagsMap.entrySet().stream().forEach(entry -> {
JSONObject jsonObject = JSON.parseObject(entry.getValue());
tagBeanList.add(
TagBean.builder()
.createTime(jsonObject.getLong("createTime"))
.tag(jsonObject).build());
});
//按创建时间倒叙排序
tagBeanList.sort(Comparator.comparingLong(TagBean::getCreateTime).reversed());
//移除createTime字段
tags = tagBeanList.stream().map(tagBean -> {
JSONObject tag = tagBean.getTag();
tag.remove("createTime");
return tag;
}).collect(Collectors.toList());
}
result.put("tags", tags);
//查询缓存是否包含icons
key = String.format(RedisKey.SCENE_HOT_ICONS, num);
Set icons = redisUtil.sGet(key);
if(icons == null){
icons = Sets.newHashSet();
}
List iconList = this.sortIcons(tags, icons);
result.put("icons", iconList);
return ResultData.ok(result);
}
private List sortIcons(List tags, Set icons){
//统计使用频次
List iconBeans = Lists.newArrayList();
for (String icon : icons) {
int count = 0;
for (JSONObject tag : tags) {
String sid = tag.getString("icon");
if(StrUtil.isEmpty(sid) || !icon.equals(sid)){
continue;
}
++count;
}
iconBeans.add(IconBean.builder().icon(icon).count(count).build());
}
//排序
List iconList = iconBeans.stream().sorted(Comparator.comparing(IconBean::getCount).reversed())
.map(item -> {
return item.getIcon();
}).collect(Collectors.toList());
return iconList;
}
/**
*
保证热点数据安全性,当redis宕机导致热点数据丢失时,可以从文件中读取,恢复到redis
*
* @author dengsixing
* @date 2022/3/3
**/
private void syncHotFromFileToRedis(String num) throws Exception{
String key = String.format(RedisKey.SCENE_HOT_DATA, num);
boolean exist = redisUtil.hasKey(key);
if(exist){
return;
}
String lockKey = String.format(RedisLockKey.LOCK_HOT_DATA_SYNC, num);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
if(!lock){
throw new BusinessException(ErrorCode.SYSTEM_BUSY);
}
try{
exist = redisUtil.hasKey(key);
if(exist){
return;
}
String tagsFilePath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num);
String tagsData = FileUtils.readFile(tagsFilePath + "hot.json");
if(StrUtil.isEmpty(tagsData)){
return;
}
JSONObject jsonObject = JSON.parseObject(tagsData);
JSONArray tagsArr = jsonObject.getJSONArray("tags");
if(CollUtil.isEmpty(tagsArr)){
return;
}
Map map = new HashMap<>();
for (Object o : tagsArr) {
JSONObject jo = (JSONObject)o;
map.put(jo.getString("sid"), jo.toJSONString());
}
redisUtil.hmset(key, map);
}finally {
redisLockUtil.unlockLua(lockKey);
}
}
/**
*
保证icons数据安全性,当redis宕机导致icons数据丢失时,可以从文件中读取,恢复到redis
*
* @author dengsixing
* @date 2022/3/3
**/
private void syncIconsFromFileToRedis(String num) throws Exception{
String key = String.format(RedisKey.SCENE_HOT_ICONS, num);
boolean exist = redisUtil.hasKey(key);
if(exist){
return;
}
String lockKey = String.format(RedisLockKey.LOCK_HOT_ICONS_SYNC, num);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
if(!lock){
throw new BusinessException(ErrorCode.SYSTEM_BUSY);
}
try{
exist = redisUtil.hasKey(key);
if(exist){
return;
}
String tagsFilePath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num);
String tagsData = FileUtils.readFile(tagsFilePath + "hot.json");
if(StrUtil.isEmpty(tagsData)){
return;
}
JSONObject jsonObject = JSON.parseObject(tagsData);
JSONArray iconArr = jsonObject.getJSONArray("icons");
if(CollUtil.isEmpty(iconArr)){
return;
}
redisUtil.sSet(key, iconArr.toJavaList(String.class).toArray());
}finally {
redisLockUtil.unlockLua(lockKey);
}
}
/**
*
热点数据保存
*
* @author dengsixing
* @date 2022/3/3
**/
private void writeHotJson(String num) throws Exception{
String dataKey = String.format(RedisKey.SCENE_HOT_DATA, num);
Map tagMap = redisUtil.hmget(dataKey);
List tagList = Lists.newArrayList();
tagMap.entrySet().stream().forEach(entry->{
if(StrUtil.isNotEmpty(entry.getValue())){
tagList.add(entry.getValue());
}
});
JSONObject jsonObject = new JSONObject();
JSONArray tagJsonArr = new JSONArray();
if(CollUtil.isNotEmpty(tagList)){
tagList.stream().forEach(hot->{
tagJsonArr.add(JSONObject.parseObject(hot));
});
}
jsonObject.put("tags", tagJsonArr);
String iconsKey = String.format(RedisKey.SCENE_HOT_ICONS, num);
Set iconList = redisUtil.sGet(iconsKey);
jsonObject.put("icons", iconList);
String hotJsonPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num) + "hot.json";
String lockKey = String.format(RedisLockKey.LOCK_HOT_JSON, num);
boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
if(!lock){
return;
}
try{
FileUtils.writeFile(hotJsonPath, jsonObject.toJSONString());
}finally {
redisLockUtil.unlockLua(lockKey);
}
}
private void addOrUpdateHotDataHandler(String num, Map addOrUpdateMap){
if(CollUtil.isEmpty(addOrUpdateMap))
return;
//数据验证,新增、修改状态,hotdata不能为空
for (String sid : addOrUpdateMap.keySet()) {
String hotData = addOrUpdateMap.get(sid);
if(StrUtil.isEmpty(hotData)){
throw new BusinessException(ErrorCode.FAILURE_CODE_7004);
}
}
//批量写入缓存
String key = String.format(RedisKey.SCENE_HOT_DATA, num);
redisUtil.hmset(key, addOrUpdateMap);
}
private void deleteHotData(String num, List deleteSidList) throws Exception {
this.syncHotFromFileToRedis(num);
if(CollUtil.isEmpty(deleteSidList)){
return;
}
//从redis中加载热点数据
String key = String.format(RedisKey.SCENE_HOT_DATA, num);
List deletDataList = redisUtil.hMultiGet(key, deleteSidList);
if(CollUtil.isEmpty(deletDataList))
return;
String userDataPath = String.format(UploadFilePath.USER_EDIT_PATH, num);
//删除图片音频视频等资源文件
for (String data : deletDataList) {
if(StrUtil.isBlank(data)){
continue;
}
JSONObject jsonObject = JSON.parseObject(data);
String sid = jsonObject.getString("sid");
if(jsonObject.containsKey("media")){
String fileType = jsonObject.getString("media");
if(fileType.contains("photo"))
{
uploadToOssUtil.delete(userDataPath + "hot"+sid+".jpg");
}
if(fileType.contains("audio") || fileType.contains("voice"))
{
uploadToOssUtil.delete(userDataPath + "hot"+sid+".mp3");
}
if(fileType.contains("video"))
{
uploadToOssUtil.delete(userDataPath + "hot"+sid+".mp4");
}
}
if(!StorageType.AWS.code().equals(this.type)){
JSONObject paramData = new JSONObject();
paramData.put("hotId", sid);
JSONObject hotListJson = JSONObject.parseObject(OkHttpUtils.httpGet(hotDomainList));
if(hotListJson != null){
JSONArray hotListArray = hotListJson.getJSONArray("data");
if(hotListArray != null){
for(int l = 0, len = hotListArray.size(); l < len; l++){
OkHttpUtils.httpPostJson(hotListArray.getString(l) + hotDelete + "?hotId=" + sid
, paramData.toJSONString());
}
}
}
}
}
//从redis中移除热点数据
redisUtil.hdel(key, deleteSidList.toArray());
}
@Override
// @SystemServiceLog(description = "保存场景热点")
public ResultData saveShopHot(SceneEditParamVO base) throws Exception {
if(StrUtil.isEmpty(base.getType())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
String fileName = "shopHot.json";
String sid = base.getSid();
ScenePro scenePro = findBySceneNum(base.getNum());
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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 map = redisUtil.hmget(key);
List> allTags = map.entrySet().stream().filter(item -> {
if (StrUtil.isBlank(item.getValue())) {
return false;
}
return true;
}).collect(Collectors.toList());
if (CollUtil.isEmpty(allTags)) {
throw new BusinessException(ErrorCode.FAILURE_CODE_7005);
}
allTags.stream().forEach(entry->{
JSONObject hot = JSON.parseObject(entry.getValue());
visiblePanos.stream().forEach(item->{
if (hot.getString("sid").equals(((JSONObject) item).getString("sid"))) {
hot.put("visiblePanos", ((JSONObject) item).getJSONArray("value"));
hot.put("isHidden", ((JSONObject) item).getBoolean("isHidden"));
entry.setValue(hot.toJSONString());
}
});
});
//更新版本号
SceneEditInfo editInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
sceneEditInfoService.upgradeVersionById(editInfo.getId());
//放入缓存
Map finalMap = new HashMap<>();
allTags.stream().forEach(entry->{
finalMap.put(entry.getKey(), entry.getValue());
});
//从新放入缓存
redisUtil.hmset(key, finalMap);
return ResultData.ok();
}
@Override
// @SystemServiceLog(description = "漫游可行")
public ResultData saveRoam(BaseDataParamVO param) throws Exception {
// ScenePro scenePro = this.findBySceneNum(param.getNum());
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(param.getNum());
if (scenePlus == null ) {
return ResultData.error(ErrorCode.FAILURE_CODE_5005);
}
JSONArray inputData = JSONObject.parseArray(param.getData());
String localDataPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, param.getNum());
File directory = new File(localDataPath);
if (!directory.exists()) {
directory.mkdirs();
}
String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, param.getNum());
String modeldataUrl = ossUrlPrefix + viewImagesPath + "vision.modeldata?t=" + System.currentTimeMillis();
//如果是云存储,将vision.modeldata下载到本地,如果是本地存储,场景计算完就已经将这个文件拷贝到编辑目录了存在这个文件了,不需要再下载
if(!StorageType.LOCAL.code().equals(this.type)){
FileUtils.downLoadFromUrl(modeldataUrl, "vision.modeldata", localDataPath);
}
//检查vision.modeldata本地是否存在,不存在抛出异常
File file = new File(localDataPath + "vision.modeldata");
if(!file.exists()) {
return ResultData.error(ErrorCode.FAILURE_CODE_5012);
}
//将vision.modeldata解压缩至vision.json
ConvertUtils.convertVisionModelDataToTxt(localDataPath + "vision.modeldata", localDataPath + "vision.json");
String str = FileUtils.readFile(localDataPath + "vision.json");
JSONObject json = JSONObject.parseObject(str);
JSONArray panos = json.getJSONArray("sweepLocations");
for (int i = 0; i < panos.size(); ++i) {
JSONObject pano = panos.getJSONObject(i);
for (int j = 0; j < inputData.size(); ++j) {
JSONObject jo = inputData.getJSONObject(j);
String currentPanoId = jo.getString("panoID");
JSONArray visibles = jo.getJSONArray("visibles");
JSONArray visibles3 = jo.getJSONArray("visibles3");
if (pano.getString("uuid").equals(currentPanoId)) {
pano.put("visibles", visibles);
pano.put("visibles3", visibles3);
}
}
}
FileUtils.deleteFile(localDataPath + "vision.json");
FileUtils.deleteFile(localDataPath + "vision.modeldata");
FileUtils.writeFile(localDataPath + "vision.json", json.toString());
ConvertUtils.convertTxtToVisionModelData(localDataPath + "vision.json", localDataPath + "vision.modeldata");
uploadToOssUtil.upload(localDataPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
//更新版本号
SceneEditInfo editInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
if(Objects.isNull(editInfo)){
editInfo = new SceneEditInfo();
editInfo.setScenePlusId(scenePlus.getId());
sceneEditInfoService.save(editInfo);
}else{
sceneEditInfoService.upgradeVersionById(editInfo.getId());
}
return ResultData.ok();
}
@Override
public ResultData uploadShareLogo(SceneEditParamVO base, MultipartFile file) throws Exception {
if(file == null || StrUtil.isEmpty(base.getNum())){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = findBySceneNum(base.getNum());
if (scenePro == null ) {
return ResultData.error(ErrorCode.FAILURE_CODE_5005);
}
StringBuffer dataBuf = new StringBuffer()
.append("data").append(File.separator)
.append("data").append(scenePro.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.append(File.separator);
StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
String fileName = "";
if (!file.isEmpty()&&file.getSize() > 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.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", true, path + File.separator + fileName);
MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", true, path + File.separator + fileName);
}
if("V3".equals(scenePro.getBuildType())){
MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+".png", true, path + File.separator + fileName);
MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getNum() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getNum()+"_en.png", true, path + File.separator + fileName);
}
}
return ResultData.ok(imagesBuf.toString() + fileName);
}
@Override
public ResultData uploadPic(FileParamVO param, MultipartFile file) throws Exception{
String sceneNum = param.getNum();
String folderName = param.getFolderName();
String toOss = param.getToOss();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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(SceneEditParamVO param) throws Exception {
String sceneNum = param.getNum();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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(FileParamVO param) throws Exception {
uploadToOssUtil.deleteFile(param.getFilePath());
return ResultData.ok();
}
@Override
public ResultData uploadFloorplanPng(FileParamVO param, MultipartFile[] file) throws Exception{
String sceneNum = param.getNum();
String cadInfo = param.getCadInfo();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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::getNum, sceneNum));
if(CollUtil.isEmpty(list))
return;
//修改场景状态 空间 支付状态 计算时间
List sceneProIds = list.stream().map(scenePro -> {
return scenePro.getId();
}).collect(Collectors.toList());
this.update(new LambdaUpdateWrapper()
.in(ScenePro::getId, sceneProIds)
.set(ScenePro::getSceneStatus, SceneStatus.NO_DISPLAY.code())
.set(ScenePro::getCreateTime, Calendar.getInstance().getTime())
.set(ScenePro::getUpdateTime, Calendar.getInstance().getTime())
.set(ScenePro::getPayStatus, payStatus)
.set(ScenePro::getVideos, videos));
sceneProExtService.update(new LambdaUpdateWrapper()
.in(SceneProExt::getSceneProId, sceneProIds)
.set(SceneProExt::getSpace, space)
.set(SceneProExt::getComputeTime, computeTime));
}
@Override
public void updateTime2(String sceneNum, String videos, long computeTime) {
List list = this.list(new LambdaQueryWrapper().eq(ScenePro::getNum, sceneNum));
if(CollUtil.isEmpty(list))
return;
//修改场景状态 空间 支付状态 计算时间
List sceneProIds = list.stream().map(scenePro -> {
return scenePro.getId();
}).collect(Collectors.toList());
this.update(new LambdaUpdateWrapper()
.in(ScenePro::getId, sceneProIds)
.set(ScenePro::getSceneStatus, SceneStatus.NO_DISPLAY.code())
.set(ScenePro::getCreateTime, Calendar.getInstance().getTime())
.set(ScenePro::getUpdateTime, Calendar.getInstance().getTime())
.set(ScenePro::getVideos, videos));
sceneProExtService.update(new LambdaUpdateWrapper()
.in(SceneProExt::getSceneProId, sceneProIds)
.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()
.select(ScenePro::getId)
.eq(ScenePro::getCameraId, oldCameraId));
if(CollUtil.isEmpty(list))
return;
//修改场景状态 空间 支付状态 计算时间
List sceneProIds = list.stream().map(scenePro -> {
return scenePro.getId();
}).collect(Collectors.toList());
this.update(new LambdaUpdateWrapper()
.eq(ScenePro::getCameraId, oldCameraId)
.set(ScenePro::getCameraId, cameraId)
.set(ScenePro::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::getTbStatus, TbStatus.DELETE.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::getTbStatus, TbStatus.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 uploadLogoBottomStatus(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String status = param.getStatus();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(status)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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 uploadObjAndImg(String num, MultipartFile file) throws Exception{
if(StrUtil.isEmpty(num)){
throw new BusinessException(ServerCode.PARAM_REQUIRED, "num");
}
if(!file.getOriginalFilename().endsWith(".zip")){
throw new BusinessException(ErrorCode.FAILURE_CODE_7015);
}
// ScenePro scenePro = this.findBySceneNum(num);
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
if(scenePlus == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
// SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
//文件上传的位置可以自定义
String path = scenePlusExt.getDataSource() + "_obj2txt";
String zipPath = path + "/zip/";
String filePath = path + "/extras/";
String resultPath = path + "/results/";
// String path = "F:\\uploadModel" + "_obj2txt";
// String zipPath = path + "\\zip\\";
// String filePath = path + "\\extras\\";
// String resultPath = path + "\\results\\";
//压缩文件处理:解压缩,解压缩后复制等操作
this.objAndImgFileHandler(resultPath, filePath, zipPath, file);
//创建data.json
this.writeDataJson(path);
//调用算法,不同的类型调用不同的算法
if("V2".equals(scenePlusExt.getBuildType())){
CreateObjUtil.objToTxt(path , "1");
}
if("V3".equals(scenePlusExt.getBuildType())){
CreateObjUtil.build3dModel(path , "1");
}
//算法计算完后,生成压缩文件,上传到oss
this.uploadFileofterRebuildPanoram(path, num);
//更新版本信息
SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
if(Objects.isNull(sceneEditInfo)){
sceneEditInfo = new SceneEditInfo();
sceneEditInfo.setScenePlusId(scenePlus.getId());
sceneEditInfo.setFloorPublishVer(1);
sceneEditInfo.setFloorEditVer(1);
sceneEditInfo.setIsUploadObj(CommonStatus.YES.code());
sceneEditInfoService.save(sceneEditInfo);
}else{
sceneEditInfoService.update(
new LambdaUpdateWrapper()
.setSql("version = version + 1")
.setSql("floor_edit_ver = floor_edit_ver + 1")
.setSql("floor_publish_ver = floor_publish_ver + 1")
.set(SceneEditInfo::getIsUploadObj, CommonStatus.YES.code())
.eq(SceneEditInfo::getId, sceneEditInfo.getId()));
}
return ResultData.ok();
}
private void uploadFileofterRebuildPanoram(String path, String sceneNum) throws Exception {
//因为共享目录有延迟,这里循环检测算法是否计算完毕3次,每次隔五秒
String uploadJsonPath = path + File.separator + "results" +File.separator+"upload.json";
boolean exist = ComputerUtil.checkComputeCompleted(uploadJsonPath, maxCheckTimes, waitTime);
if(!exist){
throw new BusinessException(ErrorCode.FAILURE_CODE_7013);
}
String uploadData = FileUtils.readFile(uploadJsonPath);
JSONObject uploadJson = null;
JSONArray array = null;
if(uploadData!=null) {
uploadJson = JSONObject.parseObject(uploadData);
array = uploadJson.getJSONArray("upload");
}
Map map = new HashMap();
JSONObject fileJson = null;
String fileName = "";
String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum);
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,
imgViewPath + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/" + fileName.replace("tex/", ""));
// TODO: 2022/2/17 这里复制一份到本地,不知道需不需要,先注释掉
//复制一份到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", imgViewPath +ConstantFileName.modelUUID+"_50k.dam.lzma");
map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", imgViewPath+ConstantFileName.modelUUID+"_50k.dam");
uploadToOssUtil.uploadMulFiles(map);
// TODO: 2022/2/17 这里复制一份到本地,不知道需不需要,先注释掉
// 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);
}
private void writeDataJson(String path) throws IOException {
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());
}
private void objAndImgFileHandler(String resultPath, String filePath, String zipPath, MultipartFile file)
throws Exception {
FileUtils.delAllFile(resultPath);
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();
}
// 保存压缩包到本地
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();
}
}
//是否包含obj文件
boolean objFlag = false;
//是否包含mtl文件
boolean mtlFlag = false;
File[] files = null;
String dataPath = null;
if(StrUtil.isEmpty(targetName)){
files = dataFile.listFiles();
dataPath = zipPath + "data/";
}else{
files = new File(zipPath + "data/" + targetName).listFiles();
dataPath = zipPath + "data/" + targetName + File.separator;
}
for(File data : files){
if(data.isDirectory()){
throw new BusinessException(ErrorCode.FAILURE_CODE_5018);
}
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")){
if(objFlag){
throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
}
if(!data.getName().equals("mesh.obj")){
throw new BusinessException(ErrorCode.FAILURE_CODE_5060);
}
if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){
throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
}
objFlag = true;
FileUtils.copyFile(dataPath + data.getName(), filePath + "mesh.obj", true);
continue;
}
if(data.getName().endsWith(".mtl")){
mtlFlag = true;
}
FileUtils.copyFile(dataPath + data.getName(), filePath + data.getName(), true);
}
//压缩文件中必须有且仅有一个obj和mtl文件,否则抛出异常
if(!mtlFlag || !objFlag){
throw new BusinessException(ErrorCode.FAILURE_CODE_5059);
}
}
@Override
public ResultData saveJsonData(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String jsonData = param.getJsonData();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(jsonData)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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 ResultData downloadPanoramaOrVideo(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String planId = param.getPlanId();
String type = param.getPlanId();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type)|| StrUtil.isEmpty(planId)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
if(fileName.contains("..") || fileName.contains("./\\") || fileName.contains(".//")
|| fileName.contains(".\\\\") || fileName.contains(".\\/")){
throw new BusinessException(ErrorCode.FAILURE_CODE_3018);
}
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.getNum())
.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.getNum() + "/" + planId + ".mp4";
}
Map map = new HashMap<>();
map.put("fileUrl", url + "?t=" + System.currentTimeMillis());
map.put("fileName", url.substring(url.lastIndexOf("/") + 1));
return ResultData.ok(map);
}
@Override
public ResultData uploadPanoramaOrVideo(FileParamVO param, MultipartFile file) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String planId = param.getPlanId();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type) || StrUtil.isEmpty(planId)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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(FileParamVO param, MultipartFile file) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String planId = param.getPlanId();
String rect = param.getRect();
String dir = param.getDir();
String hfov = param.getHfov();
String vfov = param.getVfov();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) ||
StrUtil.isEmpty(planId) || StrUtil.isEmpty(rect)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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.getNum() + File.separator + fileName, filePath, true);
}else {
//上传文件
file.transferTo(targetFile);
FileUtils.copyFile(filePath, ConstantFilePath.SCENE_PATH + "video/video"+
scenePro.getNum() + 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.getNum());
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.getNum() + 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(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String planId = param.getPlanId();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(planId)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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.getNum() + File.separator +
fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4");
uploadToOssUtil.delete("video/video"+ scenePro.getNum() + File.separator +
fileName.substring(0, fileName.lastIndexOf(".")) + ".flv");
FileUtils.deleteFile(ConstantFilePath.SCENE_PATH + "video/video"+ scenePro.getNum() + File.separator + fileName);
return ResultData.ok();
}
@Override
public ResultData uploadBgMusic(FileParamVO param, MultipartFile file) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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(FileParamVO param, MultipartFile file) throws Exception {
String sceneNum = param.getNum();
String sid = param.getSid();
String imagesName = param.getImagesName();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(sid)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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("aws".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.getNum()+"/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.getNum()+ "/panorama_edit/" + sid + File.separator + fileName);
}
//tiles文件夹,亚马逊瓦片图
if(fileJson.getIntValue("clazz") == 7 ){
map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
scenePro.getNum()+ File.separator + fileName);
}
}
//上传全景图
map.put(filePath, "images/images"+ scenePro.getNum()+ 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.getNum()+ "/panorama_edit/" + sid);
return ResultData.ok(result);
}
@Override
public ResultData savePanoramaJson(FileParamVO param) throws Exception {
String sceneNum = param.getNum();
String fileName = param.getFileName();
String fileData = param.getFileData();
String sid = param.getSid();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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(FileParamVO param) throws Exception{
String sceneNum = param.getNum();
String floorJsonData = param.getFloorJsonData();
if(StrUtil.isEmpty(sceneNum) ){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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(FileParamVO param) throws Exception{
String sceneNum = param.getNum();
String floorJsonData = param.getFloorJsonData();
if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(floorJsonData)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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 Page 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::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::getCameraId, cameraId)
.in(ScenePro::getSceneStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code())
.eq(ScenePro::getPayStatus, PayStatus.PAY.code()));
if(CollUtil.isEmpty(list)){
return 0l;
}
List sceneProIds = list.stream().map(scenePro -> {
return scenePro.getId();
}).collect(Collectors.toList());
List extList = sceneProExtService.list(new LambdaQueryWrapper()
.in(SceneProExt::getSceneProId, sceneProIds));
long sum = extList.parallelStream().mapToLong(ext -> ext.getSpace()).sum();
return sum;
}
@Override
public void updatePayStatusByCameraId(Integer payStatus, Long cameraId) {
this.update(new LambdaUpdateWrapper()
.eq(ScenePro::getTbStatus, TbStatus.VALID.code())
.eq(ScenePro::getCameraId, cameraId)
.set(ScenePro::getPayStatus, payStatus));
}
@Override
public ResultData downloadPanoramaData(SceneEditParamVO param) throws Exception {
String sceneNum = param.getNum();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
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.getNum())
.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(SceneEditParamVO param) throws Exception {
String sceneCode = param.getSceneName();
if(StrUtil.isEmpty(sceneCode)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
List sceneProList = this.list(
new QueryWrapper()
.eq("tb_status", TbStatus.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.getNum())
.append(File.separator);
StringBuffer imagesBuf = new StringBuffer()
.append("images").append(File.separator)
.append("images").append(scenePro.getNum())
.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("aws".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.PARAM_REQUIRED);
}
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.getTbStatus().equals(TbStatus.DELETE.code())){
throw new BusinessException(ErrorCode.FAILURE_CODE_5009);
}
if(!SceneStatus.SUCCESS.code().equals(scenePro.getSceneStatus())
&& !SceneStatus.NO_DISPLAY.code().equals(scenePro.getSceneStatus())){
throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
}
if(scenePro.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);
}
@Override
public ResultData rebuildReduceSpaceBySceneNum(String sceneNum) throws Exception{
ScenePro scenePro = this.findBySceneNum(sceneNum);
if(scenePro == null){
log.info("该场景不存在无法扣除容量,场景码为:" + sceneNum);
return ResultData.error(ErrorCode.FAILURE_CODE_5054);
}
if (scenePro.getSceneScheme() < 4){
log.info("该场景不属于八目相机无法扣除容量,场景码为:" + sceneNum);
return ResultData.error(ErrorCode.FAILURE_CODE_5055);
}
SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
platformGoodsClient.updateCameraDetailByCameraIdAndSpace(scenePro.getCameraId(), -sceneProExt.getSpace());
sceneProExt.setSpace(Long.parseLong("0"));
sceneProExt.setUpdateTime(Calendar.getInstance().getTime());
sceneProExtService.updateById(sceneProExt);
return ResultData.ok();
}
@Override
public void tempScenes(List lockedIds) {
if (lockedIds == null || lockedIds.size() == 0){
return;
}
for (Long id : lockedIds){
ScenePro scenePro = this.getById(id);
scenePro.setPayStatus(-2);
this.updateById(scenePro);
ScenePro sceneProEntity = this.getById(id);
try{
Map map = new HashMap<>();
map.put("payStatus", -2);
FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneProEntity.getNum() + "/scene.json", map);
}catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public ResultData getRecordAudioFromBrowser(FileParamVO param, MultipartFile file) throws IOException {
String sceneNum = param.getNum();
if(StrUtil.isEmpty(sceneNum) || file.isEmpty() || file.getSize() <= 0){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = this.findBySceneNum(sceneNum);
if(scenePro == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
//文件上传的位置可以自定义
log.info("开始上传文件");
String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum;
File targetFile = new File(path);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
String fileName = file.getOriginalFilename();
targetFile = new File(path + File.separator + fileName);
// 保存
synchronized(this){
file.transferTo(targetFile);
}
return ResultData.ok();
}
@Override
public ResultData checkVideoUrl(FileParamVO param) {
String path = param.getPath();
if(StrUtil.isEmpty(path)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
if(!path.contains("qq.com") && !path.contains("youku.com") && !path.contains("iqiyi.com")){
throw new BusinessException(ErrorCode.FAILURE_CODE_5016);
}
if(path.contains("v.qq.com/txp/iframe/player.html") || path.contains("player.youku.com/embed")
|| path.contains("open.iqiyi.com/developer/player_js/coopPlayerIndex.html")){
return ResultData.ok(path);
}
String html = "";
try {
URL url = new URL(path);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.setConnectTimeout(60000);
httpConn.setReadTimeout(60000);
InputStreamReader input = new InputStreamReader(httpConn
.getInputStream(), "utf-8");
BufferedReader bufReader = new BufferedReader(input);
String line = "";
String vid = "";
if(path.contains("qq.com")){
while ((line = bufReader.readLine()) != null) {
// System.out.println(line);
if(line.contains("m.v.qq.com/play.html")){
System.out.println(line.substring(line.indexOf("&vid=") + 5, line.indexOf("&ptag")));
vid = line.substring(line.indexOf("&vid=") + 5, line.indexOf("&ptag"));
break;
}
}
if(!StrUtil.isEmpty(vid)){
html = "https://v.qq.com/txp/iframe/player.html?vid=" + vid;
}
}
if(path.contains("youku.com")){
vid = path.substring(path.indexOf("/id_") + "/id_".length(), path.indexOf(".html"));
html = "https://player.youku.com/embed/" + vid;
}
if(path.contains("iqiyi.com")){
String tvid = "";
while ((line = bufReader.readLine()) != null) {
if(line.contains("param['vid']")){
vid = line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""));
}
if(line.contains("param['tvid']")){
tvid = line.substring(line.indexOf("\"") + 1, line.lastIndexOf("\""));
}
}
if(!StrUtil.isEmpty(vid) && !StrUtil.isEmpty(tvid)){
html = "https://open.iqiyi.com/developer/player_js/coopPlayerIndex.html?vid=" + vid +
"&tvId=" + tvid;
}
}
}catch (Exception e){
e.printStackTrace();
}
return ResultData.ok(html);
}
public ResultData downloadTexData(String num) throws Exception {
if(StrUtil.isEmpty(num)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
// ScenePro scenePro = this.findBySceneNum(num);
ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
if(scenePlus == null){
throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
}
// SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
SceneEditInfo sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
String localImagePath = String.format(ConstantFilePath.IMAGESBUFFER_FORMAT, num);
if(!new File(localImagePath).exists()){
new File(localImagePath).mkdirs();
}
String newData = scenePlusExt.getDataSource() + "_obj2txt/extras";
String newResultData = scenePlusExt.getDataSource() + "_obj2txt/results/upload.json";
String zipName = num + "_extras.zip";
String zipPath = localImagePath + zipName;
//如果用户上传过模型,就打包上传到oss,直接返回
if(CommonStatus.YES.code().equals(sceneEditInfo.getIsUploadObj())
&& new File(newData).exists()
&& new File(newResultData).exists()){
//打包
FileUtils.zipFile(zipPath, newData);
//上传压缩包
uploadToOssUtil.upload(zipPath, "downloads/extras/" + zipName);
String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
return ResultData.ok(url);
}
String buildType = scenePlusExt.getBuildType();
if("V3".equals(buildType)){
String dataViewPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
//V3版本去oss下载2048模型
String meshPath = String.format(ConstantFilePath.DATABUFFER_FORMAT, num) + "mesh";
FileUtils.deleteDirectory(meshPath);
CreateObjUtil.ossUtilCp(dataViewPath + "mesh", meshPath);
log.info("meshPath="+meshPath.concat("/mesh"));
if(!new File(meshPath.concat("/mesh")).exists()){
throw new BusinessException(ErrorCode.FAILURE_CODE_7006);
}
log.info(new File(meshPath.concat("/mesh")).listFiles().toString());
if(new File(meshPath.concat("/mesh")).listFiles().length > 0){
for(File file : new File(meshPath.concat("/mesh")).listFiles()){
if(file.getName().endsWith(".obj") && !"output.house.obj".equals(file.getName()) &&
!"mesh.obj".equals(file.getName())){
file.delete();
}
if(file.getName().endsWith(".mtl") && !"output.house.mtl".equals(file.getName()) &&
!"mesh.mtl".equals(file.getName())){
file.delete();
}
}
//打包
FileUtils.zipFile(zipPath, meshPath);
//上传压缩包
uploadToOssUtil.upload(zipPath, "downloads/extras/" + zipName);
String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
return ResultData.ok(url);
}
}
//V2版本在本地获取模型资源
//修改过的资源
String editData = scenePlusExt.getDataSource() + "_edit/caches/tex";
String results = scenePlusExt.getDataSource() + "_edit/results";
if (new File(editData).exists() && new File(results).exists()){
for(File file : new File(editData).listFiles()){
if(file.getName().endsWith(".obj") && !"output.house.obj".equals(file.getName()) &&
!"mesh.obj".equals(file.getName())){
file.delete();
}
if(file.getName().endsWith(".mtl") && !"output.house.mtl".equals(file.getName()) &&
!"mesh.mtl".equals(file.getName())){
file.delete();
}
}
FileUtils.zipFile(zipPath, editData);
//上传压缩包
uploadToOssUtil.upload(zipPath, "downloads/extras/" + zipName);
String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
return ResultData.ok(url);
}
//没上传过返回源资源
String dataPath = scenePlusExt.getDataSource() + "/caches/tex";
File dataFile = new File(dataPath);
if(!dataFile.exists()){
throw new BusinessException(ErrorCode.FAILURE_CODE_3018);
}
for(File file : dataFile.listFiles()){
if(file.getName().endsWith(".obj") && !"output.house.obj".equals(file.getName()) &&
!"mesh.obj".equals(file.getName())){
file.delete();
}
if(file.getName().endsWith(".mtl") && !"output.house.mtl".equals(file.getName()) &&
!"mesh.mtl".equals(file.getName())){
file.delete();
}
}
FileUtils.zipFile(zipPath, dataPath);
//上传压缩包
uploadToOssUtil.upload(zipPath, "downloads/extras/" + zipName);
String url = ossUrlPrefix + "downloads/extras/" + zipName + "?t=" + Calendar.getInstance().getTimeInMillis();
return ResultData.ok(url);
}
private void dealTour(SceneEditParamVO 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.getNum()+"/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 map = new HashMap<>();
if(StringUtils.isEmpty(path) || StringUtils.isEmpty(projectNum)){
return ResultData.error(ErrorCode.PARAM_REQUIRED);
}
boolean vision2 = false;
//读取upload文件,检验需要上传的文件是否存在
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){
throw new Exception("upload.json数据出错");
}
JSONObject fileJson = null;
String fileName = "";
String meshfix = ""; //双模型时候会有改文件路径
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+"文件不存在");
}
//判断是否有vision2.txt
if("vision2.txt".equals(fileName)){
vision2 = true;
}
//tex文件夹
if(fileJson.getIntValue("clazz") == 2 && !fileJson.containsKey("pack-file")){
if(fileName.contains("meshfix.txt")){
meshfix = fileName;
}else {
map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
projectNum+"/"+ ConstantFileName.modelUUID+"_50k_texture_jpg_high1/"+fileName.replace("tex/", ""));
}
continue;
}
//high文件夹
if(fileJson.getIntValue("clazz") == 3){
map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
projectNum+"/pan/high/"+ fileName.replace("high/", ""));
continue;
}
//low文件夹
if(fileJson.getIntValue("clazz") == 4){
map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
projectNum+"/pan/low/"+ fileName.replace("low/", ""));
continue;
}
//tiles文件夹
if(fileJson.getIntValue("clazz") == 5 ){
map.put(path + File.separator + "results" + File.separator+ fileName,"images/images"+
projectNum+ File.separator + fileName);
continue;
}
//updown文件复制一份到ecs中并去掉换行符
if(fileJson.getIntValue("clazz") == 10){
String updown = FileUtils.readFile(path + File.separator + "results" +File.separator+ fileName);
JSONObject updownJson = JSONObject.parseObject(updown);
FileUtils.writeFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + projectNum +
File.separator + fileName.replace("updown", "mapping"), updownJson.toString());
continue;
}
//video视频文件或封面图
if(fileJson.getIntValue("clazz") == 11 || fileJson.getIntValue("clazz") == 12){
map.put(path + File.separator + "results" + File.separator+ fileName,"video/video"+
projectNum+ File.separator + fileName.replace("videos/", ""));
}
//2048的模型和贴图
if(fileJson.getIntValue("clazz") == 16){
map.put(path + File.separator + "results" + File.separator+ fileName,"data/data"+
projectNum+ File.separator + fileName);
}
}
CreateObjUtil.convertTxtToDam( path + File.separator + "results" + File.separator+"tex"+File.separator+"modeldata.txt", path + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k.dam");
CreateObjUtil.convertDamToLzma(path + File.separator + "results");
CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+"tex"+File.separator+"modeldata.txt", path + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k.dam");
//有meshfix,表示双模型
if(!"".equals(meshfix)){
CreateObjUtil.convertTxtToDam( path + File.separator + "results" + File.separator+meshfix, path + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k2.dam");
CreateObjUtil.convertDamToLzma2(path + File.separator + "results");
CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+meshfix, path + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k2.dam");
map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k2.dam.lzma", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k2.dam.lzma");
map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k2.dam", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k2.dam");
}
CreateObjUtil.convertTxtToVisionmodeldata(path + File.separator + "results" +File.separator+"vision.txt",path + File.separator + "results" +File.separator+"vision.modeldata");
//8目相机有两个vision.txt因此第二个叫vision2.txt
if(vision2){
CreateObjUtil.convertTxtToVisionmodeldata(path + File.separator + "results" +File.separator+"vision2.txt",path + File.separator + "results" +File.separator+"vision2.modeldata");
map.put(path + File.separator + "results" +File.separator+"vision2.modeldata", "images/images"+projectNum+"/"+"vision2.modeldata");
}
log.info("数据转换完成:"+projectNum);
File file = new File(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma");
while(!file.exists())
{
Thread.sleep(60000);
}
map.put(path + File.separator + "results" +File.separator+"vision.modeldata", "images/images"+projectNum+"/"+"vision.modeldata");
map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k.dam.lzma");
map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", "images/images"+projectNum+"/"+ConstantFileName.modelUUID+"_50k.dam");
file = new File(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum);
if(!file.exists())
{
file.mkdir();
}
FileUtils.copyFile(path + File.separator + "results" +File.separator+"floor.json", ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum+File.separator+"floor.json", true);
log.info("floor.json路径:"+ path + File.separator + "results" +File.separator+"floor.json");
map.put(path + File.separator + "results" +File.separator+"floor.json","data/data"+projectNum+"/floor.json");
log.info("准备上传文件到oss:"+projectNum);
uploadToOssUtil.uploadMulFiles(map);
return ResultData.ok("上传完成");
}
@Override
public ResultData updateStatusByScene(SceneParamVO param) throws Exception{
String sceneNum = param.getNum();
Integer status = param.getStatus();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
if(scenePro != null){
scenePro.setSceneStatus(status);
sceneProService.updateById(scenePro);
SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
sceneProEdit.setVersion(sceneProEdit.getVersion() + 1);
sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1);
sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorPublishVer() + 1);
sceneProEditService.updateById(sceneProEdit);
sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1);
sceneProEditExt.setVideosUser(null);
sceneProEditExtService.updateById(sceneProEditExt);
}
return ResultData.ok();
}
@Override
public ResultData getStatusByScene(SceneParamVO param) throws Exception{
String sceneNum = param.getNum();
if(StrUtil.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.PARAM_REQUIRED);
}
ScenePro scenePro = sceneProService.findBySceneNum(sceneNum);
if(scenePro != null){
return ResultData.ok(scenePro.getSceneStatus() == -2? 1 : scenePro.getSceneStatus());
}
return ResultData.ok();
}
@Override
public ResultData checkDownLoad(String sceneNum) {
if(StringUtils.isEmpty(sceneNum)){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
ScenePro scenePro = sceneProService.findBySceneNum(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);
}
//downloadStatus,1打包资源下载,2已下载过,3下载过,并且没有修改过,无需打包直接返回下载地址,-1没下载次数不足
SceneDownloadLog sceneDownloadLogEntity = sceneDownloadLogService.findByStatusAndNum(sceneNum, 0);
Map result = new HashMap<>();
if(sceneDownloadLogEntity != null){
result.put("downloadStatus", 1);
return ResultData.ok(result);
}
sceneDownloadLogEntity = sceneDownloadLogService.findByStatusAndNum(sceneNum, 1);
//3下载过,并且没有修改过
if(sceneDownloadLogEntity != null && sceneDownloadLogEntity.getSceneVersion().intValue() ==
sceneProEdit.getVersion()){
result.put("downloadStatus", 3);
result.put("downloadUrl", sceneDownloadLogEntity.getDownloadUrl());
return ResultData.ok(result);
}
//下载过
if(sceneDownloadLogEntity != null){
result.put("downloadStatus", 2);
// 清除旧的下载信息
redisUtil.del(RedisKey.PREFIX_DOWNLOAD_PROGRESS_V4.concat(sceneNum));
return ResultData.ok(result);
}
//未下载过
result.put("downloadStatus", 0);
return ResultData.ok(result);
}
@Override
public List findByCameraIds(String cameraIds, String startTime, String endTime) {
return this.baseMapper.findByCameraIds(cameraIds, startTime, endTime);
}
@Override
public ResultData getScenesBySnCode(String snCode, String token) {
if(StringUtils.isEmpty(token)){
throw new BusinessException(3004, "无token参数");
}
SSOUser ssoUser = ssoLoginHelper.loginCheck(token);
if(ssoUser == null){
throw new BusinessException(3004, "token参数不正确");
}
if(StringUtil.isEmpty(snCode)){
throw new BusinessException(ErrorCode.MISSING_REQUIRED_PARAMETERS);
}
Camera cameraEntity = platformGoodsClient.getCameraBySnCode(snCode).getData();
if(cameraEntity == null ){
throw new BusinessException(CameraConstant.FAILURE_6018);
}
CameraDetail cameraDetailEntity = platformGoodsClient.getCameraDetailByCameraId(cameraEntity.getId()).getData();
if(cameraDetailEntity == null ){
throw new BusinessException(CameraConstant.FAILURE_6018);
}
if(!cameraDetailEntity.getUserId().equals(ssoUser.getId())){
return ResultData.ok();
}
if(cameraDetailEntity.getCameraType() == 10 ){ //激光场景
List scenesBySnCode = fdkkLaserService.getScenesBySnCode(snCode, token);
return ResultData.ok(scenesBySnCode);
}
List sceneVo = sceneProMapper.getNumAndNameByCameraId(cameraEntity.getId(), ssoUser.getId());
return ResultData.ok(sceneVo);
}
}