Переглянути джерело

Merge branch 'project-jmga-2.2.0-2.0.1' into project-jmga-dev

dengsixing 4 тижнів тому
батько
коміт
c8938fdddb

+ 5 - 0
src/main/java/com/fdkankan/contro/bean/SendCallAlgorithmDetail.java

@@ -17,4 +17,9 @@ public class SendCallAlgorithmDetail {
 
     private String fileName;
 
+    private Integer index;
+
+    //UPLOAD_WHILE_SHOOTING
+    private String callType;
+
 }

+ 8 - 0
src/main/java/com/fdkankan/contro/constant/ApiConstant.java

@@ -0,0 +1,8 @@
+package com.fdkankan.contro.constant;
+
+public class ApiConstant {
+
+    public static final String URL_ADD_UCENTER_USER = "/service/manage/inner/addUcenterUser";
+
+    public static final String URL_CAMERA_INSTORE = "/service/manage/inner/cameraInStore";
+}

+ 44 - 4
src/main/java/com/fdkankan/contro/controller/SceneFileController.java

@@ -1,16 +1,15 @@
 package com.fdkankan.contro.controller;
 
+import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
-import com.fdkankan.contro.service.IAppCameraFailLogService;
-import com.fdkankan.contro.service.IJmgaService;
-import com.fdkankan.contro.service.ISceneFileBuildService;
-import com.fdkankan.contro.service.ISceneUploadCountService;
+import com.fdkankan.contro.service.*;
 import com.fdkankan.contro.vo.ReportFailLogVO;
 import com.fdkankan.contro.vo.ResponseSceneFile;
 import com.fdkankan.contro.vo.SceneUploadCountParamVO;
@@ -54,6 +53,8 @@ public class SceneFileController{
 
     @Autowired
     private IJmgaService jmgaService;
+    @Autowired
+    private UploadShootingService uploadShootingService;
 
 
     /**
@@ -219,6 +220,12 @@ public class SceneFileController{
         if(StrUtil.isEmpty(detail.getUuid())){
             throw new RuntimeException("uuid不能为空");
         }
+        String callType = detail.getCallType();
+        if(StrUtil.isNotEmpty(callType) && callType.equals("UPLOAD_WHILE_SHOOTING")){
+            uploadShootingService.build(detail);
+            return ResultData.ok();
+        }
+
         return sceneFileBuildService.noticeBuild(detail.getUuid());
     }
 
@@ -245,4 +252,37 @@ public class SceneFileController{
         return ResultData.ok();
     }
 
+    /**
+     * 边拍边上传文件上传
+     */
+    @PostMapping("uploadShooting/file")
+    public ResultData uploadShootingFile(
+            @RequestParam(value = "file") MultipartFile file,
+            @RequestPart SendCallAlgorithmDetail details) throws Exception {
+
+        String parentPath = "/oss/4dkankan/bd_server/upload_while_shooting/" + details.getUuid() + "/";
+        String localPath = parentPath + details.getIndex() + details.getFileName();
+        FileUtil.mkParentDirs(localPath);
+        String url = "https://survey.4dkankan.com"  + localPath.replace("4dkankan/", "");
+        file.transferTo(new File(localPath));
+
+        SendCallAlgorithmParam param = new SendCallAlgorithmParam();
+        param.setFilepath(url);
+        param.setDetails(details);
+        HttpUtil.post("http://127.0.0.1:8085/api/scene/file/sendCallAlgorithm", JSON.toJSONString(param));
+
+        return ResultData.ok();
+    }
+
+    /**
+     * 边拍边上串通知计算
+     * @return
+     */
+    @PostMapping("uploadShooting/build")
+    public ResultData uploadShootingBuild(@RequestBody SendCallAlgorithmDetail details) throws Exception {
+        String body = "uuid=" + details.getUuid() + "&index=" + details.getIndex() + "&callType=" + details.getCallType();
+        HttpUtil.post("http://127.0.0.1:8085/api/scene/file/noticeBuild", body);
+        return ResultData.ok();
+    }
+
 }

+ 10 - 8
src/main/java/com/fdkankan/contro/entity/OrigFileUploadBatch.java

@@ -1,15 +1,11 @@
 package com.fdkankan.contro.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.util.Date;
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Getter;
 import lombok.Setter;
-import org.springframework.data.annotation.Transient;
+
+import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
@@ -81,5 +77,11 @@ public class OrigFileUploadBatch implements Serializable {
     @TableField(exist = false)
     private Integer[] inStatus;
 
+    @TableField("call_type")
+    private Integer callType;
+
+    @TableField("pt_index")
+    private Integer ptIndex;
+
 
 }

+ 3 - 0
src/main/java/com/fdkankan/contro/entity/ScenePlus.java

@@ -137,4 +137,7 @@ public class ScenePlus implements Serializable {
 
     @TableField("build_fail_reason")
     private String buildFailReason;
+
+    @TableField("preview")
+    private int preview;
 }

+ 94 - 0
src/main/java/com/fdkankan/contro/mq/listener/UploadShootingListener.java

@@ -0,0 +1,94 @@
+package com.fdkankan.contro.mq.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.common.constant.SceneStatus;
+import com.fdkankan.contro.entity.OrigFileUpload;
+import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.service.IOrigFileUploadBatchService;
+import com.fdkankan.contro.service.IOrigFileUploadService;
+import com.fdkankan.contro.service.IScenePlusService;
+import com.fdkankan.contro.util.HttpUtilExt;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+@Slf4j
+@Component
+public class UploadShootingListener {
+
+    @Autowired
+    private IOrigFileUploadBatchService origFileUploadBatchService;
+    @Autowired
+    private IOrigFileUploadService origFileUploadService;
+    @Resource
+    private RabbitMqProducer mqProducer;
+    @Autowired
+    private IScenePlusService scenePlusService;
+
+
+    @RabbitListener(
+            queuesToDeclare = @Queue("upload-shooting-pre")
+    )
+    public void pre(Channel channel, Message message) throws Exception {
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        JSONObject params = JSONObject.parseObject(msg);
+        String num = params.getString("sceneCode");
+        String batchId = params.getString("batchId");
+        Integer index = params.getInteger("index");
+        Integer uuid = params.getInteger("uuid");
+        try {
+            List<OrigFileUpload> fileUploadList = origFileUploadService.getByBatchId(batchId);
+            String path = ConstantFilePath.BUILD_MODEL_PATH + "upload_while_shooting/" + uuid + "/" + index + "/";
+            for (OrigFileUpload origFileUpload : fileUploadList) {
+                String localPath = path + origFileUpload.getFileName();
+                HttpUtilExt.downloadFileAndCheck(origFileUpload.getFileUrl(), localPath, 300000);
+            }
+            params.put("path", path);
+            mqProducer.sendByWorkQueue(" laser-preview-scene-handler", params);
+        }catch (Exception e){
+            log.error("场景预览文件处理出错, num:{}", num, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+    }
+
+    @RabbitListener(
+            queuesToDeclare = @Queue("preview-scene-status-update")
+    )
+    public void updateStatus(Channel channel, Message message) throws Exception {
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        JSONObject params = JSONObject.parseObject(msg);
+        String num = params.getString("num");
+        Integer status = params.getInteger("status");
+        try {
+            ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+            if(scenePlus.getPreview() == CommonStatus.NO.code().intValue()){
+                return;
+            }
+            if(status == CommonSuccessStatus.SUCCESS.code()){
+                status = SceneStatus.PREVIEW.code();
+            }else{
+                log.info("点云系统处理失败,num:{}", num);
+            }
+            scenePlus.setSceneStatus(status);
+            scenePlusService.updateById(scenePlus);
+        }catch (Exception e){
+            log.error("修改场景预览状态出错, num:{}", num, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+    }
+
+}

+ 0 - 3
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java

@@ -391,9 +391,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                 }
             }while (times < 4);
             log.info("下载原始文件结束, url:{}, filePath:{}", origFileUpload.getFileUrl(), filePath);
-//            if(!FileUtil.exist(filePath)){
-//                throw new RuntimeException("原始文件下载失败,fileUrl:" + origFileUpload.getFileUrl() + ", filePath:" + filePath);
-//            }
         }
     }
 

+ 17 - 0
src/main/java/com/fdkankan/contro/service/UploadShootingService.java

@@ -0,0 +1,17 @@
+package com.fdkankan.contro.service;
+
+import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
+import com.fdkankan.contro.vo.SendCallAlgorithmParam;
+
+public interface UploadShootingService {
+
+    void uploadFile(SendCallAlgorithmParam param) throws InterruptedException;
+
+    void build(SendCallAlgorithmDetail detail) throws Exception;
+
+
+
+
+
+
+}

+ 8 - 3
src/main/java/com/fdkankan/contro/service/impl/OrigFileUploadBatchServiceImpl.java

@@ -1,13 +1,11 @@
 package com.fdkankan.contro.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.contro.entity.OrigFileUploadBatch;
 import com.fdkankan.contro.mapper.IOrigFileUploadBatchMapper;
 import com.fdkankan.contro.service.IOrigFileUploadBatchService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 import java.util.Objects;
@@ -38,6 +36,13 @@ public class OrigFileUploadBatchServiceImpl extends ServiceImpl<IOrigFileUploadB
         if(condition.getInStatus() != null && condition.getInStatus().length > 0){
             wrapper.in(OrigFileUploadBatch::getStatus, condition.getInStatus());
         }
+        if(Objects.nonNull(condition.getCallType())){
+            wrapper.eq(OrigFileUploadBatch::getCallType, condition.getCallType());
+        }
+        if(Objects.nonNull(condition.getPtIndex())){
+            wrapper.eq(OrigFileUploadBatch::getPtIndex, condition.getPtIndex());
+        }
+
         return this.getOne(wrapper);
     }
 }

+ 26 - 17
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -24,11 +24,12 @@ import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.*;
 import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
 import com.fdkankan.contro.common.Result;
+import com.fdkankan.contro.constant.ApiConstant;
 import com.fdkankan.contro.constant.RedisConstants;
 import com.fdkankan.contro.constant.ZipConstant;
 import com.fdkankan.contro.entity.*;
-import com.fdkankan.contro.httpclient.MyClient;
 import com.fdkankan.contro.enums.CameraTypeEnum;
+import com.fdkankan.contro.httpclient.MyClient;
 import com.fdkankan.contro.mapper.ISceneFileBuildMapper;
 import com.fdkankan.contro.service.*;
 import com.fdkankan.contro.util.HttpUtilExt;
@@ -90,8 +91,6 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
     private static final String sendCallAlgorithmPath = "/mnt/sendCallAlgorithm/";
 
-    private static final String URL_ADD_UCENTER_USER = "/service/manage/inner/addUcenterUser";
-
     @Value("${main.url}")
     private String mainUrl;
     @Value("${fyun.type}")
@@ -247,6 +246,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
     @Autowired
     private IJmgaService jmgaService;
+    @Autowired
+    private UploadShootingService uploadShootingService;
 
     @Override
     public SceneFileBuild findByFileId(String fileId) {
@@ -389,7 +390,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         String unicode = jsonObject.getString("creator") + "_" + jsonObject.getString("uuidtime");
 
         int camType = jsonObject.getJSONObject("cam").getIntValue("type");
-        String cameraInStoreUrl = fdServiceUrl + "/service/manage/inner/cameraInStore";
+        String cameraInStoreUrl = fdServiceUrl + ApiConstant.URL_CAMERA_INSTORE;
         Map<String, Object> cameraInStoreParams = new HashMap<>();
         cameraInStoreParams.put("cameraType", camType);
         cameraInStoreParams.put("snCode", jsonObject.getString("creator"));
@@ -412,7 +413,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             params.put("ryNo", customUserName);
 //        params.put("nickName", customUserName);//去掉昵称,又燕海的接口进行判断
             params.put("password", AesUtil.encryptCBC(customUserPwd, userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
-            String url = fdServiceUrl.concat(URL_ADD_UCENTER_USER);
+            String url = fdServiceUrl.concat(ApiConstant.URL_ADD_UCENTER_USER);
             myClient.post(url, params);
             JyUser jyUser = jyUserService.getByRyId(customUserId);
             user = userService.getById(jyUser.getUserId());
@@ -1092,6 +1093,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             scenePlus.setPayStatus(PayStatus.NOT_PAY.code());
             scenePlus.setCreateTime(Calendar.getInstance().getTime());
             scenePlus.setBuildFailReason("");
+            //只要开始常规场景上传计算,场景就不可以预览了
+            scenePlus.setPreview(CommonStatus.NO.code());
 
             ScenePlusExt oldSceneExt = scenePlusExtService.getScenePlusExtByPlusId(oldScene.getId());
             scenePlusExt.setSpace(oldSceneExt.getSpace());
@@ -2317,7 +2320,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                     params.put("ryNo", customUserName);
                     params.put("nickName", customUserName);
                     params.put("password", AesUtil.encryptCBC(customUserPwd, userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
-                    String url = fdServiceUrl.concat(URL_ADD_UCENTER_USER);
+                    String url = fdServiceUrl.concat(ApiConstant.URL_ADD_UCENTER_USER);
                     myClient.post(url, params);
                     JyUser jyUser = jyUserService.getByRyId(customUserId);
                     User user = userService.getById(jyUser.getUserId());
@@ -2366,6 +2369,15 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             throw new BusinessException(ErrorCode.PARAM_REQUIRED.code(), "filePath不能为空");
         }
         SendCallAlgorithmDetail detail = param.getDetails();
+
+//        //边拍边上传逻辑处理
+//        String callType = param.getDetails().getCallType();
+//        if(StrUtil.isNotEmpty(callType) && callType.equals("UPLOAD_WHILE_SHOOTING")){
+//            String localPath = ConstantFilePath.BUILD_MODEL_PATH + "upload_while_shooting/" + detail.getUuid() + "/" + detail.getIndex() + "/" + detail.getFileName();
+//            HttpUtilExt.downloadFileAndCheck(filePath, localPath, 600000);
+//            return ResultData.ok();
+//        }
+
         String uploadType = detail.getUploadType();
         if(StrUtil.isNotEmpty(uploadType) && "log".equals(uploadType)){
             return ResultData.ok();
@@ -2379,6 +2391,12 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             throw new BusinessException(ErrorCode.PARAM_REQUIRED.code(), "fileName不能为空");
         }
 
+        String callType = param.getDetails().getCallType();
+        if(StrUtil.isNotEmpty(callType) && callType.equals("UPLOAD_WHILE_SHOOTING")){
+            uploadShootingService.uploadFile(param);
+            return ResultData.ok();
+        }
+
         boolean lock = redisLockUtil.lock("lock:single:upload:uuid:" + uuid, uuid, 1);
         if(!lock){//如果拿不到锁,证明
             Thread.sleep(2000L);
@@ -2440,7 +2458,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
 
             JSONObject fdageData = JSONObject.parseObject(FileUtils.readFile(sendCallAlgorithmPath.concat(uuid).concat("/data.fdage")));
             int camType = fdageData.getJSONObject("cam").getIntValue("type");
-            String cameraInStoreUrl = fdServiceUrl + "/service/manage/inner/cameraInStore";
+            String cameraInStoreUrl = fdServiceUrl + ApiConstant.URL_CAMERA_INSTORE;
             Map<String, Object> cameraInStoreParams = new HashMap<>();
             cameraInStoreParams.put("cameraType", camType);
             cameraInStoreParams.put("snCode", snCode);
@@ -2490,7 +2508,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             params.put("ryNo", customUserName);
 //        params.put("nickName", customUserName);//去掉昵称,又燕海的接口进行判断
             params.put("password", AesUtil.encryptCBC(customUserPwd, userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
-            String url = fdServiceUrl.concat(URL_ADD_UCENTER_USER);
+            String url = fdServiceUrl.concat(ApiConstant.URL_ADD_UCENTER_USER);
             myClient.post(url, params);
             JyUser jyUser = jyUserService.getByRyId(customUserId);
             User user = userService.getById(jyUser.getUserId());
@@ -2508,15 +2526,6 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
             }
 
-//        String imgViewPath = String.format(UploadFilePath.IMG_VIEW_PATH, sceneNum);
-//        if(fdageData.containsKey("icon") && StringUtils.isNotEmpty(fdageData.getString("icon"))){
-//            String ossPath = ConstantFilePath.OSS_PREFIX + dataSource.replace(ConstantFilePath.BUILD_MODEL_PATH, "")
-//                    .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "");
-//            fYunFileService.copyFileInBucket(ossPath + File.separator + fdageData.getString("icon"),imgViewPath + fdageData.getString("icon"));
-//            icon = fYunFileConfig.getHost() + imgViewPath + fdageData.getString("icon");
-//            log.info("上传icon成功....");
-//        }
-
             buildScenePost(dataSource, fdageData, "V3", cameraType, sceneNum, camera, cameraDetail, rebuild, "", user, customUserId, "single");
 
             scenePlus = scenePlusService.getScenePlusByNum(sceneNum);

+ 253 - 0
src/main/java/com/fdkankan/contro/service/impl/UploadShootingServiceImpl.java

@@ -0,0 +1,253 @@
+package com.fdkankan.contro.service.impl;
+
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.SceneSource;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.common.util.AesUtil;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
+import com.fdkankan.contro.constant.ApiConstant;
+import com.fdkankan.contro.entity.*;
+import com.fdkankan.contro.enums.CameraTypeEnum;
+import com.fdkankan.contro.httpclient.MyClient;
+import com.fdkankan.contro.service.*;
+import com.fdkankan.contro.util.HttpUtilExt;
+import com.fdkankan.contro.vo.SendCallAlgorithmParam;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@Slf4j
+@Service
+public class UploadShootingServiceImpl implements UploadShootingService {
+
+    @Value("${4dkk.fdService.basePath}")
+    private String fdServiceUrl;
+    @Value("${user.password.key:0000000856753656}")
+    private String userPasswordKey;
+    @Value("${user.password.iv:pwel781esd6wglxm}")
+    private String userPasswordIv;
+    @Value("${scene.pro.new.url}")
+    private String sceneProNewUrl;
+
+    @Resource
+    private RedisLockUtil redisLockUtil;
+    @Resource
+    private RedisUtil redisUtil;
+    @Autowired
+    private IOrigFileUploadBatchService origFileUploadBatchService;
+    @Autowired
+    private IOrigFileUploadService origFileUploadService;
+    @Resource
+    private MyClient myClient;
+    @Autowired
+    private IJyUserService jyUserService;
+    @Autowired
+    private IUserService userService;
+    @Autowired
+    private ISceneFileBuildService sceneFileBuildService;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScene3dNumService scene3dNumService;
+    @Autowired
+    private FYunFileConfig fYunFileConfig;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private ISceneEditInfoService sceneEditInfoService;
+    @Autowired
+    private ISceneEditInfoExtService sceneEditInfoExtService;
+    @Autowired
+    private ISceneEditControlsService sceneEditControlsService;
+    @Autowired
+    private RabbitMqProducer mqProducer;
+
+    @Override
+    public void uploadFile(SendCallAlgorithmParam param) throws InterruptedException {
+        SendCallAlgorithmDetail details = param.getDetails();
+        if (details.getIndex() == null) {
+            throw new BusinessException(ErrorCode.PARAM_REQUIRED.code(), "index不能为空");
+        }
+        String uuid = details.getUuid();
+
+        boolean lock = redisLockUtil.lock("lock:uploadshooting:upload:uuid:" + uuid, uuid, 1);
+        if (!lock) {//如果拿不到锁,证明
+            Thread.sleep(2000L);
+        }
+
+        String batchId = redisUtil.get("uploadshooting:upload:uuid:" + uuid);
+        if (StrUtil.isEmpty(batchId)) {
+            OrigFileUploadBatch condition = new OrigFileUploadBatch();
+            condition.setUuid(uuid);
+            condition.setStatus(0);
+            condition.setPtIndex(details.getIndex());
+            condition.setCallType(2);
+            OrigFileUploadBatch origFileUploadBatch = origFileUploadBatchService.getByCondition(condition);
+            if (Objects.isNull(origFileUploadBatch)) {
+                batchId = redisUtil.get("uploadshooting:upload:uuid:" + uuid);
+                if (StrUtil.isEmpty(batchId)) {
+                    batchId = UUID.fastUUID().toString().replace("-", "");
+                    redisUtil.set("uploadshooting:upload:uuid:" + uuid, batchId);
+                    origFileUploadBatch = new OrigFileUploadBatch();
+                    origFileUploadBatch.setUuid(uuid);
+                    origFileUploadBatch.setBatchId(batchId);
+                    origFileUploadBatch.setCallType(2);
+                    origFileUploadBatch.setPtIndex(details.getIndex());
+                    origFileUploadBatchService.save(origFileUploadBatch);
+                }
+            }
+        }
+
+        //插入上传明细表
+        OrigFileUpload origFileUpload = new OrigFileUpload();
+        origFileUpload.setFileUrl(param.getFilepath());
+        origFileUpload.setFileName(details.getFileName());
+        origFileUpload.setBatchId(batchId);
+        origFileUploadService.save(origFileUpload);
+
+        if (lock) {
+            redisLockUtil.unlockLua("lock:single:upload:uuid:" + uuid, uuid);
+        }
+
+    }
+
+    @Override
+    public void build(SendCallAlgorithmDetail detail) throws Exception {
+
+        OrigFileUploadBatch condition = new OrigFileUploadBatch();
+        condition.setUuid(detail.getUuid());
+        condition.setStatus(0);
+        condition.setPtIndex(detail.getIndex());
+        condition.setCallType(2);
+        OrigFileUploadBatch origFileUploadBatch = origFileUploadBatchService.getByCondition(condition);
+
+        OrigFileUpload origFileUpload = origFileUploadService.getByBatchIdAndFileName(origFileUploadBatch.getBatchId(), "config.json");
+        String localPath = ConstantFilePath.BUILD_MODEL_PATH + "upload_while_shooting/" + detail.getUuid() + "/" + detail.getIndex() + "/" + detail.getFileName();
+        HttpUtilExt.downloadFileAndCheck(origFileUpload.getFileUrl(), localPath, 300000);
+
+        //入库相机
+        String[] uuidArr = detail.getUuid().split("_");
+        String snCode = uuidArr[0];
+        JSONObject configJson = JSONObject.parseObject(FileUtils.readUtf8String(localPath));
+        int camType = configJson.getInteger("cameraType");
+        String cameraInStoreUrl = fdServiceUrl + ApiConstant.URL_CAMERA_INSTORE;
+        Map<String, Object> cameraInStoreParams = new HashMap<>();
+        cameraInStoreParams.put("cameraType", camType);
+        cameraInStoreParams.put("snCode", snCode);
+        ResultData post = myClient.post(cameraInStoreUrl, cameraInStoreParams);
+        log.info("---------cameraInStore result:{}-----------", post);
+
+        //注册用户
+        String folderName = configJson.getString("id");
+        String customUserId = configJson.getString("customUserId");
+        String customUserName = configJson.getString("customUserName");
+        String customUserPwd = configJson.getString("customUserPwd");
+        if (StrUtil.isBlank(folderName) || StrUtil.isBlank(snCode)) {
+            throw new RuntimeException("config.json 文件有误!");
+        }
+        Map<String, Object> params = new HashMap<>();
+        params.put("ryId", customUserId);
+        params.put("ryNo", customUserName);
+//        params.put("nickName", customUserName);//去掉昵称,又燕海的接口进行判断
+        params.put("password", AesUtil.encryptCBC(customUserPwd, userPasswordKey, userPasswordIv, AesUtil.ALMODE_CBC_NOPADDING));
+        String url = fdServiceUrl.concat(ApiConstant.URL_ADD_UCENTER_USER);
+        myClient.post(url, params);
+        JyUser jyUser = jyUserService.getByRyId(customUserId);
+        User user = userService.getById(jyUser.getUserId());
+        if (Objects.isNull(jyUser)) {
+            throw new RuntimeException("注册用户失败");
+        }
+
+        //生成场景表
+        String sceneNum = null;
+        String fileId = sceneFileBuildService.getFileId(snCode, detail.getUuid());
+        String subFolder = snCode.concat(File.separator).concat(fileId).concat(File.separator).concat(detail.getUuid());
+        String dataSource = ConstantFilePath.BUILD_MODEL_PATH.concat(subFolder);
+        ScenePlus scenePlus = scenePlusService.getByFileId(dataSource);
+        ScenePlusExt scenePlusExt = null;
+        SceneEditInfo sceneEditInfo = null;
+        SceneEditInfoExt sceneEditInfoExt = null;
+        SceneEditControls sceneEditControls = null;
+        if (Objects.nonNull(scenePlus)) {
+            log.info("该场景资源已存在,执行补拍逻辑!");
+            sceneNum = scenePlus.getNum();
+            scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+            sceneEditInfo = sceneEditInfoService.getByScenePlusId(scenePlus.getId());
+            sceneEditInfoExt = sceneEditInfoExtService.getByEditInfoId(sceneEditInfo.getId());
+            sceneEditControls = sceneEditControlsService.getBySceneEditId(sceneEditInfo.getId());
+        } else {
+            sceneNum = scene3dNumService.generateSceneNum(camType);
+            scenePlus = new ScenePlus();
+            scenePlusExt = new ScenePlusExt();
+            scenePlus.setNum(sceneNum);
+            scenePlus.setSceneSource(SceneSource.BM.code());
+            if (camType == CameraTypeEnum.DOUBLE_EYE_TURN.getType()) {
+                scenePlus.setSceneSource(SceneSource.ZT.code());
+            }
+            if (camType == CameraTypeEnum.LASER_TURN.getType()) {
+                scenePlus.setSceneSource(SceneSource.JG.code());
+                scenePlusExt.setIsObj(CommonStatus.YES.code());
+            }
+            if (camType == CameraTypeEnum.LASER_SG.getType()) {
+                scenePlus.setSceneSource(SceneSource.SG.code());
+                scenePlusExt.setIsObj(CommonStatus.YES.code());
+            }
+            scenePlusExt.setThumb(fYunFileConfig.getHost() + "/loading/thumb.jpg");
+            if (camType == 5) {//圆周率
+                scenePlus.setThreeCamType("yzl");
+            }
+            sceneEditInfo = new SceneEditInfo();
+            sceneEditInfoExt = new SceneEditInfoExt();
+            sceneEditControls = new SceneEditControls();
+        }
+        String title = configJson.getString("title");
+        scenePlus.setUserId(user.getId());
+        scenePlus.setTitle(title);
+        scenePlus.setPreview(CommonStatus.YES.code());
+        scenePlusService.saveOrUpdate(scenePlus);
+
+        scenePlusExt.setPlusId(scenePlus.getId());
+        scenePlusExt.setWebSite("/" + sceneProNewUrl + sceneNum);
+        scenePlusExtService.saveOrUpdate(scenePlusExt);
+
+        sceneEditInfo.setTitle(scenePlus.getTitle());
+        sceneEditInfo.setScenePlusId(scenePlus.getId());
+        sceneEditInfoService.saveOrUpdate(sceneEditInfo);
+
+        sceneEditInfoExt.setEditInfoId(sceneEditInfo.getId());
+        sceneEditInfoExt.setScenePlusId(scenePlus.getId());
+        sceneEditInfoExtService.saveOrUpdate(sceneEditInfoExt);
+
+        sceneEditControls.setEditInfoId(sceneEditInfo.getId());
+        sceneEditControlsService.saveOrUpdate(sceneEditControls);
+
+        JSONObject preParams = new JSONObject();
+        preParams.put("batchId", origFileUploadBatch.getBatchId());
+        preParams.put("sceneCode", sceneNum);
+        preParams.put("index", detail.getIndex());
+        mqProducer.sendByWorkQueue("preview-scene-pre", preParams);
+    }
+
+
+
+
+
+}