package com.fdkankan.scene.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.common.constant.*;
import com.fdkankan.common.exception.BusinessException;
import com.fdkankan.common.response.ResultData;
import com.fdkankan.common.util.*;
import com.fdkankan.scene.entity.*;
import com.fdkankan.scene.mapper.ISceneProMapper;
import com.fdkankan.scene.service.*;
import com.fdkankan.scene.vo.SceneEditVO;
import com.fdkankan.scene.vo.SceneProVO;
import com.fdkankan.scene.vo.SceneVO;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * pro场景表 服务实现类
 * </p>
 *
 * @author dengsixing
 * @since 2021-12-23
 */
@Slf4j
@Service
public class SceneProServiceImpl extends ServiceImpl<ISceneProMapper, ScenePro> implements ISceneProService {

    @Value("${prefix.ali}")
    private String prefixAli;

    @Value("${oss.type}")
    private String type;

    @Value("${hot.domain.list}")
    private String hotDomainList;

    @Value("${hot.delete}")
    private String hotDelete;

    @Value("${main.url}")
    private String mainUrl;

    @Value("${scene.url}")
    private String sceneUrl;

    @Value("${scene.pro.url}")
    private String sceneProUrl;

    @Value("${scene.pro.new.url}")
    private String sceneProNewUrl;

    @Autowired
    @Qualifier("uploadToOssUtil")
    UploadToOssUtil uploadToOssUtil;
    @Autowired
    ISceneProExtService sceneProExtService;
    @Autowired
    ISceneProEditService sceneProEditService;
    @Autowired
    ISceneProEditExtService sceneProEditExtService;
    @Autowired
    ISceneService sceneService;
    @Autowired
    RedisUtil redisUtil;
    @Autowired
    ISceneDataDownloadService sceneDataDownloadService;

    @Override
    public List<SceneVO> convert(List<ScenePro> list){
        List<SceneVO> sceneVOS = list.parallelStream().map(scenePro -> {
            SceneVO sceneVo = new SceneVO();
            SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
            SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getProId());
            BeanUtils.copyProperties(sceneProEditExt, sceneVo);
            BeanUtils.copyProperties(sceneProEdit, sceneVo);
            BeanUtils.copyProperties(scenePro, sceneVo);

            sceneVo.setCreateTime(DateUtil.format(scenePro.getCreateTime(), DateExtUtil.dateStyle4));
            sceneVo.setCreateDate(scenePro.getCreateTime().getTime());

            return sceneVo;

        }).collect(Collectors.toList());

        return sceneVOS;
    }

    @Override
    public Long getSceneCount(Long cameraId) {

        return this.count(new QueryWrapper<ScenePro>()
                .eq("camera_id", cameraId)
                .eq("tb_status",TbStatus.VALID.code())
                .eq("rec_status",RecStatus.VALID.code())
                .notIn("scene_type", SceneType.YJHZXNFY.code()));

    }

    @Override
    public ScenePro findBySceneNum(String sceneNum) {
        List<ScenePro> list = this.list(new QueryWrapper<ScenePro>()
                .eq("tb_status", TbStatus.VALID.code())
                .eq("rec_status", RecStatus.VALID.code())
                .eq("scene_code", sceneNum));
        if(CollUtil.isEmpty(list)){
            return null;
        }
        return list.get(0);
    }

    @Override
    public ScenePro findDeleteSceneBySceneNum(String sceneNum) {

        List<ScenePro> list = this.list(new QueryWrapper<ScenePro>()
                .eq("rec_status", RecStatus.DISABLE.code())
                .eq("scene_code", sceneNum));
        if(CollUtil.isEmpty(list)){
            return null;
        }
        return list.get(0);

    }

    @Override
    public SceneProPO getSceneStatusByUnicode(String unicode, String recStatus) {
        return baseMapper.getSceneStatusByUnicode(unicode, recStatus);
    }

    @Override
    public List<SceneProPO> findByUserIdAndCameraType(Long userId, Integer cameraType) {
        return baseMapper.findByUserIdAndCameraType(userId, cameraType);
    }

    public List<SceneProPO> findByUserId(Long userId, List<String> excludeNums) {
        return baseMapper.findByUserId(userId,excludeNums);
    }

    @Override
    public List<SceneProPO> findBySceneNums(List<String> sceneCodeList, Integer cameraType) {
        return baseMapper.findBySceneNums(sceneCodeList, cameraType);
    }

    @Override
    public void updateStatus(String sceneNum, int sceneStatus) {
        List<ScenePro> sceneProList = this.list(new QueryWrapper<ScenePro>().eq("scene_code", sceneNum));
        if(CollUtil.isEmpty(sceneProList)){
            return ;
        }
        List<Long> proIds = sceneProList.stream().map(pro -> {
            return pro.getId();
        }).collect(Collectors.toList());

        sceneProExtService.update(new LambdaUpdateWrapper<SceneProExt>()
                .in(SceneProExt::getSceneProId, proIds)
                .set(SceneProExt::getSceneStatus, sceneStatus));
    }

    @Override
    public ResultData resetUploadFloorJson(SceneEditVO sceneEdit) throws Exception{
        if(StrUtil.isEmpty(sceneEdit.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneEdit.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        //更新scene.json文件
        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null)
        {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }else {
            new File(dataBuffer.toString() + "scene.json").createNewFile();
        }
        if(!StrUtil.isEmpty(sceneEdit.getSceneData())){
            JSONObject sceneObject = JSONObject.parseObject(sceneEdit.getSceneData());
            Set<String> set =sceneObject.keySet();

            for(String key : set){
                scenejson.put(key, sceneObject.get(key));
            }
        }

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
        //重置将floorEditVer回归floorPublishVer
        sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorEditVer());
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        //更新scene.json文件
        if(strsceneInfos!=null){
            scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer());
            scenejson.put("floorPublishVer", sceneProEdit.getFloorEditVer());
            scenejson.put("cadInfo", sceneProEditExt.getCadInfo());
            FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
            log.info("写入scene.json文件完成, sceneCode:{}", sceneEdit.getSceneNum());
        }
        log.info("重置画墙重建模型版本成功");

        return ResultData.ok();
    }

    @Override
    public ResultData uploadFloorJson(SceneEditVO sceneEdit) throws Exception {

        String lockKey = String.format(RedisKey.LOCK_UPLOAD_FLOORJSON_REBUILD, sceneEdit.getSceneNum());
        Boolean lock = redisUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR);
        if(!lock){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5036);
        }

        try {

            long start = System.currentTimeMillis();
            log.info("画墙重建模型开始时间：" + start);
            if(StrUtil.isEmpty(sceneEdit.getSceneNum())){
                throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
            }

            ScenePro scenePro = findBySceneNum(sceneEdit.getSceneNum());
            if(scenePro == null){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
            }
            SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

            SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
            if(sceneProEdit == null){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
            }

            //更新scene.json文件
            String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneEdit.getSceneNum() + File.separator + "scene.json");
            JSONObject scenejson = new JSONObject();
            if(strsceneInfos!=null)
            {
                scenejson = JSONObject.parseObject(strsceneInfos);
            }else {
                new File(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneEdit.getSceneNum() + File.separator + "scene.json").createNewFile();
            }
            if(!StrUtil.isEmpty(sceneEdit.getSceneData())){
                JSONObject sceneObject = JSONObject.parseObject(sceneEdit.getSceneData());
                Set<String> set =sceneObject.keySet();

                for(String key : set){
                    scenejson.put(key, sceneObject.get(key));
                }
            }

            //保存floor.json前端下次进入需要使用
            if(StrUtil.isEmpty(sceneEdit.getWebFloor())){
                sceneEdit.setWebFloor(sceneEdit.getFloor());
            }

            //上传过模型只更新floor.json
            FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum() + File.separator + "floor.json", new String(sceneEdit.getWebFloor().getBytes(), "UTF-8"));

            //更新scene.json文件
            if(strsceneInfos!=null)
            {
                scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer() + 1);
                scenejson.put("floorPublishVer", sceneProEdit.getFloorPublishVer());
                FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum()+File.separator+"scene.json", scenejson.toString());
                log.info("写入scene.json文件完成——"+sceneEdit.getSceneNum());
            }

            //floorEditVer字段增加1
            sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1);
            sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
            sceneProEditService.updateById(sceneProEdit);

            String path = sceneProExt.getDataSource();
            if(path != null && !"".equals(path) && path.startsWith("http")){
                path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
            }
            String target = path + "_edit";
            File editPath = new File(target);
            if(!editPath.exists()){
                editPath.mkdirs();
            }
            //创建文件夹软连接并且复制data.json和project.json
            if(new File(target + File.separator + "capture").exists()){
                new File(target + File.separator + "capture").delete();
            }
            if(new File(target + File.separator + "caches").exists()){
                //删除link
                new File(target + File.separator + "caches" + File.separator + "images").delete();
                //删除所有文件
                FileUtils.delAllFile(target + File.separator + "caches");
            }
            if(new File(target + File.separator + "results").exists()){
                FileUtils.delAllFile(target + File.separator + "results");
            }
            //创建文件夹,并link文件夹
            new File(target + File.separator + "caches").mkdirs();
            CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
            if(new File(path + File.separator + "caches" + File.separator + "images").exists()){
                CreateObjUtil.createSoftConnection(path + File.separator + "caches" + File.separator + "images", target + File.separator + "caches" + File.separator + "images");
            }

            FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
            FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);

            //data.json增加extras为执行重建算法
            String project = FileUtils.readFile(target + File.separator+"project.json");
            if(project != null){
                JSONObject projectJson = JSONObject.parseObject(project);
                projectJson.put("parent", projectJson.get("uuid"));
                projectJson.put("uuid", UUID.randomUUID().toString());
                projectJson.put("time", System.currentTimeMillis());
                FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString());
            }

            String data = FileUtils.readFile(target + File.separator+"data.json");
            if(data != null){
                JSONObject floorplanJson = new JSONObject();
                floorplanJson.put("has_floorplan_json", true);
                floorplanJson.put("has_vision_txt", true);

                JSONObject dataJson = JSONObject.parseObject(data);
                dataJson.put("extras", floorplanJson);
                //V5表示不需要生成high，low文件
                dataJson.put("skybox_type", "SKYBOX_V5");
                dataJson.put("split_type", "SPLIT_V4");
                FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
            }

            //文件上传的位置可以自定义
            log.info("画墙重建模型开始");
            File targetFile = new File(target + File.separator + "extras" + File.separator + "floorplan.json");
            if(!targetFile.getParentFile().exists()){
                targetFile.getParentFile().mkdirs();
            }
            if(targetFile.exists()){
                FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "floorplan.json");
            }
            // 保存
            FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floorplan.json", new String(sceneEdit.getFloor().getBytes(), "UTF-8"));

            FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum() + File.separator + "floor.json", new String(sceneEdit.getWebFloor().getBytes(), "UTF-8"));
            //下载vision.modeldata，解压成vision.txt,并且删除vision.modeldata
            log.info("下载vision.modeldata文件");
            if("s3".equals(type)){
                FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getSceneNum() + "/vision.modeldata" + "?m="+new Date().getTime(),
                        "vision.modeldata", target + File.separator + "extras" + File.separator);
            }
            if("oss".equals(type)){
                FileUtils.downLoadFromUrl(prefixAli + "images/images" + sceneEdit.getSceneNum() + "/vision.modeldata" + "?m="+new Date().getTime(),
                        "vision.modeldata", target + File.separator + "extras" + File.separator);
            }
            CreateObjUtil.convertVisionmodeldataToTxt(target + File.separator + "extras" + File.separator + "vision.modeldata",
                    target + File.separator + "extras" + File.separator + "vision.txt");
            log.info("解压完成，删除vision.modeldata文件");
            FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "vision.modeldata");

            log.info("下载vision2.modeldata文件");
            if("oss".equals(type)){
                FileUtils.downLoadFromUrl(prefixAli + "images/images" + sceneEdit.getSceneNum() + "/vision2.modeldata" + "?m="+new Date().getTime(),
                        "vision2.modeldata", target + File.separator + "extras" + File.separator);
            }
            if("s3".equals(type)){
                FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + sceneEdit.getSceneNum() + "/vision2.modeldata" + "?m="+new Date().getTime(),
                        "vision2.modeldata", target + File.separator + "extras" + File.separator);
            }
            CreateObjUtil.convertVisionmodeldataToTxt(target + File.separator + "extras" + File.separator + "vision2.modeldata",
                    target + File.separator + "extras" + File.separator + "vision2.txt");
            log.info("解压完成，删除vision2.modeldata文件");
            FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "vision2.modeldata");

            //重新计算算法
            log.info("重新计算大场景：开始建模——"+sceneEdit.getSceneNum());
            //判断V2还是V3
            if("V2".equals(scenePro.getBuildType())){
                CreateObjUtil.build3dModelOld(target , "1");
            }
            if("V3".equals(scenePro.getBuildType())){
                CreateObjUtil.build3dModel(target , "1");
            }
            log.info("重新计算大场景：开始转换成lzma文件——"+sceneEdit.getSceneNum());
            CreateObjUtil.convertTxtToDam( target + File.separator + "results" + File.separator+"tex"+
                    File.separator+"modeldata.txt", target + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k.dam");
            CreateObjUtil.convertDamToLzma(target + File.separator + "results");
            CreateObjUtil.convertTxtToDam( target + File.separator + "results" +File.separator+"tex"+
                    File.separator+"modeldata.txt", target + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k.dam");
            File lzmaFile = new File(target + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma");
            if(!lzmaFile.exists())
            {
                log.info("lzam文件不存在——"+sceneEdit.getSceneNum());
                Thread.sleep(3000);
            }

            File sceneFile = new File(ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneEdit.getSceneNum() + File.separator + ConstantFileName.modelUUID + "_50k_texture_jpg_high1");
            if(!sceneFile.exists())
            {
                log.info("high1文件夹不存在——"+sceneEdit.getSceneNum());
                sceneFile.mkdirs();
            }

            //将重新建模的tex里的文件和lzma文件复制到Message.filePath+"images"+File.separator+"images"+sceneNum下。
            List<String> 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<list1.size(); ++i)
            {
                String imgName = list1.get(i);
                FileUtils.copyFile(target+File.separator + "results" + File.separator+"tex"+File.separator+imgName,
                        ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneEdit.getSceneNum() + File.separator + ConstantFileName.modelUUID + "_50k_texture_jpg_high1"+File.separator+imgName, true);
            }
            FileUtils.copyFile(target+File.separator + "results" + File.separator +ConstantFileName.modelUUID+"_50k.dam",
                    ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneEdit.getSceneNum() + File.separator + ConstantFileName.modelUUID+"_50k.dam", true);
            log.info("文件复制到本地ecs完成——"+sceneEdit.getSceneNum());

            //更新scene.json文件
            if(strsceneInfos!=null)
            {
                scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer() + 1);
                scenejson.put("floorPublishVer", sceneProEdit.getFloorPublishVer());
                FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneEdit.getSceneNum()+File.separator+"scene.json", scenejson.toString());
                log.info("写入scene.json文件完成——"+sceneEdit.getSceneNum());
            }

            //floorEditVer字段增加1
            sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1);
            sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
            sceneProEditService.updateById(sceneProEdit);
            log.info("修改数据库完成, sceneCode:{}, 花费时间：{}", sceneEdit.getSceneNum(), System.currentTimeMillis() - start);

        }catch (Exception e){
            log.error("画墙重建模型失败...", e);
            throw new BusinessException(ErrorCode.FAILURE_CODE_5039);
        }finally {
            redisUtil.unlock(lockKey, Thread.currentThread().getId());
        }

        return ResultData.ok();
    }

    @Override
    public ResultData uploadFloorJsonAjk(String sceneNum, String ajkJson, String cameraJson, String floorPlanJson, MultipartFile[] file) throws Exception {

        String lockKey = String.format(RedisKey.LOCK_UPLOAD_FLOORJSON_REBUILD, sceneNum);
        Boolean lock = redisUtil.lock(lockKey, RedisKey.EXPIRE_TIME_2_HOUR);
        if(!lock){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5036);
        }

        try {

            if(StrUtil.isEmpty(sceneNum)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
            }

            ScenePro scenePro = findBySceneNum(sceneNum);
            if(scenePro == null){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
            }

            SceneProEdit sceneProEdit= sceneProEditService.findByProId(scenePro.getId());
            if(sceneProEdit == null){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
            }
            SceneProExt sceneProExt = sceneProExtService.getOne(new LambdaQueryWrapper<SceneProExt>().eq(SceneProExt::getSceneProId, scenePro.getId()));

            //更新scene.json文件
            String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneNum + File.separator + "scene.json");
            JSONObject scenejson = new JSONObject();
            if(strsceneInfos!=null)
            {
                scenejson = JSONObject.parseObject(strsceneInfos);
            }else {
                new File(ConstantFilePath.SCENE_PATH + "data" + File.separator + "data" + sceneNum + File.separator + "scene.json").createNewFile();
            }

            String path = sceneProExt.getDataSource();
            if(path != null && !"".equals(path) && path.startsWith("http")){
                path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
            }
            String target = path + "_ajk";
            File editPath = new File(target);
            if(!editPath.exists()){
                editPath.mkdirs();
            }

            //创建文件夹软连接并且复制data.json和project.json
            if(new File(target + File.separator + "capture").exists()){
                new File(target + File.separator + "capture").delete();
            }
            if(new File(target + File.separator + "caches").exists()){
                //删除link
                new File(target + File.separator + "caches" + File.separator + "images").delete();
                //删除所有文件
                FileUtils.delAllFile(target + File.separator + "caches");
            }
            if(new File(target + File.separator + "results").exists()){
                FileUtils.delAllFile(target + File.separator + "results");
            }
            //创建文件夹,并link文件夹
            new File(target + File.separator + "caches").mkdirs();
            CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
            if(new File(path + File.separator + "caches" + File.separator + "images").exists()){
                CreateObjUtil.createSoftConnection(path + File.separator + "caches" + File.separator + "images", target + File.separator + "caches" + File.separator + "images");
            }

            FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
            FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);

            //data.json增加extras为执行重建算法
            String project = FileUtils.readFile(target + File.separator+"project.json");
            if(project != null){
                JSONObject projectJson = JSONObject.parseObject(project);
                projectJson.put("parent", projectJson.get("uuid"));
                projectJson.put("uuid", UUID.randomUUID().toString());
                projectJson.put("time", System.currentTimeMillis());
                FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString());
            }

            String data = FileUtils.readFile(target + File.separator+"data.json");
            if(data != null){
                JSONObject floorplanJson = new JSONObject();
                floorplanJson.put("has_floor_ajk_json", true);
                floorplanJson.put("has_vision_txt", true);
                floorplanJson.put("has_floorplan_json", true);

                JSONObject dataJson = JSONObject.parseObject(data);
                dataJson.put("extras", floorplanJson);
                //V5表示不需要生成high，low文件
                dataJson.put("skybox_type", "SKYBOX_V8");
                dataJson.put("split_type", "SPLIT_V10");
                FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
            }

            //文件上传的位置可以自定义
            log.info("画墙重建模型开始");
            File targetFile = new File(target + File.separator + "extras" + File.separator + "floor_ajk.json");
            if(!targetFile.getParentFile().exists()){
                targetFile.getParentFile().mkdirs();
            }
            if(targetFile.exists()){
                FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "floor_ajk.json");
            }
            // 保存
            FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floorplan.json", new String(floorPlanJson.getBytes(), "UTF-8"));

            FileUtils.writeFile(target + File.separator + "extras" + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8"));
            FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum + File.separator + "floor_ajk.json", new String(ajkJson.getBytes(), "UTF-8"));

            FileUtils.writeFile(target + File.separator + "extras" + File.separator + "vision.txt", new String(cameraJson.getBytes(), "UTF-8"));
            FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum + File.separator + "camera.json", new String(cameraJson.getBytes(), "UTF-8"));

            for(int i = 0; i < file.length; i ++){

                File cadImg = new File(target + File.separator + "extras" + File.separator + "Floorplans/" + file[i].getOriginalFilename());
                if(!cadImg.getParentFile().exists()){
                    cadImg.getParentFile().mkdirs();
                }
                if(cadImg.exists())
                {
                    cadImg.delete();
                }

                file[i].transferTo(cadImg);
            }
            //下载封面图
            FileUtils.downLoadFromUrl(scenePro.getThumb() + "?t=" + System.currentTimeMillis(),
                    "Cover.png", target + File.separator + "extras" + File.separator + "CoverImage");
            //转换成jpg
            FileUtils.pngToJpg(target + File.separator + "extras" + File.separator + "CoverImage/Cover.png",
                    target + File.separator + "extras" + File.separator + "CoverImage/Cover.jpg");
//        FileUtils.deleteFile(target + File.separator + "extras" + File.separator + "CoverImage/Cover.png");

            //安居客算法运行
            log.info("安居客算法：开始建模——"+sceneNum);

            CreateObjUtil.build3dModel(target , "1");
            if(!new File(target + File.separator + "results" + File.separator + "upload.json").exists()){
                return ResultData.error(ErrorCode.FAILURE_CODE_5042);
            }

            String zipPath = target + File.separator + "results/" + sceneNum + ".zip";
            new File(zipPath).delete();

//            FileUtils.zipFile(zipPath, target + File.separator + "results/ajk/");
            String command = "bash /opt/ossutil/gzip.sh " + zipPath.replace(".zip", "") + " " + target + File.separator + "results/ajk/";
            log.info("压缩文件:" + command);
            CreateObjUtil.callshell(command);

            if(!new File(zipPath).exists()){
                return  ResultData.error(ErrorCode.FAILURE_CODE_5043);
            }
            String fileMD5 = FileMd5Util.getFileMD5(new File(zipPath));

            uploadToOssUtil.upload(zipPath, "data_download/" + sceneNum + ".zip");

            SceneDataDownload sceneDataDownload = sceneDataDownloadService.findBySceneNum(sceneNum);
            if(sceneDataDownload == null){
                sceneDataDownload = new SceneDataDownload();
                sceneDataDownload.setSceneCode(sceneNum);
                sceneDataDownload.setDownloadPath(prefixAli + "data_download/" + sceneNum + ".zip");
                sceneDataDownload.setFileMd5(fileMD5);
                sceneDataDownloadService.save(sceneDataDownload);
                return ResultData.ok();
            }

            sceneDataDownload.setFileMd5(fileMD5);
            sceneDataDownload.setUpdateTime(Calendar.getInstance().getTime());
            sceneDataDownloadService.updateById(sceneDataDownload);
        }catch (Exception e){
            log.error("画墙重建模型失败...", e);
            throw new BusinessException(ErrorCode.FAILURE_CODE_5039);
        }finally {
            redisUtil.unlock(lockKey, Thread.currentThread().getId());
        }

        return ResultData.ok();
    }

    @Override
    public ResultData addHotMediaInfo(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getType()) ||
                StrUtil.isEmpty(base.getInfo())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String infoData = FileUtils.readFile(dataBuffer.toString() + "mediaInfo.json");
        JSONArray medias =  null;
        if(infoData != null){
            medias= JSONArray.parseArray(infoData);
        }

        if(SceneEditType.ADD.code().equals(base.getType())){
            JSONObject jo = JSONObject.parseObject(base.getInfo());
            medias.add(jo);
        }
//        else if("1".equals(base.getType())){
//
//            for(int i=0;i<medias.size();++i){
//                JSONObject ob = medias.getJSONObject(i);
//                if(ob.getString("file").equals(base.getName())){
//                    medias.remove(i);
//                    break;
//                }
//            }
//        }
        else{
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }

        FileUtils.writeFile(dataBuffer.toString() + "mediaInfo.json", medias.toString());

        return ResultData.ok();
    }

    @Override
    public ResultData saveScreencapFile(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getIndex()) ||
                StrUtil.isEmpty(base.getCamerasData())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        if("1".equals(base.getIndex())){
            File file = new File(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER);
            if(file.isDirectory()){
                String[] strs = file.list();
                if(strs!=null){
                    for(int i=0;i<strs.length;++i) {

                        if(strs[i].indexOf(ConstantFileName.SCREEN_CRP_DATAFILE)>-1) {
                            FileUtils.deleteFile(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER + File.separator + strs[i]);
                        }
                    }
                }
            } else {
                file.mkdirs();
            }

            String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
            JSONObject scenejson = new JSONObject();
            if(strsceneInfos!=null) {
                scenejson = JSONObject.parseObject(strsceneInfos);
            }
            Map<String, Object> map = new HashMap<>();
            map.put("screencapLen", "0");
            map.put("version", scenejson.getIntValue("version")+1);
            FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);
        }

        String filePath = dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER+File.separator+ConstantFileName.SCREEN_CRP_DATAFILE+base.getIndex()+"json";
        File file = new File(filePath);
        if(!file.exists())
        {
            file.createNewFile();
        }
        FileUtils.writeFile(filePath, base.getCamerasData());

        return ResultData.ok();
    }

    @Override
    public ResultData saveSceneKey(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getSceneKey())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        sceneProEdit.setSceneKey(base.getSceneKey());
        sceneProEdit.setNeedKey(0);
        sceneProEdit.setVersion(sceneProEdit.getVersion() + 1);
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        return ResultData.ok();
    }

    @Override
    public ResultData saveFloorLogo(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getSize()) ||
                StrUtil.isEmpty(base.getLogoType())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        Map map = new HashMap();
        map.put("floorLogo", base.getLogoType());
        map.put("floorLogoSize", base.getSize());
        map.put("version", scenejson.getIntValue("version")+1);

        FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);
        return ResultData.ok();
    }

    @Override
    public ResultData saveBackgroundMusic(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getMusicName())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        Map map = new HashMap();
        map.put("bgMusic", base.getMusicName());
        map.put("version", scenejson.getIntValue("version")+1);

        FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);
        return ResultData.ok();
    }

    @Override
    public ResultData saveInitialPage(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getInitialPoint())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String path1 = imagesBuffer.toString() + "thumbBigImg.jpg";
        String path2 = imagesBuffer.toString() + "thumbSmallImg.jpg";

        //生成缩略图
        //按指定大小把图片进行缩和放（会遵循原图高宽比例）
        //此处把图片压成1024×512的缩略图
        Thumbnails.of(path1).size(1024,512).toFile(path2);//变为1024×512

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + scenePro.getSceneCode() + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        Map map = new HashMap();
        map.put("entry", JSONObject.parseObject(base.getInitialPoint()));
        map.put("thumbImg", 1);
        map.put("version", scenejson.getIntValue("version")+1);
        FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);

        return ResultData.ok();
    }

    @Override
    public ResultData getScreencapVoice(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String sceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(sceneInfos!=null)
        {
            scenejson = JSONObject.parseObject(sceneInfos);
        }
        JSONObject result = new JSONObject();
        String screencapVoiceFileName = "";
        if(scenejson.containsKey("screencapVoiceFileName"))
        {
            screencapVoiceFileName = scenejson.getString("screencapVoiceFileName");
        }
        String screencapVoiceSrc = "";
        if(scenejson.containsKey("screencapVoiceSrc"))
        {
            screencapVoiceSrc = scenejson.getString("screencapVoiceSrc");
        }
        if(!screencapVoiceFileName.trim().equals("")&&!screencapVoiceSrc.trim().equals("")&&screencapVoiceFileName.indexOf(".")>-1)
        {
            result.put("screencapVoiceFileName", screencapVoiceFileName);
            result.put("screencapVoiceSrc1", screencapVoiceSrc);
            result.put("screencapVoiceSrc2", "voice/voice"+base.getSceneNum()+"/201810" +screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf(".")));
        }

        return ResultData.ok();
    }

    @Override
    public ResultData uploadScreencapVoiceNew(String sceneNum, String type, String fileName, MultipartFile file, String length, String replace) throws Exception{
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        if (!file.isEmpty()&& file.getSize() <= 0) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }
        //文件上传的位置可以自定义
        String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum;
        File targetFile = new File(path);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }

        //获取文件名去掉后缀
        String originalFileName = file.getOriginalFilename().substring(0,
                file.getOriginalFilename().indexOf(".") > 0 ? file.getOriginalFilename().indexOf(".") : file.getOriginalFilename().length());
        log.info("上传的音频文件名：" + file.getOriginalFilename());
        String soundFileName = "sound201810.wav";

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        if("soundsync".equals(type) && !"1".equals(replace)){
            synchronized(this){
                if(scenejson.containsKey("screencapVoiceSoundsync") && !StrUtil.isEmpty(scenejson.getString("screencapVoiceSoundsync"))){
                    String target = ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSoundsync").substring(
                            scenejson.getString("screencapVoiceSoundsync").indexOf("voice"));

                    if(new File(target).exists()){
                        targetFile = new File(path + File.separator +soundFileName);
                        if(targetFile.exists())
                        {
                            FileUtils.deleteFile(path + File.separator + soundFileName);
                        }
                        file.transferTo(targetFile);
                        FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + "newSound201810.mp3");

                        //目标文件改名
                        new File(target).renameTo(new File(path + File.separator + "oldSound201810.mp3"));

                        //判断音频时长，不够拼接空白音效
                        double total = Double.parseDouble(length);
                        double now = (FileUtils.getAudioPlayTime(new File(path + File.separator + "oldSound201810.mp3")) +
                                FileUtils.getAudioPlayTime(new File(path + File.separator + "newSound201810.mp3"))) / 1000.0;
                        if(total - now > 0.5){
                            CreateObjUtil.createMuteViode(total - now, path + File.separator + "muteSound.mp3");
                            if(new File(path + File.separator + "muteSound.mp3").exists()){
                                //需要将旧的音频改名
                                new File(path + File.separator + "oldSound201810.mp3").renameTo(new File(path + File.separator + "oldMuteSound201810.mp3"));
                                log.info("生成新的静音音频和旧的音频合并");
                                CreateObjUtil.mergeVideo(path + File.separator + "oldMuteSound201810.mp3", path + File.separator + "muteSound.mp3",
                                        path + File.separator + "oldSound201810.mp3");
                            }
                        }

                        //app端和pc端名字不一致，统一文件名字
                        target = path + File.separator + originalFileName + ".mp3";
                        CreateObjUtil.mergeVideo(path + File.separator + "oldSound201810.mp3", path + File.separator + "newSound201810.mp3", target);
                        //删除改名后的文件
//                    new File(path + File.separator + "oldSound201810.mp3").delete();

                        Map map = new HashMap();
                        map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3");
                        String proVideo = "voice/voice"+sceneNum+"/"+originalFileName  + ".mp3";
                        map.put("screencapVoiceSoundsync", proVideo);
                        map.put("uploadVoiceSoundsync", 1);
                        map.put("screencapVoiceType", type);
                        map.put("version", scenejson.getIntValue("version")+1);
                        FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
                        return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName + ".mp3");
                    }

                }else {
                    targetFile = new File(path + File.separator +soundFileName);
                    if(targetFile.exists())
                    {
                        FileUtils.deleteFile(path + File.separator + soundFileName);
                    }
                    file.transferTo(targetFile);
                    //判断音频时长，不够拼接空白音效
                    FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + "newSound201810.mp3");
                    double total = Double.parseDouble(length);
                    double now = (FileUtils.getAudioPlayTime(new File(path + File.separator + "newSound201810.mp3"))) / 1000.0;
                    log.info("前端传的时长：" + total);
                    log.info("获取文件的时长：" + now);

                    //同步录音前一段没空白，直接生成文件
                    if(total - now < 0.5){
                        FileUtils.changeVoiceToMp3(path + File.separator + soundFileName, path + File.separator + originalFileName + ".mp3");
                        Map map = new HashMap();
                        map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3");
                        String proVideo = "voice/voice"+sceneNum+"/"+originalFileName  + ".mp3";
                        map.put("screencapVoiceSoundsync", proVideo);
                        map.put("uploadVoiceSoundsync", 1);
                        map.put("screencapVoiceType", type);
                        map.put("version", scenejson.getIntValue("version")+1);

                        FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
                        return ResultData.ok(proVideo);
                    }

                    ////同步录音前一段有空白，生成一段静音后拼接文件
                    CreateObjUtil.createMuteViode(total - now, path + File.separator + "muteSound.mp3");

                    //app端和pc端名字不一致，统一文件名字
                    String target = path + File.separator + originalFileName + ".mp3";
                    CreateObjUtil.mergeVideo(path + File.separator + "muteSound.mp3", path + File.separator + "newSound201810.mp3", target);

                    Map map = new HashMap();
                    map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3");
                    String proVideo = "voice/voice"+sceneNum+"/"+originalFileName  + ".mp3";
                    map.put("screencapVoiceSoundsync", proVideo);
                    map.put("uploadVoiceSoundsync", 1);
                    map.put("screencapVoiceType", type);
                    map.put("version", scenejson.getIntValue("version")+1);
                    FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
                    return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName + ".mp3");
                }

            }
        }

        String name = "201810.wav";
        targetFile = new File(path + File.separator +name);
        // 保存
        synchronized(this){
            if(targetFile.exists())
            {
                FileUtils.deleteFile(path + File.separator + name);
            }
            file.transferTo(targetFile);
        }
        Map map = new HashMap();

        if("soundsync".equals(type)){
            FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName + ".mp3");
            map.put("screencapVoiceSoundsyncFileName", originalFileName + ".mp3");
            String proVideo = "voice/voice"+sceneNum+"/"+originalFileName  + ".mp3";
            map.put("screencapVoiceSoundsync", proVideo);
            map.put("uploadVoiceSoundsync", 1);
            map.put("version", scenejson.getIntValue("version")+1);
            map.put("screencapVoiceType", type);
            FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
            return ResultData.ok(proVideo);
        }

        if("sound".equals(type)){
            FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName + ".mp3");
            map.put("screencapVoiceSoundFileName", originalFileName + ".mp3");
            String proVideo = "voice/voice"+sceneNum+"/"+originalFileName  + ".mp3";
            map.put("screencapVoiceSound", proVideo);
            map.put("uploadVoiceSound", 1);
            map.put("version", scenejson.getIntValue("version")+1);
            map.put("screencapVoiceType", type);
            FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
            return ResultData.ok(proVideo);
        }

        FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator +"201810.mp3");
        if(StrUtil.isEmpty(fileName)){
            map.put("screencapVoiceFileName", originalFileName + ".mp3");
        }else {
            map.put("screencapVoiceFileName", fileName);
        }
        String voiceSrc = "voice/voice"+sceneNum+"/"+"201810.mp3";
        map.put("screencapVoiceSrc", voiceSrc);
        map.put("uploadVoiceSrc", 1);
        map.put("version", scenejson.getIntValue("version")+1);
        map.put("screencapVoiceType", type);
        FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
        return ResultData.ok(voiceSrc);
    }

    @Override
    public ResultData uploadScreencapVoiceNewV3(String sceneNum, String type, String fileName, MultipartFile file, String length, String replace, String times, String index) throws Exception{
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        if (!file.isEmpty()&& file.getSize() <= 0) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }
        //文件上传的位置可以自定义
        String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum;
        File targetFile = new File(path);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }

        String originalFileName = "sound201810.mp3";

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        if("soundsync".equals(type) && !"1".equals(replace)){
            //判断分房间模块文件夹是否存在
            String partPath = path + File.separator + "part";
            File partFile = new File(partPath);
            if(!partFile.exists()){
                partFile.mkdirs();
            }

            synchronized(this){
                targetFile = new File(partPath + File.separator + fileName);
                if(targetFile.exists())
                {
                    FileUtils.deleteFile(partPath + File.separator + fileName);
                }
                file.transferTo(targetFile);
            }

            //获取总音频多少段，每段时长
            String[] time = times.split(",");
            //遍历判断音频是否存在，不存在生成空白音效
            for(int i = 0, len = time.length; i < len; i++){
                if(!new File(partPath + File.separator + i + ".mp3").exists()){
                    //某部分文件不存在，直接生成一段静音后拼接文件
                    CreateObjUtil.createMuteViode(Double.valueOf(time[i]), partPath + File.separator + i + ".mp3");
                }
            }

            //拼接所有音频文件
            if(time.length > 2){
                //若是多部分，两个两个合并，最后合成最终文件
                for(int i = 1, len = time.length; i < len; i++){
                    if(i == 1){

                        CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + ".mp3", partPath + File.separator + i + ".mp3",
                                partPath + File.separator + i + "muteSound.mp3");
                    }else if(i == len - 1){
                        CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3",
                                path + File.separator + originalFileName);
                    }else {
                        CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3",
                                partPath + File.separator + i + "muteSound.mp3");
                    }
                }
            }else {
                //若只有两部分，直接合并成最终文件
                CreateObjUtil.mergeVideo(partPath + File.separator + "0.mp3", partPath + File.separator + "1.mp3", path + File.separator + originalFileName);
            }

            Map map = new HashMap();
            map.put("screencapVoiceSoundsyncFileName", originalFileName);
            String proVideo = "voice/voice"+sceneNum+"/"+originalFileName;
            map.put("screencapVoiceSoundsync", proVideo);
            map.put("uploadVoiceSoundsync", 1);
            map.put("screencapVoiceType", type);
            map.put("version", scenejson.getIntValue("version")+1);
            FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
            return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName);
        }

        String name = "201810.wav";
        targetFile = new File(path + File.separator +name);
        // 保存
        synchronized(this){
            if(targetFile.exists())
            {
                FileUtils.deleteFile(path + File.separator + name);
            }
            file.transferTo(targetFile);
        }
        Map map = new HashMap();

        if("soundsync".equals(type)){
            FileUtils.delAllFile(path + File.separator + "part");
            //判断分房间模块文件夹是否存在
            String partPath = path + File.separator + "part";
            File partFile = new File(partPath);
            if(!partFile.exists()){
                partFile.mkdirs();
            }

            //保存0.mp3文件到part
            FileUtils.copyFile(path + File.separator +name, partPath + File.separator + fileName, true);

            FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator + originalFileName);
            map.put("screencapVoiceSoundsyncFileName", originalFileName);
            String proVideo = "voice/voice"+sceneNum+"/"+originalFileName;
            map.put("screencapVoiceSoundsync", proVideo);
            map.put("uploadVoiceSoundsync", 1);
            map.put("version", scenejson.getIntValue("version")+1);
            map.put("screencapVoiceType", type);
            FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
            return ResultData.ok(proVideo);
        }

        FileUtils.changeVoiceToMp3(path + File.separator + name, path + File.separator +"201810.mp3");
        map.put("screencapVoiceFileName", file.getOriginalFilename());
        String voiceSrc = "voice/voice"+sceneNum+"/"+"201810.mp3";
        map.put("screencapVoiceSrc", voiceSrc);
        map.put("uploadVoiceSrc", 1);
        map.put("version", scenejson.getIntValue("version")+1);
        map.put("screencapVoiceType", type);
        FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
        return ResultData.ok(voiceSrc);
    }

    @Override
    public ResultData deleteScreencapVoicePart(String sceneNum, String fileName, String times, String index) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        //文件上传的位置可以自定义
        String path = ConstantFilePath.SCENE_PATH+"voice"+File.separator+"voice"+sceneNum;
        File targetFile = new File(path);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }

        String originalFileName = "sound201810.mp3";
        log.info("上传的音频文件名：" + originalFileName);

        String strsceneInfos = FileUtils.readFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        //判断分房间模块文件夹是否存在
        String partPath = path + File.separator + "part";
        File partFile = new File(partPath);
        if(!partFile.exists()){
            partFile.mkdirs();
        }

        //删除指定部分音频文件
        FileUtils.deleteFile(partPath + File.separator + index + ".mp3");

        //获取总音频多少段，每段时长
        String[] time = times.split(",");
        //修改删除的部分视频后面部分音频名字，如删除1.MP3，则将2.mp3修改成1.mp3，往后以此类推
        if(Integer.parseInt(index) < time.length) {
            for(int i = 0, len = time.length - Integer.parseInt(index); i < len; i++){
                if(new File(partPath + File.separator + (Integer.parseInt(index) + 1 + i) + ".mp3").exists()){
                    FileUtils.copyFile(partPath + File.separator + (Integer.parseInt(index) + 1 + i) + ".mp3",
                            partPath + File.separator + (Integer.parseInt(index) + i) + ".mp3", true);
                }
            }
        }

        //遍历判断音频是否存在，不存在生成空白音效
        for(int i = 0, len = time.length; i < len; i++){
            if(!new File(partPath + File.separator + i + ".mp3").exists()){
                //某部分文件不存在，直接生成一段静音后拼接文件
                CreateObjUtil.createMuteViode(Double.valueOf(time[i]), partPath + File.separator + i + ".mp3");
            }
        }

        //拼接所有音频文件
        if(time.length > 2){
            //若是多部分，两个两个合并，最后合成最终文件
            for(int i = 1, len = time.length; i < len; i++){
                if(i == 1){
//                    FileUtils.deleteFile(partPath + File.separator + i + "muteSound.mp3");

                    CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + ".mp3", partPath + File.separator + i + ".mp3",
                            partPath + File.separator + i + "muteSound.mp3");
                }else if(i == len - 1){
                    CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3",
                            path + File.separator + originalFileName);
                }else {
                    CreateObjUtil.mergeVideo(partPath + File.separator + (i - 1) + "muteSound.mp3", partPath + File.separator + i + ".mp3",
                            partPath + File.separator + i + "muteSound.mp3");
                }
            }
        }else if(time.length == 2){
            //若只有两部分，直接合并成最终文件
            CreateObjUtil.mergeVideo(partPath + File.separator + "0.mp3", partPath + File.separator + "1.mp3", path + File.separator + originalFileName);
        }else {
            FileUtils.copyFile(partPath + File.separator + "0.mp3", path + File.separator + originalFileName, true);
        }

        Map map = new HashMap();
        map.put("screencapVoiceSoundsyncFileName", originalFileName);
        String proVideo = "voice/voice"+sceneNum+"/"+originalFileName;
        map.put("screencapVoiceSoundsync", proVideo);
        map.put("uploadVoiceSoundsync", 1);
        map.put("screencapVoiceType", "soundsync");
        map.put("version", scenejson.getIntValue("version")+1);
        FileUtils.writeJsonFile(ConstantFilePath.SCENE_PATH + "data/data" + sceneNum + File.separator + "scene.json", map);
        return ResultData.ok("voice/voice"+sceneNum+"/"+originalFileName);
    }

    @Override
    public ResultData deleteScreencapVoice(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        String scenePath = ConstantFilePath.SCENE_PATH+ "data" + File.separator+"data"+base.getSceneNum()+File.separator+"scene.json";
        String str = FileUtils.readFile(scenePath);
        JSONObject json = new JSONObject();
        if(str!=null){
            json = JSONObject.parseObject(str);
        }
        else{
            File file = new File(scenePath);
            if(!file.getParentFile().exists())
            {
                file.getParentFile().mkdirs();
            }
            if(!file.exists())
            {
                file.createNewFile();
            }
        }
        log.info("type:" + base.getType());
        if("soundsync".equals(base.getType())){
            FileUtils.deleteFile(ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSoundsync"));
            json.put("screencapVoiceSoundsyncFileName", "");
            json.put("screencapVoiceSoundsync", "");
            json.put("version", json.getIntValue("version")+1);
            FileUtils.deleteFile(scenePath);
            FileUtils.writeFile(scenePath, json.toString());
            return ResultData.ok();
        }

        if("sound".equals(base.getType())){
            FileUtils.deleteFile(ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSound"));
            json.put("screencapVoiceSoundFileName", "");
            json.put("screencapVoiceSound", "");
            json.put("version", json.getIntValue("version")+1);
            FileUtils.deleteFile(scenePath);
            FileUtils.writeFile(scenePath, json.toString());
            return ResultData.ok();
        }

        String path = ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSrc");
        log.info("path:" + ConstantFilePath.SCENE_PATH+json.getString("screencapVoiceSrc"));
        FileUtils.deleteFile(path);

        json.put("screencapVoiceFileName", "");
        json.put("screencapVoiceSrc", "");
        json.put("version", json.getIntValue("version")+1);
        log.info("scenePath:" + scenePath);
        FileUtils.deleteFile(scenePath);
        FileUtils.writeFile(scenePath, json.toString());
        return ResultData.ok();
    }

    @Override
    public ResultData deleteScreencap(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String capPath = dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER;
        File file1 = new File(capPath);
        String[] strs = file1.list();
        //删除screenCap对应的json数据
        if(strs!=null) {
            for(int i=0;i<strs.length;++i) {
                if(strs[i].indexOf(ConstantFileName.SCREEN_CRP_DATAFILE)>-1) {
                    FileUtils.deleteFile(capPath+File.separator+strs[i]);
                }
            }
        }

        String imgPath = imagesBuffer.toString() + ConstantFileName.TOURLIST_FOLDER;

        String tourListPath = dataBuffer.toString() + ConstantFileName.TOUR_LIST;
        String tourList = FileUtils.readFile(tourListPath);
        JSONArray tourJsons = new JSONArray();
        if(tourList!=null) {
            tourJsons = JSONArray.parseArray(tourList);
        }
        for(int i=0;i<tourJsons.size();++i) {
            String filePath = imgPath + File.separator +"guide"+i+".jpg";
            FileUtils.deleteFile(filePath);
        }
        FileUtils.deleteFile(tourListPath);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        Map<String, Object> map = new HashMap<>();
        map.put("screencapLen", 0);
        map.put("uploadTourList", 1);
        map.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);

        return ResultData.ok();
    }

    @Override
    public ResultData saveTourList(SceneEditVO base) throws Exception{
        if(StrUtil.isEmpty(base.getSceneNum()) || StrUtil.isEmpty(base.getTourList()) ||
                StrUtil.isEmpty(base.getScreencapLen())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        log.info("editScene/saveTourList：生成tourList.json文件");
        String tourListPath = dataBuffer.toString() + ConstantFileName.TOUR_LIST;
        FileUtils.writeFile(tourListPath, base.getTourList());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        Map<String, Object> map = new HashMap<>();
        map.put("screencapLen", String.valueOf(base.getScreencapLen()));
        map.put("uploadTourList", 1);
        map.put("version", scenejson.getIntValue("version")+1);
        FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);

        return ResultData.ok();
    }

    @Override
    public ResultData saveSceneInfo(SceneEditVO base) throws Exception{

        if(StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        int type = Integer.valueOf(base.getSceneType());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        //上传七牛
        Map<String,String> map = new HashMap<>();

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());

        //处理漫游数据
        this.dealTour(base, scenejson, map, dataBuffer, imagesBuffer);

        //判断scene.json是否有uploadVoiceSrc上传普通版音频
        if(scenejson.containsKey("uploadVoiceSrc") && scenejson.getIntValue("uploadVoiceSrc") == 1) {
            String screencapVoiceFileName = "";
            if(scenejson.containsKey("screencapVoiceFileName")) {
                screencapVoiceFileName = scenejson.getString("screencapVoiceFileName");
            }
            String screencapVoiceSrc = "";
            if(scenejson.containsKey("screencapVoiceSrc")) {
                screencapVoiceSrc = scenejson.getString("screencapVoiceSrc");
            }

            if(screencapVoiceFileName.indexOf(".")>-1) {
                String fileName = "201810" + screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf("."));
                String path = ConstantFilePath.SCENE_PATH + "voice" + File.separator+"voice"+base.getSceneNum()+File.separator+fileName;
                map.put(path, "voice/voice"+base.getSceneNum()+"/201810" +screencapVoiceFileName.substring(screencapVoiceFileName.lastIndexOf(".")));
            }
            sceneProEdit.setScreencapVoiceSrc(screencapVoiceSrc);
        }

        //判断scene.json是否有uploadVoiceSound上传专业版音频
        if(scenejson.containsKey("uploadVoiceSound") && scenejson.getIntValue("uploadVoiceSound") == 1){
            if(!StrUtil.isEmpty(scenejson.getString("screencapVoiceSound"))){
                map.put(ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSound"), scenejson.getString("screencapVoiceSound"));
            }
            sceneProEdit.setScreencapVoiceSound(scenejson.getString("screencapVoiceSound"));
        }

        if(scenejson.containsKey("uploadVoiceSoundsync") && scenejson.getIntValue("uploadVoiceSoundsync") == 1){
            if(!StrUtil.isEmpty(scenejson.getString("screencapVoiceSoundsync"))){
                map.put(ConstantFilePath.SCENE_PATH + scenejson.getString("screencapVoiceSoundsync"), scenejson.getString("screencapVoiceSoundsync"));
            }
            sceneProEdit.setScreencapVoiceSoundsync(scenejson.getString("screencapVoiceSoundsync"));
        }

        if(base.getScreencapVoiceType() != null){
            scenejson.put("screencapVoiceType", base.getScreencapVoiceType());
            sceneProEdit.setScreencapVoiceType(base.getScreencapVoiceType());
        }

        if(!StrUtil.isEmpty(base.getCapData())){
            FileUtils.writeFile(dataBuffer.toString() + "capData.json", new String(base.getCapData().getBytes(), "UTF-8"));
            scenejson.put("capData", dataBuf.toString() + "capData.json");
        }

        if(!StrUtil.isEmpty(base.getFrameData())){
            FileUtils.writeFile(dataBuffer.toString() + "frameData.json", new String(base.getFrameData().getBytes(), "UTF-8"));
            scenejson.put("frameData", dataBuf.toString() + "frameData.json");
        }

        if(!StrUtil.isEmpty(base.getPlayData())){
            FileUtils.writeFile(dataBuffer.toString() + "playData.json", new String(base.getPlayData().getBytes(), "UTF-8"));
            scenejson.put("playData", dataBuf.toString() + "playData.json");
            sceneProEdit.setPlayData(dataBuf.toString() + "playData.json");
            map.put(dataBuffer.toString() + "playData.json", dataBuf.toString() + "playData.json");
        }

        if(!StrUtil.isEmpty(base.getScreencapThumb())){
            FileUtils.writeFile(dataBuffer.toString() + "screencapThumb.json", new String(base.getScreencapThumb().getBytes(), "UTF-8"));
            scenejson.put("screencapThumb", dataBuf.toString() + "screencapThumb.json");
            sceneProEdit.setScreencapThumb(dataBuf.toString() + "screencapThumb.json");
            map.put(dataBuffer.toString() + "screencapThumb.json", dataBuf.toString() + "screencapThumb.json");
        }

        if(!StrUtil.isEmpty(base.getRecordType())){
            scenejson.put("recordType", base.getRecordType());
        }

        if(!StrUtil.isEmpty(base.getMapVisi())){
            scenejson.put("mapVisi", Integer.parseInt(base.getMapVisi()));
            sceneProEditExt.setMapVisi(Integer.parseInt(base.getMapVisi()));
        }

        if(!StrUtil.isEmpty(base.getTourVisi())){
            scenejson.put("tourVisi", Integer.parseInt(base.getTourVisi()));
            sceneProEditExt.setTourVisi(Integer.parseInt(base.getTourVisi()));
        }
        if(!StrUtil.isEmpty(base.getVrVisi())){
            scenejson.put("vrVisi", Integer.parseInt(base.getVrVisi()));
            sceneProEditExt.setVrVisi(Integer.parseInt(base.getVrVisi()));
        }

        if(!StrUtil.isEmpty(base.getRulerVisi())){
            scenejson.put("rulerVisi", Integer.parseInt(base.getRulerVisi()));
            sceneProEditExt.setRulerVisi(Integer.parseInt(base.getRulerVisi()));
        }
        if(!StrUtil.isEmpty(base.getCadImgVisi())){
            scenejson.put("cadImgVisi", Integer.parseInt(base.getCadImgVisi()));
            sceneProEditExt.setCadImgVisi(Integer.parseInt(base.getCadImgVisi()));
        }

        if(!StrUtil.isEmpty(base.getPanoVisi())){
            scenejson.put("panoVisi", Integer.parseInt(base.getPanoVisi()));
            sceneProEditExt.setPanoVisi(Integer.parseInt(base.getPanoVisi()));
        }

        if(!StrUtil.isEmpty(base.getM2dVisi())){
            scenejson.put("m2dVisi", Integer.parseInt(base.getM2dVisi()));
            sceneProEditExt.setM2dVisi(Integer.parseInt(base.getM2dVisi()));
        }
        if(!StrUtil.isEmpty(base.getM3dVisi())){
            scenejson.put("m3dVisi", Integer.parseInt(base.getM3dVisi()));
            sceneProEditExt.setM3dVisi(Integer.parseInt(base.getM3dVisi()));
        }
        if(!StrUtil.isEmpty(base.getMeasureVisi())){
            scenejson.put("measureVisi", Integer.parseInt(base.getMeasureVisi()));
            sceneProEditExt.setMeasureVisi(Integer.parseInt(base.getMeasureVisi()));
        }

        if(!StrUtil.isEmpty(base.getFloorPlanAngle())){
            scenejson.put("floorPlanAngle", base.getFloorPlanAngle());
            sceneProEditExt.setFloorPlanAngle(base.getFloorPlanAngle());
        }

        if(scenejson.containsKey("uploadFloorPlanPng") && scenejson.getIntValue("uploadFloorPlanPng") == 1){
            JSONArray floorPlanPngStr = new JSONArray();
            JSONArray floorPlanPng = new JSONArray();
            switch (scenePro.getBuildType()){
                case "V2":
                    floorPlanPng.add(scenejson.getString("floorPlanPng"));
                    break;
                case "V3":
                    try {
                        floorPlanPng = scenejson.getJSONArray("floorPlanPng");
                    } catch (Exception e) {
                        // 旧的V3也是String
                        floorPlanPng.add(scenejson.getString("floorPlanPng"));
                    }
                    break;
            }
            scenejson.put("uploadFloorPlanPng", 0);
            for(int i = 0, len = floorPlanPng.size(); i < len; i++){
                map.put(ConstantFilePath.SCENE_PATH+floorPlanPng.getString(i), floorPlanPng.getString(i));
                floorPlanPngStr.add(floorPlanPng.getString(i) + "?t=" + System.currentTimeMillis());
            }
            sceneProEditExt.setFloorPlanPng(floorPlanPngStr.toJSONString());
        }

        if(scenejson.containsKey("uploadFloorJson") && scenejson.getIntValue("uploadFloorJson") == 1){
            map.put(dataBuffer.toString() + "floor.json", dataBuf.toString() + "floor.json");
            scenejson.put("uploadFloorJson", 0);
        }

        if(StrUtil.isNotEmpty(base.getEntry())) {
            //上传七牛
            map.put(imagesBuffer.toString() + "thumbBigImg.jpg", imagesBuf.toString() + "thumbBigImg.jpg");
            map.put(imagesBuffer.toString() + "thumbFishBigImg.jpg",imagesBuf.toString() + "thumbFishBigImg.jpg");
            map.put(imagesBuffer.toString() + "thumbSmallImg.jpg", imagesBuf.toString() + "thumbSmallImg.jpg");
            map.put(imagesBuffer.toString() + "smallPic.jpg", imagesBuf.toString() + "smallPic.jpg");
            sceneProEdit.setEntry(base.getEntry());

            scenejson.put("entry", base.getEntry());

            if(scenejson.containsKey("thumbImg"))
            {
                sceneProEdit.setThumbStatus(scenejson.getIntValue("thumbImg"));
            }

            if(sceneProEdit.getThumbStatus() == 1)
            {
                scenePro.setThumb(prefixAli + imagesBuf.toString() + "thumbSmallImg.jpg");
                if("s3".equals(this.type)){
                    scenePro.setThumb(ConstantUrl.PREFIX_AWS + imagesBuf.toString() + "thumbSmallImg.jpg");
                }
            }

        }

        if(base.getHotFlag() != null && "1".equals(base.getHotFlag())) {
            String str = FileUtils.readFile(dataBuffer.toString() + "hot.json");
            JSONArray jsonhots = new JSONArray();

            if(str != null&&!str.trim().equals("")) {
                jsonhots = JSONArray.parseArray(str);
            }
            String hotsids = "";
            for(int i=0;i<jsonhots.size();++i) {
                JSONObject ele = jsonhots.getJSONObject(i);
                String index = ele.getString("sid");
                hotsids+=index+",";
                if(ele.containsKey("media"))
                {
                    String fileType = ele.getString("media");
                    if(fileType.contains("photo"))
                    {
                        map.put(imagesBuffer.toString() + "hot"+index+".jpg",
                                imagesBuf.toString() + "hot"+index+".jpg");
                    }
                    if(fileType.contains("audio") || fileType.contains("voice"))
                    {
                        map.put(imagesBuffer.toString() + "hot"+index+".mp3",
                                imagesBuf.toString() + "hot"+index+".mp3");
                    }
                    if(fileType.contains("video"))
                    {
                        map.put(imagesBuffer.toString() + "hot"+index+".mp4",
                                imagesBuf.toString() + "hot"+index+".mp4");
                        map.put(imagesBuffer.toString() + "hot"+index+"-cut.jpg",
                                imagesBuf.toString() + "hot"+index+"-cut.jpg");
                    }
                }

            }
            map.put(dataBuffer.toString() + "hot.json",dataBuf.toString() + "hot.json");
            sceneProEdit.setHotsIds(hotsids);
        }

        if(StrUtil.isNotEmpty(base.getFloorLogoType())) {
            sceneProEdit.setFloorLogo(base.getFloorLogoType());
            scenejson.put("floorLogo", base.getFloorLogoType());
            if(base.getFloorLogoType().trim().equals("1")||base.getFloorLogoType().trim().equals("user")) {
                map.put(imagesBuffer.toString() + "floorLogoImg.png", imagesBuf.toString() + "floorLogoImg.png");
            }
        }

        if(StrUtil.isNotEmpty(base.getFloorLogoSize())) {
            sceneProEdit.setFloorLogoSize(Integer.valueOf(base.getFloorLogoSize()));
            scenejson.put("floorLogoSize", base.getFloorLogoSize());
        }

        if(base.getBgMusic() != null) {
            sceneProEdit.setBgMusic(base.getBgMusic());
            scenejson.put("bgMusic", base.getBgMusic());
        }

        if(base.getSceneName() != null) {
            scenePro.setSceneName(base.getSceneName());
            scenejson.put("sceneName", base.getSceneName());
        }

        if(StrUtil.isNotEmpty(base.getSceneType())) {
            if(scenePro.getSceneType() == 99){
                scenejson.put("sceneType", scenePro.getSceneType());
            }else {
                scenePro.setSceneType(type);
                scenejson.put("sceneType", base.getSceneType());
            }
        }

        if(base.getSceneDec() != null) {
            scenePro.setSceneDec(base.getSceneDec());
            scenejson.put("sceneDec", base.getSceneDec());
        }

        if(!StrUtil.isEmpty(base.getSceneKey())) {
            sceneProEdit.setSceneKey(base.getSceneKey());
            sceneProEdit.setNeedKey(1);
            scenejson.put("sceneKey", base.getSceneKey());
            scenejson.put("needKey", 1);
        }else {
            sceneProEdit.setSceneKey("");
            sceneProEdit.setNeedKey(0);
            scenejson.put("sceneKey", "");
            scenejson.put("needKey", 0);
        }

        if(!scenejson.containsKey("version")) {
            scenejson.put("version", 0);
        }
        scenejson.put("version", scenejson.getIntValue("version")+1);
        map.put(dataBuffer.toString() + "scene.json", dataBuf.toString() + "scene.json");

        sceneProEditExt.setCadInfo(scenejson.getString("cadInfo"));
        sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditExtService.updateById(sceneProEditExt);
        sceneProEdit.setVersion(scenejson.getIntValue("version"));
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        //重建上传资源到oss
        if(sceneProEdit.getFloorEditVer() != sceneProEdit.getFloorPublishVer()){
            //上传过模型，只更新floor.json
            if(scenejson.containsKey("isUploadObj") && scenejson.getBooleanValue("isUploadObj")){
                map.put(dataBuffer.toString() + "floor.json", dataBuf.toString() + "floor.json");
                //发布重新建模场景，将floorPublishVer设为floorEditVer的值
                sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorEditVer());

                scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer());
                scenejson.put("floorPublishVer", sceneProEdit.getFloorEditVer());
            }else {

                String path = sceneProExt.getDataSource();
                if(path != null && !"".equals(path) && path.startsWith("http")){
                    path = ConstantFilePath.BUILD_MODEL_PATH + path.split("/")[path.split("/").length - 2];
                }
                path = path + "_edit";
                String projectNum = base.getSceneNum();

                //读取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){
                    JSONObject fileJson = null;
                    String fileName = "";
                    for(int i = 0, len = array.size(); i < len; i++){
                        fileJson = array.getJSONObject(i);
                        fileName = fileJson.getString("file");
                        //文件不存在抛出异常
                        if(!new File(path + File.separator + "results" +File.separator + fileName).exists()){
                            throw new Exception(path + File.separator + "results" +File.separator + fileName+"文件不存在");
                        }

                        //tex文件夹
                        if(fileJson.getIntValue("clazz") == 2 && !fileJson.containsKey("pack-file")){
                            map.put(path + File.separator + "results" +File.separator+ fileName,"images/images"+
                                    projectNum+"/"+ConstantFileName.modelUUID+"_50k_texture_jpg_high1/"+fileName.replace("tex/", ""));
                        }

                        //2048的模型和贴图
                        if(fileJson.getIntValue("clazz") == 16){
                            map.put(path + File.separator + "results" + File.separator+ fileName,"data/data"+
                                    projectNum+ File.separator + fileName);
                        }
                    }

                    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 file = new File(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+projectNum);
                    if(!file.exists())
                    {
                        file.mkdir();
                    }
                    log.info("计算大场景：开始上传大场景文件到阿里——"+projectNum);
                    //上传修改后的本地的缩略图
                    map.put(dataBuffer.toString() + "floor.json", dataBuf.toString() + "floor.json");

                    //发布重新建模场景，将floorPublishVer设为floorEditVer的值
                    sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorEditVer());

                    scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer());
                    scenejson.put("floorPublishVer", sceneProEdit.getFloorEditVer());
                }
            }

        }

        //重算全景图并上传oss或oss
        if(scenejson.containsKey("buildImages")){
            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";

            File images = new File(target + File.separator + "extras/images");
            File video = new File(target + File.separator + "extras/video");

            if(scenejson.getIntValue("buildImages") == 1){
                log.info("下载vision.modeldata文件");
                if("s3".equals(this.type)){
                    FileUtils.downLoadFromUrl(ConstantUrl.PREFIX_AWS + "images/images" + scenePro.getSceneCode() + "/vision.modeldata" + "?m="+new Date().getTime(),
                            "vision.modeldata", target + File.separator + "extras" + File.separator);
                }
                if("oss".equals(this.type)){
                    FileUtils.downLoadFromUrl(prefixAli + "images/images" + scenePro.getSceneCode() + "/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");

                if(images.exists() && images.listFiles() != null && images.listFiles().length > 0){

                    FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
                    FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);

                    //data.json增加extras为执行重建算法
                    String data = FileUtils.readFile(target + File.separator+"data.json");
                    if(data != null){
                        JSONObject floorplanJson = new JSONObject();
                        floorplanJson.put("has_source_images", true);
                        floorplanJson.put("has_vision_txt", true);

                        JSONObject dataJson = JSONObject.parseObject(data);
                        dataJson.put("extras", floorplanJson);
                        //V5表示不需要生成high，low文件
                        dataJson.put("skybox_type", "SKYBOX_V6");
                        if(scenePro.getSceneScheme() == 11){
                            dataJson.put("skybox_type", "SKYBOX_V7");
                        }
                        dataJson.put("split_type", "SPLIT_V8");
                        //sceneScheme为3切成瓦片图
                        if(scenePro.getSceneScheme() == 3){
                            dataJson.put("skybox_type", "SKYBOX_V4");
                        }
                        FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
                    }

                    //创建文件夹软连接并且复制data.json和project.json
                    if(new File(target + File.separator + "capture").exists()){
                        new File(target + File.separator + "capture").delete();
                    }
                    if(new File(target + File.separator + "results").exists()){
                        FileUtils.delAllFile(target + File.separator + "results");
                    }
                    //下载data.fdage
                    if("s3".equals(this.type)){
                        //亚马逊保持旧方式，超链接capture
                        CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
                    }
                    CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") + "/data.fdage", target + File.separator + "capture/");

                    CreateObjUtil.build3dModel(target , "1");

                    //读取upload文件，检验需要上传的文件是否存在
                    String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
                    JSONObject uploadJson = null;
                    JSONArray array = null;
                    if(uploadData!=null) {
                        uploadJson = JSONObject.parseObject(uploadData);
                        array = uploadJson.getJSONArray("upload");
                    }
                    if(array == null){
                        throw new Exception("upload.json数据出错");
                    }
                    JSONObject fileJson = null;
                    String fileName = "";
                    for(int i = 0, len = array.size(); i < len; i++){
                        fileJson = array.getJSONObject(i);
                        fileName = fileJson.getString("file");
                        //文件不存在抛出异常
                        if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
                            throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
                        }

                        //high文件夹
                        if(fileJson.getIntValue("clazz") == 3){
                            map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+"/pan/high/"+ fileName.replace("high/", ""));
                            continue;
                        }
                        //low文件夹
                        if(fileJson.getIntValue("clazz") == 4){
                            map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+"/pan/low/"+ fileName.replace("low/", ""));
                            continue;
                        }

                        //tiles文件夹,亚马逊没有裁剪图片api，不需要上传4k图
                        if(fileJson.getIntValue("clazz") == 5){
                            map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+ File.separator + fileName);
                            continue;
                        }

                        //tiles文件夹,亚马逊瓦片图
                        if(fileJson.getIntValue("clazz") == 7 ){
                            map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+ File.separator + fileName);
                            continue;
                        }
                    }

                    for(String imagesName : images.list()){
                        //覆盖原始图片资源
                        FileUtils.copyFile(target + File.separator + "extras/images/" + imagesName,
                                path + File.separator + "caches/images/" + imagesName, true);
                        FileUtils.deleteFile(target + File.separator + "extras/images/" + imagesName);
                    }
                }

                if(video.exists() && video.listFiles() != null && video.listFiles().length > 0){
                    for(String videoName : video.list()){
                        uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,"video/video"+
                                scenePro.getSceneCode()+ File.separator + videoName);

                        CreateObjUtil.mp4ToFlv(target + File.separator + "extras/video/" + videoName,
                                target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"));

                        uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"),"video/video"+
                                scenePro.getSceneCode()+ File.separator + videoName.replace("mp4", "flv"));

                        //覆盖原始视频资源
                        FileUtils.copyFile(target + File.separator + "extras/video/" + videoName,
                                path + File.separator + "caches/videos/" + videoName, true);

                    }
                    FileUtils.deleteDirectory(target + File.separator + "extras/video/");
                }

            }else if(scenejson.getIntValue("buildImages") == 2){
                if(video.exists() && video.listFiles() != null && video.listFiles().length > 0){
                    for(String videoName : video.list()){
                        uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName,"video/video"+
                                scenePro.getSceneCode()+ File.separator + videoName);

                        CreateObjUtil.mp4ToFlv(target + File.separator + "extras/video/" + videoName,
                                target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"));

                        uploadToOssUtil.upload(target + File.separator + "extras/video/" + videoName.replace("mp4", "flv"),"video/video"+
                                scenePro.getSceneCode()+ File.separator + videoName.replace("mp4", "flv"));

                        //覆盖原始视频资源
                        FileUtils.copyFile(target + File.separator + "extras/video/" + videoName,
                                path + File.separator + "caches/videos/" + videoName, true);

                    }
                    FileUtils.deleteDirectory(target + File.separator + "extras/video/");
                }
            }

            scenejson.put("imagesVersion", sceneProEditExt.getImagesVersion() + 1);
            scenejson.put("buildImages", 0);
            sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1);

        }

        if(scenejson.containsKey("uploadBgMusic") && scenejson.getIntValue("uploadBgMusic") == 1){
            if(StrUtil.isNotEmpty(scenejson.getString("bgMusicName"))){
                map.put(imagesBuffer.toString() + scenejson.getString("bgMusicName"), imagesBuf.toString() + scenejson.getString("bgMusicName"));
            }

            scenejson.put("uploadBgMusic", 0);
            sceneProEditExt.setBgMusicName(scenejson.getString("bgMusicName"));
        }

        if(scenejson.containsKey("uploadPanoramaImg") && scenejson.getIntValue("uploadPanoramaImg") == 1){
            String targetPath = ConstantFilePath.SCENE_PATH + "images/images" + base.getSceneNum() + "/panorama";
            for(File targetFile : new File(targetPath).listFiles()){
                if(targetFile.isDirectory()){
                    String target = targetFile.getAbsolutePath();
                    String sid = target.substring(target.lastIndexOf(File.separator) + 1);
                    //读取upload文件，检验需要上传的文件是否存在
                    String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
                    JSONObject uploadJson = null;
                    JSONArray array = null;
                    if(uploadData!=null) {
                        uploadJson = JSONObject.parseObject(uploadData);
                        array = uploadJson.getJSONArray("upload");
                    }
                    if(array == null){
                        continue;
                    }
                    JSONObject fileJson = null;
                    String fileName = "";
                    for(int i = 0, len = array.size(); i < len; i++){
                        fileJson = array.getJSONObject(i);
                        fileName = fileJson.getString("file");
                        //文件不存在抛出异常
                        if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
                            throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
                        }

                        //high文件夹
                        if(fileJson.getIntValue("clazz") == 3){
                            map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+"/panorama/" + sid + "/pan/high/"+ fileName.replace("high/", ""));
                            continue;
                        }
                        //low文件夹
                        if(fileJson.getIntValue("clazz") == 4){
                            map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+"/panorama/" + sid + "/pan/low/"+ fileName.replace("low/", ""));
                            continue;
                        }

                        //tiles文件夹,亚马逊没有裁剪图片api，不需要上传4k图
                        if(fileJson.getIntValue("clazz") == 5){
                            map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+ "/panorama/" + sid + File.separator + fileName);
                            continue;
                        }

                        //tiles文件夹,亚马逊瓦片图
                        if(fileJson.getIntValue("clazz") == 7 ){
                            map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                                    scenePro.getSceneCode()+ File.separator + fileName);
                            continue;
                        }
                    }
                }
            }

            scenejson.put("uploadPanoramaImg", 0);
        }

        if(scenejson.containsKey("uploadPanoramaJson") && scenejson.getIntValue("uploadPanoramaJson") == 1){
            scenejson.put("uploadPanoramaJson", 0);

            map.put(dataBuffer.toString() + "link-scene.json", dataBuf.toString() + "link-scene.json");
            sceneProEditExt.setJumpScene(scenejson.getBooleanValue("jumpScene"));
        }

        log.info("scene.json路径：" + dataBuffer.toString() + "scene.json");
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        if(map.size()>0) {
            uploadToOssUtil.uploadMulFiles(map);
        }

        scenePro.setUpdateTime(Calendar.getInstance().getTime());
        this.updateById(scenePro);

        sceneProExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProExtService.updateById(sceneProExt);

        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditExtService.updateById(sceneProEditExt);

        return ResultData.ok();
    }

    @Override
//    @SystemServiceLog(description = "上传场景的热点媒体文件")
    public ResultData uploadHotMedia(String sceneNum, MultipartFile file, String sid) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        String fileName = "hot" + sid + ".mp4";
        if (!file.isEmpty()){

            String path = ConstantFilePath.SCENE_PATH + "images" + File.separator + "images" + sceneNum;
            File targetFile = new File(path);
            if (!targetFile.exists()){
                targetFile.mkdirs();
            }

            targetFile = new File(path + File.separator + fileName);
            if (targetFile.exists()){
                FileUtils.deleteFile(path + File.separator + fileName);
            }
            file.transferTo(targetFile);

            if(targetFile.exists()){
                FileUtils.executeCodecs(path + File.separator + fileName, path, "hot" + sid + "-cut");
            }
        }

        return ResultData.ok(fileName);
    }

    @Override
//    @SystemServiceLog(description = "保存场景热点")
    public ResultData saveHot(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getType())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        String sid = base.getSid();

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        JSONObject jsonhot = JSONObject.parseObject(base.getHotData());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String str = FileUtils.readFile(dataBuffer.toString() + "hot.json");
        JSONArray jsonhots = null;
        if (StrUtil.isNotEmpty(str)) {
            jsonhots = JSONArray.parseArray(str);
        }else {
            File file = new File(dataBuffer.toString() + "hot.json");
            if(!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            if(!file.exists()){
                file.createNewFile();
            }
            jsonhots = new JSONArray();
        }

        //添加或者修改
        if("1".equals(base.getType())){
            sid = jsonhot.getString("sid");
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
            jsonhots.add(jsonhot);
        }
        else if("0".equals(base.getType())){
            sid = jsonhot.getString("sid");
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
        }
        else if("-1".equals(base.getType())){
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
        }
        //判断是否需要删除自定义热点样式
        String[] styles = null;
        if(StrUtil.isNotEmpty(base.getStyleName())){
            styles = base.getStyleName().split(",");
        }

        for(int i=0;i<jsonhots.size();++i){
            JSONObject ele = jsonhots.getJSONObject(i);
            //名字对应上就删除
            if(styles != null){
                for(String style : styles){
                    if(style.equals(ele.getString("styleId"))){
                        jsonhots.getJSONObject(i).put("styleId", null);
                        jsonhots.getJSONObject(i).put("style", "default");
                        jsonhots.getJSONObject(i).put("styleImageURL", null);
                    }
                }
            }
            if(ele.getString("sid").equals(sid)){
                if("-1".equals(base.getType())){
                    jsonhots.remove(i);
                    if(ele.containsKey("media")){
                        String fileType = ele.getString("media");
                        if(fileType.contains("photo"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".jpg");
                        }
                        if(fileType.contains("audio") || fileType.contains("voice"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp3");
                        }
                        if(fileType.contains("video"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp4");
                        }
                    }

                    if(!"s3".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());
                                }

                            }
                        }
                    }

                }
                else if("0".equals(base.getType())){
                    jsonhots.set(i, jsonhot);
                }
            }
        }

        FileUtils.deleteFile(dataBuffer.toString() + "hot.json");
        File dataPath = new File(dataBuffer.toString());
        if(!dataPath.exists()){
            dataPath.mkdirs();
        }
        FileUtils.writeFile(dataBuffer.toString() + "hot.json", jsonhots.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null){
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        if(jsonhots.size()>0){
            scenejson.put("hots", 1);
        }
        else{
            scenejson.put("hots", 0);
        }

        if(!StrUtil.isEmpty(base.getCapData())){
            FileUtils.writeFile(dataBuffer.toString() + "capData.json", new String(base.getCapData().getBytes(), "UTF-8"));
            scenejson.put("capData", dataBuf.toString() + "capData.json");
        }

        if(!StrUtil.isEmpty(base.getFrameData())){
            FileUtils.writeFile(dataBuffer.toString() + "frameData.json", new String(base.getFrameData().getBytes(), "UTF-8"));
            scenejson.put("frameData", dataBuf.toString() + "frameData.json");
        }

        if(!StrUtil.isEmpty(base.getPlayData())){
            FileUtils.writeFile(dataBuffer.toString() + "playData.json", new String(base.getPlayData().getBytes(), "UTF-8"));
            scenejson.put("playData", dataBuf.toString() + "playData.json");
        }

        if(!StrUtil.isEmpty(base.getScreencapThumb())){
            FileUtils.writeFile(dataBuffer.toString() + "screencapThumb.json", new String(base.getScreencapThumb().getBytes(), "UTF-8"));
            scenejson.put("screencapThumb", dataBuf.toString() + "screencapThumb.json");
        }

        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
        return ResultData.ok();
    }


    @Override
//    @SystemServiceLog(description = "保存场景热点")
    public ResultData saveShopHot(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getType())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        String fileName = "shopHot.json";

        String sid = base.getSid();

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        JSONObject jsonhot = JSONObject.parseObject(base.getHotData());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String str = FileUtils.readFile(dataBuffer.toString() + fileName);

        JSONArray jsonhots = null;
        if (StrUtil.isNotEmpty(str)) {
            jsonhots = JSONArray.parseArray(str);
        }else {
            File file = new File(dataBuffer.toString() + fileName);
            if(!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            if(!file.exists()){
                file.createNewFile();
            }
            jsonhots = new JSONArray();
        }

        //添加或者修改
        if("1".equals(base.getType())){
            sid = jsonhot.getString("sid");
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
            jsonhots.add(jsonhot);
        }
        else if("0".equals(base.getType())){
            sid = jsonhot.getString("sid");
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
        }
        else if("-1".equals(base.getType())){
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
        }

        for(int i=0;i<jsonhots.size();++i){
            JSONObject ele = jsonhots.getJSONObject(i);
            if(ele.getString("sid").equals(sid)){
                if("-1".equals(base.getType())){
                    jsonhots.remove(i);
                    if(ele.containsKey("media")){
                        String fileType = ele.getString("media");
                        if(fileType.contains("photo"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".jpg");
                        }
                        if(fileType.contains("audio") || fileType.contains("voice"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp3");
                        }
                        if(fileType.contains("video"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "hot"+sid+".mp4");
                        }
                    }
                }
                else if("0".equals(base.getType())){
                    jsonhots.set(i, jsonhot);
                }
                break;
            }
        }

        FileUtils.deleteFile(dataBuffer.toString() + fileName);
        File dataPath = new File(dataBuffer.toString());
        if(!dataPath.exists()){
            dataPath.mkdirs();
        }
        FileUtils.writeFile(dataBuffer.toString() + fileName, jsonhots.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null){
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
        return ResultData.ok();
    }

    @Override
    public ResultData saveOverlay(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getType())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        String sid = base.getSid();

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if (sceneProEdit == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());

        //需要操作的数据
        JSONObject jsonOverlay = JSONObject.parseObject(base.getOverlayData());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String str = sceneProEditExt.getOverlay();
        JSONArray jsonOverlays = null;
        if (StrUtil.isNotEmpty(str)) {
            jsonOverlays = JSONArray.parseArray(str);
        }else {
            jsonOverlays = new JSONArray();
        }

        //添加或者修改
        if("1".equals(base.getType())){
            sid = jsonOverlay.getString("sid");
            if(StrUtil.isEmpty(sid)){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
            }
            jsonOverlays.add(jsonOverlay);
        }
        else if("0".equals(base.getType())){
            sid = jsonOverlay.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<jsonOverlays.size();++i){
            JSONObject ele = jsonOverlays.getJSONObject(i);
            if(ele.getString("sid").equals(sid)){
                if("-1".equals(base.getType())){
                    jsonOverlays.remove(i);
                    if(ele.containsKey("media")){
                        String fileType = ele.getString("media");
                        if(fileType.contains("photo"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "overlay"+sid+".jpg");
                        }
                        if(fileType.contains("audio") || fileType.contains("voice"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "overlay"+sid+".mp3");
                        }
                        if(fileType.contains("video"))
                        {
                            FileUtils.deleteFile(imagesBuffer.toString() + "overlay"+sid+".mp4");
                        }
                    }
                }
                else if("0".equals(base.getType())){
                    jsonOverlays.set(i, jsonOverlay);
                }
                break;
            }
        }

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null){
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("overlay", jsonOverlays.toString());
        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.setOverlay(jsonOverlays.toString());
        sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);
        sceneProEditExtService.updateById(sceneProEditExt);

        return ResultData.ok();
    }

    @Override
    public ResultData uploadOverlayMedia(String sceneNum, MultipartFile file, String sid) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        String fileName = "overlay" + sid + ".mp4";
        if (!file.isEmpty()){

            String path = ConstantFilePath.SCENE_PATH + "images" + File.separator + "images" + sceneNum;
            File targetFile = new File(path);
            if (!targetFile.exists()){
                targetFile.mkdirs();
            }

            targetFile = new File(path + File.separator + fileName);
            if (targetFile.exists()){
                FileUtils.deleteFile(path + File.separator + fileName);
            }
            file.transferTo(targetFile);

            CreateObjUtil.mp4ToFlv(path + File.separator + fileName, path + File.separator + fileName.replace("mp4", "flv"));

            uploadToOssUtil.upload(path + File.separator + fileName, "images"+File.separator+"images"+sceneNum + File.separator + fileName);
            uploadToOssUtil.upload(path + File.separator + fileName.replace("mp4", "flv"), "images"+File.separator+"images"+sceneNum + File.separator + fileName.replace("mp4", "flv"));
        }

        return ResultData.ok(fileName);
    }

    @Override
//    @SystemServiceLog(description = "保存场景热点")
    public ResultData saveScreencapData(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        if(base.getScreencapVoiceType() != null){
            scenejson.put("screencapVoiceType", 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");
        }

        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");
        }

        if(!StrUtil.isEmpty(base.getRecordType())){
            scenejson.put("recordType", base.getRecordType());
        }

        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
        return ResultData.ok();
    }

    @Override
//    @SystemServiceLog(description = "漫游可行")
    public ResultData saveLinkPano(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getData()) || StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        JSONArray inputData = JSONObject.parseArray(base.getData());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        File directory = new File(dataBuffer.toString());
        if (!directory.exists()) {
            directory.mkdirs();
        }

        JSONArray inputdata =  JSONArray.parseArray(base.getData());

        String modeldataUrl = prefixAli + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis();
        if("s3".equals(type)){
            modeldataUrl = ConstantUrl.PREFIX_AWS + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis();
        }
        FileUtils.downLoadFromUrl(modeldataUrl, "vision.modeldata", dataBuffer.toString());
        File file = new File(dataBuffer.toString() + "vision.modeldata");
        if(!file.exists()) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5012);
        }
        ConvertUtils.convertVisionModelDataToTxt(dataBuffer.toString() + "vision.modeldata", dataBuffer.toString() + "vision.json");

        String str = FileUtils.readFile(dataBuffer.toString() + "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(dataBuffer.toString() + "vision.json");
        FileUtils.deleteFile(dataBuffer.toString() + "vision.modeldata");
        FileUtils.writeFile(dataBuffer.toString() + "vision.json", json.toString());
        ConvertUtils.convertTxtToVisionModelData(dataBuffer.toString() + "vision.json", dataBuffer.toString() + "vision.modeldata");
        uploadToOssUtil.upload(dataBuffer.toString() + "vision.modeldata", imagesBuf.toString() + "vision.modeldata");

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null){
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if (sceneProEdit == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        sceneProEdit.setVersion(scenejson.getIntValue("version") + 1);
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);
        return ResultData.ok();
    }

    @Override
//    @SystemServiceLog(description = "保存热点可见性的数据")
    public ResultData saveHotVisible(SceneEditVO base) throws Exception {
        if(StrUtil.isEmpty(base.getData()) || StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        JSONArray visiblePanos = JSONArray.parseArray(base.getData());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        File file = new File(dataBuffer.toString() + "hot.json");
        if (!file.exists()) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_3018);
        }

        String str = FileUtils.readFile(dataBuffer.toString() + "hot.json");
        JSONArray hots = JSONArray.parseArray(str);
        for (int i = 0; i < hots.size(); ++i) {
            JSONObject hot = hots.getJSONObject(i);
            for (int j = 0; j < visiblePanos.size(); ++j) {
                if (hot.getString("sid").equals(((JSONObject) visiblePanos.get(j)).getString("sid"))) {
                    hot.put("visiblePanos", ((JSONObject) visiblePanos.get(j)).getJSONArray("value"));
                }
            }
        }
        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null){
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        sceneProEdit.setVersion(sceneProEdit.getVersion() + 1);
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        FileUtils.deleteFile(dataBuffer.toString() + "hot.json");
        FileUtils.writeFile(dataBuffer.toString() + "hot.json", hots.toString());
        return ResultData.ok();
    }

    @Override
    public ResultData uploadShareLogo(SceneEditVO base, MultipartFile file) throws Exception {
        if(file == null || StrUtil.isEmpty(base.getSceneNum())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = findBySceneNum(base.getSceneNum());
        if (scenePro == null ) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer 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<String, Object> map = new HashMap<>();
            map.put("shareLogo", imagesBuf.toString() + fileName);
            map.put("version", sceneProEdit.getVersion()+1);
            FileUtils.writeJsonFile(dataBuffer.toString() + "scene.json", map);

            sceneProEdit.setShareLogo(imagesBuf.toString() + fileName);
            sceneProEdit.setVersion(sceneProEdit.getVersion()+1);
            sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
            sceneProEditService.updateById(sceneProEdit);
            if("V2".equals(scenePro.getBuildType())){
                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getSceneCode(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+".png", path + File.separator + fileName);
                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProUrl + scenePro.getSceneCode() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+"_en.png", path + File.separator + fileName);
            }
            if("V3".equals(scenePro.getBuildType())){
                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getSceneCode(), ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+".png", path + File.separator + fileName);
                MatrixToImageWriterUtil.createQRCode(mainUrl + sceneProNewUrl + scenePro.getSceneCode() + "&lang=en", ConstantFilePath.BASE_PATH + File.separator + "sceneQRcode/"+scenePro.getSceneCode()+"_en.png", path + File.separator + fileName);
            }
        }
        return ResultData.ok(imagesBuf.toString() + fileName);
    }

    @Override
    public ResultData uploadPic(String sceneNum, String folderName, MultipartFile file, String toOss) throws Exception{
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        if (file.isEmpty() && file.getSize() <= 0) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }

        //文件上传的位置可以自定义
        String path = ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum;
        if(StrUtil.isNotEmpty(folderName)) {
            path = path+File.separator + folderName;
        }
        File targetFile = new File(path);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        String fileName = file.getOriginalFilename();
        targetFile = new File(path + File.separator + fileName);
        // 保存
        synchronized(this)
        {
            if(targetFile.exists())
            {
                FileUtils.deleteFile(path + File.separator + fileName);
            }
            file.transferTo(targetFile);
        }

        if(toOss != null && "1".equals(toOss)){
            uploadToOssUtil.upload(path + File.separator + fileName, "images"+File.separator+"images"+sceneNum + File.separator + fileName);
        }

        return ResultData.ok(targetFile.getName());
    }

    @Override
    public ResultData uploadHotJsonToOss(String sceneNum) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        String path = ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum;
        uploadToOssUtil.upload(path + File.separator + "hot.json", "data"+File.separator+"data"+sceneNum + File.separator + "hot.json");

        return ResultData.ok();
    }

    @Override
    public ResultData deleteOss(String filePath) throws Exception {
        uploadToOssUtil.deleteFile(filePath);
        return ResultData.ok();
    }

    @Override
    public ResultData uploadFloorplanPng(String sceneNum, MultipartFile[] file, String cadInfo) throws Exception{
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        if (file.length <= 0) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());


        //文件上传的位置可以自定义
        String path = ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum;
        File targetFile = new File(path);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        String fileName = "";
        JSONArray floorPlanPngArr = new JSONArray();
        for (MultipartFile multipartFile : file) {
            fileName = multipartFile.getOriginalFilename();
            targetFile = new File(path + File.separator + fileName);
            // 保存
            synchronized(this)
            {
                if(targetFile.exists())
                {
                    FileUtils.deleteFile(path + File.separator + fileName);
                }
                multipartFile.transferTo(targetFile);
            }
            floorPlanPngArr.add("images"+File.separator+"images"+sceneNum + File.separator + fileName);
        }

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        Map<String, Object> 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<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getSceneCode, sceneNum));
        if(CollUtil.isEmpty(list))
            return;

        this.update(new LambdaUpdateWrapper<ScenePro>()
                .eq(ScenePro::getSceneCode, sceneNum)
                .set(ScenePro::getCreateTime, Calendar.getInstance().getTime())
                .set(ScenePro::getUpdateTime, Calendar.getInstance().getTime())
                .set(ScenePro::getVideos, videos));

        //修改场景状态 空间 支付状态 计算时间
        List<Long> sceneProIds = list.stream().map(scenePro -> {
            return scenePro.getId();
        }).collect(Collectors.toList());
        sceneProExtService.update(new LambdaUpdateWrapper<SceneProExt>()
                .eq(SceneProExt::getSceneProId, sceneProIds)
                .set(SceneProExt::getSceneStatus, SceneStatus.NO_DISPLAY.code())
                .set(SceneProExt::getSpace, space)
                .set(SceneProExt::getPayStatus, payStatus)
                .set(SceneProExt::getComputeTime, computeTime));
    }

    @Override
    public void updateTime2(String sceneNum, String videos, long computeTime) {
        List<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getSceneCode, sceneNum));
        if(CollUtil.isEmpty(list))
            return;

        this.update(new LambdaUpdateWrapper<ScenePro>()
                .eq(ScenePro::getSceneCode, sceneNum)
                .set(ScenePro::getCreateTime, Calendar.getInstance().getTime())
                .set(ScenePro::getUpdateTime, Calendar.getInstance().getTime())
                .set(ScenePro::getVideos, videos));

        //修改场景状态 空间 支付状态 计算时间
        List<Long> sceneProIds = list.stream().map(scenePro -> {
            return scenePro.getId();
        }).collect(Collectors.toList());
        sceneProExtService.update(new LambdaUpdateWrapper<SceneProExt>()
                .eq(SceneProExt::getSceneProId, sceneProIds)
                .set(SceneProExt::getSceneStatus, SceneStatus.NO_DISPLAY.code())
                .set(SceneProExt::getComputeTime, computeTime));
    }

    @Override
    public SceneVO findLatestOneByUserId(Long userId) {
        return baseMapper.findLatestOneByUserId(userId);
    }

    @Override
    public void updateUserIdByCameraId(Long userId, Long cameraId) {
        this.update(new LambdaUpdateWrapper<ScenePro>()
                .eq(ScenePro::getCameraId, cameraId)
                .set(ScenePro::getUserId, userId));
    }

    @Override
    public List<SceneProPO> findByCameraIdPro(Long cameraId) {
        return baseMapper.findByCameraIdPro(cameraId);
    }

    @Override
    public void updateCameraIdByCameraIdPro(Long oldCameraId, Long cameraId) {
        List<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>().eq(ScenePro::getCameraId, oldCameraId));
        if(CollUtil.isEmpty(list))
            return;

        this.update(new LambdaUpdateWrapper<ScenePro>()
                .eq(ScenePro::getCameraId, oldCameraId)
                .set(ScenePro::getCameraId, cameraId));

        //修改场景状态 空间 支付状态 计算时间
        List<Long> sceneProIds = list.stream().map(scenePro -> {
            return scenePro.getId();
        }).collect(Collectors.toList());

        sceneProExtService.update(new LambdaUpdateWrapper<SceneProExt>()
                .eq(SceneProExt::getSceneProId, sceneProIds)
                .set(SceneProExt::getPayStatus, PayStatus.NO_CAPACITY.code()));
    }

    @Override
    public void updateRecStatus(String unicode) {

        List<SceneProExt> list = sceneProExtService.list(
                new LambdaQueryWrapper<SceneProExt>()
                        .like(SceneProExt::getDataSource, "%" + unicode + "%"));
        if(CollUtil.isEmpty(list)){
            return ;
        }

        List<Long> sceneProIds = list.stream().map(sceneProExt -> {
            return sceneProExt.getSceneProId();
        }).collect(Collectors.toList());

        this.update(new LambdaUpdateWrapper<ScenePro>()
                .in(ScenePro::getId, sceneProIds)
                .set(ScenePro::getRecStatus, RecStatus.DISABLE.code()));
    }

    @Override
    public SceneProPO findByFileId(String fileId) {
        return baseMapper.findByFileId(fileId);
    }

    @Override
    public List<ScenePro> findTempScenes() throws Exception {
        return baseMapper.findTempScenes();
    }

    @Override
    public List<String> findByCameraId(Long cameraId) throws Exception {
        List<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>()
                .select(ScenePro::getWebSite)
                .eq(ScenePro::getTbStatus, TbStatus.VALID.code())
                .eq(ScenePro::getRecStatus, RecStatus.VALID.code())
                .eq(ScenePro::getCameraId, cameraId));
        if(CollUtil.isEmpty(list))
            return null;

        return list.stream().map(scenePro -> {
            return scenePro.getWebSite();
        }).collect(Collectors.toList());
    }

    @Override
    public ResultData uploadObjAndImg(String sceneNum, MultipartFile file) throws Exception{
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if(sceneProEdit == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        if (file == null || file.getSize() <= 0) {
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        //文件上传的位置可以自定义
        String path = sceneProExt.getDataSource() + "_obj2txt";
        String zipPath = path + "/zip/";
        String filePath =  path + "/extras/";

        FileUtils.delAllFile(path + "/results/");
        File targetFile = new File(filePath);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }else {
            FileUtils.delAllFile(filePath);
        }

        targetFile = new File(zipPath);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }else {
            FileUtils.delAllFile(zipPath);
        }

        targetFile = new File(zipPath + file.getOriginalFilename());
        if(!targetFile.getParentFile().exists()){
            targetFile.getParentFile().mkdirs();
        }
        // 保存
        synchronized(this)
        {
            if(targetFile.exists())
            {
                FileUtils.deleteFile(zipPath + file.getOriginalFilename());
            }
            file.transferTo(targetFile);
        }

        FileUtils.decompress(zipPath + file.getOriginalFilename(), zipPath + "data/");

        //源文件数据，判断是否有多个文件夹，有多个就提示错误，有一个就将文件夹里数据迁移到extras目录，无直接迁移到extras目录
        boolean flag = false;
        String targetName = "";
        File dataFile = new File(zipPath + "data/");
        for(File data : dataFile.listFiles()){
            if(data.isDirectory() && flag){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5018);
            }
            if(data.isDirectory() && !flag){
                flag = true;
                targetName = data.getName();
            }
        }

        boolean objFlag = false;
        boolean mtlFlag = false;
        if(StrUtil.isEmpty(targetName)){
            for(File data : dataFile.listFiles()){
                if(data.getName().endsWith(".obj") && objFlag){
                    throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
                }

                if(data.getName().endsWith(".jpg") || data.getName().endsWith(".png")){
                    if(!FileUtils.checkFileSizeIsLimit(data.length(), 1.5, "M")){
                        throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                    }
                }

                if(data.getName().endsWith(".obj") && !objFlag){
                    if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){
                        throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                    }
                    objFlag = true;
                    FileUtils.copyFile(zipPath + "data/" + data.getName(), filePath + "mesh.obj", true);
                    continue;
                }

                if(data.getName().endsWith(".mtl")){
                    mtlFlag = true;
                }

                FileUtils.copyFile(zipPath + "data/" + data.getName(), filePath + data.getName(), true);
            }
        }else {
            for(File data : new File(zipPath + "data/" + targetName).listFiles()){
                if(data.isDirectory()){
                    throw new BusinessException(ErrorCode.FAILURE_CODE_5018);
                }
                if(data.getName().endsWith(".obj") && objFlag){
                    throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
                }

                if(data.getName().endsWith(".jpg") || data.getName().endsWith(".png")){
                    if(!FileUtils.checkFileSizeIsLimit(data.length(), 1.5, "M")){
                        throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                    }
                }

                if(data.getName().endsWith(".obj") && !objFlag){
                    if(!FileUtils.checkFileSizeIsLimit(data.length(), 20, "M")){
                        throw new BusinessException(ErrorCode.FAILURE_CODE_5020);
                    }

                    objFlag = true;
                    FileUtils.copyFile(zipPath + "data/" + targetName + File.separator + data.getName(), filePath + "mesh.obj", true);
                    continue;
                }

                if(data.getName().endsWith(".mtl")){
                    mtlFlag = true;
                }

                FileUtils.copyFile(zipPath + "data/" + targetName + File.separator + data.getName(), filePath + data.getName(), true);
            }
        }

        if(!mtlFlag && !objFlag){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5019);
        }

        //创建data.json
        JSONObject dataJson = new JSONObject();
        dataJson.put("obj2txt", true);
        dataJson.put("split_type", "SPLIT_V6");
        dataJson.put("data_describe", "double spherical");
        dataJson.put("skybox_type", "SKYBOX_V5");
        FileUtils.writeFile(path + "/data.json", dataJson.toString());

        //调用objToTxt算法
        //判断V2还是V3
        if("V2".equals(scenePro.getBuildType())){
            CreateObjUtil.objToTxt(path , "1");
        }
        if("V3".equals(scenePro.getBuildType())){
            CreateObjUtil.build3dModel(path , "1");
        }

        String uploadData = FileUtils.readFile(path + File.separator + "results" +File.separator+"upload.json");
        JSONObject uploadJson = null;
        JSONArray array = null;
        if(uploadData!=null) {
            uploadJson = JSONObject.parseObject(uploadData);
            array = uploadJson.getJSONArray("upload");
        }
        if(array == null){
            log.error("upload.json数据出错");
            throw new BusinessException(ErrorCode.FAILURE_CODE_5017);
        }

        Map<String,String> map = new HashMap<String,String>();
        JSONObject fileJson = null;
        String fileName = "";
        for(int i = 0, len = array.size(); i < len; i++) {
            fileJson = array.getJSONObject(i);
            fileName = fileJson.getString("file");
            //文件不存在抛出异常
            if (!new File(path + File.separator + "results" + File.separator + fileName).exists()) {
                throw new Exception(path + File.separator + "results" + File.separator + fileName + "文件不存在");
            }

            //tex文件夹
            if (fileJson.getIntValue("clazz") == 15) {
                map.put(path + File.separator + "results" + File.separator + fileName, "images/images" +
                        sceneNum + "/" + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/" + fileName.replace("tex/", ""));

                //复制一份到images本地
                FileUtils.copyFile(path + File.separator + "results" +File.separator + fileName,
                        ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator +
                                ConstantFileName.modelUUID + "_50k_texture_jpg_high1/" + fileName.replace("tex/", ""), true);
                continue;
            }
        }

        CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+"modeldata.txt", path + File.separator + "results" +File.separator+ ConstantFileName.modelUUID+"_50k.dam");
        CreateObjUtil.convertDamToLzma(path + File.separator + "results");
        CreateObjUtil.convertTxtToDam( path + File.separator + "results" +File.separator+"modeldata.txt", path + File.separator + "results" + File.separator+ConstantFileName.modelUUID+"_50k.dam");
        map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma", "images/images"+sceneNum+"/"+ConstantFileName.modelUUID+"_50k.dam.lzma");
        map.put(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam", "images/images"+sceneNum+"/"+ConstantFileName.modelUUID+"_50k.dam");

        uploadToOssUtil.uploadMulFiles(map);

        FileUtils.copyFile(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam",
                ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator + ConstantFileName.modelUUID+"_50k.dam", true);
        FileUtils.copyFile(path + File.separator + "results" +File.separator+ConstantFileName.modelUUID+"_50k.dam.lzma",
                ConstantFilePath.SCENE_PATH+"images"+File.separator+"images"+sceneNum + File.separator + ConstantFileName.modelUUID+"_50k.dam.lzma", true);
        log.info("文件复制到本地ecs完成——"+sceneNum);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        //更新scene.json文件
        if(strsceneInfos!=null)
        {
            scenejson.put("isUploadObj", true);
            scenejson.put("version", sceneProEdit.getVersion() + 1);
            scenejson.put("floorEditVer", sceneProEdit.getFloorEditVer() + 1);
            scenejson.put("floorPublishVer", sceneProEdit.getFloorPublishVer() + 1);
            FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data"+File.separator+"data"+sceneNum+File.separator+"scene.json", scenejson.toString());
            log.info("写入scene.json文件完成——"+sceneNum);
        }

        //floorEditVer字段增加1
        sceneProEdit.setVersion(sceneProEdit.getVersion() + 1);
        sceneProEdit.setFloorPublishVer(sceneProEdit.getFloorPublishVer() + 1);
        sceneProEdit.setFloorEditVer(sceneProEdit.getFloorEditVer() + 1);
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditService.updateById(sceneProEdit);

        return ResultData.ok();
    }

    @Override
    public ResultData uploadLogoBottomStatus(String sceneNum, String status) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(status)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if(sceneProEdit == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());
        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }


        scenejson.put("showLogoBottom", Integer.valueOf(status));
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        sceneProEdit.setVersion(scenejson.getIntValue("version") + 1);
        sceneProEdit.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditExt.setShowLogoBottom(Integer.valueOf(status));
        sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProEditExtService.updateById(sceneProEditExt);
        sceneProEditService.updateById(sceneProEdit);

        return ResultData.ok();
    }

    @Override
    public ResultData saveJsonData(String sceneNum, String fileName, String jsonData) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(jsonData)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        FileUtils.writeFile(dataBuffer.toString() + fileName, jsonData.toString());

        return ResultData.ok("scene/" + dataBuf.toString() + fileName);
    }

    @Override
    public String downloadPanoramaOrVideo(String sceneNum, String fileName, String type, String planId) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type)|| StrUtil.isEmpty(planId)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String path = sceneProExt.getDataSource();

        String url = "";

        if("image".equals(type)){
            if(!new File(path + "/caches/images/" + fileName).exists()){
                throw new BusinessException(ErrorCode.FAILURE_CODE_3018);
            }

            //备份原始数据
            if(!new File(imagesBuffer.toString() + "caches/back-" + fileName).exists()){
                FileUtils.copyFile(path + "/caches/images/" + fileName, imagesBuffer.toString() + "caches/back-" + fileName, false);
            }
            //复制打包数据，并且改名
            FileUtils.copyFile(path + "/caches/images/" + fileName, imagesBuffer.toString() + "caches/" + planId + ".jpg", true);

            url = mainUrl + "scene/" + imagesBuf.toString() + "caches/" + planId + ".jpg";
        }

        if("video".equals(type)){
            url = prefixAli + "video/video" + scenePro.getSceneCode() + "/" + planId + ".mp4";
        }
        return url;
    }

    @Override
    public ResultData uploadPanoramaOrVideo(String sceneNum, String fileName, String type, MultipartFile file, String planId) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(type) || StrUtil.isEmpty(planId)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        if(!fileName.endsWith(".jpg") && !fileName.endsWith(".mp4")){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5023);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());


        String path = sceneProExt.getDataSource();

        if(path != null && !"".equals(path) && path.startsWith("http")){
            path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
        }
        String target = path + "_images";

        //文件上传的位置可以自定义
        String filePath = "";
        if("image".equals(type)){
            filePath = target + File.separator + "extras/images" + File.separator + fileName;
        }

        if("video".equals(type)){
            filePath = target + File.separator + "extras/video" + File.separator + fileName;
        }
        File targetFile = new File(filePath);
        if(!targetFile.getParentFile().exists()){
            targetFile.getParentFile().mkdirs();
        }

        //上传文件
        file.transferTo(targetFile);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }
        if(type.equals("video")){
            scenejson.put("buildImages", 2);
            FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
        }else{
            scenejson.put("buildImages", 1);
            FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());
        }

        return ResultData.ok();
    }

    @Override
    public ResultData uploadROIVideo(String sceneNum, String fileName, MultipartFile file, String planId, String rect,
                                 String videoDirMatrix, String dir, String hfov, String vfov) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) ||
                StrUtil.isEmpty(planId) || StrUtil.isEmpty(rect)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());


        String path = sceneProExt.getDataSource();

        if(path != null && !"".equals(path) && path.startsWith("http")){
            path = ConstantFilePath.BUILD_MODEL_PATH + File.separator + path.split("/")[path.split("/").length - 2];
        }
        String target = path + "_roi";

        FileUtils.deleteDirectory(target);

        //文件上传的位置可以自定义
        String filePath = target + File.separator + "extras" + File.separator + fileName;
        File targetFile = new File(filePath);
        if(!targetFile.getParentFile().exists()){
            targetFile.getParentFile().mkdirs();
        }

        if(file == null){
            FileUtils.copyFile(ConstantFilePath.SCENE_PATH + "video/video"+
                    scenePro.getSceneCode() + File.separator + fileName, filePath, true);
        }else {
            //上传文件
            file.transferTo(targetFile);

            FileUtils.copyFile(filePath, ConstantFilePath.SCENE_PATH + "video/video"+
                    scenePro.getSceneCode() + File.separator + fileName, true);
        }

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();

        JSONObject rectJson = JSON.parseObject(rect);

        boolean noPanoId = true;
        if(scenejson.containsKey("videosUser")){
            jsonArray = scenejson.getJSONArray("videosUser");
            for(int i = 0, len = jsonArray.size(); i < len; i++){
                jsonObject = jsonArray.getJSONObject(i);
                if(planId.equals(jsonObject.getString("panoId"))){
                    jsonObject.put("rect", rectJson);
                    jsonObject.put("name", fileName.substring(0, fileName.lastIndexOf(".")));
                    jsonObject.put("dir", JSON.parseObject(dir));
                    jsonObject.put("hfov", hfov);
                    jsonObject.put("vfov", vfov);
                    noPanoId = false;
                    break;
                }
            }
        }
        if(noPanoId){
            jsonObject = new JSONObject();
            jsonObject.put("name", fileName.substring(0, fileName.lastIndexOf(".")));
            jsonObject.put("panoId", planId);
            jsonObject.put("rect", rectJson);
            jsonObject.put("dir", JSON.parseObject(dir));
            jsonObject.put("hfov", hfov);
            jsonObject.put("vfov", vfov);
            if(!jsonArray.contains(jsonObject)){
                jsonArray.add(jsonObject);
            }
        }
        //保存rect的json数据
        FileUtils.writeFile(target + File.separator + "extras" + File.separator + "video-ROI.json", jsonObject.toJSONString());
        //复制原始图片
        FileUtils.copyFile(path + "/caches/images/" + planId + ".jpg",
                target + File.separator + "extras" + File.separator + planId + ".jpg", true);

        FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
        FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);

        //data.json增加extras为执行重建算法
        String project = FileUtils.readFile(target + File.separator+"project.json");
        if(project != null){
            JSONObject projectJson = JSONObject.parseObject(project);
            projectJson.put("parent", projectJson.get("uuid"));
            projectJson.put("uuid", UUID.randomUUID().toString());
            projectJson.put("time", System.currentTimeMillis());
            FileUtils.writeFile(path + File.separator + "project.json", projectJson.toString());
        }

        String data = FileUtils.readFile(target + File.separator+"data.json");
        if(data != null){
            JSONObject dataJson = JSONObject.parseObject(data);
            //V5表示不需要生成high，low文件
            dataJson.put("skybox_type", "SKYBOX_V5");
            dataJson.put("split_type", "SPLIT_V11");
            FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
        }

        //进行计算
        log.info("绿幕抠图视频：开始建模——" + scenePro.getSceneCode());
        CreateObjUtil.build3dModel2(target , "1");

        //读取upload文件，检验需要上传的文件是否存在
        String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
        JSONObject uploadJson = null;
        JSONArray array = null;
        if(uploadData!=null) {
            uploadJson = JSONObject.parseObject(uploadData);
            array = uploadJson.getJSONArray("upload");
        }
        if(array == null){
            throw new Exception("upload.json数据出错");
        }

        Map<String, String> map = new HashMap<>();
        JSONObject fileJson = null;
        for(int i = 0, len = array.size(); i < len; i++){
            fileJson = array.getJSONObject(i);
            fileName = fileJson.getString("file");
            //文件不存在抛出异常
            if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
                throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
            }

            if(fileJson.getIntValue("clazz") == 19 ){
                map.put(target + File.separator + "results" + File.separator+ fileName,"video/video"+
                        scenePro.getSceneCode() + File.separator + fileName.replace("videos/", ""));
            }

        }

        uploadToOssUtil.uploadMulFiles(map);

        scenejson.put("videosUser", jsonArray.toJSONString());
        scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1);

        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if(sceneProEdit != null){
            SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
            sceneProEditExt.setVideosUser(jsonArray.toJSONString());
            sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1);
            sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
            sceneProEditExtService.updateById(sceneProEditExt);
        }

        return ResultData.ok();
    }

    @Override
    public ResultData deleteROIVideo(String sceneNum, String fileName, String planId) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName) || StrUtil.isEmpty(planId)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        JSONArray newArray = new JSONArray();
        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject = new JSONObject();

        if(scenejson.containsKey("videosUser")){
            jsonArray = JSON.parseArray(scenejson.getString("videosUser"));
            for(int i = 0, len = jsonArray.size(); i < len; i++){
                jsonObject = jsonArray.getJSONObject(i);
                if(planId.equals(jsonObject.getString("panoId"))){
                    continue;
                }
                if(!newArray.contains(jsonObject)){
                    newArray.add(jsonObject);
                }
            }
        }

        scenejson.put("videosUser", newArray.toJSONString());
        scenejson.put("imagesVersion", scenejson.getIntValue("imagesVersion") + 1);

        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        SceneProEdit sceneProEdit = sceneProEditService.findByProId(scenePro.getId());
        if(sceneProEdit != null){
            SceneProEditExt sceneProEditExt = sceneProEditExtService.getByProEditId(sceneProEdit.getId());
            sceneProEditExt.setVideosUser(newArray.toJSONString());
            sceneProEditExt.setImagesVersion(sceneProEditExt.getImagesVersion() + 1);
            sceneProEditExt.setUpdateTime(Calendar.getInstance().getTime());
            sceneProEditExtService.updateById(sceneProEditExt);
        }

        uploadToOssUtil.delete("video/video"+ scenePro.getSceneCode() + File.separator +
                fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4");
        uploadToOssUtil.delete("video/video"+ scenePro.getSceneCode() + File.separator +
                fileName.substring(0, fileName.lastIndexOf(".")) + ".flv");

        FileUtils.deleteFile(ConstantFilePath.SCENE_PATH + "video/video"+ scenePro.getSceneCode() + File.separator + fileName);
        return ResultData.ok();
    }

    @Override
    public ResultData uploadBgMusic(String sceneNum, String fileName, MultipartFile file) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        File buMusicFile = new File(imagesBuffer.toString() + fileName);
        if(!buMusicFile.getParentFile().exists()){
            buMusicFile.getParentFile().mkdirs();
        }

        //上传文件
        file.transferTo(buMusicFile);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("bgMusicName", fileName);
        scenejson.put("uploadBgMusic", 1);
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        return ResultData.ok();
    }

    @Override
    public ResultData deleteUploadBgMusic(String sceneNum) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("bgMusicName", "");
        scenejson.put("uploadBgMusic", 1);
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        return ResultData.ok();
    }

    @Override
    public ResultData savePanorama(String sceneNum, String sid, MultipartFile file, String imagesName) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(sid)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String path = sceneProExt.getDataSource();
        String target = imagesBuffer.toString() + "panorama/" + sid;
        FileUtils.deleteDirectory(target);

        //文件上传的位置可以自定义
        String filePath = target + File.separator + "extras/images" + File.separator + imagesName;

        File targetFile = new File(filePath);
        if(!targetFile.getParentFile().exists()){
            targetFile.getParentFile().mkdirs();
        }

        //上传文件
        file.transferTo(targetFile);

        //调用算法切全景图
        FileUtils.copyFile(path + File.separator + "data.json", target + File.separator+"data.json", true);
        FileUtils.copyFile(path + File.separator + "project.json", target + File.separator+"project.json", true);

        JSONObject visionJson = new JSONObject();
        JSONArray visionArray = new JSONArray();
        visionJson.put("uuid", imagesName.substring(0, imagesName.lastIndexOf(".")));
        visionJson.put("group", 1);
        visionJson.put("subgroup", 0);
        visionArray.add(visionJson);

        JSONObject vision = new JSONObject();
        vision.put("sweepLocations", visionArray);
        FileUtils.writeFile(target + "/extras" + File.separator + "vision.txt", new String(vision.toString().getBytes(), "UTF-8"));

        //data.json增加extras为执行重建算法
        String data = FileUtils.readFile(target + File.separator + "data.json");
        if(data != null){
            JSONObject floorplanJson = new JSONObject();
            floorplanJson.put("has_source_images", true);
            floorplanJson.put("has_vision_txt", true);

            JSONObject dataJson = JSONObject.parseObject(data);
            dataJson.put("extras", floorplanJson);
            //V5表示不需要生成high，low文件
            dataJson.put("skybox_type", "SKYBOX_V6");
            if(scenePro.getSceneScheme() == 11){
                dataJson.put("skybox_type", "SKYBOX_V7");
            }
            dataJson.put("split_type", "SPLIT_V8");
            if(scenePro.getSceneScheme() == 3){
                dataJson.put("skybox_type", "SKYBOX_V4");
            }
            FileUtils.writeFile(target + File.separator+"data.json", new String(dataJson.toString().getBytes(), "UTF-8"));
        }

        //创建文件夹软连接并且复制data.json和project.json
        if(new File(target + File.separator + "capture").exists()){
            new File(target + File.separator + "capture").delete();
        }
        if(new File(target + File.separator + "results").exists()){
            FileUtils.delAllFile(target + File.separator + "results");
        }
        //下载data.fdage
        if("s3".equals(this.type)){
            //亚马逊保持旧方式，超链接capture
            CreateObjUtil.createSoftConnection(path + File.separator + "capture", target + File.separator + "capture");
        }
        CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "") + "/data.fdage", target + File.separator + "capture/");

        CreateObjUtil.build3dModel(target , "1");

        //读取upload文件，检验需要上传的文件是否存在
        String uploadData = FileUtils.readFile(target + File.separator + "results" +File.separator+"upload.json");
        JSONObject uploadJson = null;
        JSONArray array = null;
        if(uploadData!=null) {
            uploadJson = JSONObject.parseObject(uploadData);
            array = uploadJson.getJSONArray("upload");
        }
        if(array == null){
            log.info("计算全景图失败，没有upload.json");
        }
        Map<String, String> map = new HashMap<>();
        JSONObject fileJson = null;
        String fileName = "";
        String img = "";
        for(int i = 0, len = array.size(); i < len; i++){
            fileJson = array.getJSONObject(i);
            fileName = fileJson.getString("file");
            //文件不存在抛出异常
            if(!new File(target + File.separator + "results" +File.separator + fileName).exists()){
                throw new Exception(target + File.separator + "results" +File.separator + fileName+"文件不存在");
            }

            //low文件夹
            if(fileJson.getIntValue("clazz") == 4){
                img = "/results" + File.separator + fileName;

                map.put(target + File.separator + "results" +File.separator+ fileName,"images/images"+
                        scenePro.getSceneCode()+"/pan/low/"+ fileName.replace("low/", ""));
                continue;
            }

            //tiles文件夹,亚马逊没有裁剪图片api，不需要上传4k图
            if(fileJson.getIntValue("clazz") == 5){
                map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                        scenePro.getSceneCode()+ "/panorama_edit/" + sid + File.separator + fileName);
            }

            //tiles文件夹,亚马逊瓦片图
            if(fileJson.getIntValue("clazz") == 7 ){
                map.put(target + File.separator + "results" + File.separator+ fileName,"images/images"+
                        scenePro.getSceneCode()+ File.separator + fileName);
            }

        }

        //上传全景图
        map.put(filePath, "images/images"+ scenePro.getSceneCode()+ File.separator + "pan/high/" + imagesName);

        uploadToOssUtil.uploadMulFiles(map);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("uploadPanoramaImg", 1);
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        Map<String, String> result = new HashMap<>();
        result.put("type", scenePro.getSceneScheme() == 11? "2k" : "4k");
        result.put("img", "scene/" + imagesBuf.toString() + "panorama/" + sid + img);
        result.put("path", "images/images"+ scenePro.getSceneCode()+ "/panorama_edit/" + sid);
        return ResultData.ok(result);
    }

    @Override
    public ResultData savePanoramaJson(String sceneNum, String fileData, String fileName, String sid) throws Exception {
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(fileName)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        ScenePro scenePro = baseMapper.findByNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        FileUtils.writeFile(dataBuffer.toString() + fileName, fileData);

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("uploadPanoramaJson", 1);
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        if(StrUtil.isNotEmpty(fileData)){
            scenejson.put("jumpScene", true);
        }else {
            scenejson.put("jumpScene", false);
        }
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toString());

        if(StrUtil.isNotEmpty(sid)){
            String target = imagesBuffer.toString() + "panorama/" + sid;
            FileUtils.deleteDirectory(target);
            uploadToOssUtil.deleteFile(imagesBuf.toString() + "panorama_edit/" + sid);
        }

        return ResultData.ok();
    }

    @Override
    public ResultData copyAndUpdateFloorJson(String sceneNum, String floorJsonData) throws Exception{
        if(StrUtil.isEmpty(sceneNum) ){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(sceneNum)
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        if(StrUtil.isEmpty(floorJsonData)){
            ScenePro scenePro = baseMapper.findByNum(sceneNum);
            if(scenePro == null){
                throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
            }
            SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());

            FileUtils.copyFile(sceneProExt.getDataSource() + "/results/floor.json", dataBuffer.toString() + "houst_floor.json", true);
            uploadToOssUtil.upload(dataBuffer.toString() + "houst_floor.json", dataBuf.toString() + "houst_floor.json");

            String result = FileUtils.readFile(dataBuffer.toString() + "houst_floor.json");
            return ResultData.ok((Object) result);
        }

        FileUtils.writeFile(dataBuffer.toString() + "houst_floor.json", floorJsonData);
        uploadToOssUtil.upload(dataBuffer.toString() + "houst_floor.json", dataBuf.toString() + "houst_floor.json");
        return ResultData.ok(floorJsonData);
    }

    @Override
    public ResultData updateFloorJson(String sceneNum, String floorJsonData) throws Exception{
        if(StrUtil.isEmpty(sceneNum) || StrUtil.isEmpty(floorJsonData)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(sceneNum)
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());

        String strsceneInfos = FileUtils.readFile(dataBuffer.toString() + "scene.json");
        JSONObject scenejson = new JSONObject();
        if(strsceneInfos!=null) {
            scenejson = JSONObject.parseObject(strsceneInfos);
        }

        scenejson.put("uploadFloorJson", 1);
        scenejson.put("version", scenejson.getIntValue("version") + 1);
        FileUtils.writeFile(dataBuffer.toString() + "floor.json", floorJsonData);
        FileUtils.writeFile(dataBuffer.toString() + "scene.json", scenejson.toJSONString());
        return ResultData.ok((Object) floorJsonData);
    }

    @Override
    public IPage<SceneVO> getAppAllSceneByPage(Long cameraId, Long userId, int cameraType, int pageNum, Integer pageSize, String orderBy, Integer sceneType, List<String> sceneCodeList, String sceneName) {

        Page<SceneVO> page = new Page<>(pageNum, pageSize);

        List<SceneVO> 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<ScenePro>().eq(ScenePro::getRecStatus, RecStatus.VALID.code()).eq(ScenePro::getCameraId, cameraId));
    }

    @Override
    public SceneProPO findLastSceneByCameraId(Long cameraId) {
        return baseMapper.findLastSceneByCameraId(cameraId);
    }

    @Override
    public Long findTotalSpaceByCameraId(Long cameraId) {
        List<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>()
                .select(ScenePro::getId)
                .eq(ScenePro::getTbStatus, TbStatus.VALID.code())
                .eq(ScenePro::getRecStatus, RecStatus.VALID.code())
                .eq(ScenePro::getCameraId, cameraId));
        if(CollUtil.isEmpty(list)){
            return 0l;
        }

        List<Long> sceneProIds = list.stream().map(scenePro -> {
            return scenePro.getId();
        }).collect(Collectors.toList());

        return sceneProExtService.count(new LambdaQueryWrapper<SceneProExt>()
                .in(SceneProExt::getSceneProId, sceneProIds)
                .eq(SceneProExt::getPayStatus, PayStatus.PAY.code())
                .in(SceneProExt::getSceneStatus, SceneStatus.SUCCESS.code(), SceneStatus.NO_DISPLAY.code()));

    }

    @Override
    public void updatePayStatusByCameraId(Integer payStatus, Long cameraId) {
        List<ScenePro> list = this.list(new LambdaQueryWrapper<ScenePro>()
                .select(ScenePro::getId)
                .eq(ScenePro::getTbStatus, TbStatus.VALID.code())
                .eq(ScenePro::getCameraId, cameraId));
        if(CollUtil.isEmpty(list)){
            return;
        }

        List<Long> sceneProIds = list.stream().map(scenePro -> {
            return scenePro.getId();
        }).collect(Collectors.toList());

        sceneProExtService.update(
                new LambdaUpdateWrapper<SceneProExt>()
                        .in(SceneProExt::getSceneProId, sceneProIds)
                        .set(SceneProExt::getPayStatus, payStatus));
    }

    @Override
    public ResultData downloadPanoramaData(String sceneNum) throws Exception {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }
        ScenePro scenePro = findBySceneNum(sceneNum);
        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        SceneProExt sceneProExt = sceneProExtService.findBySceneProId(scenePro.getId());
        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());

        String highPath = sceneProExt.getDataSource() + "/results/high";
        if(!new File(highPath).exists()){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
        }

        FileUtils.zipFile(imagesBuffer.toString() + sceneNum + "-high.zip", highPath);
        uploadToOssUtil.upload(imagesBuffer.toString() + sceneNum + "-high.zip", imagesBuf.toString() + sceneNum + "-high.zip");

        return ResultData.ok(prefixAli + imagesBuf.toString() + sceneNum + "-high.zip?t=" + System.currentTimeMillis());

    }

    public ResultData getSceneAndCameras(Long userId,List<String> excludeNums) {
        List<SceneProPO> scenes = findByUserId(userId,excludeNums);
        Map<String,Object> result = new HashMap<>(2);
        if(ObjectUtils.isEmpty(scenes)){
            result.put("scenes",new ArrayList<>());
            result.put("cameras",new ArrayList<>());
            return ResultData.ok(result);
        }
        List<String> ids = scenes.parallelStream().map(scene->String.valueOf(scene.getCameraId()))
                .collect(Collectors.toList());
        // TODO: 2021/12/29 这里需要feign接口 
//        List<CameraEntity> cameras = cameraService.getCamerasByIds(ids);
//        result.put("scenes",scenes);
//        result.put("cameras",cameras);
        return ResultData.ok(result);
    }

    @Override
    public SceneProPO findBySceneNumWithOutCheckRecStatus(String sceneNum) throws Exception {
        return baseMapper.findByNumWithOutCheckRecStatus(sceneNum);
    }


    @Override
    public Integer findFolderIdScence(Long folderId, Long userId) {
        return baseMapper.findFolderIdScence(SceneProVO.builder().folderId(folderId).userId(userId).build());
    }

    @Override
    public ResultData downloadVisionData(String sceneCode) throws Exception {
        if(StrUtil.isEmpty(sceneCode)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }
        List<ScenePro> sceneProList =  this.list(
                new QueryWrapper<ScenePro>()
                        .eq("tb_status", TbStatus.VALID.code())
                        .eq("rec_status", RecStatus.VALID.code())
                        .eq("scene_code",sceneCode));
        if(CollUtil.isEmpty(sceneProList)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        ScenePro scenePro = sceneProList.get(0);

        StringBuffer dataBuf = new StringBuffer()
                .append("data").append(File.separator)
                .append("data").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer imagesBuf = new StringBuffer()
                .append("images").append(File.separator)
                .append("images").append(scenePro.getSceneCode())
                .append(File.separator);

        StringBuffer dataBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(dataBuf.toString());
        StringBuffer imagesBuffer = new StringBuffer(ConstantFilePath.SCENE_PATH).append(imagesBuf.toString());


        String modeldataUrl = prefixAli + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis();
        if("s3".equals(type)){
            modeldataUrl = ConstantUrl.PREFIX_AWS + imagesBuf.toString() + "vision.modeldata?t=" + System.currentTimeMillis();
        }
        FileUtils.downLoadFromUrl(modeldataUrl, "vision.modeldata", dataBuffer.toString());
        File file = new File(dataBuffer.toString() + "vision.modeldata");
        if(!file.exists()) {
            return ResultData.error(ErrorCode.FAILURE_CODE_5012);
        }
        ConvertUtils.convertVisionModelDataToTxt(dataBuffer.toString() + "vision.modeldata", dataBuffer.toString() + "vision.json");

        uploadToOssUtil.upload(dataBuffer.toString() + "vision.json", dataBuf.toString() + "vision.json");
        return ResultData.ok(prefixAli + dataBuf.toString() + "vision.json?t=" + System.currentTimeMillis());
    }

    @Override
    public SceneVO getInfo(String sceneNum) {
        if(StrUtil.isEmpty(sceneNum)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_3001);
        }


        List<ScenePro> sceneProList =  this.list(
                new QueryWrapper<ScenePro>()
                        .eq("tb_status", TbStatus.VALID.code())
                        .eq("scene_code",sceneNum));
        if(CollUtil.isEmpty(sceneProList)){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        ScenePro scenePro = sceneProList.get(0);

        if(scenePro == null){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5005);
        }
        if(scenePro.getRecStatus().equals(RecStatus.DISABLE.code())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5009);
        }

        SceneProExt sceneProExt = sceneProExtService.list(new QueryWrapper<SceneProExt>()
                .eq("scene_pro_id", scenePro.getId())).get(0);

        if(!SceneStatus.SUCCESS.code().equals(sceneProExt.getSceneStatus())
                && !SceneStatus.NO_DISPLAY.code().equals(sceneProExt.getSceneStatus())){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
        }
        if(sceneProExt.getPayStatus() != 1){
            throw new BusinessException(ErrorCode.FAILURE_CODE_5034);
        }

        SceneVO sceneVo = new SceneVO();
        SceneProEdit sceneProEdit =
                sceneProEditService.getOne(
                        new QueryWrapper<SceneProEdit>()
                                .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<SceneProEditExt>()
                                .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());

        // TODO: 2021/12/31  feign 调用  修改相机已使用用量
//        CameraDetailEntity detailEntity = cameraDetailService.findByCameraId(sceneProEntity.getCameraId());
//        detailEntity.setUsedSpace(detailEntity.getUsedSpace().subtract(sceneProEntity.getSpace()));
//        if(detailEntity.getUsedSpace().signum() < 0){
//            detailEntity.setUsedSpace(new BigInteger("0"));
//        }
//        cameraDetailService.update(detailEntity);

        sceneProExt.setSpace(Long.parseLong("0"));
        sceneProExt.setUpdateTime(Calendar.getInstance().getTime());
        sceneProExtService.updateById(sceneProExt);

        return ResultData.ok();
    }

    private void dealTour(SceneEditVO base, JSONObject scenejson, Map<String,String> 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<strs.length;++i) {
                        if(strs[i].indexOf(ConstantFileName.SCREEN_CRP_DATAFILE)>-1)
                        {
                            ++screencapLen;
                            map.put(dataBuffer.toString() + ConstantFileName.TOURLIST_FOLDER+File.separator+strs[i],
                                    "data/data"+base.getSceneNum()+"/tour/"+strs[i]);
                        }
                    }
                }
                scenejson.put("screencapLen", screencapLen);

                String path = imagesBuffer.toString() + ConstantFileName.TOURLIST_FOLDER;
                JSONArray tourJsons = JSONArray.parseArray(base.getTourList());
                for(int i=0;i<tourJsons.size();++i) {
                    String fileName = path + File.separator +"guide"+i+".jpg";
                    map.put(fileName,"images/images"+base.getSceneNum()+"/tour/guide"+i+".jpg");
                }

                scenejson.put("uploadTourList", 0);
            }

            String tourListPath = dataBuffer.toString() + ConstantFileName.TOUR_LIST;
            FileUtils.deleteFile(tourListPath);
            FileUtils.writeFile(tourListPath, base.getTourList());
            map.put(tourListPath, dataBuffer.toString() + ConstantFileName.TOUR_LIST);
        }else{
            if(scenejson.containsKey("uploadTourList") && scenejson.getIntValue("uploadTourList") == 1){
                scenejson.put("uploadTourList", 0);
            }
            scenejson.put("screencapLen", 0);
        }
    }



}
