dengsixing преди 3 години
родител
ревизия
134cd8038b

+ 809 - 0
4dkankan-center-modeling/src/main/java/com/fdkankan/modeling/receiver/BuildSceneListener.java

@@ -0,0 +1,809 @@
+//package com.fdkankan.modeling.receiver;
+//
+//import static com.fdkankan.push.PushMessageConfig.ANDROID_KEY;
+//import static com.fdkankan.push.PushMessageConfig.ANDROID_KEY_Z;
+//import static com.fdkankan.push.PushMessageConfig.ANDROID_SECRET;
+//import static com.fdkankan.push.PushMessageConfig.ANDROID_SECRET_Z;
+//import static com.fdkankan.push.PushMessageConfig.IOS_KEY;
+//import static com.fdkankan.push.PushMessageConfig.IOS_KEY_Z;
+//import static com.fdkankan.push.PushMessageConfig.IOS_SECRET;
+//import static com.fdkankan.push.PushMessageConfig.IOS_SECRET_Z;
+//
+//import cn.hutool.core.collection.CollUtil;
+//import cn.hutool.core.date.DateUtil;
+//import cn.hutool.core.util.StrUtil;
+//import com.alibaba.fastjson.JSONArray;
+//import com.alibaba.fastjson.JSONObject;
+//import com.fdkankan.common.constant.ConstantFilePath;
+//import com.fdkankan.common.constant.ConstantUrl;
+//import com.fdkankan.common.constant.UploadFilePath;
+//import com.fdkankan.common.util.ComputerUtil;
+//import com.fdkankan.common.util.CreateObjUtil;
+//import com.fdkankan.common.util.FileUtil;
+//import com.fdkankan.common.util.FileUtils;
+//import com.fdkankan.dingtalk.DingTalkSendUtils;
+//import com.fdkankan.fyun.constant.StorageType;
+//import com.fdkankan.fyun.oss.UploadToOssUtil;
+//import com.fdkankan.modeling.constants.SysConstants;
+//import com.fdkankan.mq.message.BuildSceneMqMessage;
+//import com.fdkankan.mq.message.BuildSceneResultMqMessage;
+//import com.fdkankan.mq.util.RocketMQProducer;
+//import com.fdkankan.push.PushMessageConfig;
+//import com.fdkankan.push.PushMsgUtil;
+//import com.fdkankan.redis.constant.RedisKey;
+//import com.fdkankan.redis.util.RedisUtil;
+//import com.taobao.api.ApiException;
+//import java.io.File;
+//import java.io.FileWriter;
+//import java.io.IOException;
+//import java.io.PrintWriter;
+//import java.io.StringWriter;
+//import java.io.UnsupportedEncodingException;
+//import java.security.InvalidKeyException;
+//import java.security.NoSuchAlgorithmException;
+//import java.time.Duration;
+//import java.time.temporal.ChronoUnit;
+//import java.util.Date;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Map.Entry;
+//import java.util.Objects;
+//import java.util.concurrent.Callable;
+//import java.util.concurrent.CompletableFuture;
+//import java.util.concurrent.ExecutorService;
+//import java.util.concurrent.Executors;
+//import java.util.concurrent.Future;
+//import java.util.concurrent.TimeUnit;
+//import java.util.concurrent.TimeoutException;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.lang3.StringUtils;
+//import org.apache.rocketmq.spring.annotation.MessageModel;
+//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+//import org.apache.rocketmq.spring.core.RocketMQListener;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.ObjectUtils;
+//import org.springframework.web.client.RestTemplate;
+//
+//
+//@Slf4j
+//@Component
+//@RocketMQMessageListener(
+//        consumerGroup = "${rocketmq.consumer.build-scene-group}",
+//        topic = "${rocketmq.build-scene.topicName.topic-modeling-a}",
+//        messageModel = MessageModel.CLUSTERING,//负载均衡模式
+//        consumeThreadMax = 1//消费者最大线程数,每次只消费一个
+//)
+//public class BuildSceneListener implements RocketMQListener<String> {
+//
+//    @Value("${rocketmq.consumer.build-scene-group}")
+//    private String consumerGroup;
+//
+//    @Value("${rocketmq.build-scene.topicName.topic-modeling-a}")
+//    private String topicName;
+//
+//    @Autowired
+//    RedisUtil redisUtil;
+//
+//    private RestTemplate restTemplate = new RestTemplate();
+//
+//    @Value("${4dkk.laserService.host}")
+//    private String laserHost;
+//
+//    @Value("${upload.type}")
+//    private String ossType;
+//
+//    @Value("${oss.prefix.ali}")
+//    private String prefixAli;
+//
+//    @Autowired
+//    private UploadToOssUtil uploadToOssUtil;
+//
+//    @Autowired
+//    RocketMQProducer rocketMQProducer;
+//
+//    @Value("${rocketmq.build-scene-result.topicName.topic-modeling-a}")
+//    private String buildSceneResultTopic;
+//
+//    @Value("${environment:dev}")
+//    private String environment;
+//
+//    @Autowired
+//    private DingTalkSendUtils dingTalkSendUtils;
+//
+//    @Override
+//    public synchronized void onMessage(String message) {
+//        log.info("开始处理消息,消费者组:{},主题名:{}, 消息内容:{}", consumerGroup, topicName, message);
+//        BuildSceneMqMessage buildSceneMqMessage = JSONObject.parseObject(message, BuildSceneMqMessage.class);
+//        if(StringUtils.isBlank(buildSceneMqMessage.getSceneNum())){
+//            log.error("消息结构错误,消费者组:{},主题名:{}, 消息内容:{}", consumerGroup, topicName, message);
+//            return;
+//        }
+//        process(buildSceneMqMessage);
+//    }
+//
+//    public void process(BuildSceneMqMessage message) {
+//        final ExecutorService exec = Executors.newFixedThreadPool(1);
+//        Callable<String> call = (Callable<String>) () -> {
+//            //开始执行耗时操作
+//            try {
+//                String key = RedisKey.SCENE_BUILDING + message.getSceneNum();
+//                // 获取缓存锁,防止重复消费
+//                Long building = redisUtil.incr(key, 1);
+//                if (building.compareTo(1L) != 0) {
+//                    log.error("场景正在构建中,退出构建,当前服务器id:{},参数:{}", SysConstants.hostName, JSONObject.toJSONString(message));
+//                } else {
+//                    redisUtil.expire(key, Duration.of(SysConstants.modelTimeOut, ChronoUnit.HOURS));
+//                }
+//                //休眠2秒等待数据入库
+//                Thread.sleep(2000L);
+//                try {
+//                    FileUtils.writeFile("/opt/hosts/running.txt", DateUtil.formatDateTime(new Date()));
+//                    String tomcatLog = "scenenum:" + message.getSceneNum() + "\ntime:" + DateUtil.formatDateTime(new Date()) +
+//                            " action:create hostname:" + SysConstants.hostName;
+//                    //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
+//                    FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + message.getSceneNum() + ".log", true);
+//                    writer.write(tomcatLog);
+//                    writer.close();
+//                } catch (Exception e) {
+//                    e.printStackTrace();
+//                }
+//
+//                this.buildScene(message);
+//                redisUtil.del(key);
+//                try {
+//                    FileUtils.deleteFile("/opt/hosts/running.txt");
+//                    String tomcatLog = "scenenum:" + message.getSceneNum() + "\ntime:" + DateUtil.formatDateTime(new Date()) +
+//                            " action:delete hostname:" + SysConstants.hostName;
+//                    //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
+//                    FileWriter writer = new FileWriter("/mnt/elastic_log/tomcat" + "_" + message.getSceneNum() + "log", true);
+//                    writer.write(tomcatLog);
+//                    writer.close();
+//                } catch (Exception e) {
+//                    e.printStackTrace();
+//                }
+//            } catch (Exception e) {
+//                log.error("大场景计算失败",e);
+//                // TODO: 2022/1/25 测试阶段,先注释掉推送
+////                this.handFail("计算失败", message);
+//            }
+//            log.info("场景生成好了***");
+//            return "success";
+//        };
+//        Future<String> future = exec.submit(call);
+//        try {
+//            future.get(SysConstants.modelTimeOut, TimeUnit.HOURS); //任务处理超时时间设为 24个小时
+//        } catch (TimeoutException ex) {
+//            ex.printStackTrace();
+//            StringWriter trace=new StringWriter();
+//            ex.printStackTrace(new PrintWriter(trace));
+//            log.error("超时了");
+//            log.error(trace.toString());
+//            FileUtils.deleteFile("/opt/hosts/running.txt");
+//            future.cancel(true);
+//            // TODO: 2022/1/25 测试阶段,先注释掉推送
+////            handFail("计算超时",message);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            StringWriter trace=new StringWriter();
+//            e.printStackTrace(new PrintWriter(trace));
+//            log.error(trace.toString());
+//            FileUtils.deleteFile("/opt/hosts/running.txt");
+//            future.cancel(true);
+//            // TODO: 2022/1/25 测试阶段,先注释掉推送
+////            handFail("计算失败",message);
+//        }
+//
+//    }
+//
+//    private void buildScene(BuildSceneMqMessage message){
+//        boolean buildSuccess = Boolean.FALSE;
+//        String projectNum = null;
+//        Long computeTime = null;//计算耗时
+//        JSONObject videosJson = null;
+//        //如果mq生产者在消息体中执行了计算结果mq的主题名,就发到这个主题名,否则就发送到配置的主题名
+//        String resultTopicName = StrUtil.isNotBlank(message.getResultReceiverMqName()) ?
+//                message.getResultReceiverMqName() : buildSceneResultTopic;
+//        //该场景使用的容量
+//        Long space = 0L;
+//        //支付状态
+//        int payStatus = 0;
+//        String unicode = message.getUnicode();
+//        String path = message.getPath();
+//        String prefix = message.getPrefix();
+//        String imgsName = message.getImgsName();
+//        projectNum = message.getSceneNum();
+//        String userName = message.getUserName();
+//        //不同的相机不同的方法
+//        String cameraType = message.getCameraType();
+//        String algorithm = message.getAlgorithm();
+//        String fileId = message.getFileId();
+//        String cameraName = message.getCameraName();
+//        //0表示有4k图,1表示没有
+//        String resolution = message.getResolution();
+//        //判断调用V2还是V3版本的算法
+//        String buildType = ObjectUtils.isEmpty(message.getBuildType()) ? "V2" : message.getBuildType();
+//        String sceneName = message.getSceneName();
+//        String webSite = message.getWebSite();
+//        Date createTime = message.getSceneProCreateTime();
+//        Long userId = message.getUserId();
+//        String dataSource = message.getDataSource();
+//        Integer sceneStatus = message.getSceneStatus();
+//        Integer sceneProPayStatus = message.getPayStatus();
+//        Long sceneProId = message.getSceneProId();
+//        String thumb = message.getThumb();
+//
+//        String imgPath = String.format(UploadFilePath.IMG_VIEW_PATH, projectNum);       //新版本文件路径
+//        String dataPath = String.format(UploadFilePath.DATA_VIEW_PATH, projectNum);     //新版本文件路径
+//        String videosPath = String.format(UploadFilePath.VIDEOS_VIEW_PATH, projectNum);     //新版本文件路径
+//
+//        String oldDataPath = "data/data" + projectNum;//老版本文件路径
+//
+//        try{
+//            if(StringUtils.equals(message.getIsStandardization(),"1")){
+//                //表示标定算法
+//                ComputerUtil.computerCalibration(message.getPath());
+//                return;
+//            }
+//
+//            Map<String, String> dataMap = ComputerUtil.getTypeString(cameraType, algorithm,
+//                    resolution);
+//            String splitType = dataMap.get("splitType");
+//            String skyboxType = dataMap.get("skyboxType");
+//            String dataDescribe = dataMap.get("dataDescribe");
+//
+//            log.info("用的算法是:"+algorithm);
+//            log.info("用的相机是:"+ (Integer.parseInt(cameraType) < 4 ? "单球目" : "双球目(八目)"));
+//            Map<String,String> map = new HashMap<>();
+//
+//            //4表示硬件部研发的双球目相机,其余为旧版本相机
+//            if(Integer.parseInt(cameraType) < 3){
+//                for(int i = 0;i<5;++i){
+//                    try{
+//                        FileUtils.downLoadFromUrl(prefix+imgsName+"?m="+new Date().getTime(), imgsName,
+//                                path + File.separator + "capture");
+//                        FileUtils.decompress(path + File.separator + "capture" +File.separator+imgsName,
+//                                path + File.separator + "capture") ;
+//                        break;
+//                    }catch(Exception e){
+//                        log.error(String.format("第%d次下载并解压资源失败", i+1),  e);
+//                        if(i<4)
+//                        {
+//                            FileUtils.deleteFile(path + File.separator + "capture" +File.separator+imgsName);
+//                            FileUtils.delFolder(path + File.separator + "capture" +File.separator+"images");
+//                        }
+//                        Thread.sleep(10000);
+//                    }
+//                }
+//
+//                FileUtils.deleteFile(path + File.separator + "capture" +File.separator+"zip.Zip");
+//
+//                String data = FileUtils.readFile(path + File.separator + "capture" +File.separator+"data.fdage");
+//                JSONObject dataJson = new JSONObject();
+//                if(data!=null){
+//                    dataJson = JSONObject.parseObject(data);
+//                    if(dataJson.containsKey("imgs")){
+//                        splitType = "SPLIT_V4";
+//                    }
+//                }
+//                //生成project.json和data.json供算法部使用
+//                ComputerUtil.createJson(path, splitType, skyboxType, dataDescribe, projectNum, path);
+//                //计算模型并返回需要上传oss的文件集合
+//                map = ComputerUtil.computer(projectNum, path, buildType);
+//
+//                uploadToOssUtil.uploadMulFiles(map);
+//                log.info("双目上完oss结束修改数据:"+projectNum);
+//            } else {
+//
+//                //休眠1秒,否则可能获取不到场景资源
+//                Thread.sleep(1000);
+//                if(sceneProId == null){
+//                    log.info(projectNum + ":场景不存在");
+//                    // TODO: 2022/1/25 测试阶段,先注释掉推送
+////                    handFail("场景不存在",message);
+//                    return;
+//                }
+//
+//                long start = System.currentTimeMillis();
+//
+//                //下载资源到本地
+//                path = this.downLoadSource(path, Integer.valueOf(cameraType), cameraName, unicode, fileId, imgsName, prefix);
+//
+//                String dataFdagePath = path + File.separator + "capture" +File.separator+"data.fdage";
+//                log.info("dataFdagePath 文件路径 :{}", dataFdagePath);
+//                String data = FileUtils.readFile(dataFdagePath);
+//                //获取data.fdage的内容
+//                JSONObject dataJson = new JSONObject();
+//                if(data!=null){
+//                    dataJson = JSONObject.parseObject(data);
+//                }
+//
+//                /*
+//                 1、判断是否计算过资源,若计算过删除缓存, 如果caches中存在_images文件或者目录,就删除掉,否则就删除除了images以外的所有文件和目录
+//                 2、删除上一次计算出来的result目录
+//                 */
+//                this.deleteCachesAndResult(path);
+//
+//                //v2版本使用4k算法
+//                if(dataJson.containsKey("videoVersion")
+//                        && StringUtils.isNotEmpty(dataJson.getString("videoVersion"))
+//                        && Integer.parseInt(dataJson.getString("videoVersion")) < 4){
+//                    skyboxType = "SKYBOX_V6";
+//                }
+//
+//                //生成project.json和data.json并写到path目录下供算法部使用
+//                log.info("path:" + path);
+//                ComputerUtil.createJson(path, splitType, skyboxType, dataDescribe, projectNum, path);
+//                //计算模型并返回需要上传oss的文件集合
+//                map = ComputerUtil.computer(projectNum, path, buildType);
+//                //计算完成时间
+//                computeTime = (System.currentTimeMillis() - start) / 1000;
+//                log.info("计算完成耗时:{}",computeTime);
+//
+//                if(Integer.parseInt(cameraType) == 5 || Integer.parseInt(cameraType) == 6){
+//                    //todo 老版本old_path 待删除
+//                    map.put(path + File.separator + "capture/stitch_params.txt",
+//                            oldDataPath + "/stitch_params.txt");
+//                    //新版本文件路径
+//                    map.put(path + File.separator + "capture/stitch_params.txt",
+//                            dataPath+ "stitch_params.txt");
+//                }
+//
+//                //todo 老版本old_path 待删除
+//                map.put(path + File.separator + "capture/Up.xml", oldDataPath + "/Up.xml");
+//                map.put(path + File.separator + "capture/Up2.xml", oldDataPath + "/Up2.xml");
+//                //新版本文件路径
+//                map.put(path + File.separator + "capture/Up.xml", dataPath  + "Up.xml");
+//                map.put(path + File.separator + "capture/Up2.xml", dataPath + "Up2.xml");
+//
+//                //转台相机
+//                if(Integer.parseInt(cameraType) == 13){
+//
+//                    //todo 老版本old_path 待删除
+//                    map.put(path + File.separator + "capture/Up.txt", oldDataPath + "/Up.txt");
+//                    map.put(path + File.separator + "capture/Up2.txt", oldDataPath + "/Up2.txt");
+//
+//                    map.put(path + File.separator + "capture/Up.txt", dataPath+ "Up.txt");
+//                    map.put(path + File.separator + "capture/Up2.txt",dataPath + "Up2.txt");
+//                }
+//
+//                //上传计算结果中的caches/images和caches/videos
+//                this.uploadCaches(projectNum, map, path);
+//
+//                log.info("计算完成,批量上传文件集合:{}", map.toString());
+//                //上传计算后生成的文件
+//                uploadToOssUtil.uploadMulFiles(map);
+//
+//                //拷贝部分文件到编辑目录,用于用户编辑
+//                this.copyToEditDir(projectNum);
+//
+//                //计算已使用容量
+//                payStatus = 1;
+//                File spaceFile = null;
+//                for (String key : map.keySet()) {
+//                    spaceFile = new File(key);
+//                    if(spaceFile.exists()){
+//                        space += spaceFile.length();
+//                    }
+//                }
+//
+//                log.info("八目上完oss结束修改数据:"+projectNum);
+//
+//                //读取计算结果文件生成videosJson
+//                videosJson = this.getVideosJson(path, dataJson, projectNum, Integer.valueOf(cameraType));
+//
+//                //更新scene.json里面的video数据
+//                this.updateVideosToSceneJson(projectNum, videosJson);
+//
+//                //根据data.fdage推送计算完成的消息
+//                this.sendSms(dataJson, Integer.valueOf(cameraType), sceneName, webSite);
+//
+//                //计算成功  激光转台相机 同步 请求
+//                this.jgSynch(projectNum, Integer.valueOf(cameraType), sceneName, dataSource, createTime, userId, userName, cameraName);
+//            }
+//
+//            CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/") + "/capture");
+//            buildSuccess = Boolean.TRUE;
+//        } catch(Exception e){
+//            log.error("计算大场景失败"+projectNum, e);
+//            // TODO: 2022/1/25 测试阶段,先注释掉推送
+////            handFail("计算失败",message);
+//        }finally {
+//            //发送计算结果到mq,再由消费者消费并操作数据库
+//            this.sendCallResult(buildSuccess, resultTopicName, cameraType, computeTime, fileId, payStatus, projectNum, space, videosJson);
+//            //上传status.json   console.log
+//            this.uploadStatusJsonAndConsoleLog(sceneProId, sceneStatus, webSite, projectNum, thumb, payStatus, dataPath, dataSource);
+//
+//        }
+//    }
+//
+//    private void uploadCaches(String num, Map<String,String> map, String path){
+//
+//        String sceneNumPAth = String.format("scene/%s", num);
+//
+//        List<String> imagesList = FileUtil.getFileList(path + "/caches/images");
+//        log.info("caches/images_path:{}", path + "/caches/images");
+//        if(CollUtil.isNotEmpty(imagesList)){
+//            log.info("上传的caches/images文件列表:{}", imagesList.toString());
+//            imagesList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+//        }
+//
+//        List<String> videosList = FileUtil.getFileList(path + "/caches/videos");
+//        if(CollUtil.isNotEmpty(videosList)){
+//            log.info("上传的caches/videos文件列表:{}", videosList.toString());
+//            videosList.stream().forEach(str -> map.put(str, str.replace(path, sceneNumPAth)));
+//        }
+//
+//    }
+//
+//    private void copyToEditDir(String num) throws IOException {
+//
+//        String editImagesPath = String.format(UploadFilePath.IMG_EDIT_PATH, num);
+//        String viewImagesPath = String.format(UploadFilePath.IMG_VIEW_PATH, num);
+//
+//        String editDataPath = String.format(UploadFilePath.DATA_EDIT_PATH, num);
+//        String viewDataPath = String.format(UploadFilePath.DATA_VIEW_PATH, num);
+//
+//        Map<String, String> map = new HashMap<>();
+//        map.put(editImagesPath + "vision.modeldata", viewImagesPath + "vision.modeldata");
+//        map.put(editImagesPath + "vision2.modeldata", viewImagesPath + "vision2.modeldata");
+//        map.put(editDataPath + "floorplan_cad.json", viewDataPath + "floorplan_cad.json");
+//
+//        for (Entry<String, String> entry : map.entrySet()) {
+//            uploadToOssUtil.copyFiles(entry.getValue(), entry.getKey());
+//        }
+//    }
+//
+//    private void sendCallResult(boolean buildSuccess, String resultTopicName, String cameraType, Long computeTime, String fileId,
+//                                Integer payStatus, String projectNum, Long space, JSONObject videosJson){
+//        rocketMQProducer.sendOneWay(resultTopicName,
+//                BuildSceneResultMqMessage.builder()
+//                        .buildSuccess(buildSuccess)
+//                        .cameraType(cameraType)
+//                        .computeTime(computeTime)
+//                        .fileId(fileId)
+//                        .payStatus(payStatus)
+//                        .sceneCode(projectNum)
+//                        .space(space)
+//                        .videosJson(buildSuccess? videosJson.toJSONString() : null)
+//                        .build());
+//    }
+//
+//    private void uploadStatusJsonAndConsoleLog(Long sceneProId, Integer sceneStatus, String webSite, String projectNum,
+//                                               String thumb, Integer payStatus, String dataPath, String dataSource){
+//        try{
+//            if(Objects.nonNull(sceneProId)){
+//                JSONObject statusJson = new JSONObject();
+//                //临时将-2改成1,app还没完全更新
+//                if(sceneStatus == -2){
+//                    sceneStatus = 1;
+//                }else if(sceneStatus == -1){
+//                    // 失败状态不予显示到客户端
+//                    sceneStatus = 0;
+//                }
+//                statusJson.put("status", sceneStatus);
+//                statusJson.put("webSite", webSite);
+//                statusJson.put("sceneNum", projectNum);
+//                statusJson.put("thumb", thumb);
+//                statusJson.put("payStatus", payStatus);
+//                FileUtils.writeFile(ConstantFilePath.SCENE_PATH+"data/data"+projectNum+File.separator+"status.json", statusJson.toString());
+//
+//                //todo 待删除old_path
+//                uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH+"data/data"+projectNum+File.separator+"status.json",
+//                        "data/data"+projectNum+File.separator+"status.json");
+//
+//                uploadToOssUtil.upload(ConstantFilePath.SCENE_PATH+"data/data"+projectNum+File.separator+"status.json",
+//                        dataPath+"status.json");
+//
+//                //上送日志  //todo 待删除old_path
+//                uploadToOssUtil.upload(dataSource+File.separator+"console.log",
+//                        "build_log/"+projectNum+File.separator+"console.log");
+//
+//                //上送日志
+//                uploadToOssUtil.upload(dataSource+File.separator+"console.log",
+//                        dataPath+"console.log");
+//
+//            }
+//        }catch (Exception e){
+//            log.error("上传status.json/console.log失败", e);
+//        }
+//    }
+//
+//    private void jgSynch(String projectNum, int cameraType, String sceneName, String dataSource, Date createTime, Long userId, String userName, String cameraName){
+//        log.info("激光转台相机 同步 请求 ");
+//        if(cameraType != 14)
+//            return;
+//        try {
+//            String title = "";
+//            if(StringUtils.isNotEmpty(sceneName)){
+//                title = sceneName;
+//            }
+////                        String dataSource = sceneProExt.getDataSource();
+//            String jgPath = dataSource;
+//            //创建目录
+//            if(dataSource.lastIndexOf("/")!=-1){
+//                jgPath = jgPath + "_laserData";
+//            }else{
+//                jgPath = jgPath.substring(0,jgPath.length()-1) + "_laserData";
+//            }
+//
+//            FileUtils.createDir(jgPath+"/extras");
+//
+//            log.info("生成 激光相机目录 " + jgPath);
+//            //生成data.json
+//            JSONObject jgDataJson = new JSONObject();
+//            jgDataJson.put("split_type", "SPLIT_V15");
+//            jgDataJson.put("skybox_type", "SKYBOX_V5");
+//            jgDataJson.put("extras", null);
+//            FileUtils.writeFile(jgPath + File.separator + "data.json", jgDataJson.toString());
+//
+//            CreateObjUtil.cpfile(dataSource  + "/results/laserData/cover", jgPath+"/extras/");
+//            CreateObjUtil.cplaserfile(dataSource  + "/results/laserData", jgPath+File.separator);
+//
+//            //激光相机
+//            String url = laserHost+"/indoor/{sceneCode}/api/init?path="
+//                    + jgPath + File.separator + "laserData" + "&title="+ title
+//                    + "&childName=" + cameraName + "&createTime=" +  createTime
+//                    + "&snCode="+ cameraName;
+//
+//            if(userId!=null){
+//                url = url + "&userId=" + userId;
+//            }
+//
+//            if(StringUtils.isNotEmpty(userName)){
+//                url = url + "&phone=" + userName;
+//            }
+//
+//            url = url.replace("{sceneCode}",projectNum);
+//            log.info("激光转台相机 同步 :" + url);
+//            JSONObject hotListJson =
+//                    JSONObject.parseObject(restTemplate.getForObject(url,String.class));
+//            log.info("激光转台相机 同步结束 :" + hotListJson);
+//        }catch (Exception e){
+//            log.error("激光转台相机同步失败", e);
+//            // TODO: 2022/1/25 测试阶段,先注释掉推送
+////          handFail("激光转台相机同步失败",message);
+//        }
+//    }
+//
+//    private void sendSms(JSONObject dataJson, int cameraType, String sceneName, String webSite){
+//        log.info("推送消息,渠道是 {}, 手机token是 {}", dataJson.get("pushChannel"), dataJson.get("pushToken"));
+//        if(dataJson.containsKey("pushChannel") && dataJson.containsKey("pushToken")){
+//            try{
+//                if(StorageType.AWS.code().equals(ossType)){
+//                    PushMsgUtil.googlePushMsg(ConstantFilePath.BASE_PATH + "/refreshToken.json",dataJson.getString("pushToken"),
+//                            sceneName + "计算完成", "您上传的" + sceneName + "计算完成,点击查看",
+//                            webSite);
+//                    return;
+//                }
+//
+//                PushMessageConfig demo = null;
+//                if(dataJson.getIntValue("pushChannel") == 0){
+//
+//                    if(cameraType == 10 || cameraType == 13){
+//                        //ios
+//                        log.info("IOS_KEY:{}, IOS_SECRET:{}", IOS_KEY_Z, IOS_SECRET_Z);
+//                        demo = new PushMessageConfig(IOS_KEY_Z, IOS_SECRET_Z);
+//                        demo.sendIOSUnicast(dataJson.getString("pushToken"),
+//                                "四维看看Minion", sceneName + "计算完成", "您上传的" + sceneName + "计算完成,点击查看",
+//                                webSite);
+//                    }else {
+//                        //ios
+//                        log.info("IOS_KEY:{}, IOS_SECRET:{}", IOS_KEY, IOS_SECRET);
+//                        demo = new PushMessageConfig(IOS_KEY, IOS_SECRET);
+//                        demo.sendIOSUnicast(dataJson.getString("pushToken"),
+//                                "四维看看Pro", sceneName + "计算完成", "您上传的" + sceneName + "计算完成,点击查看",
+//                                webSite);
+//                    }
+//
+//                }else {
+//                    if(cameraType == 10 || cameraType == 13){
+//                        //ios
+//                        //安卓
+//                        log.info("ANDROID_KEY:{}, ANDROID_SECRET:{}", ANDROID_KEY_Z, ANDROID_SECRET_Z);
+//                        demo = new PushMessageConfig(ANDROID_KEY_Z, ANDROID_SECRET_Z);
+//                        demo.sendAndroidUnicast2(dataJson.getString("pushToken"),
+//                                "四维看看Minion", sceneName + "计算完成", "您上传的" + sceneName + "计算完成,点击查看",
+//                                webSite);
+//                    }else {
+//                        //安卓
+//                        log.info("ANDROID_KEY:{}, ANDROID_SECRET:{}", ANDROID_KEY, ANDROID_SECRET);
+//                        demo = new PushMessageConfig(ANDROID_KEY, ANDROID_SECRET);
+//                        demo.sendAndroidUnicast(dataJson.getString("pushToken"),
+//                                "四维看看Pro", sceneName + "计算完成", "您上传的" + sceneName + "计算完成,点击查看",
+//                                webSite);
+//                    }
+//                }
+//                log.info("消息推送结束!");
+//            }catch (Exception e){
+//                log.error("推送消息失败:", e);
+//            }
+//        }
+//    }
+//
+//    private void updateVideosToSceneJson(String projectNum, JSONObject videosJson) throws Exception {
+//        String sceneJsonPath = String.format(ConstantFilePath.SCENE_PATH_FORMAT, projectNum);
+//        String strsceneInfos = FileUtils.readFile(sceneJsonPath);
+//        JSONObject scenejson = new JSONObject();
+//        if(strsceneInfos!=null){
+//            scenejson = JSONObject.parseObject(strsceneInfos);
+//        }
+//        scenejson.put("videos", videosJson.toJSONString());
+//        FileUtils.writeFile(sceneJsonPath, scenejson.toString());
+//    }
+//
+//    private JSONObject getVideosJson(String path, JSONObject dataJson, String projectNum, int cameraType) throws Exception {
+//        //读取videos_hdr_param.json, 保存点位视频的value
+//        Map<String, Object> videoMap = new HashMap<>();
+//        String videosHdr = FileUtils.readFile(path + File.separator + "results/videos/videos_hdr_param.json");
+//        JSONArray videoArray = null;
+//        if(StringUtils.isNotEmpty(videosHdr)){
+//            videoArray = JSONObject.parseObject(videosHdr).getJSONArray("hdr_param");
+//        }
+//        if(videoArray != null){
+//            for(int i = 0, len = videoArray.size(); i < len; i++) {
+//                videoMap.put(videoArray.getJSONObject(i).getString("name"), videoArray.getJSONObject(i).getString("value"));
+//                if(videoArray.getJSONObject(i).containsKey("fov")){
+//                    videoMap.put(videoArray.getJSONObject(i).getString("name") + "_fov", videoArray.getJSONObject(i).getString("fov"));
+//                }
+//            }
+//        }
+//
+//        //获取upload中的video视频名称
+//        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");
+//        }
+//        JSONObject fileJson = null;
+//        String fileName = "";
+//
+//        //计算ts文件的大小,并拼接成json格式
+//        JSONArray jsonArray = new JSONArray();
+//        JSONObject videoJson = null;
+//        JSONObject videosJson = new JSONObject();
+//        long videoSize = 0L;
+//        for(int i = 0, len = array.size(); i < len; i++) {
+//            fileJson = array.getJSONObject(i);
+//            fileName = fileJson.getString("file");
+//            if(fileJson.getIntValue("clazz") == 11 && fileName.contains(".mp4") && !fileName.contains("-ios.mp4")){
+//                videoJson = new JSONObject();
+//                videoJson.put("id", fileName.substring(
+//                        0, fileName.lastIndexOf(".")).replace("videos/", ""));
+//
+//                //如果ts文件存在,就计算ts大小
+//                if(new File(path + File.separator + "results" +File.separator+ fileName.replace(".mp4", ".ts")).exists()){
+//                    videoSize = new File(path + File.separator + "results" +File.separator+ fileName.replace(".mp4", ".ts")).length();
+//                    videoJson.put("tsSize", videoSize);
+//                }
+//                if(videoMap.containsKey(videoJson.get("id"))){
+//                    videoJson.put("value", videoMap.get(videoJson.get("id")));
+//                }
+//                if(videoMap.containsKey(videoJson.get("id") + "_fov")){
+//                    videoJson.put("blend_fov", videoMap.get(videoJson.get("id") + "_fov"));
+//                }else {
+//                    videoJson.put("blend_fov", 7);
+//                }
+//                jsonArray.add(videoJson);
+//            }
+//        }
+//
+//        videosJson.put("data", jsonArray);
+//        if(dataJson.containsKey("videoVersion") && StringUtils.isNotEmpty(dataJson.getString("videoVersion")) && Integer.parseInt(dataJson.getString("videoVersion")) >= 4){
+//            videosJson.put("version", 3);
+//            if(StorageType.OSS.code().equals(ossType)){
+//                videosJson.put("upPath", prefixAli + "data/data" + projectNum + "/Up.xml");
+//            }
+//            if(StorageType.AWS.code().equals(ossType)){
+//                videosJson.put("upPath", ConstantUrl.PREFIX_AWS + "data/data" + projectNum + "/Up.xml");
+//            }
+//            if(cameraType == 13){
+//                //转台相机
+//                videosJson.put("upPath", videosJson.getString("upPath").replace(".xml", ".txt"));
+//            }
+//        }else {
+//            videosJson.put("version", 1);
+//            if("oss".equals(ossType)){
+//                videosJson.put("upPath", prefixAli + "data/data" + projectNum + "/Up2.xml");
+//            }
+//            if("aws".equals(ossType)){
+//                videosJson.put("upPath", ConstantUrl.PREFIX_AWS + "data/data" + projectNum + "/Up2.xml");
+//            }
+//
+//            if(cameraType == 13){
+//                //转台相机
+//                videosJson.put("upPath", videosJson.getString("upPath").replace(".xml", ".txt"));
+//            }
+//        }
+//
+//        if(cameraType == 5 || cameraType == 6){
+//            videosJson.put("version", 1);
+//            if("oss".equals(ossType)){
+//                videosJson.put("upPath", prefixAli + "data/data" + projectNum + "/stitch_params.txt");
+//            }
+//            if("aws".equals(ossType)){
+//                videosJson.put("upPath", ConstantUrl.PREFIX_AWS + "data/data" + projectNum + "/stitch_params.txt");
+//            }
+//        }
+//
+//        return videosJson;
+//    }
+//
+//    private String downLoadSource(String path, int cameraType, String cameraName, String unicode, String fileId, String imgsName, String prefix) throws Exception {
+//        if(cameraType < 4){
+//            throw new Exception("cameraType 不能小于4");
+//        }
+//        //cameraType=5为新版本双目, cameraType=6为小红屋新版本双目
+//        String ossPath = ConstantFilePath.OSS_PREFIX + cameraName.replace("4DKKPRO_", "")
+//                .replace("-fdage", "").toLowerCase() + File.separator + fileId + File.separator
+//                + unicode + File.separator;
+//        String localPath = cameraName.replace("4DKKPRO_", "").replace("-fdage", "").toLowerCase() +
+//                File.separator + fileId + File.separator + unicode;
+//        if(cameraType == 5 || cameraType == 6){
+//            path = ConstantFilePath.BUILD_MODEL_PATH + unicode;
+//            //下载zip包
+//            FileUtils.downLoadFromUrl(prefix + "/" + imgsName + "?m=" + System.currentTimeMillis(), imgsName, path + File.separator + "capture");
+//            //解压
+//            FileUtils.decompress(path + File.separator + "capture" + File.separator + imgsName,
+//                    path + File.separator + "capture") ;
+//            //删除压缩包
+//            FileUtil.delFile(path + File.separator + "capture" + File.separator + imgsName);
+//        }else if(cameraType == 14) {
+////                    + File.separator + "capture"
+//            path = ConstantFilePath.BUILD_MODEL_LASER_PATH + localPath;
+//            CreateObjUtil.ossUtilCp(ossPath,path + File.separator + "capture");
+//        } else{
+//            path = ConstantFilePath.BUILD_MODEL_PATH + localPath;
+//            CreateObjUtil.ossUtilCp(ossPath,path + File.separator + "capture");
+//        }
+//        return path;
+//    }
+//
+//    private void deleteCachesAndResult(String path){
+//        //判断是否计算过资源,若计算过删除缓存, 如果caches中存在_images文件或者目录,就删除掉,否则就删除除了images以外的所有文件和目录
+//        File caches = new File(path + File.separator + "caches");
+//        if(caches.exists()){
+//            for(File deleteFile : caches.listFiles()){
+//                if(new File(path + "_images").exists()){
+//                    if(deleteFile.isDirectory()){
+//                        FileUtils.delAllFile(deleteFile.getAbsolutePath());
+//                    }else {
+//                        FileUtils.deleteFile(deleteFile.getAbsolutePath());
+//                    }
+//                }else if(!deleteFile.getAbsolutePath().contains("images")){
+//                    if(deleteFile.isDirectory()){
+//                        FileUtils.delAllFile(deleteFile.getAbsolutePath());
+//                    }else {
+//                        FileUtils.deleteFile(deleteFile.getAbsolutePath());
+//                    }
+//                }
+//            }
+//        }
+//        //删除上一次计算出来的result目录
+//        if(new File(path + File.separator + "results").exists()){
+//            FileUtils.delAllFile(path + File.separator + "results");
+//        }
+//    }
+//
+//    private void handFail(String reason,BuildSceneMqMessage message){
+//        String serverPath = message.getPath().substring(0,message.getPath().lastIndexOf("/")+1).concat(message.getPrefix());
+//        handFail(reason,serverPath,message.getSceneNum());
+//    }
+//
+//    private void handFail(String reason,String serverPath,String num){
+//        // 释放缓存锁
+//        redisUtil.del(RedisKey.SCENE_BUILDING + num);
+//        CompletableFuture.runAsync(() -> {
+//            try {
+//                String content = String.format(SysConstants.DINGTALK_MSG_PATTERN,environment, SysConstants.hostName,reason,num,serverPath,num,num);
+//                dingTalkSendUtils.sendActioncardMsgToDingRobot(content,"场景计算失败");
+//            } catch (ApiException | UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeyException apiException) {
+//                apiException.printStackTrace();
+//            }
+//        });
+//    }
+//}

+ 2 - 3
4dkankan-center-modeling/src/main/java/com/fdkankan/modeling/receiver/BuildSceneMQListener.java

@@ -136,7 +136,7 @@ public class BuildSceneMQListener implements RocketMQListener<String> {
                     e.printStackTrace();
                 }
 
-                buildScene(message);
+                this.buildScene(message);
                 redisUtil.del(key);
                 try {
                     FileUtils.deleteFile("/opt/hosts/running.txt");
@@ -252,8 +252,7 @@ public class BuildSceneMQListener implements RocketMQListener<String> {
                         FileUtils.decompress(path + File.separator + "capture" +File.separator+imgsName,
                                 path + File.separator + "capture") ;
                         break;
-                    }
-                    catch(Exception e){
+                    }catch(Exception e){
                         log.error(String.format("第%d次下载并解压资源失败", i+1),  e);
                         if(i<4)
                         {