Przeglądaj źródła

Merge branch 'release-知象光电' into test

# Conflicts:
#	src/main/java/com/fdkankan/contro/generate/AutoGenerate.java
#	src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java
dengsixing 2 tygodni temu
rodzic
commit
b745efe845

+ 57 - 0
src/main/java/com/fdkankan/contro/entity/SceneZxgd.java

@@ -0,0 +1,57 @@
+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 2025-12-04
+ */
+@Getter
+@Setter
+@TableName("t_scene_zxgd")
+public class SceneZxgd implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @TableField("title")
+    private String title;
+
+    @TableField("unicode")
+    private String unicode;
+
+    @TableField("file_id")
+    private String fileId;
+
+    @TableField("url")
+    private String url;
+
+    @TableField("status")
+    private Integer status;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A", delval = "I")
+    private String recStatus;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+
+}

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

@@ -0,0 +1,18 @@
+package com.fdkankan.contro.mapper;
+
+import com.fdkankan.contro.entity.SceneZxgd;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 知象光电 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2025-12-04
+ */
+@Mapper
+public interface ISceneZxgdMapper extends BaseMapper<SceneZxgd> {
+
+}

+ 123 - 0
src/main/java/com/fdkankan/contro/mq/listener/BuildZXGDListener.java

@@ -0,0 +1,123 @@
+package com.fdkankan.contro.mq.listener;
+
+import cn.hutool.core.exceptions.ExceptionUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
+import com.fdkankan.contro.mq.service.impl.BuildE57SceneServiceImpl;
+import com.fdkankan.contro.mq.service.impl.BuildZXGDSceneServiceImpl;
+import com.fdkankan.contro.service.ICommonService;
+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;
+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 org.springframework.util.ObjectUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+
+@Slf4j
+@Component
+public class BuildZXGDListener {
+
+    private static final String bizType = "zxgd";
+
+    @Value("${queue.modeling.zxgd.modeling-pre:zxgd-modeling-pre}")
+    private String queueModelingPre;
+
+    @Value("${queue.modeling.zxgd.modeling-post:zxgd-modeling-post}")
+    private String queueModelingPost;
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
+    @Autowired
+    private ICommonService commonService;
+    @Autowired
+    private BuildZXGDSceneServiceImpl buildSceneService;
+
+
+    /**
+     * 场景计算前置资源准备处理
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.modeling.zxgd.modeling-pre:zxgd-modeling-pre}"),
+            concurrency = "${maxThread.modeling.modeling-pre}"
+    )
+    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+        String messageId = message.getMessageProperties().getMessageId();
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        HashMap<String, Object> map = JSON.parseObject(msg, HashMap.class);
+        String num = (String) map.get("unicode");
+        map.put("bizType", "zxgd");
+
+        log.info("开始准备知象光电计算资源,队列名:{},id:{},消息体:{}", queueModelingPre, messageId, msg);
+        BuildSceneCallMessage buildSceneMessage = new BuildSceneCallMessage();
+        buildSceneMessage.setSceneNum(num);
+        buildSceneMessage.setExt(map);
+        buildSceneMessage.setBuildType("V3");
+        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(), queueModelingPre, bizType);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.WAITING.code(), null, bizType);
+            buildSceneService.buildScenePre(buildSceneMessage);
+            commonService.saveMqSendLog(null, buildSceneMessage, 0);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.SUCCESS.code(), null,bizType);
+        }catch (Exception e){
+            log.error("知象光电计算前置处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000), bizType);
+        }
+        log.info("准备知象光电计算资源完成,队列名:{},id:{},消息体:{}", queueModelingPre, messageId, msg);
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+    }
+
+    /**
+     * 场景计算后置结果处理
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.modeling.zxgd.modeling-post:zxgd-modeling-post}"),
+            concurrency = "${maxThread.modeling.modeling-post}"
+    )
+    public void buildScenePostHandler(Channel channel, Message message) throws Exception {
+        String messageId = message.getMessageProperties().getMessageId();
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        log.info("场景计算完成,开始处理e57计算结果,队列名:{},id:{},消息体:{}", queueModelingPost, messageId, msg);
+        BuildSceneResultMqMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
+        String num = buildSceneMessage.getBuildContext().get("sceneNum").toString();
+        try {
+            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueModelingPost, bizType);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.WAITING.code(), null, bizType);
+            buildSceneService.buildScenePost(buildSceneMessage);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.SUCCESS.code(), null, bizType);
+        }catch (Exception e){
+            log.error("场景计算结果处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000), bizType);
+        }
+        log.info("场景计算结果处理完成,队列名:{},id:{},消息体:{}", queueModelingPost, messageId, msg);
+        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+
+    }
+}

+ 157 - 0
src/main/java/com/fdkankan/contro/mq/service/impl/BuildZXGDSceneServiceImpl.java

@@ -0,0 +1,157 @@
+package com.fdkankan.contro.mq.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ZipUtil;
+import com.alibaba.fastjson.JSON;
+import com.fdkankan.common.constant.CommonSuccessStatus;
+import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.entity.ScenePlusExt;
+import com.fdkankan.contro.mq.service.IBuildSceneService;
+import com.fdkankan.contro.service.IBuildSceneDTService;
+import com.fdkankan.contro.service.IBuildService;
+import com.fdkankan.contro.service.IScenePlusExtService;
+import com.fdkankan.contro.service.IScenePlusService;
+import com.fdkankan.fyun.config.FYunFileConfig;
+import com.fdkankan.fyun.face.FYunFileServiceInterface;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.model.constants.UploadFilePath;
+import com.fdkankan.model.utils.CreateObjUtil;
+import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
+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.cloud.context.config.annotation.RefreshScope;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/4/20
+ **/
+@Slf4j
+@Service
+@RefreshScope
+public class BuildZXGDSceneServiceImpl implements IBuildSceneService {
+    public static final String logUrlFormat = "**algorithm-log**: [%sbuild_log/%s/zxgd/console.log](%sbuild_log/%s/zxgd/console.log)";
+
+    @Value("${queue.modeling.e57.modeling-post}")
+    private String queueModelingPost;
+    @Value("${model.type:#{null}}")
+    private String modelType;
+    @Value("${env:gn}")
+    private String env;
+    @Value("#{'${build.scene.post.not-delete-nas-nums:}'.split(',')}")
+    private List<String> notDeleteNasNumList;
+    @Value("${queue.application.laser.e57-modeling-done:e57-modeling-done}")
+    private String queueE57ModelingDone;
+    @Autowired
+    private RabbitMqProducer mqProducer;
+    @Resource
+    private FYunFileServiceInterface fYunFileService;
+    @Autowired
+    private FYunFileConfig fYunFileConfig;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IScenePlusExtService scenePlusExtService;
+    @Autowired
+    private IBuildSceneDTService buildSceneDTService;
+    @Autowired
+    private IBuildService buildService;
+
+    @Override
+    public void buildScenePre(BuildSceneCallMessage message) throws Exception{
+        String num = message.getSceneNum();
+        try {
+            String dataSource = (String)message.getExt().get("path");
+            String bizType = (String)message.getExt().get("bizType");
+            String path = dataSource + "_" + bizType;
+            message.setPath(dataSource);
+
+            //下载资源到本地
+            this.downLoadSource(message, path);
+
+            //发送mq,就进行计算
+            message.setPath(path);
+            message.setResultReceiverMqName(queueModelingPost);
+            message.setBizType(bizType);
+            message.getExt().put("shPath", "/home/ubuntu/bin_sx/Launcher.sh");
+
+            //写入算法参数文件
+            Map<String, String> dataMap = new HashMap<>();
+            dataMap.put("splitType", "SPLIT_V33");
+            dataMap.put("skyboxType", "SKYBOX_V11");
+            buildService.writeDataJson(message, null, dataMap, null);
+
+            log.info("知象光电计算资源准备结束,场景码:{}", message.getSceneNum());
+
+        }catch (Exception e){
+            log.error("知象光电计算前置处理出错,num"+num, e);
+            buildSceneDTService.handBaseFail("知象光电计算资源准备异常!", message.getPath(), num, "计算控制服务器");
+            throw e;
+        }
+    }
+
+    private String getOssPath(String path) {
+        String ossPath = ConstantFilePath.OSS_PREFIX
+                + path.replace(ConstantFilePath.BUILD_MODEL_PATH, "")
+                .replace(ConstantFilePath.BUILD_MODEL_LASER_PATH, "");
+        if (!ossPath.endsWith("/")) {
+            ossPath = ossPath.concat("/");
+        }
+        return ossPath;
+    }
+
+    @Override
+    public void downLoadSource(BuildSceneCallMessage buildSceneMqMessage,String path){
+        String ossPath = getOssPath(buildSceneMqMessage.getPath());
+        fYunFileService.downloadFileByCommand(path + "/capture", ossPath);
+    }
+
+    @Override
+    public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
+        Map<String, Object> ext = message.getExt();
+        String unicode = (String) ext.get("unicode");
+        String path = message.getPath();
+        try {
+            // 上传计算日志
+            //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
+            log.info("开始上传计算日志");
+            String buildLogPath = String.format(UploadFilePath.BUILD_LOG_PATH, unicode) + "zxgd/";
+            fYunFileService.uploadFile(path + File.separator + "console.log", buildLogPath + "console.log");
+            log.info("计算日志上传完成");
+            if (!message.getBuildSuccess()) {
+                // 发送钉钉消息,计算失败
+                String logUrl = String.format(logUrlFormat,fYunFileConfig.getHost(),unicode,fYunFileConfig.getHost(),unicode);
+                buildSceneDTService.handModelFail("计算知象光电", message.getPath(), unicode, message.getHostName(), logUrl);
+                return;
+            }
+
+            //压缩e57
+            String ossKey = "zxgd/" + unicode + "/mesh.ply";
+            String plyPath = path + "/results/mesh.ply";
+            fYunFileService.uploadFileByCommand(plyPath, ossKey);
+
+            CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/"));
+
+            log.info("知象光电计算结果处理结束,场景码:{}", unicode);
+        }catch (Exception e){
+            log.error("知象光电计算结果处理出错,unicode"+unicode, e);
+            buildSceneDTService.handBaseFail("知象光电计算结果处理出错!", message.getPath(), unicode, "计算控制服务器");
+            throw e;
+        }
+    }
+
+}

+ 19 - 0
src/main/java/com/fdkankan/contro/service/ISceneZxgdService.java

@@ -0,0 +1,19 @@
+package com.fdkankan.contro.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.contro.entity.SceneZxgd;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 知象光电 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2025-12-04
+ */
+public interface ISceneZxgdService extends IService<SceneZxgd> {
+
+    void upload(String fileId, JSONObject dataFdage);
+
+}

+ 6 - 1
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -208,6 +208,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     private IWbService wbService;
     @Autowired
     private IRelocationBindService relocationBindService;
+    @Autowired
+    private ISceneZxgdService sceneZxgdService;
 
     @Override
     public SceneFileBuild findByFileId(String fileId) {
@@ -869,9 +871,12 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             log.info("data.fdage文件为空");
             throw new BusinessException(CameraConstant.FAILURE_6009);
         }
+        if(fdageJson.getIntValue("zxState.") == 1){
+            sceneZxgdService.upload(fileId, fdageJson);
+            return ResultData.ok();
+        }
 
         this.removeUpdateV4(ConstantFilePath.OSS_PREFIX + prefixBuffer + "data.fdage", fdageJson);
-
         String buildType = "V3";
         //13表示转台
         Long cameraType = 13L;

+ 65 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneZxgdServiceImpl.java

@@ -0,0 +1,65 @@
+package com.fdkankan.contro.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.contro.entity.SceneZxgd;
+import com.fdkankan.contro.mapper.ISceneZxgdMapper;
+import com.fdkankan.contro.service.ISceneZxgdService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fdkankan.model.constants.ConstantFilePath;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+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;
+
+/**
+ * <p>
+ * 知象光电 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2025-12-04
+ */
+@Service
+public class SceneZxgdServiceImpl extends ServiceImpl<ISceneZxgdMapper, SceneZxgd> implements ISceneZxgdService {
+
+    @Value("${queue.modeling.zxgd.modeling-pre:zxgd-modeling-pre}")
+    private String queueModelingPre;
+    @Resource
+    private RabbitMqProducer mqProducer;
+
+    @Override
+    public void upload(String fileId, JSONObject dataFdage) {
+        String title = dataFdage.getString("title");
+        String snCode = dataFdage.getString("creator");
+        String unicode = snCode + "_" + dataFdage.getString("uuidtime");
+
+        //计算中的不允许提交申请
+        Long count = lambdaQuery().eq(SceneZxgd::getUnicode, unicode).eq(SceneZxgd::getFileId, fileId).count();
+        if(count > 0){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5033);
+        }
+
+        //先清空历史记录
+        lambdaUpdate().eq(SceneZxgd::getUnicode, unicode).eq(SceneZxgd::getFileId, fileId).remove();
+
+        //插入新的历史
+        SceneZxgd sceneZxgd = new SceneZxgd();
+        sceneZxgd.setUnicode(unicode);
+        sceneZxgd.setFileId(fileId);
+        sceneZxgd.setTitle(title);
+        this.save(sceneZxgd);
+
+        //发送通知开始计算
+        JSONObject content = new JSONObject();
+        content.put("fileId", fileId);
+        content.put("unicode", unicode);
+        content.put("path", ConstantFilePath.BUILD_MODEL_PATH + snCode + File.separator + fileId + File.separator + unicode);
+        mqProducer.sendByWorkQueue(queueModelingPre, content);
+    }
+
+}

+ 5 - 0
src/main/resources/mapper/contro/SceneZxgdMapper.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.ISceneZxgdMapper">
+
+</mapper>