dengsixing преди 3 седмици
родител
ревизия
6064464d66

+ 6 - 0
pom.xml

@@ -224,6 +224,12 @@
       <version>4.0.3</version>
       <version>4.0.3</version>
     </dependency>
     </dependency>
 
 
+<!--    <dependency>-->
+<!--      <groupId>net.lingala.zip4j</groupId>-->
+<!--      <artifactId>zip4j</artifactId>-->
+<!--      <version>2.11.5</version>-->
+<!--    </dependency>-->
+
   </dependencies>
   </dependencies>
   <build>
   <build>
     <finalName>${artifactId}</finalName>
     <finalName>${artifactId}</finalName>

+ 3 - 4
src/main/java/com/fdkankan/contro/controller/JmgaController.java

@@ -18,11 +18,10 @@ public class JmgaController {
     @Autowired
     @Autowired
     private IJmgaService jmgaService;
     private IJmgaService jmgaService;
 
 
-    @PostMapping("/uploadSceneOrig")
-    public ResultData uploadSceneOrig(@RequestBody @Valid UploadSceneOrigParamVo param) throws Exception {
-        jmgaService.uploadSceneOrig(param);
+    @PostMapping("/uploadScene")
+    public ResultData uploadScene(@RequestBody @Valid UploadSceneOrigParamVo param) throws Exception {
+        jmgaService.uploadScene(param);
         return ResultData.ok();
         return ResultData.ok();
     }
     }
 
 
-
 }
 }

+ 91 - 0
src/main/java/com/fdkankan/contro/mq/listener/UploadSceneListener.java

@@ -0,0 +1,91 @@
+package com.fdkankan.contro.mq.listener;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.contro.constant.ZipConstant;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import net.lingala.zip4j.core.ZipFile;
+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 java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+
+@Slf4j
+@Component
+public class UploadSceneListener {
+
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+
+    /**
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.scene.manage-upload-scene}")
+    )
+    public void handler(Channel channel, Message message) throws Exception {
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        log.info("开始处理管理后台上传场景,content:{}", msg);
+        String num = null;
+        String zipPath = null;
+        try {
+            JSONObject jsonObject = JSON.parseObject(msg);
+            num = jsonObject.getString("num");
+            zipPath = jsonObject.getString("zipPath");
+            //解压缩
+            ZipFile zipFile = new ZipFile(new File(zipPath));
+            if (zipFile.isEncrypted()) {
+                zipFile.setPassword(ZipConstant.zipPassword);
+                zipFile.extractAll(zipPath);
+            } else {
+                ZipUtil.unzip(zipPath, zipDir + uuid);
+            }
+
+            //去读data.fdage
+            String dataFdagePath = zipDir + uuid + "/data.fdage";
+            if(!FileUtil.exist(dataFdagePath)){
+                log.warn("---------dataFdagePath:{}", dataFdagePath);
+                throw new BusinessException(ErrorCode.FAILURE_CODE_4002.code(), ErrorCode.FAILURE_CODE_4002.formatMessage("data.fdage"));
+            }
+            JSONObject dataFdageObj = JSONObject.parseObject(FileUtil.readUtf8String(dataFdagePath));
+            int camType = dataFdageObj.getJSONObject("cam").getIntValue("type");
+            String snCode = dataFdageObj.getJSONObject("cam").getString("uuid");
+            String uuidTime = dataFdageObj.getString("uuidtime");
+            String uniCode = snCode + "_" + uuidTime;
+            String fileId = sceneFileBuildService.getFileId(snCode, uniCode);
+            String homePath = "/oss/4dkankan/" + ConstantFilePath.OSS_PREFIX + snCode + "/" + fileId + "/" + uniCode;
+            FileUtil.mkdir(homePath);
+            String cpCmd = "cp -p -r " + zipDir + uuid + "/* " + homePath;
+            CmdUtils.callLineSh(cpCmd);
+
+            String params = snCode + "#" + fileId + "#" + uniCode;
+            String encode = Base64.encode(RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile()), params.getBytes(StandardCharsets.UTF_8)));
+            if(camType == 9 || camType == 10 || camType == 11){
+                sceneFileBuildService.turntableUploadSuccess(encode, user);
+            }else{
+                sceneFileBuildService.uploadSuccessBuild(encode, user);
+            }
+
+
+        }catch (Exception e){
+            log.error("处理管理后台上传场景报错, content:{}", msg, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+        log.info("结束处理管理后台上传场景,content:{}", msg);
+    }
+
+}

+ 6 - 0
src/main/java/com/fdkankan/contro/service/ICameraService.java

@@ -1,8 +1,11 @@
 package com.fdkankan.contro.service;
 package com.fdkankan.contro.service;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.contro.entity.Camera;
 import com.fdkankan.contro.entity.Camera;
 
 
+import java.util.Map;
+
 /**
 /**
  * <p>
  * <p>
  * 相机主表 服务类
  * 相机主表 服务类
@@ -18,4 +21,7 @@ public interface ICameraService extends IService<Camera> {
     Camera getBySnCode(String snCode);
     Camera getBySnCode(String snCode);
 
 
     Long getUsedSpace(Long cameraId, String spaceTypeStr);
     Long getUsedSpace(Long cameraId, String spaceTypeStr);
+
+    Map<String, Object> instorage(int camType, String snCode);
+
 }
 }

+ 1 - 1
src/main/java/com/fdkankan/contro/service/IJmgaService.java

@@ -11,7 +11,7 @@ public interface IJmgaService {
 
 
     void checkLackFile(String dataSource);
     void checkLackFile(String dataSource);
 
 
-    void uploadSceneOrig(UploadSceneOrigParamVo param) throws Exception;
+    void uploadScene(UploadSceneOrigParamVo param) throws Exception;
 
 
     void noticeBuildBd(String ossHost, String uuid, String dir);
     void noticeBuildBd(String ossHost, String uuid, String dir);
 
 

+ 36 - 1
src/main/java/com/fdkankan/contro/service/impl/CameraServiceImpl.java

@@ -1,16 +1,28 @@
 package com.fdkankan.contro.service.impl;
 package com.fdkankan.contro.service.impl;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.SpaceType;
 import com.fdkankan.common.constant.SpaceType;
+import com.fdkankan.contro.constant.ApiConstant;
 import com.fdkankan.contro.entity.Camera;
 import com.fdkankan.contro.entity.Camera;
+import com.fdkankan.contro.entity.CameraDetail;
+import com.fdkankan.contro.httpclient.MyClient;
 import com.fdkankan.contro.mapper.ICameraMapper;
 import com.fdkankan.contro.mapper.ICameraMapper;
+import com.fdkankan.contro.service.ICameraDetailService;
 import com.fdkankan.contro.service.ICameraService;
 import com.fdkankan.contro.service.ICameraService;
 import com.fdkankan.contro.service.IScenePlusService;
 import com.fdkankan.contro.service.IScenePlusService;
 import com.fdkankan.contro.service.ISceneProService;
 import com.fdkankan.contro.service.ISceneProService;
+import com.fdkankan.web.response.ResultData;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
 /**
  * <p>
  * <p>
  * 相机主表 服务实现类
  * 相机主表 服务实现类
@@ -19,14 +31,20 @@ import org.springframework.stereotype.Service;
  * @author 
  * @author 
  * @since 2021-12-24
  * @since 2021-12-24
  */
  */
+@Slf4j
 @Service
 @Service
 public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
 public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implements ICameraService {
 
 
+    @Value("${4dkk.fdService.basePath}")
+    private String fdServiceUrl;
+    @Resource
+    private MyClient myClient;
     @Autowired
     @Autowired
     private IScenePlusService scenePlusService;
     private IScenePlusService scenePlusService;
     @Autowired
     @Autowired
     private ISceneProService sceneProService;
     private ISceneProService sceneProService;
-
+    @Autowired
+    private ICameraDetailService cameraDetailService;
     @Override
     @Override
     public Camera getByChildName(String childName){
     public Camera getByChildName(String childName){
         return this.getOne(new LambdaQueryWrapper<Camera>().eq(Camera::getChildName,childName));
         return this.getOne(new LambdaQueryWrapper<Camera>().eq(Camera::getChildName,childName));
@@ -43,4 +61,21 @@ public class CameraServiceImpl extends ServiceImpl<ICameraMapper, Camera> implem
         return sceneProService.sumUsedSpaceByCameraId(cameraId, spaceTypeStr)
         return sceneProService.sumUsedSpaceByCameraId(cameraId, spaceTypeStr)
                 + scenePlusService.sumUsedSpaceByCameraId(cameraId, spaceTypeStr);
                 + scenePlusService.sumUsedSpaceByCameraId(cameraId, spaceTypeStr);
     }
     }
+
+    @Override
+    public Map<String, Object> instorage(int camType, String snCode) {
+        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);
+
+        Camera camera = this.getBySnCode(snCode);
+        CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId());
+        Map<String,Object> result = new HashMap<>();
+        result.put("camera", camera);
+        result.put("cameraDetail", cameraDetail);
+        return result;
+    }
 }
 }

+ 140 - 31
src/main/java/com/fdkankan/contro/service/impl/JmgaServiceImpl.java

@@ -4,8 +4,10 @@ import cn.hutool.core.codec.Base64;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ZipUtil;
 import cn.hutool.core.util.ZipUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
@@ -17,16 +19,21 @@ import com.fdkankan.common.constant.SceneStatus;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.CmdUtils;
 import com.fdkankan.common.util.CmdUtils;
 import com.fdkankan.common.util.DateExtUtil;
 import com.fdkankan.common.util.DateExtUtil;
+import com.fdkankan.contro.bean.SceneJsonBean;
 import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
 import com.fdkankan.contro.bean.SendCallAlgorithmDetail;
+import com.fdkankan.contro.constant.ApiConstant;
 import com.fdkankan.contro.constant.ZipConstant;
 import com.fdkankan.contro.constant.ZipConstant;
 import com.fdkankan.contro.entity.*;
 import com.fdkankan.contro.entity.*;
+import com.fdkankan.contro.httpclient.MyClient;
 import com.fdkankan.contro.mq.service.IBuildLogService;
 import com.fdkankan.contro.mq.service.IBuildLogService;
 import com.fdkankan.contro.service.*;
 import com.fdkankan.contro.service.*;
+import com.fdkankan.contro.util.SceneSourceUtil;
 import com.fdkankan.contro.vo.SendCallAlgorithmParam;
 import com.fdkankan.contro.vo.SendCallAlgorithmParam;
 import com.fdkankan.contro.vo.UploadSceneOrigParamVo;
 import com.fdkankan.contro.vo.UploadSceneOrigParamVo;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import com.fdkankan.web.response.ResultData;
 import com.fdkankan.web.util.RSAEncrypt;
 import com.fdkankan.web.util.RSAEncrypt;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import net.lingala.zip4j.core.ZipFile;
 import net.lingala.zip4j.core.ZipFile;
@@ -74,6 +81,12 @@ public class JmgaServiceImpl implements IJmgaService {
     private IBuildLogService buildLogService;
     private IBuildLogService buildLogService;
     @Autowired
     @Autowired
     private IJyUserService jyUserService;
     private IJyUserService jyUserService;
+    @Autowired
+    private IScene3dNumService scene3dNumService;
+    @Autowired
+    private ICameraService cameraService;
+    @Autowired
+    private ICameraDetailService cameraDetailService;
 
 
     @Override
     @Override
     public void checkFileWhole(String uuid, String dataSource, JSONObject fdageData) {
     public void checkFileWhole(String uuid, String dataSource, JSONObject fdageData) {
@@ -232,7 +245,7 @@ public class JmgaServiceImpl implements IJmgaService {
     }
     }
 
 
     @Override
     @Override
-    public void uploadSceneOrig(UploadSceneOrigParamVo param) throws Exception {
+    public void uploadScene(UploadSceneOrigParamVo param) throws Exception {
 
 
         User user = userService.getById(param.getUserId());
         User user = userService.getById(param.getUserId());
         if(Objects.isNull(user)){
         if(Objects.isNull(user)){
@@ -244,41 +257,137 @@ public class JmgaServiceImpl implements IJmgaService {
         String zipDir = "/oss/4dkankan/bd_server/";
         String zipDir = "/oss/4dkankan/bd_server/";
         fYunFileService.downloadFileByCommand(zipDir + zipName, param.getFilePath());
         fYunFileService.downloadFileByCommand(zipDir + zipName, param.getFilePath());
 
 
-        //解压缩
-        ZipFile zipFile = new ZipFile(new File(zipDir +  zipName));
-        if (zipFile.isEncrypted()) {
-            zipFile.setPassword(ZipConstant.zipPassword);
-            zipFile.extractAll(zipDir + uuid);
-        } else {
-            ZipUtil.unzip(zipDir +  zipName, zipDir + uuid);
+        Camera camera = null;
+        CameraDetail cameraDetail = null;
+        String sceneNum = null;
+        if(param.getSourceType().equals("orig")){//原始资源
+            String dataFdageStr = com.fdkankan.contro.util.ZipUtil.readUtf8(zipDir + zipName, "data.fdage");
+            if(StrUtil.isEmpty(dataFdageStr) || JSONUtil.isJson(dataFdageStr)){
+                throw new BusinessException(60027, "data.fdage文件数据异常");
+            }
+            JSONObject dataFdage = JSON.parseObject(dataFdageStr);
+            String snCode = dataFdage.getJSONObject("cam").getString("uuid");
+            String uuidTime = dataFdage.getString("uuidtime");
+            String uniCode = snCode + "_" + uuidTime;
+            int camType = dataFdage.getJSONObject("cam").getIntValue("type");
+            Map<String, Object> instorage = cameraService.instorage(camType, snCode);
+            cameraDetail = (CameraDetail) instorage.get("cameraDetail");
+
+            ScenePlus scenePlus = scenePlusService.getByFileId(uniCode);
+            if(scenePlus == null){
+                scenePlus = new ScenePlus();
+                sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
+                scenePlus.setNum(sceneNum);
+                scenePlus.setCameraId(cameraDetail.getCameraId());
+                scenePlus.setSceneSource(SceneSourceUtil.getSceneSourceByCamType(cameraDetail.getType()));
+            }
+            scenePlus.setTitle(dataFdage.getString("name"));
+            scenePlus.setUserId(user.getId());
+            scenePlus.setUpdateTime(null);
+            scenePlus.setSceneStatus(SceneStatus.wait.code());
+            scenePlusService.saveOrUpdate(scenePlus);
+
+            ScenePlusExt scenePlusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
+            if(scenePlusExt == null){
+                scenePlusExt = new ScenePlusExt();
+                scenePlusExt.setPlusId(scenePlus.getId());
+                String fileId = sceneFileBuildService.getFileId(snCode, uniCode);
+                scenePlusExt.setDataSource(ConstantFilePath.BUILD_MODEL_PATH + snCode + File.separator + fileId + File.separator + uniCode);
+                scenePlusExtService.save(scenePlusExt);
+            }
+
+        }else{//离线包
+            String sceneJsonStr = com.fdkankan.contro.util.ZipUtil.readUtf8(zipDir + zipName, "scene.json");
+            if(StrUtil.isEmpty(sceneJsonStr) || JSONUtil.isJson(sceneJsonStr)){
+                throw new BusinessException(60027, "scene.json文件数据异常");
+            }
+            JSONObject sceneJson = JSON.parseObject(sceneJsonStr);
+            int camType = sceneJson.getInteger("camType");
+            String snCode = sceneJson.getString("snCode");
+            Map<String, Object> instorage = cameraService.instorage(camType, snCode);
+            cameraDetail = (CameraDetail) instorage.get("cameraDetail");
+            ScenePlus scenePlus = new ScenePlus();
+            sceneNum = scene3dNumService.generateSceneNum(cameraDetail.getType());
+            scenePlus.setNum(sceneNum);
+            scenePlus.setCameraId(cameraDetail.getCameraId());
+            scenePlus.setSceneSource(SceneSourceUtil.getSceneSourceByCamType(cameraDetail.getType()));
+            scenePlus.setTitle(sceneJson.getString("title"));
+            scenePlus.setUserId(user.getId());
+            scenePlus.setUpdateTime(null);
+            scenePlus.setSceneStatus(SceneStatus.wait.code());
+            scenePlusService.save(scenePlus);
+            ScenePlusExt scenePlusExt = new ScenePlusExt();
+            scenePlusExt.setPlusId(scenePlus.getId());
+            String uniCode = snCode + DateExtUtil.format(new Date(), DateExtUtil.dateStyle11);
+            String fileId = sceneFileBuildService.getFileId(snCode, uniCode);
+            scenePlusExt.setDataSource(ConstantFilePath.BUILD_MODEL_PATH + snCode + File.separator + fileId + File.separator + uniCode);
+            scenePlusExtService.save(scenePlusExt);
         }
         }
 
 
-        //去读data.fdage
-        String dataFdagePath = zipDir + uuid + "/data.fdage";
-        if(!FileUtil.exist(dataFdagePath)){
-            log.warn("---------dataFdagePath:{}", dataFdagePath);
-            throw new BusinessException(ErrorCode.FAILURE_CODE_4002.code(), ErrorCode.FAILURE_CODE_4002.formatMessage("data.fdage"));
-        }
-        JSONObject dataFdageObj = JSONObject.parseObject(FileUtil.readUtf8String(dataFdagePath));
-        int camType = dataFdageObj.getJSONObject("cam").getIntValue("type");
-        String snCode = dataFdageObj.getJSONObject("cam").getString("uuid");
-        String uuidTime = dataFdageObj.getString("uuidtime");
-        String uniCode = snCode + "_" + uuidTime;
-        String fileId = sceneFileBuildService.getFileId(snCode, uniCode);
-        String homePath = "/oss/4dkankan/" + ConstantFilePath.OSS_PREFIX + snCode + "/" + fileId + "/" + uniCode;
-        FileUtil.mkdir(homePath);
-        String cpCmd = "cp -p -r " + zipDir + uuid + "/* " + homePath;
-        CmdUtils.callLineSh(cpCmd);
-
-        String params = snCode + "#" + fileId + "#" + uniCode;
-        String encode = Base64.encode(RSAEncrypt.encrypt(RSAEncrypt.loadPublicKeyByStr(RSAEncrypt.loadPublicKeyByFile()), params.getBytes(StandardCharsets.UTF_8)));
-        if(camType == 9 || camType == 10 || camType == 11){
-            sceneFileBuildService.turntableUploadSuccess(encode, user);
-        }else{
-            sceneFileBuildService.uploadSuccessBuild(encode, user);
+        //发mq做异步处理
+        JSONObject content = new JSONObject();
+        content.put("zipPath", zipDir + zipName);
+        content.put("num", sceneNum);
+        content.put("sourceType", param.getSourceType());
+        mqProducer.sendByWorkQueue("manage-upload-scene", content);
+    }
+
+    private void checkUploadSceneOrig(JSONObject dataFdageJson, Long userId){
+        String uuidtime = dataFdageJson.getString("uuidtime");
+        ScenePlus scenePlus = scenePlusService.getByFileId(uuidtime);
+        if(scenePlus == null){
+            return;
+        }
+        if(scenePlus.getUserId() != null){
+            JyUser jyUser = jyUserService.getByUserId(scenePlus.getUserId());
+            if(jyUser != null && !jyUser.getId().equals(userId)){
+                throw  new BusinessException(60042, "此场景属于-" + jyUser.getRyNo());
+            }
+            if(jyUser != null){
+                throw  new BusinessException(60043, "此场景此前已上传过");
+            }
         }
         }
     }
     }
 
 
+    private void checkUploadSceneOffline(String zipPath) throws Exception {
+        String sceneJsonStr = com.fdkankan.contro.util.ZipUtil.readUtf8(zipPath, "scene.json");
+        if(StrUtil.isEmpty(sceneJsonStr) || !JSONUtil.isJson(sceneJsonStr)){
+            throw new BusinessException(60027, "scene.json文件数据异常");
+        }
+        JSONObject jsonObject = JSON.parseObject(sceneJsonStr);
+        //校验版本
+        String offlineVersion = jsonObject.getString("offlineVersion");
+        String platformVersion = "2.2.0";//从数据中获取
+        if (offlineVersion == null || platformVersion == null) {
+            throw new BusinessException(60127, "版本不匹配");
+        }
+
+        String[] offParts = offlineVersion.split(".");
+        String[] pfParts = platformVersion.split(".");
+
+        // 至少需要两位版本号
+        if (offParts.length < 2 || pfParts.length < 2) {
+            throw new BusinessException(60127, "版本不匹配");
+        }
+
+        // 比较前两位
+        if (!offParts[0].equals(pfParts[0]) || !offParts[1].equals(pfParts[1])) {
+            throw new BusinessException(60127, "版本不匹配");
+        }
+
+        // 前两位一致,检查第三位
+        if (!offParts[2].equals(pfParts[2])) {
+            throw new BusinessException(60128, "小版本版本不匹配");
+        }
+
+        String num = jsonObject.getString("num");
+        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(num);
+        if(scenePlus != null){
+            throw new BusinessException(60128, "场景已存在,不能重复导入");
+        }
+    }
+
+
 
 
     @Override
     @Override
     public void noticeBuildBd(String ossHost, String uuid, String dir) {
     public void noticeBuildBd(String ossHost, String uuid, String dir) {

+ 23 - 0
src/main/java/com/fdkankan/contro/util/SceneSourceUtil.java

@@ -0,0 +1,23 @@
+package com.fdkankan.contro.util;
+
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.constant.SceneSource;
+import com.fdkankan.contro.enums.CameraTypeEnum;
+
+public class SceneSourceUtil {
+
+    public static Integer getSceneSourceByCamType(Integer camType){
+        SceneSource sceneSource = SceneSource.BM;
+        if (camType == CameraTypeEnum.DOUBLE_EYE_TURN.getType()) {
+            sceneSource = SceneSource.ZT;
+        }
+        if (camType == CameraTypeEnum.LASER_TURN.getType()) {
+            sceneSource = SceneSource.JG;
+        }
+        if (camType == CameraTypeEnum.LASER_SG.getType()) {
+            sceneSource = SceneSource.SG;
+        }
+        return sceneSource.code();
+    }
+
+}

+ 39 - 0
src/main/java/com/fdkankan/contro/util/ZipUtil.java

@@ -0,0 +1,39 @@
+package com.fdkankan.contro.util;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import com.fdkankan.contro.constant.ZipConstant;
+import net.lingala.zip4j.core.ZipFile;
+import net.lingala.zip4j.model.FileHeader;
+
+import java.io.InputStream;
+import java.nio.file.Paths;
+import java.util.List;
+
+public class ZipUtil {
+
+    public static void main(String[] args) throws Exception {
+
+        // 压缩包路径
+        String zipPath = "D:\\Downloads\\各类相机从App导出的原始数据\\panoxv23291.osc_202501131055559520.zip";
+        System.out.println(readUtf8(zipPath, "data.fdage"));
+    }
+
+    public static String readUtf8(String zipPath, String fileName) throws Exception {
+        ZipFile zipFile = new ZipFile(zipPath);
+        zipFile.setPassword(ZipConstant.zipPassword);
+        // 读取所有条目(文件头)
+        for (FileHeader header : (List<FileHeader>)zipFile.getFileHeaders()) {
+            // 文件名(不含目录)
+            String filePath = header.getFileName();
+            String headerFileName = FileUtil.getName(filePath);
+            if (filePath.contains("backup") || !fileName.equals(headerFileName)) {
+                continue;
+            }
+            try (InputStream is = zipFile.getInputStream(header)) {
+                return IoUtil.readUtf8(is);
+            }
+        }
+        return null;
+    }
+}

+ 4 - 1
src/main/java/com/fdkankan/contro/vo/UploadSceneOrigParamVo.java

@@ -8,10 +8,13 @@ import javax.validation.constraints.NotNull;
 @Data
 @Data
 public class UploadSceneOrigParamVo {
 public class UploadSceneOrigParamVo {
 
 
-    @NotBlank(message = "原始资源路径不能为空")
+    @NotBlank(message = "filePath不能为空")
     private String filePath;
     private String filePath;
 
 
     @NotNull(message = "userId不能为空")
     @NotNull(message = "userId不能为空")
     private Long userId;
     private Long userId;
 
 
+    //资源包类型 orig-原始数据  offline 离线包
+    @NotBlank(message = "sourceType不能为空")
+    private String sourceType;
 }
 }