فهرست منبع

Merge branch 'release' into feature-slimming-nas-20220130-dsx

# Conflicts:
#	src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java
dsx 2 سال پیش
والد
کامیت
a0786cb423

+ 81 - 0
src/main/java/com/fdkankan/contro/entity/SceneBuildProcessLog.java

@@ -0,0 +1,81 @@
+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 lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 场景计算流程状态表
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Getter
+@Setter
+@TableName("t_scene_build_process_log")
+public class SceneBuildProcessLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 计算流程(pre-前置处理,call-计算,post-后置处理)
+     */
+    @TableField("process")
+    private String process;
+
+    /**
+     * mq消息队列名称
+     */
+    @TableField("queue_name")
+    private String queueName;
+
+    /**
+     * 处理状态(0-处理中,1-成功,2-失败)
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 失败原因
+     */
+    @TableField("reason")
+    private String reason;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+
+}

+ 1 - 1
src/main/java/com/fdkankan/contro/generate/AutoGenerate.java

@@ -17,7 +17,7 @@ public class AutoGenerate {
         String path =System.getProperty("user.dir");
 
         generate(path,"contro", getTables(new String[]{
-                "t_scene_asyn_oper_log"
+                "t_scene_build_process_log"
         }));
 
 //        generate(path,"goods", getTables(new String[]{

+ 18 - 0
src/main/java/com/fdkankan/contro/mapper/ISceneBuildProcessLogMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.contro.mapper;
+
+import com.fdkankan.contro.entity.SceneBuildProcessLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 场景计算流程状态表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Mapper
+public interface ISceneBuildProcessLogMapper extends BaseMapper<SceneBuildProcessLog> {
+
+}

+ 32 - 7
src/main/java/com/fdkankan/contro/mq/listener/AbstrackBuildSceneListener.java

@@ -1,8 +1,12 @@
 package com.fdkankan.contro.mq.listener;
 
+import cn.hutool.core.exceptions.ExceptionUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.contro.constant.RedisConstants;
 import com.fdkankan.contro.mq.service.IBuildSceneService;
+import com.fdkankan.contro.service.ISceneBuildProcessLogService;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
 import com.fdkankan.redis.util.RedisLockUtil;
@@ -21,6 +25,8 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
 
     @Autowired
     private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
     public void preHandle(Channel channel, String queueName, Message message, IBuildSceneService buildSceneService) throws IOException {
@@ -39,13 +45,23 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("开始准备场景计算资源,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         BuildSceneCallMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneCallMessage.class);
-        if(ObjectUtils.isEmpty(buildSceneMessage.getBuildContext())){
-            buildSceneMessage.setBuildContext(new HashMap<>());
-        }
-        if(!ObjectUtils.isEmpty(buildSceneMessage.getSceneNum())){
-            buildSceneMessage.getBuildContext().put("sceneNum",buildSceneMessage.getSceneNum());
+        String num = buildSceneMessage.getSceneNum();
+        try {
+            if(ObjectUtils.isEmpty(buildSceneMessage.getBuildContext())){
+                buildSceneMessage.setBuildContext(new HashMap<>());
+            }
+            if(!ObjectUtils.isEmpty(buildSceneMessage.getSceneNum())){
+                buildSceneMessage.getBuildContext().put("sceneNum",buildSceneMessage.getSceneNum());
+            }
+            //记录日志
+            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.WAITING.code(), null);
+            buildSceneService.buildScenePre(buildSceneMessage);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.SUCCESS.code(), null);
+        }catch (Exception e){
+            log.error("场景计算前置处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
         }
-        buildSceneService.buildScenePre(buildSceneMessage);
         log.info("准备场景计算资源完成,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }
@@ -67,7 +83,16 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("场景计算完成,开始处理场景计算结果,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         BuildSceneResultMqMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
-        buildSceneService.buildScenePost(buildSceneMessage);
+        String num = buildSceneMessage.getBuildContext().get("sceneNum").toString();
+        try {
+            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.WAITING.code(), null);
+            buildSceneService.buildScenePost(buildSceneMessage);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.SUCCESS.code(), null);
+        }catch (Exception e){
+            log.error("场景计算结果处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+        }
         log.info("场景计算结果处理完成,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }

+ 67 - 0
src/main/java/com/fdkankan/contro/mq/listener/BuildSceneProcessLogListener.java

@@ -0,0 +1,67 @@
+package com.fdkankan.contro.mq.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
+import com.fdkankan.common.constant.ModelingBuildStatus;
+import com.fdkankan.contro.service.ISceneBuildProcessLogService;
+import com.fdkankan.model.constants.SceneBuildProcessType;
+import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
+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.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+@Component
+public class BuildSceneProcessLogListener{
+
+    @Value("${queue.modeling.modeling-process-log}")
+    private String queueModelingProcessLog;
+    @Value("${queue.modeling.modeling-call}")
+    private String queueModelingCall;
+
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
+
+    /**
+     * 场景计算状态日志记录
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.modeling.modeling-process-log}")
+    )
+    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        BuildSceneProcessLogMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneProcessLogMessage.class);
+        String num = buildSceneMessage.getNum();
+        try {
+            String reason = null;
+            int status = CommonOperStatus.SUCCESS.code();
+            int buildStatus = buildSceneMessage.getBuildStatus();
+            //新的计算开始,需要将之前的记录置为失效
+            if(buildStatus == ModelingBuildStatus.CALCULATING.code()){
+                sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.CALL.code(),queueModelingCall);
+                status = CommonOperStatus.WAITING.code();
+            }else{
+                if(buildStatus != ModelingBuildStatus.SUCCESS.code()){
+                    status = CommonOperStatus.FAILD.code();
+                    reason = ModelingBuildStatus.get(buildStatus).message();
+                }
+            }
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.CALL.code(), queueModelingCall, status, reason);
+        }catch (Exception e){
+            log.error("场景计算流程状态日志记录出错, num="+num, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+    }
+
+}

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

@@ -13,7 +13,7 @@ import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
  **/
 public interface IBuildSceneService {
 
-    void buildScenePre(BuildSceneCallMessage message);
+    void buildScenePre(BuildSceneCallMessage message) throws Exception;
 
     void downLoadSource(BuildSceneCallMessage buildSceneMqMessage, String path) throws Exception;
 

+ 96 - 73
src/main/java/com/fdkankan/contro/mq/service/impl/BuildObjServiceImpl.java

@@ -1,8 +1,10 @@
 package com.fdkankan.contro.mq.service.impl;
 
+import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.ModelKind;
 import com.fdkankan.common.util.FileUtils;
@@ -15,6 +17,7 @@ import com.fdkankan.contro.service.impl.FdkkV4Service;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.model.constants.ConstantFileName;
 import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import com.fdkankan.model.constants.UploadFilePath;
 import com.fdkankan.model.utils.CreateObjUtil;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
@@ -48,6 +51,9 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     @Value("${queue.modeling.obj.modeling-post}")
     private String queueObjModelingPost;
 
+    @Value("${queue.modeling.obj.modeling-pre}")
+    private String queueObjModelingPre;
+
     @Value("${model.modelKind:3dtiles}")
     private String modelKind;
 
@@ -76,9 +82,13 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     @Autowired
     private IScenePlusService scenePlusService;
 
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
+
     @Override
-    public void buildScenePre(BuildSceneCallMessage message) {
+    public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
+        String num = message.getSceneNum();
         try {
             String path = message.getPath();
             //根据相机类型,组装资源路径
@@ -123,13 +133,13 @@ public class BuildObjServiceImpl implements IBuildSceneService {
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
-            log.error("场景计算前置处理出错", e);
+            log.error("生成OBJ场景资源准备异常,num=" + num, e);
+            throw e;
         }finally {
             //如果前置处理失败,发送钉钉消息
             if(!success){
                 buildSceneDTService.handBaseFail("生成OBJ场景资源准备异常", message.getPath(), message.getSceneNum(), "计算控制服务器");
             }
-
         }
     }
 
@@ -163,92 +173,105 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     @Override
     public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
 
-        if (!message.getBuildSuccess()) {
-            log.error("生成OBJ场景计算失败!");
-            // 发送钉钉消息,计算失败
-            buildSceneDTService.handModelFail("生成OBJ场景计算失败!", message.getPath(), message.getBuildContext().get("sceneNum").toString(), message.getHostName());
-            return;
-        }
-
         String path = message.getPath();
-        String laserObjFilePath = path;
         String projectNum = message.getBuildContext().get("sceneNum").toString();
-        ScenePro scenePro = sceneProService.getByNum(projectNum);
-        String version = "v4";
-        String ossImagePath = String.format(UploadFilePath.IMG_VIEW_PATH,  projectNum);
-        //如果是微服务上线之前的存量场景且未生成过obj(未升级过),需要上传到v3的目录,在函数最后调用升级接口进行文件拷贝
-        if(Objects.nonNull(scenePro) && scenePro.getIsUpgrade() != CommonStatus.YES.code().intValue()){
-            ossImagePath = String.format(ConstantFilePath.IMAGE_PATH_FORMAT, projectNum);
-            version = "v3";
-        }
-        //上传obj
-        String resultsPath = path + File.separator + "results" + File.separator;
-        if(this.modelKind.equals(ModelKind.DAM.code())){
-            CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
-            CreateObjUtil.convertDamToLzma(path + File.separator + "results/");
-            CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
-            File file = new File(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma");
-            while (!file.exists()) {
-                Thread.sleep(60000);
+        boolean success = false;
+        try {
+            if (!message.getBuildSuccess()) {
+                log.error("生成OBJ场景计算失败!");
+                // 发送钉钉消息,计算失败
+                buildSceneDTService.handModelFail("生成OBJ场景计算失败!", message.getPath(), message.getBuildContext().get("sceneNum").toString(), message.getHostName());
+                return;
             }
-            fYunFileService.uploadFile(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma", ossImagePath + ConstantFileName.modelUUID + "_50k.dam.lzma");
-            fYunFileService.uploadFile(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam", ossImagePath + ConstantFileName.modelUUID + "_50k.dam");
-        }
-        if(this.modelKind.equals(ModelKind.THREE_D_TILE.code())){
-            String threedtilesPath = resultsPath + ModelKind.THREE_D_TILE.code();
-            String oss3dtilesPath = ossImagePath + ModelKind.THREE_D_TILE.code();
-            List<String> list = FileUtils.list(new File(threedtilesPath));
-            if(CollUtil.isEmpty(list)){
-                log.error("3dtiles目录异常,3dtiles地址:{}", new File(path + File.separator + "results" + File.separator + ModelKind.THREE_D_TILE.code()));
-                throw new Exception("3dtiles目录异常");
+
+            String laserObjFilePath = path;
+            ScenePro scenePro = sceneProService.getByNum(projectNum);
+            String version = "v4";
+            String ossImagePath = String.format(UploadFilePath.IMG_VIEW_PATH,  projectNum);
+            //如果是微服务上线之前的存量场景且未生成过obj(未升级过),需要上传到v3的目录,在函数最后调用升级接口进行文件拷贝
+            if(Objects.nonNull(scenePro) && scenePro.getIsUpgrade() != CommonStatus.YES.code().intValue()){
+                ossImagePath = String.format(ConstantFilePath.IMAGE_PATH_FORMAT, projectNum);
+                version = "v3";
+            }
+            //上传obj
+            String resultsPath = path + File.separator + "results" + File.separator;
+            if(this.modelKind.equals(ModelKind.DAM.code())){
+                CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
+                CreateObjUtil.convertDamToLzma(path + File.separator + "results/");
+                CreateObjUtil.convertTxtToDam(path + File.separator + "results" + File.separator + "tex" + File.separator + "modeldata.txt", path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam");
+                File file = new File(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma");
+                while (!file.exists()) {
+                    Thread.sleep(60000);
+                }
+                fYunFileService.uploadFile(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam.lzma", ossImagePath + ConstantFileName.modelUUID + "_50k.dam.lzma");
+                fYunFileService.uploadFile(path + File.separator + "results" + File.separator + ConstantFileName.modelUUID + "_50k.dam", ossImagePath + ConstantFileName.modelUUID + "_50k.dam");
+            }
+            if(this.modelKind.equals(ModelKind.THREE_D_TILE.code())){
+                String threedtilesPath = resultsPath + ModelKind.THREE_D_TILE.code();
+                String oss3dtilesPath = ossImagePath + ModelKind.THREE_D_TILE.code();
+                List<String> list = FileUtils.list(new File(threedtilesPath));
+                if(CollUtil.isEmpty(list)){
+                    log.error("3dtiles目录异常,3dtiles地址:{}", new File(path + File.separator + "results" + File.separator + ModelKind.THREE_D_TILE.code()));
+                    throw new Exception("3dtiles目录异常");
+                }
+                //上传3dtiles文件
+                fYunFileService.uploadFileByCommand(threedtilesPath, oss3dtilesPath);
             }
-            //上传3dtiles文件
-            fYunFileService.uploadFileByCommand(threedtilesPath, oss3dtilesPath);
-        }
 
-        String texPath = laserObjFilePath + File.separator + "results" + File.separator + "tex";
+                String texPath = laserObjFilePath + File.separator + "results" + File.separator + "tex";
 
-        File texFile = new File(texPath);
-        if(texFile.exists()){
-            for (File textureFile : texFile.listFiles()) {
-                if(textureFile.getName().endsWith(".jpg")){
-                    fYunFileService.uploadFile(textureFile.getAbsolutePath(),
-                        ossImagePath + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/"+textureFile.getName());
+            File texFile = new File(texPath);
+            if(texFile.exists()){
+                for (File textureFile : texFile.listFiles()) {
+                    if(textureFile.getName().endsWith(".jpg")){
+                        fYunFileService.uploadFile(textureFile.getAbsolutePath(),
+                            ossImagePath + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/"+textureFile.getName());
+                    }
                 }
             }
-        }
 
-        fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + "tex/texture1.jpg",
-                ossImagePath + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/texture1.jpg");
+            fYunFileService.uploadFile(laserObjFilePath + File.separator + "results" + File.separator + "tex/texture1.jpg",
+                    ossImagePath + ConstantFileName.modelUUID + "_50k_texture_jpg_high1/texture1.jpg");
 
-        // 拷贝结果
-        log.info("开始拷贝obj文件");
-        FileUtils.copyFolderAllFiles(laserObjFilePath + "/results/mesh", laserObjFilePath + "/laserData/mesh/", true);
+                // 拷贝结果
+                log.info("开始拷贝obj文件");
+                FileUtils.copyFolderAllFiles(laserObjFilePath + "/results/mesh", laserObjFilePath + "/laserData/mesh/", true);
 
-        //上传mesh文件
-        fYunFileService.uploadFileByCommand(laserObjFilePath + "/results/mesh", String.format(UploadFilePath.DATA_VIEW_PATH,  projectNum) + "mesh");
+            //上传mesh文件
+            fYunFileService.uploadFileByCommand(laserObjFilePath + "/results/mesh", String.format(UploadFilePath.DATA_VIEW_PATH,  projectNum) + "mesh");
 
-        fdkkLaserService.pushBuildStatusToLaserSystem(projectNum, laserObjFilePath + "/laserData/mesh");
+            fdkkLaserService.pushBuildStatusToLaserSystem(projectNum, laserObjFilePath + "/laserData/mesh");
 
 
-        if(!ObjectUtils.isEmpty(scenePro)){
-            LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<ScenePro>()
-                    .set(ScenePro::getStatus, -2).eq(ScenePro::getNum, projectNum);
-            sceneProService.update(updateWrapper);
-            sceneProEditService.update(new LambdaUpdateWrapper<SceneProEdit>().set(SceneProEdit::getMapVisi,0)
-                    .eq(SceneProEdit::getProId,scenePro.getId()));
-        }
+            if(!ObjectUtils.isEmpty(scenePro)){
+                LambdaUpdateWrapper<ScenePro> updateWrapper = new LambdaUpdateWrapper<ScenePro>()
+                        .set(ScenePro::getStatus, -2).eq(ScenePro::getNum, projectNum);
+                sceneProService.update(updateWrapper);
+                sceneProEditService.update(new LambdaUpdateWrapper<SceneProEdit>().set(SceneProEdit::getMapVisi,0)
+                        .eq(SceneProEdit::getProId,scenePro.getId()));
+            }
 
-        ScenePlus scenePlus = scenePlusService.getScenePlusByNum(projectNum);
-        if(!ObjectUtils.isEmpty(scenePlus)){
-            LambdaUpdateWrapper<ScenePlus> plusUpdateWrapper = new LambdaUpdateWrapper<ScenePlus>()
-                    .set(ScenePlus::getSceneStatus, -2).eq(ScenePlus::getNum, projectNum);
-            scenePlusService.update(plusUpdateWrapper);
-        }
+                ScenePlus scenePlus = scenePlusService.getScenePlusByNum(projectNum);
+                if(!ObjectUtils.isEmpty(scenePlus)){
+                    LambdaUpdateWrapper<ScenePlus> plusUpdateWrapper = new LambdaUpdateWrapper<ScenePlus>()
+                            .set(ScenePlus::getSceneStatus, -2).eq(ScenePlus::getNum, projectNum);
+                    scenePlusService.update(plusUpdateWrapper);
+                }
+
+            // 如果未升级V4,则升级V4
+            if("v3".equals(version)){
+                fdkkV4Service.upgradeToV4(projectNum);
+            }
+
+            success = true;
 
-        // 如果未升级V4,则升级V4
-        if("v3".equals(version)){
-            fdkkV4Service.upgradeToV4(projectNum);
+        }catch (Exception e){
+            log.error("生成OBJ场景计算结果处理异常,num=" + projectNum, e);
+            throw e;
+        }finally {
+            if(!success){
+                buildSceneDTService.handBaseFail("生成OBJ场景计算结果处理异常", message.getPath(), projectNum, "计算控制服务器");
+            }
         }
     }
 

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

@@ -2,6 +2,7 @@ package com.fdkankan.contro.mq.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileNameUtil;
 import cn.hutool.core.util.StrUtil;
@@ -28,6 +29,7 @@ import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.model.constants.ConstantFileName;
 import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import com.fdkankan.model.constants.UploadFilePath;
 import com.fdkankan.model.enums.ModelTypeEnums;
 import com.fdkankan.model.utils.CreateHouseJsonUtil;
@@ -72,6 +74,12 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     @Value("${queue.modeling.single.modeling-call}")
     private String singleModelingCall;
 
+    @Value("${queue.modeling.modeling-pre}")
+    private String queueModelingPre;
+
+    @Value("${queue.modeling.modeling-post}")
+    private String queueModelingPost;
+
     @Value("${model.type:#{null}}")
     private String modelType;
 
@@ -122,10 +130,13 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     private ISceneAsynOperLogService sceneAsynOperLogService;
     @Autowired
     private ICommonService commonService;
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
-    public void buildScenePre(BuildSceneCallMessage message) {
+    public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
+        String num = message.getSceneNum();
         try {
             //重新计算时需要删除文件夹,否知使用缓存
             if(new File(message.getPath() + File.separator + "results").exists()){
@@ -175,7 +186,8 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
-            log.error("场景计算前置处理出错", e);
+            log.error("场景计算前置处理出错,num"+num, e);
+            throw e;
         }finally {
             //如果前置处理失败,发送钉钉消息
             if(!success){
@@ -343,8 +355,9 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             log.info("场景计算结果处理结束,场景码:{}", sceneCode);
 
         }catch (Exception e){
-            log.error("场景计算结果处理出错!", e);
+            log.error("场景计算结果处理出错,num"+sceneCode, e);
             buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
+            throw e;
         }
     }
 

+ 21 - 9
src/main/java/com/fdkankan/contro/mq/service/impl/BuildV3SceneServiceImpl.java

@@ -1,6 +1,7 @@
 package com.fdkankan.contro.mq.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.file.FileNameUtil;
 import cn.hutool.core.util.StrUtil;
@@ -10,6 +11,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.common.constant.ExpiredStatus;
 import com.fdkankan.common.constant.ModelKind;
 import com.fdkankan.common.constant.PayStatus;
@@ -24,6 +26,7 @@ import com.fdkankan.fyun.constant.FYunTypeEnum;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import com.fdkankan.model.constants.ConstantFileName;
 import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import com.fdkankan.model.constants.UploadFilePath;
 import com.fdkankan.model.utils.CreateHouseJsonUtil;
 import com.fdkankan.model.utils.CreateObjUtil;
@@ -64,6 +67,9 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
     @Value("${queue.modeling.v3.modeling-post}")
     private String queueV3ModelingPost;
 
+    @Value("${queue.modeling.v3.modeling-pre}")
+    private String queueV3ModelingPre;
+
     @Value("${model.type:#{null}}")
     private String modelSceneKind;
 
@@ -101,10 +107,13 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
 
     @Autowired
     private ISceneProEditService sceneProEditService;
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
     public void buildScenePre(BuildSceneCallMessage message) {
         boolean success = false;
+        String num = message.getSceneNum();
         try {
 
             //重新计算时需要删除文件夹,否知使用缓存
@@ -149,7 +158,8 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
-            log.error("场景计算前置处理出错", e);
+            log.error("场景计算前置处理出错,num="+num, e);
+            throw e;
         }finally {
             //如果前置处理失败,发送钉钉消息
             if(!success){
@@ -178,16 +188,17 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
 
     @Override
     public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
-        Integer cameraType = Integer.parseInt(message.getBuildContext().get("cameraType").toString());
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
-        Long computeTime = message.getComputeTime();
+        try {
 
-        String path = message.getPath();
+            Integer cameraType = Integer.parseInt(message.getBuildContext().get("cameraType").toString());
+            Long computeTime = message.getComputeTime();
 
-        Boolean buildSuccess = message.getBuildSuccess();
-        JSONObject fdageData = getFdageData(path + File.separator + "capture" +File.separator+"data.fdage");
-        Integer videoVersion = fdageData.getInteger("videoVersion");
-        try {
+            String path = message.getPath();
+
+            Boolean buildSuccess = message.getBuildSuccess();
+            JSONObject fdageData = getFdageData(path + File.separator + "capture" +File.separator+"data.fdage");
+            Integer videoVersion = fdageData.getInteger("videoVersion");
             // 上传计算日志
             //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
             log.info("开始上传计算日志");
@@ -290,8 +301,9 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
             }
 
         }catch (Exception e){
-            log.error("场景计算结果处理出错!", e);
+            log.error("场景计算结果处理出错,num"+sceneCode, e);
             buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
+            throw e;
         }
     }
 

+ 20 - 0
src/main/java/com/fdkankan/contro/service/ISceneBuildProcessLogService.java

@@ -0,0 +1,20 @@
+package com.fdkankan.contro.service;
+
+import com.fdkankan.contro.entity.SceneBuildProcessLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 场景计算流程状态表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+public interface ISceneBuildProcessLogService extends IService<SceneBuildProcessLog> {
+
+    public void clearSceneBuildProcessLog(String num, String process, String queueName);
+
+    public void saveSceneBuildProcessLog(String num, String process, String queueName, int status, String reason);
+
+}

+ 50 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneBuildProcessLogServiceImpl.java

@@ -0,0 +1,50 @@
+package com.fdkankan.contro.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.fdkankan.contro.entity.SceneBuildProcessLog;
+import com.fdkankan.contro.mapper.ISceneBuildProcessLogMapper;
+import com.fdkankan.contro.service.ISceneBuildProcessLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+/**
+ * <p>
+ * 场景计算流程状态表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-01-28
+ */
+@Service
+public class SceneBuildProcessLogServiceImpl extends ServiceImpl<ISceneBuildProcessLogMapper, SceneBuildProcessLog> implements ISceneBuildProcessLogService {
+
+
+    @Override
+    public void clearSceneBuildProcessLog(String num, String process, String queueName) {
+        this.remove(new LambdaQueryWrapper<SceneBuildProcessLog>()
+                .eq(SceneBuildProcessLog::getNum, num)
+                .eq(SceneBuildProcessLog::getProcess, process)
+                .eq(SceneBuildProcessLog::getQueueName, queueName));
+    }
+
+    @Override
+    public void saveSceneBuildProcessLog(String num, String process, String queueName, int status, String reason) {
+
+        SceneBuildProcessLog log = this.getOne(new LambdaQueryWrapper<SceneBuildProcessLog>()
+                .eq(SceneBuildProcessLog::getNum, num)
+                .eq(SceneBuildProcessLog::getProcess,process)
+                .eq(SceneBuildProcessLog::getQueueName, queueName));
+        if(Objects.isNull(log)){
+            log = new SceneBuildProcessLog();
+        }
+        log.setNum(num);
+        log.setProcess(process);
+        log.setProcess(process);
+        log.setQueueName(queueName);
+        log.setState(status);
+        log.setReason(reason);
+        this.saveOrUpdate(log);
+    }
+}

+ 5 - 0
src/main/resources/mapper/contro/SceneBuildProcessLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.contro.mapper.ISceneBuildProcessLogMapper">
+
+</mapper>