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

修改转台激光相机构建逻辑

tianboguang 2 роки тому
батько
коміт
140e89b3ba

+ 40 - 5
src/main/java/com/fdkankan/contro/mq/listener/RabbitMqListener.java

@@ -1,9 +1,11 @@
 package com.fdkankan.contro.mq.listener;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.contro.mq.service.impl.BuildSceneObjPostServiceImpl;
+import com.fdkankan.contro.mq.service.impl.BuildSceneObjPreServiceImpl;
+import com.fdkankan.contro.mq.service.impl.BuildScenePostServiceImpl;
+import com.fdkankan.contro.mq.service.impl.BuildScenePreServiceImpl;
 import com.fdkankan.contro.service.IBuildSceneDTService;
-import com.fdkankan.contro.mq.service.IBuildScenePostService;
-import com.fdkankan.contro.mq.service.IBuildScenePreService;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneFailDTMqMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
@@ -33,15 +35,25 @@ public class RabbitMqListener {
     private String queueModelingPre;
     @Value("${queue.modeling.modeling-post}")
     private String queueModelingPost;
+
+    @Value("${queue.modeling.obj.modeling-pre}")
+    private String queueObjModelingPre;
     @Value("${queue.modeling.obj.modeling-post}")
     private String queueObjModelingPost;
+
     @Value("${queue.modeling.modeling-dt}")
     private String queueModelingDt;
 
     @Autowired
-    private IBuildScenePreService buildScenePreService;
+    private BuildScenePreServiceImpl buildScenePreService;
+    @Autowired
+    private BuildScenePostServiceImpl buildScenePostService;
+
     @Autowired
-    private IBuildScenePostService buildScenePostService;
+    private BuildSceneObjPreServiceImpl buildSceneObjPreService;
+    @Autowired
+    private BuildSceneObjPostServiceImpl buildSceneObjPostService;
+
     @Autowired
     private IBuildSceneDTService buildSceneDTService;
 
@@ -88,6 +100,29 @@ public class RabbitMqListener {
 
     }
 
+
+    /**
+     * 场景计算前置资源准备处理
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.modeling.obj.modeling-pre}"),
+            concurrency = "${maxThread.modeling.modeling-pre}"
+    )
+    public void buildObjScenePreHandler(Channel channel, Message message) throws Exception {
+        Object correlation = message.getMessageProperties().getHeader("spring_returned_message_correlation");
+        String correlationId = (String) correlation;
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        log.info("场景计算资源准备开始,队列名:{},id:{},消息体:{}", queueModelingPre, correlationId, msg);
+        BuildSceneCallMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneCallMessage.class);
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        Thread.sleep(2000L);
+        buildSceneObjPreService.buildScenePre(buildSceneMessage);
+    }
+
+
     /**
      * 场景计算后置结果处理
      * @param channel
@@ -106,7 +141,7 @@ public class RabbitMqListener {
         BuildSceneResultMqMessage resultMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
         Thread.sleep(2000L);
-        buildScenePostService.buildScenePost(resultMessage);
+        buildSceneObjPostService.buildScenePost(resultMessage);
 
     }
 

+ 8 - 34
src/main/java/com/fdkankan/contro/mq/service/impl/BuildObjScenePostServiceImpl.java

@@ -3,17 +3,15 @@ package com.fdkankan.contro.mq.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.fdkankan.common.util.FileUtils;
-import com.fdkankan.contro.entity.*;
+import com.fdkankan.contro.entity.ScenePlus;
 import com.fdkankan.contro.mq.service.IBuildScenePostService;
-import com.fdkankan.contro.service.*;
-import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.contro.service.IScenePlusService;
+import com.fdkankan.contro.service.impl.FdkkV4Service;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.model.constants.ConstantFilePath;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
-import com.fdkankan.redis.util.RedisUtil;
 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 java.io.File;
@@ -29,43 +27,16 @@ import java.io.File;
  **/
 @Slf4j
 @Service
-public class BuildObjScenePostServiceImpl implements IBuildScenePostService {
-
-    @Value("${main.url}")
-    private String mainUrl;
-    @Value("${scene.pro.new.url}")
-    private String sceneProNewUrl;
-
-    @Value("${4dkk.laserService.host}")
-    private String laserHost;
-
-    @Autowired
-    private ISceneFileBuildService sceneFileBuildService;
-    @Autowired
-    private ICameraDetailService cameraDetailService;
-    @Autowired
-    private ISceneEditInfoService sceneEditInfoService;
-    @Autowired
-    private ISceneEditControlsService sceneEditControlsService;
+public class BuildSceneObjPostServiceImpl implements IBuildScenePostService {
     @Autowired
     private FYunFileServiceInterface fYunFileService;
-    @Autowired
-    private FYunFileConfig fYunFileConfig;
 
     @Autowired
-    private RedisUtil redisUtil;
-    @Autowired
     private IScenePlusService scenePlusService;
-    @Autowired
-    private IScenePlusExtService scenePlusExtService;
-    @Autowired
-    private ISceneEditInfoExtService sceneEditInfoExtService;
 
-    @Autowired
-    private IUserIncrementService userIncrementService;
 
     @Autowired
-    private IFdkkLaserService fdkkLaserService;
+    private FdkkV4Service fdkkV4Service;
 
     @Override
     public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
@@ -87,5 +58,8 @@ public class BuildObjScenePostServiceImpl implements IBuildScenePostService {
         LambdaUpdateWrapper<ScenePlus> updateWrapper = new LambdaUpdateWrapper<ScenePlus>()
                 .set(ScenePlus::getSceneStatus, -2).eq(ScenePlus::getNum, message.getSceneCode());
         scenePlusService.update(updateWrapper);
+
+        // 如果未升级V4,则升级V4
+        fdkkV4Service.upgradeToV4(ScenePlus.getIsUpgrade().equals(1), scene.getNum());
     }
 }

+ 57 - 1
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneObjPreServiceImpl.java

@@ -1,13 +1,23 @@
 package com.fdkankan.contro.mq.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.util.DateExtUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.contro.mq.service.IBuildScenePreService;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.utils.CreateObjUtil;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 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 org.springframework.util.ObjectUtils;
+
+import java.io.File;
+import java.util.Calendar;
 
 /**
  * <p>
@@ -30,6 +40,9 @@ public class BuildSceneObjPreServiceImpl implements IBuildScenePreService {
     @Autowired
     private RabbitMqProducer mqProducer;
 
+    @Autowired
+    private FYunFileServiceInterface fYunFileService;
+
     @Override
     public void buildScenePre(BuildSceneCallMessage message) {
         boolean success = false;
@@ -39,7 +52,25 @@ public class BuildSceneObjPreServiceImpl implements IBuildScenePreService {
             log.info("开始生成OBJ文件,路径:{}", laserObjFilePath);
 
             FileUtils.delAllFile(laserObjFilePath);
+            String path = message.getDataSource();
+            //获取解压后的资源的data.fdage中的数据
+            File folderPath = new File(path);
+            CreateObjUtil.ossUtilCp(ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "") + "/data.fdage", path + "/capture/");
+            String data = FileUtils.readFile(folderPath.getAbsolutePath() + File.separator + "capture" + File.separator + "data.fdage");
+            JSONObject jsonObject = JSONObject.parseObject(data);
+            if(ObjectUtils.isEmpty(jsonObject)){
+                log.error("data.fdage文件不存在");
+                return ;
+            }
+
+            // 重新构造datafdage文件,添加生成obt文件选项
+            jsonObject.put("OnlyExportMeshObj",true);
+            // 写入data.fdage 防止重算
+            jsonObject.put("exportMeshObj",1);
+            FileUtils.writeFile(folderPath.getAbsolutePath() + File.separator + "capture" + File.separator + "data.fdage", jsonObject.toJSONString());
 
+            fYunFileService.uploadFile(folderPath.getAbsolutePath() + File.separator + "capture" + File.separator + "data.fdage",
+                    ConstantFilePath.OSS_PREFIX + path.replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "") + "/data.fdage");
 
             //下载资源到本地
             this.downLoadSource(message, laserObjFilePath);
@@ -48,8 +79,33 @@ public class BuildSceneObjPreServiceImpl implements IBuildScenePreService {
 
             message.setResultReceiverMqName(queueObjModelingPost);
 
+            BuildSceneCallMessage mqMsg = new BuildSceneCallMessage();
+            mqMsg.setSceneProId(sceneProId);
+            mqMsg.setSceneNum(projectNum);
+            mqMsg.setCameraName(cameraName);
+            mqMsg.setUnicode(unicode);
+            mqMsg.setCameraType(String.valueOf(cameraType));
+            mqMsg.setFileId(fileId);
+            mqMsg.setPrefix(prefix);
+            mqMsg.setImgsName(imgsName);
+            mqMsg.setIsModel(isModel);
+            mqMsg.setUserName(userName);
+            mqMsg.setAlgorithm(algorithm);
+            mqMsg.setResolution(String.valueOf(resolution));
+            mqMsg.setBuildType(buildType);
+            mqMsg.setPath(path);
+            mqMsg.setSceneName(sceneName);
+            mqMsg.setWebSite(webSite);
+            mqMsg.setSceneProCreateTime(sceneProCreateTime);
+            mqMsg.setUserId(userId);
+            mqMsg.setDataSource(dataSource);
+            mqMsg.setSceneStatus(sceneStatus);
+            mqMsg.setPayStatus(PayStatus);
+            mqMsg.setCreateTime(DateUtil.format(Calendar.getInstance().getTime(), DateExtUtil.dateStyle));
+            mqMsg.setThumb(thumb);
+
             //发送mq,就进行计算
-            mqProducer.sendByWorkQueue(queueModelingCall, message);
+            mqProducer.sendByWorkQueue(queueModelingCall, mqMsg);
 
             success = true;
 

+ 66 - 0
src/main/java/com/fdkankan/contro/service/impl/FdkkLaserService.java

@@ -0,0 +1,66 @@
+package com.fdkankan.contro.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.model.Result;
+import com.fdkankan.common.util.DateUtil;
+import com.fdkankan.entity.SceneProEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class FdkkLaserService {
+    private static final Logger log = LoggerFactory.getLogger(FdkkLaserService.class);
+
+    private final String SAVE_SCENE_URL_TEMPLATE="/laser/init/%s/saveOrEdit";
+    private final String ENABLE_COOPERATION_CAMERA_URL="/laser/4dage/scene/cooperation/cameraSave";
+    private final String EDIT_LASER_BUILD_STATUS_URL="/laser/4dage/scene/editBuildStatus";
+
+    @Value("${4dkk.laserService.host}")
+    private String laserHost;
+
+    @Autowired
+    private ISceneProService sceneProService;
+
+    private RestTemplate restTemplate = new RestTemplate();
+
+    public void updateSceneStatus(String sceneCode, int sceneStatus, String path){
+        String url = laserHost + String.format(SAVE_SCENE_URL_TEMPLATE,sceneCode);
+        Map<String,Object> params = new HashMap<>();
+        params.put("sceneCode", sceneCode);
+        params.put("status", sceneStatus);
+        SceneProEntity sceneProEntity = sceneProService.findBySceneNum(sceneCode);
+        params.put("createTime", DateUtil.date2String(sceneProEntity.getCreateTime(),null));
+        if(!ObjectUtils.isEmpty(path)){
+            params.put("path", path);
+        }
+        log.info("自研激光转台相机同步,url:{},params:{}",url, JSONObject.toJSONString(params));
+        ResponseEntity<Result> responseEntity = restTemplate.postForEntity(url,params, Result.class);
+        log.info("自研激光转台相机同步,url:{},params:{},结果:{}",url, JSONObject.toJSONString(params),JSONObject.toJSONString(responseEntity.getBody()));
+        if(responseEntity.getStatusCode() != HttpStatus.OK || responseEntity.getBody().getCode() != HttpStatus.OK.value()){
+            log.error("激光场景状态同步失败!");
+        }
+    }
+
+    public void pushBuildStatusToLaserSystem(String projectNum, String laserObjFilePath) {
+        String url = laserHost + EDIT_LASER_BUILD_STATUS_URL;
+        Map<String,String> params = new HashMap<>();
+        params.put("sceneCode",projectNum);
+        params.put("objPath",laserObjFilePath);
+        log.info("激光系统同步BuildStatus,url:{},params:{}",ENABLE_COOPERATION_CAMERA_URL, JSONObject.toJSONString(params));
+        ResponseEntity<Result> responseEntity = restTemplate.postForEntity(url,params, Result.class);
+        log.info("激光系统同步BuildStatus,url:{},params:{},结果:{}",url, JSONObject.toJSONString(params),JSONObject.toJSONString(responseEntity.getBody()));
+        if(responseEntity.getStatusCode() != HttpStatus.OK || responseEntity.getBody().getCode() != HttpStatus.OK.value()){
+            log.error("激光系统同步BuildStatus");
+        }
+    }
+}

+ 81 - 0
src/main/java/com/fdkankan/contro/service/impl/FdkkV4Service.java

@@ -0,0 +1,81 @@
+package com.fdkankan.contro.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.base.constant.SceneConstant;
+import com.fdkankan.common.exception.BaseRuntimeException;
+import com.fdkankan.common.model.Result;
+import com.fdkankan.entity.SceneProEditEntity;
+import com.fdkankan.entity.SceneProEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class FdkkV4Service {
+    private static final Logger log = LoggerFactory.getLogger(FdkkV4Service.class);
+
+    private final String UPGRADE_TO_V4="/service-v3/scene/upgradeToV4";
+
+    @Value("${4dkk.v4Service.host}")
+    private String v4Host;
+
+    private RestTemplate restTemplate = new RestTemplate();
+
+    @Autowired
+    private ISceneProService sceneProService;
+    @Autowired
+    private ISceneProEditService sceneProEditService;
+
+    /**
+     * 场景升级
+     * @param reUpgrade  默认已升级过的场景不允许重复升级,如果为true,则强制重新升级
+     * @param num 场景码
+     * @return
+     * @throws Exception
+     */
+    public Result upgradeToV4(boolean reUpgrade, String num) throws Exception{
+        String url = v4Host + UPGRADE_TO_V4;
+        SceneProEntity sceneProEntity = sceneProService.findBySceneNum(num);
+        if(sceneProEntity == null){
+            throw new BaseRuntimeException(SceneConstant.FAILURE_CODE_5005, SceneConstant.FAILURE_MSG_5005);
+        }
+        SceneProEditEntity sceneProEditEntity = sceneProEditService.findByProId(sceneProEntity.getId());
+        Map<String,Object> params = new HashMap<>();
+        params.put("reUpgrade", reUpgrade);
+        params.put("scenePro", JSON.toJSONString(sceneProEntity));
+        params.put("sceneProEdit", JSON.toJSONString(sceneProEditEntity));
+        log.info("v3场景升级v4,url:{},params:{}",url, JSONObject.toJSONString(params));
+        ResponseEntity<Result> responseEntity = restTemplate.postForEntity(url, params, Result.class);
+        log.info("v3场景升级v4,url:{},params:{},结果,{}",url, JSONObject.toJSONString(params),JSONObject.toJSONString(responseEntity.getBody()));
+        if(responseEntity.getStatusCode() != HttpStatus.OK){
+            return Result.failure("场景升级失败,请稍后再试!");
+        }
+        Integer code = responseEntity.getBody().getCode();
+        if(code != 0){
+            String msg = "场景升级失败,请稍后再试!";
+            if(code == 7019){
+                msg = "场景升级中,请勿重复升级";
+            }else if(code == 7020){
+                msg = "场景已升级,不能重复升级";
+            }
+            return Result.failure(code, msg);
+        }
+
+        sceneProEntity.setStatus(0);
+        //修改场景状态为升级中
+        sceneProEntity.setIsUpgrade(2);
+        sceneProService.update(sceneProEntity);
+
+        return Result.success();
+    }
+
+}