xiewj пре 4 месеци
родитељ
комит
b2192a5526
35 измењених фајлова са 3897 додато и 964 уклоњено
  1. 52 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/ConsumerApplicationRunner.java
  2. 6 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/constant/RedisKey.java
  3. 106 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/constant/SysConstants.java
  4. 61 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/entity/MqEcs.java
  5. 70 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/entity/MqSendLog.java
  6. 66 64
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/DoSliceListener.java
  7. 677 666
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/SceneListener.java
  8. 92 90
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/SceneMigrateListener.java
  9. 80 78
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/ScenePayStatusListener.java
  10. 53 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/DoSliceQueueListener.java
  11. 70 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/PanoMigrateSceneQueueListener.java
  12. 67 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/PanoPayStatusSceneQueueListener.java
  13. 128 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/RabbitMQConfig.java
  14. 225 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/SceneQueueListener.java
  15. 592 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/SceneWorkQueueListener.java
  16. 18 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/mapper/IMqEcsMapper.java
  17. 18 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/mapper/IMqSendLogMapper.java
  18. 40 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/receiver/QueueNameService.java
  19. 24 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/IMqEcsService.java
  20. 23 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/IMqSendLogService.java
  21. 58 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/impl/MqEcsServiceImpl.java
  22. 55 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/impl/MqSendLogServiceImpl.java
  23. 1190 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/util/RedisUtil.java
  24. 18 0
      720yun_fd_consumer/gis_consumer/src/main/java/com/gis/util/testUtil.java
  25. 38 32
      720yun_fd_consumer/gis_consumer/src/main/resources/application-loc-site.yml
  26. 1 1
      720yun_fd_consumer/gis_consumer/src/main/resources/application-locsitSD.yml
  27. 1 1
      720yun_fd_consumer/gis_consumer/src/main/resources/application-pro.yml
  28. 4 4
      720yun_fd_consumer/gis_consumer/src/main/resources/application-proAws.yml
  29. 36 22
      720yun_fd_consumer/gis_consumer/src/main/resources/application-sit.yml
  30. 1 1
      720yun_fd_consumer/gis_consumer/src/main/resources/application-sitAws.yml
  31. 1 1
      720yun_fd_consumer/gis_consumer/src/main/resources/application-sitSD.yml
  32. 4 0
      720yun_fd_consumer/gis_consumer_oss/pom.xml
  33. 6 2
      720yun_fd_consumer/pom.xml
  34. 14 1
      720yun_fd_consumer/remark.md
  35. 2 1
      720yun_fd_consumer/run.sh

+ 52 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/ConsumerApplicationRunner.java

@@ -0,0 +1,52 @@
+//package com.gis;
+//
+//import cn.hutool.core.io.FileUtil;
+//import cn.hutool.core.util.ObjUtil;
+//import cn.hutool.core.util.StrUtil;
+//import cn.hutool.extra.spring.SpringUtil;
+//import com.gis.entity.MqEcs;
+//import com.gis.service.IMqEcsService;
+//import com.gis.service.impl.MqEcsServiceImpl;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.boot.CommandLineRunner;
+//
+///**
+// * @author Xiewj
+// * @date 2025/3/18
+// */
+//@Slf4j
+//
+//public class ConsumerApplicationRunner  implements CommandLineRunner {
+//
+//    @Value("${mq.listener.dynamic}")
+//    public  boolean dynamic;
+//
+//
+//
+//    @Override
+//    public void run(String... args) throws Exception {
+//        if (dynamic){
+//            log.info("动态弹性启动");
+//            String host="/opt/hosts/hosts.txt";
+//            String ecs_name = FileUtil.readString(host, "UTF-8");
+//            if (StrUtil.isNotEmpty(ecs_name)){
+//                IMqEcsService mqEcsService = SpringUtil.getBean(IMqEcsService.class);
+//                MqEcs lastEcs = mqEcsService.getLastEcs();
+//                if (ObjUtil.isNotEmpty(lastEcs)){
+//                    lastEcs.setEcsName(ecs_name);
+//                    boolean b = mqEcsService.updateMqEcs(lastEcs);
+//                    if (b){
+//                        log.info("更新成功");
+//                    }
+//                }
+//            }
+//
+//
+//        }else {
+//            log.info("正常启动");
+//
+//        }
+//    }
+//}

+ 6 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/constant/RedisKey.java

@@ -0,0 +1,6 @@
+package com.gis.constant;
+
+public class RedisKey {
+    public static String modelingKey = "4dkankan:modeling:scaling:hostname:%s";
+    public static String ecsStopKey = "4dkankan:modeling:scaling:hostname:stop:%s";
+}

+ 106 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/constant/SysConstants.java

@@ -0,0 +1,106 @@
+package com.gis.constant;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjUtil;
+import com.gis.entity.MqEcs;
+import com.gis.service.IMqEcsService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.core.env.StandardEnvironment;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+@Component
+@Slf4j
+public class SysConstants implements ApplicationContextAware {
+    public static String hostName;
+    public static int modelTimeOut;
+
+    @Value("${mq.listener.dynamic}")
+    public static boolean dynamic;
+
+    @Value("${hostName.filePath:/opt/hosts/hosts.txt}")
+    public void setHostName(String filePath){
+        try {
+            if (FileUtil.exist(filePath)){
+                SysConstants.hostName = FileUtil.readUtf8String(filePath);
+                // 去除空格
+                if(!ObjectUtils.isEmpty(SysConstants.hostName)){
+                    SysConstants.hostName = SysConstants.hostName.trim().replaceAll("\\s","");
+                }
+                log.error("从文件({})中获取服务器名称:{}", filePath,hostName);
+                String queueName = initIsResidenceService();
+                log.info("initIsResidenceService--hostName:{},queueName:{}",SysConstants.hostName,queueName);
+            }else {
+                SysConstants.hostName ="";
+            }
+
+        } catch (Exception e) {
+            log.error("从文件中获取服务器名称失败,文件路径{}", filePath);
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 默认超时时间2天
+     * @param timeOut
+     */
+    @Value("${model.timeOut:48}")
+    public void setModelTimeOut(int timeOut){
+        SysConstants.modelTimeOut = timeOut;
+    }
+
+    @Autowired
+    IMqEcsService mqEcsService;
+
+    @Value("${queue.scene-queue-work}")
+    private String queueNameDf;
+
+
+    public String initIsResidenceService() {
+        if(StringUtils.isEmpty(SysConstants.hostName)){
+            return queueNameDf;
+        }
+        MqEcs mqEcs = mqEcsService.getByHostName(SysConstants.hostName);
+        if(mqEcs == null){
+            mqEcs = mqEcsService.getLastEcs();
+            if (ObjUtil.isNull(mqEcs)){
+                log.info("获取LastEcs为空,返回默认监听队列-{}",queueNameDf);
+                return queueNameDf;
+            }
+            mqEcs.setEcsName(SysConstants.hostName);
+            mqEcs.setUpdateTime(new Date());
+            mqEcsService.updateById(mqEcs);
+        }
+        return mqEcs.getQueueName();
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext context) throws BeansException {
+        Map<String,Object> params = new HashMap<>();
+        if (dynamic) {
+            params.put("mq.consumerPriority",1);
+
+        } else {
+            params.put("mq.consumerPriority",0);
+        }
+        ((StandardEnvironment)context.getEnvironment()).getPropertySources()
+                .addLast(new MapPropertySource("mq.consumerPriority",params));
+    }
+}

+ 61 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/entity/MqEcs.java

@@ -0,0 +1,61 @@
+package com.gis.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+@TableName("mq_ecs")
+public class MqEcs implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @TableField("ecs_name")
+    private String ecsName;
+
+    @TableField("queue_name")
+    private String queueName;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("remark")
+    private String remark;
+
+    /**
+     * 0运行中未计算,1运行中计算中,2停止运行
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 是否是弹性伸缩0否1是
+     */
+    @TableField("is_scaling")
+    private Integer isScaling;
+
+    @TableField("rec_status")
+    @TableLogic(value = "A",delval = "I")
+    private String recStatus;
+
+    // 默认 4dkk,pano 全景看看
+    private String type;
+}

+ 70 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/entity/MqSendLog.java

@@ -0,0 +1,70 @@
+package com.gis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Getter
+@Setter
+@TableName("mq_send_log")
+public class MqSendLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 发送的队列
+     */
+    @TableField("queue")
+    private String queue;
+
+    /**
+     * 发送的mq消息
+     */
+    @TableField("content")
+    private String content;
+
+    @TableField("num")
+    private String num;
+
+
+    /**
+     * 0未发送,1已发送
+     */
+    @TableField("status")
+    private Integer status;
+
+    @TableField("create_time")
+    private Date createTime;
+
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 计算顺序
+     */
+    @TableField("sort")
+    private Integer sort;
+
+    @TableField(exist = false)
+    private Integer configId;
+
+    // 默认 4dkk pano 全景看看
+    private String type;
+}

+ 66 - 64
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/DoSliceListener.java

@@ -1,64 +1,66 @@
-package com.gis.listener;
-
-import com.alibaba.fastjson.JSONObject;
-import com.gis.dto.DoSliceDTO;
-import com.gis.service.FodderService;
-import com.rabbitmq.client.Channel;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-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 org.springframework.util.ObjectUtils;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 消息监听器
- *
- * @author Xiewj
- * @version 1.0
- * @since 2023/08/07
- */
-@Component
-@Slf4j
-public class DoSliceListener {
-    @Autowired
-    FodderService fodderService;
-
-    /**
-     * 全景场景初始化方法
-     *
-     * @param channel
-     * @param message
-     * @throws Exception the io exception  这里异常需要处理
-     */
-    @RabbitListener(
-            queuesToDeclare = @Queue("${queue.do-slice-queue}"),concurrency = "2"
-    )
-    public void doSliceQueue(Channel channel, Message message) throws IOException {
-        if (ObjectUtils.isEmpty(message.getBody())) {
-            log.error("消息内容为空,退出构建,当前服务器id:{}" );
-            return;
-        }
-        String traceId = System.currentTimeMillis()+"";
-        MDC.put("TRACE_ID", traceId);
-        long deliveryTag = message.getMessageProperties().getDeliveryTag();
-        try {
-            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-            String messageId = message.getMessageProperties().getMessageId();
-            log.info("场景doSliceQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
-            DoSliceDTO dto = JSONObject.parseObject(msg, DoSliceDTO.class);
-            fodderService.doSlice(dto.getId(), traceId);
-            channel.basicAck(deliveryTag, false);
-        }catch (Exception e){
-            e.printStackTrace();
-            channel.basicAck(deliveryTag, false);
-            log.error("场景doSliceQueue报错{}",e.getMessage());
-        }
-
-    }
-}
+//package com.gis.listener;
+//
+//import com.alibaba.fastjson.JSONObject;
+//import com.gis.dto.DoSliceDTO;
+//import com.gis.service.FodderService;
+//import com.rabbitmq.client.Channel;
+//import lombok.extern.slf4j.Slf4j;
+//import org.slf4j.MDC;
+//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.context.annotation.Conditional;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.ObjectUtils;
+//
+//import java.io.IOException;
+//import java.nio.charset.StandardCharsets;
+//
+///**
+// * 消息监听器
+// *
+// * @author Xiewj
+// * @version 1.0
+// * @since 2023/08/07
+// */
+//@Component
+//@Slf4j
+//public class DoSliceListener {
+//    @Autowired
+//    FodderService fodderService;
+//
+//    /**
+//     * 全景场景初始化方法
+//     *
+//     * @param channel
+//     * @param message
+//     * @throws Exception the io exception  这里异常需要处理
+//     */
+//    @RabbitListener(
+//            queuesToDeclare = @Queue("${queue.do-slice-queue}"),concurrency = "2"
+//    )
+//    @Conditional(NonDynamicListenerCondition.class)
+//    public void doSliceQueue(Channel channel, Message message) throws IOException {
+//        if (ObjectUtils.isEmpty(message.getBody())) {
+//            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+//            return;
+//        }
+//        String traceId = System.currentTimeMillis()+"";
+//        MDC.put("TRACE_ID", traceId);
+//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+//        try {
+//            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+//            String messageId = message.getMessageProperties().getMessageId();
+//            log.info("场景doSliceQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+//            DoSliceDTO dto = JSONObject.parseObject(msg, DoSliceDTO.class);
+//            fodderService.doSlice(dto.getId(), traceId);
+//            channel.basicAck(deliveryTag, false);
+//        }catch (Exception e){
+//            e.printStackTrace();
+//            channel.basicAck(deliveryTag, false);
+//            log.error("场景doSliceQueue报错{}",e.getMessage());
+//        }
+//
+//    }
+//}

Разлика између датотеке није приказан због своје велике величине
+ 677 - 666
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/SceneListener.java


+ 92 - 90
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/SceneMigrateListener.java

@@ -1,90 +1,92 @@
-package com.gis.listener;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.gis.constant.ConfigConstant;
-import com.gis.dto.OpenSceneMigrateDto;
-import com.gis.entity.WorkEntity;
-import com.gis.mq.RabbitMqProducerUtil;
-import com.gis.oss.util.FileAndOssUtil;
-import com.gis.service.ScenePanoService;
-import com.gis.service.WorkService;
-import com.gis.util.QrCodeUtils;
-import com.rabbitmq.client.Channel;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-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 org.springframework.util.ObjectUtils;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 消息监听器
- *
- * @author Xiewj
- * @version 1.0
- * @since 2023/08/07
- */
-@Component
-@Slf4j
-public class SceneMigrateListener {
-
-    @Autowired
-    ConfigConstant configConstant;
-    @Autowired
-    FileAndOssUtil fileAndOssUtil;
-    @Autowired
-    WorkService workService;
-    @Autowired
-    QrCodeUtils qrCodeUtils;
-    @Autowired
-    ScenePanoService scenePanoService;
-    @Autowired
-    RabbitMqProducerUtil rabbitMqProducerUtil;
-    /**
-     * 全景场景初始化方法
-     *
-     * @param channel
-     * @param message
-     * @throws Exception the io exception  这里异常需要处理
-     */
-    @RabbitListener(
-            queuesToDeclare = @Queue("${queue.pano-migrate-scene-queue}"),concurrency = "1"
-    )
-    public void migrateSceneQueue(Channel channel, Message message) throws IOException {
-            if (ObjectUtils.isEmpty(message.getBody())) {
-                log.error("消息内容为空,退出构建,当前服务器id:{}" );
-                return;
-            }
-        String traceId = System.currentTimeMillis()+"";
-        MDC.put("TRACE_ID", traceId);
-        long deliveryTag = message.getMessageProperties().getDeliveryTag();
-        try {
-            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-            String messageId = message.getMessageProperties().getMessageId();
-            log.info("场景migrateSceneQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
-            OpenSceneMigrateDto param = JSONObject.parseObject(JSON.parse(msg).toString(), OpenSceneMigrateDto.class);
-            if (StrUtil.isNotEmpty(param.getSceneCode())&&StrUtil.isEmpty(param.getSnCode())) {
-                WorkEntity workEntity=workService.findByNum(param.getSceneCode());
-                if (ObjectUtil.isNotNull(workEntity)) {
-                    workEntity.setSnCode(param.getToSnCode());
-                    workEntity.setUserId(param.getPhone());
-                    workService.updateById(workEntity);
-                }
-            }
-        }catch (Exception e){
-            channel.basicAck(deliveryTag, false);
-            log.error("场景migrateSceneQueue报错{}",e.getMessage());
-            e.printStackTrace();
-        }
-        channel.basicAck(deliveryTag, false);
-    }
-
-}
+//package com.gis.listener;
+//
+//import cn.hutool.core.util.ObjectUtil;
+//import cn.hutool.core.util.StrUtil;
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.gis.constant.ConfigConstant;
+//import com.gis.dto.OpenSceneMigrateDto;
+//import com.gis.entity.WorkEntity;
+//import com.gis.mq.RabbitMqProducerUtil;
+//import com.gis.oss.util.FileAndOssUtil;
+//import com.gis.service.ScenePanoService;
+//import com.gis.service.WorkService;
+//import com.gis.util.QrCodeUtils;
+//import com.rabbitmq.client.Channel;
+//import lombok.extern.slf4j.Slf4j;
+//import org.slf4j.MDC;
+//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.context.annotation.Conditional;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.ObjectUtils;
+//
+//import java.io.IOException;
+//import java.nio.charset.StandardCharsets;
+//
+///**
+// * 消息监听器
+// *
+// * @author Xiewj
+// * @version 1.0
+// * @since 2023/08/07
+// */
+//@Component
+//@Slf4j
+//public class SceneMigrateListener {
+//
+//    @Autowired
+//    ConfigConstant configConstant;
+//    @Autowired
+//    FileAndOssUtil fileAndOssUtil;
+//    @Autowired
+//    WorkService workService;
+//    @Autowired
+//    QrCodeUtils qrCodeUtils;
+//    @Autowired
+//    ScenePanoService scenePanoService;
+//    @Autowired
+//    RabbitMqProducerUtil rabbitMqProducerUtil;
+//    /**
+//     * 全景场景初始化方法
+//     *
+//     * @param channel
+//     * @param message
+//     * @throws Exception the io exception  这里异常需要处理
+//     */
+//    @RabbitListener(
+//            queuesToDeclare = @Queue("${queue.pano-migrate-scene-queue}"),concurrency = "1"
+//    )
+//    @Conditional(NonDynamicListenerCondition.class)
+//    public void migrateSceneQueue(Channel channel, Message message) throws IOException {
+//            if (ObjectUtils.isEmpty(message.getBody())) {
+//                log.error("消息内容为空,退出构建,当前服务器id:{}" );
+//                return;
+//            }
+//        String traceId = System.currentTimeMillis()+"";
+//        MDC.put("TRACE_ID", traceId);
+//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+//        try {
+//            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+//            String messageId = message.getMessageProperties().getMessageId();
+//            log.info("场景migrateSceneQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+//            OpenSceneMigrateDto param = JSONObject.parseObject(JSON.parse(msg).toString(), OpenSceneMigrateDto.class);
+//            if (StrUtil.isNotEmpty(param.getSceneCode())&&StrUtil.isEmpty(param.getSnCode())) {
+//                WorkEntity workEntity=workService.findByNum(param.getSceneCode());
+//                if (ObjectUtil.isNotNull(workEntity)) {
+//                    workEntity.setSnCode(param.getToSnCode());
+//                    workEntity.setUserId(param.getPhone());
+//                    workService.updateById(workEntity);
+//                }
+//            }
+//        }catch (Exception e){
+//            channel.basicAck(deliveryTag, false);
+//            log.error("场景migrateSceneQueue报错{}",e.getMessage());
+//            e.printStackTrace();
+//        }
+//        channel.basicAck(deliveryTag, false);
+//    }
+//
+//}

+ 80 - 78
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/ScenePayStatusListener.java

@@ -1,78 +1,80 @@
-package com.gis.listener;
-
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.fastjson.JSONObject;
-import com.gis.dto.SceneQueueDTO;
-import com.gis.entity.WorkEntity;
-import com.gis.service.WorkService;
-import com.rabbitmq.client.Channel;
-import lombok.extern.slf4j.Slf4j;
-import org.slf4j.MDC;
-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 org.springframework.util.ObjectUtils;
-
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-
-/**
- * 消息监听器
- *
- * @author Xiewj
- * @version 1.0
- * @since 2023/08/07
- */
-@Component
-@Slf4j
-public class ScenePayStatusListener {
-
-    @Autowired
-    WorkService workService;
-    /**
-     * 全景场景初始化方法
-     *
-     * @param channel
-     * @param message
-     * @throws Exception the io exception  这里异常需要处理
-     */
-    @RabbitListener(
-            queuesToDeclare = @Queue("${queue.pano-paystatus-scene-queue}"),concurrency = "1"
-    )
-    public void scenePayStatusQueue(Channel channel, Message message) throws IOException {
-            if (ObjectUtils.isEmpty(message.getBody())) {
-                log.error("消息内容为空,退出构建,当前服务器id:{}" );
-                return;
-            }
-        String traceId = System.currentTimeMillis()+"";
-        MDC.put("TRACE_ID", traceId);
-        long deliveryTag = message.getMessageProperties().getDeliveryTag();
-        try {
-            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
-            String messageId = message.getMessageProperties().getMessageId();
-            log.info("场景scenePayStatusQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
-            SceneQueueDTO param = JSONObject.parseObject(msg, SceneQueueDTO.class);
-            if (ObjectUtil.isEmpty(param.getSceneCodes())&& ArrayUtil.isNotEmpty(param.getSceneCodes())) {
-                log.error("参数列表错误(缺少),格式不匹配,{}",param);
-                channel.basicAck(deliveryTag, false);
-            }
-            for (String sceneCode : param.getSceneCodes()) {
-                WorkEntity workEntity=workService.findByNum(sceneCode);
-                if (ObjectUtil.isNotNull(workEntity)){
-                    //修改状态
-                    workEntity.setPayStatus(param.getPayStatus());
-                    workService.updateById(workEntity);
-                }
-            }
-            channel.basicAck(deliveryTag, false);
-        }catch (Exception e){
-            channel.basicAck(deliveryTag, false);
-            log.error("场景sceneQueue报错{}",e.getMessage());
-            e.printStackTrace();
-
-        }
-    }
-}
+//package com.gis.listener;
+//
+//import cn.hutool.core.util.ArrayUtil;
+//import cn.hutool.core.util.ObjectUtil;
+//import com.alibaba.fastjson.JSONObject;
+//import com.gis.dto.SceneQueueDTO;
+//import com.gis.entity.WorkEntity;
+//import com.gis.service.WorkService;
+//import com.rabbitmq.client.Channel;
+//import lombok.extern.slf4j.Slf4j;
+//import org.slf4j.MDC;
+//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.context.annotation.Conditional;
+//import org.springframework.stereotype.Component;
+//import org.springframework.util.ObjectUtils;
+//
+//import java.io.IOException;
+//import java.nio.charset.StandardCharsets;
+//
+///**
+// * 消息监听器
+// *
+// * @author Xiewj
+// * @version 1.0
+// * @since 2023/08/07
+// */
+//@Component
+//@Slf4j
+//public class ScenePayStatusListener {
+//
+//    @Autowired
+//    WorkService workService;
+//    /**
+//     * 全景场景初始化方法
+//     *
+//     * @param channel
+//     * @param message
+//     * @throws Exception the io exception  这里异常需要处理
+//     */
+//    @RabbitListener(
+//            queuesToDeclare = @Queue("${queue.pano-paystatus-scene-queue}"),concurrency = "1"
+//    )
+//    @Conditional(NonDynamicListenerCondition.class)
+//    public void scenePayStatusQueue(Channel channel, Message message) throws IOException {
+//            if (ObjectUtils.isEmpty(message.getBody())) {
+//                log.error("消息内容为空,退出构建,当前服务器id:{}" );
+//                return;
+//            }
+//        String traceId = System.currentTimeMillis()+"";
+//        MDC.put("TRACE_ID", traceId);
+//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+//        try {
+//            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+//            String messageId = message.getMessageProperties().getMessageId();
+//            log.info("场景scenePayStatusQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+//            SceneQueueDTO param = JSONObject.parseObject(msg, SceneQueueDTO.class);
+//            if (ObjectUtil.isEmpty(param.getSceneCodes())&& ArrayUtil.isNotEmpty(param.getSceneCodes())) {
+//                log.error("参数列表错误(缺少),格式不匹配,{}",param);
+//                channel.basicAck(deliveryTag, false);
+//            }
+//            for (String sceneCode : param.getSceneCodes()) {
+//                WorkEntity workEntity=workService.findByNum(sceneCode);
+//                if (ObjectUtil.isNotNull(workEntity)){
+//                    //修改状态
+//                    workEntity.setPayStatus(param.getPayStatus());
+//                    workService.updateById(workEntity);
+//                }
+//            }
+//            channel.basicAck(deliveryTag, false);
+//        }catch (Exception e){
+//            channel.basicAck(deliveryTag, false);
+//            log.error("场景sceneQueue报错{}",e.getMessage());
+//            e.printStackTrace();
+//
+//        }
+//    }
+//}

+ 53 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/DoSliceQueueListener.java

@@ -0,0 +1,53 @@
+package com.gis.listener.container;
+import com.alibaba.fastjson.JSONObject;
+import com.gis.dto.DoSliceDTO;
+import com.gis.service.FodderService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import com.rabbitmq.client.Channel;
+import org.springframework.amqp.core.Message;
+import org.springframework.util.ObjectUtils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Component
+@Slf4j
+public class DoSliceQueueListener implements ChannelAwareMessageListener {
+    @Autowired
+    FodderService fodderService;
+
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+
+        if (ObjectUtils.isEmpty(message.getBody())) {
+            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+            return;
+        }
+        String traceId = System.currentTimeMillis()+"";
+        MDC.put("TRACE_ID", traceId);
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        try {
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            String messageId = message.getMessageProperties().getMessageId();
+            log.info("场景doSliceQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+            DoSliceDTO dto = JSONObject.parseObject(msg, DoSliceDTO.class);
+            fodderService.doSlice(dto.getId(), traceId);
+            channel.basicAck(deliveryTag, false);
+        }catch (Exception e){
+            e.printStackTrace();
+            channel.basicAck(deliveryTag, false);
+            log.error("场景doSliceQueue报错{}",e.getMessage());
+        }finally {
+            channel.basicAck(deliveryTag, false);
+
+        }
+    }
+}

+ 70 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/PanoMigrateSceneQueueListener.java

@@ -0,0 +1,70 @@
+package com.gis.listener.container;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.gis.constant.ConfigConstant;
+import com.gis.dto.DoSliceDTO;
+import com.gis.dto.OpenSceneMigrateDto;
+import com.gis.entity.WorkEntity;
+import com.gis.mq.RabbitMqProducerUtil;
+import com.gis.oss.util.FileAndOssUtil;
+import com.gis.service.FodderService;
+import com.gis.service.ScenePanoService;
+import com.gis.service.WorkService;
+import com.gis.util.QrCodeUtils;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Component
+@Slf4j
+public class PanoMigrateSceneQueueListener implements ChannelAwareMessageListener {
+    @Autowired
+    FodderService fodderService;
+    @Autowired
+    WorkService workService;
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+
+        if (ObjectUtils.isEmpty(message.getBody())) {
+            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+            return;
+        }
+        String traceId = System.currentTimeMillis()+"";
+        MDC.put("TRACE_ID", traceId);
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        try {
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            String messageId = message.getMessageProperties().getMessageId();
+            log.info("场景migrateSceneQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+            OpenSceneMigrateDto param = JSONObject.parseObject(JSON.parse(msg).toString(), OpenSceneMigrateDto.class);
+            if (StrUtil.isNotEmpty(param.getSceneCode())&&StrUtil.isEmpty(param.getSnCode())) {
+                WorkEntity workEntity=workService.findByNum(param.getSceneCode());
+                if (ObjectUtil.isNotNull(workEntity)) {
+                    workEntity.setSnCode(param.getToSnCode());
+                    workEntity.setUserId(param.getPhone());
+                    workService.updateById(workEntity);
+                }
+            }
+        }catch (Exception e){
+            channel.basicAck(deliveryTag, false);
+            log.error("场景migrateSceneQueue报错{}",e.getMessage());
+            e.printStackTrace();
+        }finally {
+            channel.basicAck(deliveryTag, false);
+        }
+    }
+}

+ 67 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/PanoPayStatusSceneQueueListener.java

@@ -0,0 +1,67 @@
+package com.gis.listener.container;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.gis.dto.SceneQueueDTO;
+import com.gis.entity.WorkEntity;
+import com.gis.service.FodderService;
+import com.gis.service.WorkService;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Component
+@Slf4j
+public class PanoPayStatusSceneQueueListener implements ChannelAwareMessageListener {
+    @Autowired
+    FodderService fodderService;
+    @Autowired
+    WorkService workService;
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+        if (ObjectUtils.isEmpty(message.getBody())) {
+            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+            return;
+        }
+        String traceId = System.currentTimeMillis()+"";
+        MDC.put("TRACE_ID", traceId);
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        try {
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            String messageId = message.getMessageProperties().getMessageId();
+            log.info("场景scenePayStatusQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+            SceneQueueDTO param = JSONObject.parseObject(msg, SceneQueueDTO.class);
+            if (ObjectUtil.isEmpty(param.getSceneCodes())&& ArrayUtil.isNotEmpty(param.getSceneCodes())) {
+                log.error("参数列表错误(缺少),格式不匹配,{}",param);
+                channel.basicAck(deliveryTag, false);
+            }
+            for (String sceneCode : param.getSceneCodes()) {
+                WorkEntity workEntity=workService.findByNum(sceneCode);
+                if (ObjectUtil.isNotNull(workEntity)){
+                    //修改状态
+                    workEntity.setPayStatus(param.getPayStatus());
+                    workService.updateById(workEntity);
+                }
+            }
+        }catch (Exception e){
+            channel.basicAck(deliveryTag, false);
+            log.error("场景sceneQueue报错{}",e.getMessage());
+            e.printStackTrace();
+        }finally {
+            channel.basicAck(deliveryTag, false);
+
+        }
+    }
+}

+ 128 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/RabbitMQConfig.java

@@ -0,0 +1,128 @@
+package com.gis.listener.container;
+
+import com.gis.receiver.QueueNameService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.rabbit.connection.ConnectionFactory;
+import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Configuration
+@Slf4j
+public class RabbitMQConfig {
+
+    @Value("${mq.listener.dynamic}")
+    private boolean isDynamic;
+
+    @Value("${queue.do-slice-queue}")
+    String doSliceQueue;
+
+    @Value("${queue.pano-migrate-scene-queue}")
+    String panoMigrateSceneQueue;
+
+    @Value("${queue.pano-paystatus-scene-queue}")
+    String panoPayStatusSceneQueue;
+
+    @Value("${queue.scene-queue}")
+    String sceneQueue;
+
+    @Autowired
+    QueueNameService queueNameService;
+    @Autowired
+    SceneWorkQueueListener sceneWorkQueueListener;
+    @Autowired
+    PanoMigrateSceneQueueListener panoMigrateSceneQueueListener;
+    @Autowired
+    DoSliceQueueListener doSliceQueueListener;
+    @Autowired
+    PanoPayStatusSceneQueueListener panoPayStatusSceneQueueListener;
+
+
+    @Bean
+    public Queue doSliceQueue() {
+        return new Queue(doSliceQueue, true, false, false);
+    }
+
+    @Bean
+    public Queue panoMigrateSceneQueue() {
+        return new Queue(panoMigrateSceneQueue, true, false, false);
+    }
+
+    @Bean
+    public Queue panoPayStatusSceneQueue() {
+        return new Queue(panoPayStatusSceneQueue, true, false, false);
+    }
+
+    @Bean
+    public Queue sceneQueue() {
+        return new Queue(sceneQueue, true, false, false);
+    }
+
+    @Bean
+    public Queue sceneWorkQueue() {
+        return new Queue(queueNameService.getQueueName(), true, false, false);
+    }
+
+    @Bean
+    public SimpleMessageListenerContainer doSliceQueueContainer(ConnectionFactory connectionFactory) {
+        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
+        log.info("doSliceQueue 启动,监听队列-{},动态伸缩启动-{}", doSliceQueue, !isDynamic);
+        container.setQueueNames(doSliceQueue);
+        container.setMessageListener(doSliceQueueListener);
+        container.setAutoStartup(!isDynamic); // 根据配置决定是否自动启动
+        container.setPrefetchCount(2);
+        return container;
+    }
+
+    @Bean
+    public SimpleMessageListenerContainer panoMigrateSceneQueueContainer(ConnectionFactory connectionFactory) {
+        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
+        log.info("panoMigrateSceneQueue 启动,监听队列-{},动态伸缩启动-{}", panoMigrateSceneQueue, !isDynamic);
+        container.setQueueNames(panoMigrateSceneQueue);
+        container.setMessageListener(panoMigrateSceneQueueListener);
+        container.setAutoStartup(!isDynamic); // 根据配置决定是否自动启动
+        container.setPrefetchCount(1);
+        return container;
+    }
+
+    @Bean
+    public SimpleMessageListenerContainer panoPayStatusSceneQueueContainer(ConnectionFactory connectionFactory) {
+        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
+        log.info("panoPayStatusSceneQueue 启动,监听队列-{},动态伸缩启动-{}", panoPayStatusSceneQueue, !isDynamic);
+        container.setQueueNames(panoPayStatusSceneQueue);
+        container.setMessageListener(panoPayStatusSceneQueueListener);
+        container.setAutoStartup(!isDynamic); // 根据配置决定是否自动启动
+        container.setPrefetchCount(1);
+        return container;
+    }
+
+    @Bean
+    public SimpleMessageListenerContainer sceneQueueContainer(ConnectionFactory connectionFactory) {
+        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
+        log.info("sceneQueue 启动,监听队列-{},动态伸缩启动-{}", sceneQueue, !isDynamic);
+        container.setQueueNames(sceneQueue);
+        container.setMessageListener(new SceneQueueListener());
+        container.setAutoStartup(!isDynamic); // 根据配置决定是否自动启动
+        container.setPrefetchCount(1);
+        return container;
+    }
+
+    @Bean
+    public SimpleMessageListenerContainer sceneWorkQueueContainer(ConnectionFactory connectionFactory) {
+        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
+        String queueName = queueNameService.getQueueName();
+        log.info("sceneWorkQueue 启动,监听队列-{},动态伸缩启动-{}", queueName, isDynamic);
+        container.setQueueNames(queueName);
+        container.setMessageListener(sceneWorkQueueListener);
+        container.setAutoStartup(isDynamic); // 根据配置决定是否自动启动
+        container.setPrefetchCount(2);
+        return container;
+    }
+}

+ 225 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/SceneQueueListener.java

@@ -0,0 +1,225 @@
+package com.gis.listener.container;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.filestorage.FileStorageTemplate;
+import com.gis.constant.CmdConstant;
+import com.gis.constant.ConfigConstant;
+import com.gis.dto.RelicsSceneInitQueueDTO;
+import com.gis.dto.SceneQueueDTO;
+import com.gis.dto.WorkAddDto;
+import com.gis.dto.WorkNavigationDTO;
+import com.gis.entity.*;
+import com.gis.exception.BaseRuntimeException;
+import com.gis.mq.RabbitMqProducerUtil;
+import com.gis.oss.util.FileAndOssUtil;
+import com.gis.receiver.QueueNameService;
+import com.gis.service.*;
+import com.gis.util.CmdUtils;
+import com.gis.util.QrCodeUtils;
+import com.gis.util.RandomUtils;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+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 javax.annotation.Resource;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Component
+@Slf4j
+public class SceneQueueListener implements ChannelAwareMessageListener {
+    @Autowired
+    FodderService fodderService;
+    @Autowired
+    WorkService workService;
+    @Autowired
+    FileAndOssUtil fileAndOssUtil;
+    @Autowired
+    ConfigConstant configConstant;
+    @Autowired
+    QrCodeUtils qrCodeUtils;
+    @Autowired
+    ScenePanoService scenePanoService;
+    @Autowired
+    RabbitMqProducerUtil rabbitMqProducerUtil;
+    @Value("${queue.relics-init-queue}")
+    String relicsInitQueue;
+
+    @Value("${queue.scene-queue-work}")
+    String sceneQueueWork;
+    @Resource
+    private FileStorageTemplate ossUtil;
+
+    @Value("${domain.4dkk}")
+    public  String domain4dKK;
+
+
+    @Autowired
+    WorkCoverTypeService workCoverTypeService;
+
+    @Autowired
+    WorkLogoService workLogoService;
+
+    @Autowired
+    WorkOpeningTipService workOpeningTipService;
+
+    @Autowired
+    WorkOpeningAnimationService workOpeningAnimationService;
+
+    @Autowired
+    IMqSendLogService mqSendLogService;
+
+
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+        if (ObjectUtils.isEmpty(message.getBody())) {
+            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+            return;
+        }
+        String traceId = System.currentTimeMillis()+"";
+        MDC.put("TRACE_ID", traceId);
+        String sceneCode="";
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        try {
+            String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+            String messageId = message.getMessageProperties().getMessageId();
+            log.info("场景sceneQueue开始,id:{},deliveryTag:{},消息体:{}", messageId,deliveryTag,msg);
+            SceneQueueDTO param = JSONObject.parseObject(msg, SceneQueueDTO.class);
+            if (ObjectUtil.isEmpty(param.getSceneCode())) {
+                log.error("参数列表错误(缺少),格式不匹配,{}",param);
+                channel.basicAck(deliveryTag, false);
+            }
+            sceneCode=param.getSceneCode();
+            WorkEntity workEntity=workService.findByNum(param.getSceneCode());
+            if (ObjectUtil.isEmpty(workEntity)&&param.getStatus()==0){
+                //初始化创建work表数据
+                workService.entityAdd(param);
+                sendStartMq(param);
+                channel.basicAck(deliveryTag, false);
+            }if (ObjectUtil.isNotEmpty(workEntity)&&param.getStatus()!=1){
+                //修改状态
+                workEntity.setCalcStatus(param.getStatus());
+                if (ObjectUtil.isNotEmpty(param.getPwd())&&ObjectUtil.isEmpty(workEntity.getPassword())){
+                    workEntity.setPassword(param.getPwd());
+                    workEntity.setIsPassword(1);
+                }
+                if (ObjectUtil.isNotEmpty(param.getPayStatus())){
+                    workEntity.setPayStatus(param.getPayStatus());
+                }
+                workService.updateById(workEntity);
+                sendStartMq(param);
+                channel.basicAck(deliveryTag, false);
+            }else if (ObjectUtil.isNotEmpty(param.getSceneCode())&&param.getStatus()==1) {
+                //发送到处理队列
+                //rabbitMqProducerUtil.sendByWorkQueue(sceneQueueWork, msg);
+                //改造存入esc  mq_send_log
+                //        insert num ,  content ,type "pano"
+                MqSendLog mqSendLog = new MqSendLog();
+                mqSendLog.setNum(param.getSceneCode());
+                mqSendLog.setContent(JSONObject.toJSONString(param));
+                mqSendLog.setType("pano");
+                mqSendLog.setCreateTime(new Date());
+                mqSendLogService.save(mqSendLog);
+                log.info("保存mqSendLog-数据库准备处理:{}",mqSendLog);
+            }
+
+        }catch (Exception e){
+            if (StrUtil.isNotEmpty(sceneCode)){
+                updateOssStatusJson(sceneCode,0);
+            }
+            log.error("场景sceneQueue报错{}",e.getMessage());
+            e.printStackTrace();
+
+        }finally {
+            channel.basicAck(deliveryTag, false);
+
+        }
+    }
+
+    private void updateOssStatusJson(String sceneCode, int status) throws Exception {
+        //修改OSS,status状态 scene_view_data/场景码/data/status.json
+        String statusJson = "scene_view_data/"+sceneCode+"/data/status.json";
+        Boolean exist=ossUtil.doesObjectExist("4dkankan",statusJson);
+        if (exist){
+            String fileContent = ossUtil.getFileContent("4dkankan", statusJson);
+            log.info("statusJson存在: {}",statusJson);
+            JSONObject statusJsonObj = JSONObject.parseObject(fileContent);
+            statusJsonObj.put("status",status);
+            ossUtil.uploadFileBytes("4dkankan",statusJson,statusJsonObj.toJSONString().getBytes(StandardCharsets.UTF_8));
+
+        }
+    }
+
+    private void sendStartMq(SceneQueueDTO param) {
+        RelicsSceneInitQueueDTO relicsSceneInitQueueDTO = new RelicsSceneInitQueueDTO();
+        relicsSceneInitQueueDTO.setSceneCode(param.getSceneCode());
+        relicsSceneInitQueueDTO.setLocation(param.getLocation());
+        relicsSceneInitQueueDTO.setCreateTime(param.getCreateTime());
+        relicsSceneInitQueueDTO.setPhoneNum(param.getPhoneNum());
+        relicsSceneInitQueueDTO.setUserId(param.getUserId());
+        relicsSceneInitQueueDTO.setSnCode(param.getSnCode());
+        relicsSceneInitQueueDTO.setStatus(param.getStatus());
+        relicsSceneInitQueueDTO.setSceneName(param.getSceneName());
+        relicsSceneInitQueueDTO.setShootCount(param.getShootCount());
+        relicsSceneInitQueueDTO.setSceneSource(param.getSceneSource());
+        relicsSceneInitQueueDTO.setPayStatus(param.getPayStatus());
+        rabbitMqProducerUtil.sendByWorkQueue(relicsInitQueue, relicsSceneInitQueueDTO);
+    }
+
+
+    private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+    public static String generateRandomId() {
+        Random random = new Random();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < 8; i++) {
+            int index = random.nextInt(CHARACTERS.length());
+            sb.append(CHARACTERS.charAt(index));
+        }
+        return sb.toString();
+    }
+
+    public static String generateCustomId() {
+        return "s_" + generateRandomId();
+    }
+
+
+
+
+
+
+
+
+    public static void main(String[] args) {
+        List<String> list=new ArrayList<>();
+        list.add("scene_view_data/KJ-t-QPqp92mGf1c/images/pan/high/0.jpg");
+        list.add("scene_view_data/KJ-t-QPqp92mGf1c/images/pan/high/1.jpg");
+        list.add("scene_view_data/KJ-t-QPqp92mGf1c/images/pan/high/3.jpg");
+        list.add("scene_view_data/KJ-t-QPqp92mGf1c/images/pan/high/4.jpg");
+        //循环只打印文件是偶数的图片
+
+    }
+}

+ 592 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/listener/container/SceneWorkQueueListener.java

@@ -0,0 +1,592 @@
+package com.gis.listener.container;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.filestorage.FileStorageTemplate;
+import com.gis.constant.CmdConstant;
+import com.gis.constant.ConfigConstant;
+import com.gis.constant.RedisKey;
+import com.gis.constant.SysConstants;
+import com.gis.dto.*;
+import com.gis.entity.*;
+import com.gis.exception.BaseRuntimeException;
+import com.gis.mq.RabbitMqProducerUtil;
+import com.gis.oss.util.FileAndOssUtil;
+import com.gis.receiver.QueueNameService;
+import com.gis.service.*;
+import com.gis.util.CmdUtils;
+import com.gis.util.QrCodeUtils;
+import com.gis.util.RandomUtils;
+import com.gis.util.RedisUtil;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.MDC;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
+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 javax.annotation.Resource;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/19
+ */
+@Component
+@Slf4j
+public class SceneWorkQueueListener implements ChannelAwareMessageListener {
+    @Autowired
+    FodderService fodderService;
+    @Autowired
+    WorkService workService;
+    @Autowired
+    FileAndOssUtil fileAndOssUtil;
+    @Autowired
+    ConfigConstant configConstant;
+    @Autowired
+    QrCodeUtils qrCodeUtils;
+    @Autowired
+    ScenePanoService scenePanoService;
+    @Autowired
+    RabbitMqProducerUtil rabbitMqProducerUtil;
+    @Value("${queue.relics-init-queue}")
+    String relicsInitQueue;
+
+    @Value("${queue.scene-queue-work}")
+    String sceneQueueWork;
+    @Resource
+    private FileStorageTemplate ossUtil;
+    @Value("${domain.4dkk}")
+    public  String domain4dKK;
+    @Autowired
+    WorkCoverTypeService workCoverTypeService;
+
+    @Autowired
+    WorkLogoService workLogoService;
+
+    @Autowired
+    WorkOpeningTipService workOpeningTipService;
+
+    @Autowired
+    WorkOpeningAnimationService workOpeningAnimationService;
+
+    @Autowired
+    private WorkCustomMaskService workCustomMaskService;
+    @Autowired
+    QueueNameService queueNameService;
+    @Autowired
+    private WorkCustomButtonService workCustomButtonService;
+
+    @Autowired
+    private WorkNavigationSettingService workNavigationSettingService;
+    @Autowired
+    private WorkNavigationService workNavigationService;
+
+
+    @Autowired
+    IMqEcsService mqEcsService;
+    @Autowired
+    RedisUtil redisUtil;
+    @Override
+    public void onMessage(Message message, Channel channel) throws Exception {
+
+        if (ObjectUtils.isEmpty(message.getBody())) {
+            log.error("消息内容为空,退出构建,当前服务器id:{}" );
+            return;
+        }
+        String traceId = System.currentTimeMillis()+"";
+        MDC.put("TRACE_ID", traceId);
+        String sceneCode="";
+        long deliveryTag = message.getMessageProperties().getDeliveryTag();
+        //计算暂停锁,计算中锁。弹性伸缩控制服务使用
+        String modelingKey = String.format(RedisKey.modelingKey,SysConstants.hostName);
+        String stopKey = String.format(RedisKey.ecsStopKey,SysConstants.hostName);
+        String messageId = message.getMessageProperties().getMessageId();
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+
+
+
+        try {
+            log.error("服务实例:{} 正在构建!", SysConstants.hostName);
+            log.info("场景sceneQueueWork开始,队列名:{},id:{},deliveryTag:{},消息体:{}", queueNameService.getQueueName(), messageId,deliveryTag,msg);
+            //设置为计算超时时间过期
+            redisUtil.set(modelingKey,msg,SysConstants.modelTimeOut * 3600L,TimeUnit.SECONDS);
+            if(redisUtil.hasKey(stopKey)){
+                log.error("服务实例:{} 正在关闭,退出构建!", SysConstants.hostName);
+                redisUtil.delete(modelingKey);
+                channel.basicNack(deliveryTag, true, true);
+                return;
+            }
+            SceneQueueDTO param = JSONObject.parseObject(JSON.parse(msg).toString(), SceneQueueDTO.class);
+            if (ObjectUtil.isEmpty(param.getSceneCode())) {
+                log.error("参数列表错误(缺少),格式不匹配,{}",param);
+                channel.basicAck(deliveryTag, false);
+            }
+            sceneCode=param.getSceneCode();
+            WorkEntity workEntity=workService.findByNum(param.getSceneCode());
+            if (ObjectUtil.isNotEmpty(param.getSceneCode())&&param.getStatus()==1){
+                updateOssStatusJson(param.getSceneCode(),0);
+
+                //计算完成处理
+                //1,下载场景的全景图 默认 。scene_view_data/panorama/目录下的全景图图片
+                workEntity.setAlgorithmTime(param.getAlgorithmTime());
+                workEntity.setCalcStatus(0);
+                if (ObjectUtil.isNotEmpty(param.getPayStatus())){
+                    workEntity.setPayStatus(param.getPayStatus());
+                }
+                if (ObjectUtil.isNotEmpty(param.getSceneSource())){
+                    workEntity.setSceneSource(param.getSceneSource());
+                }
+                if (ObjectUtil.isNotEmpty(param.getPwd())&&ObjectUtil.isEmpty(workEntity.getPassword())){
+                    workEntity.setPassword(param.getPwd());
+                    workEntity.setIsPassword(1);
+                }
+                workService.updateById(workEntity);
+                //清理旧数据
+                List<ScenePanoEntity> list = scenePanoService.findByWorkId(workEntity.getId());
+                for (ScenePanoEntity scenePanoEntity : list) {
+                    scenePanoEntity.setIsDelete(1);
+                    scenePanoEntity.setUpdateTime(new Date());
+                    scenePanoService.updateById(scenePanoEntity);
+                }
+                String visionOssKey="scene_view_data/"+param.getSceneCode()+"/images/vision.txt";
+
+                JSONArray sweepLocations = new JSONArray();
+                if (ossUtil.doesObjectExist("4dkankan",visionOssKey)){
+                    log.info("vision.txt存在: {}",visionOssKey);
+                    JSONObject visJson = JSONObject.parseObject(ossUtil.getFileContent("4dkankan",visionOssKey));
+                    if(visJson.containsKey("sweepLocations")){
+                        sweepLocations = visJson.getJSONArray("sweepLocations");
+                    }
+                }
+
+                //2,使用krpano工具生成全景图数据
+                List<InitWorkNavigationSceneDTO> scenes = new ArrayList<>();
+
+                for (int i = 0; i < sweepLocations.size(); i++) {
+                    JSONObject jsonObject = sweepLocations.getJSONObject(i);
+                    String uuid = jsonObject.getString("uuid");
+                    String id = jsonObject.getString("id");
+                    String ossKey="scene_view_data/"+param.getSceneCode()+"/images/panoramas/"+uuid+".jpg";
+                    InitWorkNavigationSceneDTO scene=new InitWorkNavigationSceneDTO();
+                    ScenePanoEntity scenePanoEntity = this.doSlice(traceId ,ossKey, param.getSceneCode(), workEntity.getId(),uuid+".jpg",uuid,id);
+                    //  "icon": "https://ossxiaoan.4dage.com/720yun_fd_manage/fd720_8nRkFlzpp/vtour/panos/fd720_8nRkFlzpp.tiles/thumb.jpg",
+                    //   "sceneCode": "fd720_8nRkFlzpp",
+                    // "sceneTitle": "0",
+                    //  "category": 1,
+                    //   "type": "pano",
+                    //  "id": "s_xId8vevp",
+                    scene.setIcon(scenePanoEntity.getIcon());
+                    scene.setType("pano");
+                    scene.setName(id);
+                    //id生成规则是 s_ 拼接,随机8位字符串,字母加数字组合,有大小写
+                    scene.setSceneCode(scenePanoEntity.getSceneCode());
+                    scenes.add(scene);
+                    if (i==0){
+                        workEntity.setIcon(scenePanoEntity.getIcon());
+                        workService.updateById(workEntity);
+                    }
+
+                }
+
+                log.info("场景切图完成组装json");
+                //修改为创建数据库
+                String shareUrl = configConstant.domain4dKK + "/panorama/showMobile.html?id=" + workEntity.getId();
+                String qrCode = qrCodeUtils.generateLogoQrCode(shareUrl, configConstant.serverBasePath, configConstant.ossBasePath, ossUtil.calculateUrl(""), workEntity.getId());
+                workEntity.setQrCode(qrCode);
+                workEntity.setShare(shareUrl);
+
+                //创建tour.xml
+                this.saveTour(workEntity.getId());
+
+                WorkAddDto workAddDto = new WorkAddDto();
+                workAddDto.setSceneDTOList(scenes);
+
+                this.initData(workAddDto, workEntity);
+
+                workEntity.setCalcStatus(1);
+                workService.updateById(workEntity);
+                sendEndMq(param);
+                updateOssStatusJson(param.getSceneCode(),1);
+                channel.basicAck(deliveryTag, false);
+            }
+            log.info("场景计算结束,队列名:{},id:{}", queueNameService.getQueueName(), messageId);
+
+
+        }catch (Exception e){
+            if (StrUtil.isNotEmpty(sceneCode)){
+                updateOssStatusJson(sceneCode,0);
+            }
+            channel.basicAck(deliveryTag, false);
+            log.error("场景sceneQueue报错{}",e.getMessage());
+            e.printStackTrace();
+        }finally {
+            //计算完毕,将当前系统构建状态改为false
+            redisUtil.delete(modelingKey);
+        }
+    }
+    private void sendEndMq(SceneQueueDTO param) {
+        RelicsSceneInitQueueDTO relicsSceneInitQueueDTO = new RelicsSceneInitQueueDTO();
+        relicsSceneInitQueueDTO.setSceneCode(param.getSceneCode());
+        relicsSceneInitQueueDTO.setLocation(param.getLocation());
+        relicsSceneInitQueueDTO.setAlgorithmTime(param.getAlgorithmTime());
+        relicsSceneInitQueueDTO.setCreateTime(param.getCreateTime());
+        relicsSceneInitQueueDTO.setPhoneNum(param.getPhoneNum());
+        relicsSceneInitQueueDTO.setUserId(param.getUserId());
+        relicsSceneInitQueueDTO.setSnCode(param.getSnCode());
+        relicsSceneInitQueueDTO.setStatus(param.getStatus());
+        relicsSceneInitQueueDTO.setSceneName(param.getSceneName());
+        relicsSceneInitQueueDTO.setShootCount(param.getShootCount());
+        relicsSceneInitQueueDTO.setSceneSource(param.getSceneSource());
+        relicsSceneInitQueueDTO.setPayStatus(param.getPayStatus());
+        rabbitMqProducerUtil.sendByWorkQueue(relicsInitQueue, relicsSceneInitQueueDTO);
+    }
+    private void updateOssStatusJson(String sceneCode, int status) throws Exception {
+        //修改OSS,status状态 scene_view_data/场景码/data/status.json
+        String statusJson = "scene_view_data/"+sceneCode+"/data/status.json";
+        Boolean exist=ossUtil.doesObjectExist("4dkankan",statusJson);
+        if (exist){
+            String fileContent = ossUtil.getFileContent("4dkankan", statusJson);
+            log.info("statusJson存在: {}",statusJson);
+            JSONObject statusJsonObj = JSONObject.parseObject(fileContent);
+            statusJsonObj.put("status",status);
+            ossUtil.uploadFileBytes("4dkankan",statusJson,statusJsonObj.toJSONString().getBytes(StandardCharsets.UTF_8));
+
+        }
+    }
+
+    private void initData(WorkAddDto workAddDto, WorkEntity entity){
+        workNavigationSettingService.removeByWorkId(entity.getId());
+        //添加默认分组
+        WorkNavigationDTO defaultGroup = WorkNavigationDTO.builder().parentId(0L).name("一级分组").sort(0).build();
+        defaultGroup.setWorkId(entity.getId());
+        WorkNavigationVo workNavigationVo = workNavigationSettingService.addGroup(defaultGroup);
+        List<WorkNavigationEntity> workNavigationEntities = BeanUtil.copyToList(workAddDto.getSceneDTOList(), WorkNavigationEntity.class);
+        AtomicInteger sort = new AtomicInteger(0);
+        workNavigationEntities.stream().forEach(v->{
+            v.setParentId(workNavigationVo.getId());
+            v.setWorkId(entity.getId());
+            v.setSort(sort.getAndAdd(1));
+        });
+        workNavigationService.saveBatch(workNavigationEntities);
+
+        //初始化遮罩数据
+        this.initMaskData(workNavigationEntities,entity.getId());
+
+        //初始化自定义按钮
+        this.initCustomButton(entity.getId());
+
+        //初始化开场动画设置
+        this.initOpenAnimation(entity.getId());
+
+        //初始化开场封面
+        this.initWorkCoverType(entity.getId());
+
+        //初始化自定义logo
+        this.initWorkLogo(entity.getId());
+
+        //初始化开场提示
+        this.initWorkOpeningTip(entity.getId());
+
+    }
+    public void initWorkOpeningTip(String workId){
+        WorkOpeningTipEntity entity = workOpeningTipService.getByWorkId(workId);
+        if (ObjectUtil.isNull(entity)){
+              entity = new WorkOpeningTipEntity();
+              entity.setWorkId(workId);
+              entity.setIsRemind(1);
+              entity.setRemindTime(1);
+              workOpeningTipService.saveOrUpdate(entity);
+        }
+
+    }
+    public void initWorkLogo(String workId){
+        WorkLogoEntity entity = workLogoService.getByWorkId(workId);
+        if (ObjectUtil.isNull(entity)){
+            entity = new WorkLogoEntity();
+            entity.setWorkId(workId);
+            entity.setIsLogo(1);
+            workLogoService.saveOrUpdate(entity);
+        }
+
+    }
+
+    public void initOpenAnimation(String workId){
+        WorkOpeningAnimationEntity entity = workOpeningAnimationService.getByWorkId(workId);
+        if (ObjectUtil.isNull(entity)){
+            entity = new WorkOpeningAnimationEntity();
+            entity.setIsShowOpeningAnimation(true);
+            entity.setOpeningAnimationType(1);
+            entity.setWorkId(workId);
+            workOpeningAnimationService.save(entity);
+        }
+
+    }
+    public void initWorkCoverType(String workId){
+        WorkCoverTypeEntity entity = workCoverTypeService.getByWorkId(workId);
+        if (ObjectUtil.isNull(entity)){
+            entity = new WorkCoverTypeEntity();
+            entity.setWorkId(workId);
+            entity.setCoverSelect("img");
+            entity.setCoverPcLoc("center");
+            entity.setCoverMoLoc("center");
+            entity.setCoverImgBac("colorFill");
+            entity.setImgColorSelec("#000000");
+            entity.setCoverImageInWay(1);
+            workCoverTypeService.saveOrUpdate(entity);
+        }
+
+    }
+
+
+    private void initCustomButton(String workId){
+        List<WorkCustomButtonEntity> workCustomButtonEntities = workCustomButtonService.listByWorkId(workId);
+        if (CollUtil.isEmpty(workCustomButtonEntities)){
+            WorkCustomButtonEntity phoneButton = new WorkCustomButtonEntity();
+            phoneButton.setWorkId(workId);
+            phoneButton.setIsShow(0);
+            phoneButton.setName("电话");
+            phoneButton.setType("phone");
+            phoneButton.setOpenMethod("_self");
+            phoneButton.setCreateTime(new Date());
+
+            WorkCustomButtonEntity linkButton = BeanUtil.toBean(phoneButton, WorkCustomButtonEntity.class);
+            linkButton.setName("链接");
+            workCustomButtonService.saveBatch(Arrays.asList(phoneButton, linkButton));
+        }
+
+    }
+
+    private void initMaskData(List<WorkNavigationEntity> workNavigations, String workId){
+        List<WorkCustomMaskEntity> workCustomMaskEntities = workCustomMaskService.listByWorkId(workId);
+        if(CollUtil.isEmpty(workCustomMaskEntities)) {
+            List<WorkCustomMaskEntity> list = new ArrayList<>();
+            workNavigations.stream().forEach(v -> {
+                WorkCustomMaskEntity sky = new WorkCustomMaskEntity();
+                sky.setWorkId(v.getWorkId());
+                sky.setNavigationId(v.getId());
+                sky.setIsShow(true);
+                sky.setType("sky");
+                sky.setAntidistorted(true);
+                sky.setScale(1D);
+                list.add(sky);
+
+                WorkCustomMaskEntity earth = BeanUtil.toBean(sky, WorkCustomMaskEntity.class);
+                earth.setType("earth");
+                earth.setIsShow(false);
+                list.add(earth);
+            });
+            if (CollUtil.isNotEmpty(list)) {
+                workCustomMaskService.saveBatch(list);
+            }
+        }
+    }
+    private ScenePanoEntity doSlice(String traceId, String item, String num, String workId, String imgName, String uuid, String id){
+        ScenePanoEntity entity=scenePanoService.findByWorkIdAndName(workId,imgName);
+        String sceneCode ="";
+        String newName = "";
+        String filePath = "";
+        if (ObjectUtil.isEmpty(entity)) {
+            //未生成
+            sceneCode = RandomUtils.getSceneCode("fd720_");
+            newName = sceneCode + ".jpg";
+            filePath = configConstant.serverBasePath + sceneCode+ "/" + newName;
+            ossUtil.downloadFile("4dkankan",item,filePath );
+
+            entity = new ScenePanoEntity();
+            entity.setFilePath(filePath);
+            entity.setFileName(FileUtil.getName(filePath));
+            entity.setSceneCode(sceneCode);
+            entity.setNum(num);
+            entity.setOssPath(item);
+            entity.setName(imgName);
+            entity.setWorkId(workId);
+            entity.setVisid(id);
+            entity.setUuid(uuid);
+            long size = FileUtil.size(new File(filePath));
+            size = size / 1024;
+            log.info("fileSize: " + size);
+            entity.setFileSize(size + "");
+
+            scenePanoService.save(entity);
+        }else {
+            entity.setStatus(0);
+
+            filePath = entity.getFilePath();
+            sceneCode = entity.getSceneCode();
+            boolean exist = FileUtil.exist(filePath);
+            if (exist){
+                FileUtil.del(filePath);
+            }
+            if (filePath.endsWith(".jpg")){
+                String parent = FileUtil.getParent(filePath, 1);
+                FileUtil.del(parent);
+            }
+
+
+            log.info("生成过,重新下载");
+            ossUtil.downloadFile("4dkankan",item,filePath );
+            log.info("下载完成重新切图");
+            long size = FileUtil.size(new File(filePath));
+            size = size / 1024;
+            log.info("fileSize: " + size);
+            entity.setFileSize(size + "");
+            scenePanoService.updateById(entity);
+
+        }
+
+
+        log.info("切图流程开始 : " + filePath);
+        long start = System.currentTimeMillis();
+
+        String cmd = CmdConstant.PANO_KRPANO + filePath;
+        // 超时处理机制
+        final ExecutorService exec = Executors.newFixedThreadPool(1);
+        Callable<String> call = new Callable<String>() {
+            @Override
+            public String call() throws Exception {
+                MDC.put("TRACE_ID", traceId);
+                CmdUtils.callLine(cmd, 200);
+                long end = System.currentTimeMillis();
+                log.info("切图完成耗时: {} s" ,(end-start)/1000);
+                return "执行完成";
+            }
+        };
+        // 超时回调
+        Future<String> future = exec.submit(call);
+        try {
+            String obj = future.get(20, TimeUnit.MINUTES); //任务处理超时时间设为 3分钟
+            entity.setStatus(3);
+            String tourXmlScene = this.getTourXmlScene(sceneCode);
+            entity.setTour(tourXmlScene);
+            // 上传切图
+            this.uploadOss(sceneCode);
+            String ossUrl = ossUtil.calculateUrl("") + configConstant.ossBasePath + sceneCode+"/vtour/panos/"+sceneCode+".tiles/thumb.jpg";
+            log.info("切图预览图ossUrl: {}",ossUrl);
+            entity.setIcon(ossUrl);
+            log.info("任务成功返回: " + obj);
+
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+            entity.setStatus(2);
+            StringWriter trace=new StringWriter();
+            log.error(trace.toString());
+            log.error("异常了 InterruptedException");
+        } catch (ExecutionException | BaseRuntimeException e) {
+            e.printStackTrace();
+            StringWriter trace=new StringWriter();
+            e.printStackTrace(new PrintWriter(trace));
+            log.error("超时了 1");
+            // 异常日志要打印,不然不会出现在日志文件中,只会出现在控制台
+            log.error(trace.toString());
+            entity.setStatus(2);
+            future.cancel(true);
+        } catch (TimeoutException e) {
+            e.printStackTrace();
+            StringWriter trace=new StringWriter();
+            e.printStackTrace(new PrintWriter(trace));
+            log.error("超时了 2");
+            log.error(trace.toString());
+            entity.setStatus(2);
+            future.cancel(true);
+        } finally {
+            scenePanoService.updateById(entity);
+            log.info("切图流程, 更新数据库完成 : ");
+        }
+        log.info("切图流程结束 : ");
+        return entity;
+    }
+    /**
+     * 更新 tour.xml
+     * @param id
+     */
+    private void saveTour(String id) {
+        List<ScenePanoEntity> list = scenePanoService.findByWorkId(id);
+        // 读取tour.xml模板
+        String baseTour = getBaseTour();
+        StringBuilder builder = new StringBuilder();
+        builder.append(baseTour).append("\r\n");
+        for (ScenePanoEntity entity : list) {
+            String tour = entity.getTour();
+            builder.append(tour).append("\r\n");
+        }
+
+        // 添加结束标签
+        builder.append("</krpano>");
+
+        String tourPath = configConstant.serverBasePath + id + "/tour.xml";
+        FileUtil.writeUtf8String(builder.toString(), tourPath);
+        log.info("作品tour.xml写入完成");
+
+        String ossKeyPath = configConstant.ossBasePath + id + "/tour.xml";
+        ossUtil.uploadFile( ossKeyPath,tourPath);
+        log.info("tour.xml上传完成 : {}", ossKeyPath);
+    }
+
+    private String getBaseTour(){
+        String baseTourPath = configConstant.serverBasePath + "baseData/tour.xml";
+        String s = FileUtil.readString(baseTourPath, "utf-8");
+        // 结束标签置空, 方便操作
+        s = s.replace("</krpano>", "");
+        return s;
+    }
+    private void uploadOss(String sceneCode) {
+        long start = System.currentTimeMillis();
+        String filePath = "/mnt/720yun_fd_manage_data/" + sceneCode;
+        String ossKey = "720yun_fd_manage/" + sceneCode;
+        fileAndOssUtil.uploadBySh(filePath, ossKey);
+        long end = System.currentTimeMillis();
+        log.info("切图上传完成, 耗时:{} s" , (end-start)/1000 );
+    }
+
+    // 获取切图后的tour.xml
+    private String getTourXmlScene(String code) {
+        log.info("处理tour.xml");
+        String tourPath = configConstant.serverBasePath + code + "/vtour/tour.xml";
+        log.info("tourPath: {}", tourPath);
+        BaseRuntimeException.isTrue(!FileUtil.isFile(tourPath), null, code + "_tour.xml文件不存在");
+
+        String tour = FileUtil.readUtf8String(tourPath);
+        tour = this.extractSceneTag(tour);
+        String trim = StrUtil.trim(tour);
+        // log.info("trim: {}", trim);
+        BaseRuntimeException.isTrue(StrUtil.isAllBlank(trim), null, code + "_tour.xml文件不存在");
+
+        // 2022-09-15 加入相对路径
+        String basePath = "%CURRENTXML%../" + code + "/vtour/panos/";
+        trim = trim.replaceAll("panos/", basePath);
+
+        return trim;
+    }
+    public static String extractSceneTag(String xmlString) {
+        Pattern pattern = Pattern.compile("<scene.*?</scene>", Pattern.DOTALL);
+        Matcher matcher = pattern.matcher(xmlString);
+
+        if (matcher.find()) {
+            return matcher.group();
+        }
+
+        return "";
+    }
+
+}

+ 18 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/mapper/IMqEcsMapper.java

@@ -0,0 +1,18 @@
+package com.gis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gis.entity.MqEcs;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Mapper
+public interface IMqEcsMapper extends BaseMapper<MqEcs> {
+
+}

+ 18 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/mapper/IMqSendLogMapper.java

@@ -0,0 +1,18 @@
+package com.gis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gis.entity.MqSendLog;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Mapper
+public interface IMqSendLogMapper extends BaseMapper<MqSendLog> {
+
+}

+ 40 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/receiver/QueueNameService.java

@@ -0,0 +1,40 @@
+package com.gis.receiver;
+
+import cn.hutool.core.util.StrUtil;
+import com.gis.constant.SysConstants;
+import com.gis.entity.MqEcs;
+import com.gis.service.IMqEcsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/18
+ */
+@Service
+@Slf4j
+public class QueueNameService  {
+
+    @Value("${queue.scene-queue-work}")
+    String queue ;
+    @Autowired
+    IMqEcsService mqEcsService;
+
+    public String getQueueName(){
+        String queueName = queue;
+        if(StrUtil.isBlank(SysConstants.hostName)){
+            log.info("获取hostName失败,监听队列名为:{}",queueName);
+            return queueName;
+        }
+        MqEcs mqEcs = mqEcsService.getByHostName(SysConstants.hostName);
+        if(mqEcs != null ){
+            queueName = mqEcs.getQueueName();
+            log.info("获取hostNam成功,监听队列名为:{}",queueName);
+            return queueName;
+        }
+        log.info("获取hostName失败,监听默认队列名为:{}",queueName);
+        return queueName;
+    }
+}

+ 24 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/IMqEcsService.java

@@ -0,0 +1,24 @@
+package com.gis.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gis.entity.MqEcs;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+public interface IMqEcsService extends IService<MqEcs> {
+
+    boolean updateMqEcs(MqEcs mqEcs);
+
+    MqEcs getLastEcs();
+
+    MqEcs getByHostName(String hostName);
+
+}

+ 23 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/IMqSendLogService.java

@@ -0,0 +1,23 @@
+package com.gis.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gis.entity.MqSendLog;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+public interface IMqSendLogService extends IService<MqSendLog> {
+
+    List<MqSendLog> getNoSendMsg();
+
+    List<MqSendLog> getNoSendMsgByQueueName(String key);
+
+    void updateStatus(Integer id, Integer status,String queueName);
+}

+ 58 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/impl/MqEcsServiceImpl.java

@@ -0,0 +1,58 @@
+package com.gis.service.impl;
+
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gis.entity.MqEcs;
+import com.gis.mapper.IMqEcsMapper;
+import com.gis.service.IMqEcsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Service
+@DS("db2")
+public class MqEcsServiceImpl extends ServiceImpl<IMqEcsMapper, MqEcs> implements IMqEcsService {
+    @Override
+    public MqEcs getByHostName(String hostName) {
+        LambdaQueryWrapper<MqEcs> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MqEcs::getEcsName,hostName);
+        wrapper.eq(MqEcs::getRecStatus,"A");
+        return this.getOne(wrapper);
+    }
+
+    @Override
+    public MqEcs getLastEcs() {
+        LambdaQueryWrapper<MqEcs> wrapper = new LambdaQueryWrapper<>();
+        wrapper.isNull(MqEcs::getEcsName);
+        wrapper.eq(MqEcs::getIsScaling,1);
+        wrapper.eq(MqEcs::getRecStatus,"A");
+        wrapper.eq(MqEcs::getType,"pano");
+        wrapper.eq(MqEcs::getStatus,0);
+        wrapper.orderByAsc(MqEcs::getCreateTime);
+        wrapper.last("limit 1");
+        return this.getOne(wrapper);
+    }
+
+
+    @Override
+    public boolean updateMqEcs(MqEcs mqEcs) {
+        LambdaUpdateWrapper<MqEcs> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(MqEcs::getId,mqEcs.getId());
+        wrapper.set(MqEcs::getStatus,0);
+        return this.update(wrapper);
+    }
+}

+ 55 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/service/impl/MqSendLogServiceImpl.java

@@ -0,0 +1,55 @@
+package com.gis.service.impl;
+
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gis.entity.MqSendLog;
+import com.gis.mapper.IMqSendLogMapper;
+import com.gis.service.IMqSendLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2024-04-02
+ */
+@Service
+@DS("db2")
+public class MqSendLogServiceImpl extends ServiceImpl<IMqSendLogMapper, MqSendLog> implements IMqSendLogService {
+
+    @Override
+    public List<MqSendLog> getNoSendMsg() {
+        LambdaQueryWrapper<MqSendLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MqSendLog::getStatus,0);
+        wrapper.orderByAsc(MqSendLog::getSort);
+        wrapper.orderByAsc(MqSendLog::getId);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public List<MqSendLog> getNoSendMsgByQueueName(String key) {
+        LambdaQueryWrapper<MqSendLog> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(MqSendLog::getStatus,0);
+        wrapper.eq(MqSendLog::getQueue,key);
+        wrapper.orderByAsc(MqSendLog::getId);
+        return this.list(wrapper);
+    }
+
+    @Override
+    public void updateStatus(Integer id, Integer status,String queueName) {
+        LambdaUpdateWrapper<MqSendLog> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(MqSendLog::getId,id);
+        wrapper.set(MqSendLog::getStatus,status);
+        if(StringUtils.isNotBlank(queueName)){
+            wrapper.set(MqSendLog::getQueue,queueName);
+        }
+        this.update(wrapper);
+    }
+}

Разлика између датотеке није приказан због своје велике величине
+ 1190 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/util/RedisUtil.java


+ 18 - 0
720yun_fd_consumer/gis_consumer/src/main/java/com/gis/util/testUtil.java

@@ -0,0 +1,18 @@
+package com.gis.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gis.dto.SceneQueueDTO;
+
+/**
+ * @author Xiewj
+ * @date 2025/3/21
+ */
+public class testUtil {
+    public static void main(String[] args) {
+        SceneQueueDTO d=new SceneQueueDTO();
+        d.setSceneCode("123");
+        d.setLocation(2);
+        System.out.println(JSONObject.toJSONString(d));
+
+    }
+}

+ 38 - 32
720yun_fd_consumer/gis_consumer/src/main/resources/application-loc-site.yml

@@ -1,12 +1,15 @@
+domain:
+    4dkk: https://test.4dkankan.com
 logging:
     config: classpath:logback-spring.xml
     fdkk:
         level: INFO
         maxHistory: 180
+    file:
+        path: E:/javaProject/${project.name}_log
     level:
         com:
             gis: info
-    path: E:/javaProject/${project.name}_log
 filestorage:
     active: oss
     oss:
@@ -16,34 +19,29 @@ filestorage:
         access-key-secret: meDy7VYAWbg8kZCKsoUZcIYQxigWOy
         bucket: oss-xiaoan
         bucket-custom-domain:
-            qjkankan: https://ossxiaoan.4dage.com/
+            oss-xiaoan: https://ossxiaoan.4dage.com/
+            4dkankan: https://4dkk.4dage.com/
         full-path: true
 server:
     file:
         path: i:\test\ngin\${project.name}_data\
 spring:
     datasource:
-        driver-class-name: com.mysql.cj.jdbc.Driver
-        druid:
-            initial-size: 5
-            max-active: 20
-            max-evictable-idle-time-millis: 90000
-            max-wait: 60000
-            min-evictable-idle-time-millis: 30000
-            min-idle: 10
-            password: JK123456%JIK
-            stat-view-servlet:
-                enabled: true
-            test-on-borrow: false
-            test-on-return: false
-            test-while-idle: true
-            time-between-eviction-runs-millis: 60000
-            url: jdbc:mysql://120.25.146.52:13306/720yun_fd_manage?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
-            username: root
-            validation-query: SELECT 1 FROM DUAL
-            web-stat-filter:
-                enabled: true
         type: com.alibaba.druid.pool.DruidDataSource
+        dynamic:
+            primary: db1
+            strict: false
+            datasource:
+                db1:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://120.25.146.52:13306/720yun_fd_manage?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+                    username: root
+                    password: JK123456%JIK
+                db2:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://120.24.144.164:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+                    username: root
+                    password: 4Dage@4Dage#@168
     rabbitmq:
         host: 120.24.144.164
         port: 5672
@@ -56,14 +54,20 @@ spring:
                 prefetch: 1
                 max-concurrency: 2
                 acknowledge-mode: manual #开启消费者手动确认
-                # retry:
-                #   enabled: true           # 开启消费者出现异常情况下,进行重试消费,默认false
-                #   max-attempts: 5         # 最大重试次数,默认为3
-                #   max-interval: 10000   # 重试最大间隔时间
-                #   initial-interval: 2000  # 重试初始间隔时间
-                #   multiplier: 2 # 间隔时间乘子,间隔时间*乘子=下一次的间隔时间,最大不能超过设置的最大间隔时间
         #开启消息投递确认机制
         publisher-confirm-type: correlated
+    redis:
+        database: 0
+        host: 120.24.144.164
+        jedis:
+            pool:
+                max-active: 8
+                max-idle: 8
+                max-wait: -1ms
+                min-idle: 0
+        password: bgh0cae240
+        port: 6379
+        timeout: 3000ms
 tlog:
     enable-invoke-time-print: true
 queue:
@@ -73,9 +77,11 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
-
-domain:
-    4dkk: https://test.4dkankan.com
+    scene-queue-work: queue-pano-scene-work-A
 config:
     bashPath: ${project.name}/
+mq:
+    listener:
+        dynamic: ${Dynamic}
+hostName:
+    filePath: I:\720_host\hosts.txt

+ 1 - 1
720yun_fd_consumer/gis_consumer/src/main/resources/application-locsitSD.yml

@@ -72,4 +72,4 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A

+ 1 - 1
720yun_fd_consumer/gis_consumer/src/main/resources/application-pro.yml

@@ -84,6 +84,6 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A
 config:
     bashPath: 720yun_fd_manage/

+ 4 - 4
720yun_fd_consumer/gis_consumer/src/main/resources/application-proAws.yml

@@ -57,10 +57,10 @@ spring:
             simple:
                 prefetch: 1
                 max-concurrency: 10
-                acknowledge-mode: manual #开启消费者手动确认
+                acknowledge-mode: manual #锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟街讹拷确锟斤拷
             direct:
-                acknowledge-mode: manual #开启消费者手动确认
-        #开启消息投递确认机制
+                acknowledge-mode: manual #锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟街讹拷确锟斤拷
+        #锟斤拷锟斤拷锟斤拷息投锟斤拷确锟较伙拷锟斤拷
         publisher-confirm-type: correlated
     redis:
         database: 0
@@ -83,4 +83,4 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A

+ 36 - 22
720yun_fd_consumer/gis_consumer/src/main/resources/application-sit.yml

@@ -8,7 +8,8 @@ logging:
     level:
         com:
             gis: info
-    path: /root/data/${project.name}_log
+    file:
+        path: /root/log/${project.name}_log
 filestorage:
     active: oss
     oss:
@@ -26,27 +27,21 @@ server:
         path: /mnt/720yun_fd_manage_data/
 spring:
     datasource:
-        driver-class-name: com.mysql.cj.jdbc.Driver
-        druid:
-            initial-size: 5
-            max-active: 20
-            max-evictable-idle-time-millis: 90000
-            max-wait: 60000
-            min-evictable-idle-time-millis: 30000
-            min-idle: 10
-            password: JK123456%JIK
-            stat-view-servlet:
-                enabled: true
-            test-on-borrow: false
-            test-on-return: false
-            test-while-idle: true
-            time-between-eviction-runs-millis: 60000
-            url: jdbc:mysql://127.0.0.1:13306/720yun_fd_manage?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
-            username: root
-            validation-query: SELECT 1 FROM DUAL
-            web-stat-filter:
-                enabled: true
         type: com.alibaba.druid.pool.DruidDataSource
+        dynamic:
+            primary: db1
+            strict: false
+            datasource:
+                db1:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://172.18.156.41:13306/720yun_fd_manage?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
+                    username: root
+                    password: JK123456%JIK
+                db2:
+                    driver-class-name: com.mysql.cj.jdbc.Driver
+                    url: jdbc:mysql://172.18.156.39:3306/4dkankan_v4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
+                    username: root
+                    password: 4Dage@4Dage#@168
     rabbitmq:
         host: 172.18.156.39
         port: 5672
@@ -61,6 +56,18 @@ spring:
                 acknowledge-mode: manual #开启消费者手动确认
         #开启消息投递确认机制
         publisher-confirm-type: correlated
+    redis:
+        database: 0
+        host: 172.18.156.39
+        jedis:
+            pool:
+                max-active: 8
+                max-idle: 8
+                max-wait: -1ms
+                min-idle: 0
+        password: bgh0cae240
+        port: 6379
+        timeout: 3000ms
 tlog:
     enable-invoke-time-print: true
 queue:
@@ -70,6 +77,13 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A
+
 config:
     bashPath: 720yun_fd_manage/
+# application.yml
+mq:
+ listener:
+    dynamic: ${Dynamic}
+hostName:
+    filePath: /opt/hosts/hosts.txt

+ 1 - 1
720yun_fd_consumer/gis_consumer/src/main/resources/application-sitAws.yml

@@ -80,6 +80,6 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A
 config:
     bashPath: 720yun_fd_manage/

+ 1 - 1
720yun_fd_consumer/gis_consumer/src/main/resources/application-sitSD.yml

@@ -73,4 +73,4 @@ queue:
     relics-update-name-queue: relics-update-name-queue
     pano-migrate-scene-queue: pano-migrate-scene-queue
     pano-paystatus-scene-queue: pano-paystatus-scene-queue
-    scene-queue-work: queue-pano-scene-work
+    scene-queue-work: queue-pano-scene-work-A

+ 4 - 0
720yun_fd_consumer/gis_consumer_oss/pom.xml

@@ -195,6 +195,10 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 
 

+ 6 - 2
720yun_fd_consumer/pom.xml

@@ -48,7 +48,7 @@
         <cos.version>5.6.166</cos.version>
         <aliyun-sdk-oss.version>3.15.1</aliyun-sdk-oss.version>
 
-        <mybatisPlus.version>3.5.3.2</mybatisPlus.version>
+        <mybatisPlus.version>3.5.2</mybatisPlus.version>
 
     </properties>
 
@@ -187,7 +187,11 @@
                 <artifactId>mybatis-plus-boot-starter</artifactId>
                 <version>${mybatisPlus.version}</version>
             </dependency>
-
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
+                <version>${mybatisPlus.version}</version>
+            </dependency>
 
             <!--分页插件-->
             <dependency>

+ 14 - 1
720yun_fd_consumer/remark.md

@@ -5,4 +5,17 @@
  
 # pro
     rabbitMq
-        url: 
+        url: 
+
+
+sudo tee /etc/systemd/system/qjserver.service >/dev/null << EOF
+[Unit]
+Wants=network.target
+[Service]
+ExecStart= /usr/local/jdk1.8.0_172/bin/java -DDynamic=true -jar /user/java/720yun_fd_consumer/720yun_fd_consumer.jar --spring.profiles.active=sit --server.port=8002 > /dev/null 2>&1 &
+[Install]
+WantedBy=multi-user.target
+EOF
+
+sudo systemctl start qjserver.service
+sudo systemctl stop qjserver.service

+ 2 - 1
720yun_fd_consumer/run.sh

@@ -1,6 +1,7 @@
 #!/bin/sh
 APP_NAME=720yun_fd_consumer.jar
 APP_PORT=8002
+DYNAMIC=$3   #执行环境 sit|pro
 APP_EVN=$2   #执行环境 sit|pro
 APP_ORDER=$1   #执行方法  start|stop|restart
 # 获取进程号
@@ -14,7 +15,7 @@ startApp(){
     	echo "程序已经在运行了"
     else
     	echo "执行 start 方法"
-    	nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5530 -jar -XX:MetaspaceSize=1500m -XX:MaxMetaspaceSize=1500m -Xms4072m -Xmx4072m -Xmn1024m -Xss1m -XX:SurvivorRatio=8 ./$APP_NAME --spring.profiles.active=$APP_EVN --server.port=$APP_PORT > logs.log 2>error.log &  # 说明pid为空
+    	nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5530 -jar -XX:MetaspaceSize=1500m -XX:MaxMetaspaceSize=1500m -Xms4072m -Xmx4072m -Xmn1024m -Xss1m -XX:SurvivorRatio=8 ./$APP_NAME --spring.profiles.active=$APP_EVN --server.port=$APP_PORT -DDYNAMIC=$DYNAMIC > logs.log 2>error.log &  # 说明pid为空
 	echo Start Success!
 fi
 }