Pārlūkot izejas kodu

事件接收 事件流程 事件文件

limeng 2 mēneši atpakaļ
vecāks
revīzija
34de087356
34 mainītis faili ar 1727 papildinājumiem un 3 dzēšanām
  1. 101 0
      pom.xml
  2. 9 3
      src/main/java/com/sooka/sponest/event/SookaEventApplication.java
  3. 41 0
      src/main/java/com/sooka/sponest/event/eventAttach/domain/EventAttach.java
  4. 12 0
      src/main/java/com/sooka/sponest/event/eventAttach/mapper/EventAttachMapper.java
  5. 14 0
      src/main/java/com/sooka/sponest/event/eventAttach/service/EventAttachService.java
  6. 25 0
      src/main/java/com/sooka/sponest/event/eventAttach/service/impl/EventAttachServiceImpl.java
  7. 70 0
      src/main/java/com/sooka/sponest/event/eventLog/domain/EventLog.java
  8. 11 0
      src/main/java/com/sooka/sponest/event/eventLog/mapper/EventLogMapper.java
  9. 8 0
      src/main/java/com/sooka/sponest/event/eventLog/service/EventLogService.java
  10. 20 0
      src/main/java/com/sooka/sponest/event/eventLog/service/impl/EventLogServiceImpl.java
  11. 81 0
      src/main/java/com/sooka/sponest/event/eventMessage/controller/EventMessageController.java
  12. 44 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/DaHuaFireEventVO.java
  13. 58 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/DaHuaOtherEventVO.java
  14. 24 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/EventMessage.java
  15. 120 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/FireEventInfoVO.java
  16. 19 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/FirePointVO.java
  17. 13 0
      src/main/java/com/sooka/sponest/event/eventMessage/domain/PtzPositionVO.java
  18. 24 0
      src/main/java/com/sooka/sponest/event/eventMessage/mapper/EventMessageMapper.java
  19. 24 0
      src/main/java/com/sooka/sponest/event/eventMessage/service/EventMessageService.java
  20. 60 0
      src/main/java/com/sooka/sponest/event/eventMessage/service/impl/EventMessageServiceImpl.java
  21. 139 0
      src/main/java/com/sooka/sponest/event/eventProcess/controller/EventProcessController.java
  22. 136 0
      src/main/java/com/sooka/sponest/event/eventProcess/domain/EventInfo.java
  23. 40 0
      src/main/java/com/sooka/sponest/event/eventProcess/mapper/EventProcessMapper.java
  24. 38 0
      src/main/java/com/sooka/sponest/event/eventProcess/service/EventProcessService.java
  25. 194 0
      src/main/java/com/sooka/sponest/event/eventProcess/service/impl/EventProcessServiceImpl.java
  26. 27 0
      src/main/java/com/sooka/sponest/event/listener/carrier/EventMessageInsertedEvent.java
  27. 24 0
      src/main/java/com/sooka/sponest/event/listener/config/AsyncConfig.java
  28. 48 0
      src/main/java/com/sooka/sponest/event/listener/listener/EventMessageEventListener.java
  29. 17 0
      src/main/java/com/sooka/sponest/event/utils/database/DynamicDataSource.java
  30. 36 0
      src/main/java/com/sooka/sponest/event/utils/database/DynamicDataSourceAspect.java
  31. 134 0
      src/main/java/com/sooka/sponest/event/utils/database/MultipleDataSourceConfig.java
  32. 14 0
      src/main/java/com/sooka/sponest/event/utils/database/MyDataSource.java
  33. 61 0
      src/main/java/com/sooka/sponest/event/utils/eventConstants/EventConstants.java
  34. 41 0
      src/main/java/com/sooka/sponest/event/utils/eventEnum/EventEnum.java

+ 101 - 0
pom.xml

@@ -13,6 +13,107 @@
     <artifactId>center-event</artifactId>
 
     <dependencies>
+        <!-- SpringCloud Alibaba Nacos -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Nacos Config -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <!-- SpringCloud Alibaba Sentinel -->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+
+        <!-- Sentinel Datasource Nacos -->
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+        </dependency>
+
+        <!-- Swagger UI -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${swagger.fox.version}</version>
+        </dependency>
+
+        <!-- Mysql Connector -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-log</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Swagger -->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-swagger</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-common-datascope</artifactId>
+        </dependency>
+
+        <!--websocket-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-api-evaluation</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-api-message</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>sooka-sponest-api-monitor</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <version>1.10.0</version>
+        </dependency>
+
+        <!--  RabbitMQ的Stream实现  -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.dahuatech.icc</groupId>
+            <artifactId>java-sdk-oauth</artifactId>
+            <version>1.0.9</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 9 - 3
src/main/java/com/sooka/sponest/event/SookaEventApplication.java

@@ -1,12 +1,18 @@
 package com.sooka.sponest.event;
 
+import com.ruoyi.common.security.annotation.EnableCustomConfig;
+import com.ruoyi.common.security.annotation.EnableRyFeignClients;
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
 import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.scheduling.annotation.EnableScheduling;
 
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
-@EnableScheduling
+@EnableCustomConfig
+@EnableCustomSwagger2
+@EnableRyFeignClients
+@SpringBootApplication(scanBasePackages = "com.sooka")
+@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
 public class SookaEventApplication {
 
     public static void main(String[] args) {

+ 41 - 0
src/main/java/com/sooka/sponest/event/eventAttach/domain/EventAttach.java

@@ -0,0 +1,41 @@
+package com.sooka.sponest.event.eventAttach.domain;
+
+import lombok.Data;
+
+@Data
+public class EventAttach {
+
+    /**
+     * 日志ID
+     */
+    private Integer logId;
+
+    /**
+     * 事件ID
+     */
+    private Integer eventId;
+
+    /**
+     * 路径
+     */
+    private String path;
+
+    /**
+     * 附件来源(FIRE/OTHER)
+     */
+    private String source;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    public EventAttach buildEventAttach(Integer logId, Integer eventId, String path, String source, Integer sort) {
+        this.logId = logId;
+        this.eventId = eventId;
+        this.path = path;
+        this.source = source;
+        this.sort = sort;
+        return this;
+    }
+}

+ 12 - 0
src/main/java/com/sooka/sponest/event/eventAttach/mapper/EventAttachMapper.java

@@ -0,0 +1,12 @@
+package com.sooka.sponest.event.eventAttach.mapper;
+
+import com.sooka.sponest.event.eventAttach.domain.EventAttach;
+
+import java.util.List;
+
+public interface EventAttachMapper {
+
+    void insertEventAttach(EventAttach eventAttach);
+
+    List<EventAttach> selectEventAttachList(EventAttach eventAttach);
+}

+ 14 - 0
src/main/java/com/sooka/sponest/event/eventAttach/service/EventAttachService.java

@@ -0,0 +1,14 @@
+package com.sooka.sponest.event.eventAttach.service;
+
+import com.sooka.sponest.event.eventAttach.domain.EventAttach;
+
+import java.util.List;
+
+public interface EventAttachService {
+
+    void insertEventAttach(EventAttach eventAttach);
+
+    List<EventAttach> selectEventAttachList(EventAttach eventAttach);
+
+
+}

+ 25 - 0
src/main/java/com/sooka/sponest/event/eventAttach/service/impl/EventAttachServiceImpl.java

@@ -0,0 +1,25 @@
+package com.sooka.sponest.event.eventAttach.service.impl;
+
+import com.sooka.sponest.event.eventAttach.domain.EventAttach;
+import com.sooka.sponest.event.eventAttach.mapper.EventAttachMapper;
+import com.sooka.sponest.event.eventAttach.service.EventAttachService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class EventAttachServiceImpl implements EventAttachService {
+
+    @Resource
+    private EventAttachMapper eventAttachMapper;
+
+    public void insertEventAttach(EventAttach eventAttach) {
+        eventAttachMapper.insertEventAttach(eventAttach);
+    }
+
+    @Override
+    public List<EventAttach> selectEventAttachList(EventAttach eventAttach) {
+        return eventAttachMapper.selectEventAttachList(eventAttach);
+    }
+}

+ 70 - 0
src/main/java/com/sooka/sponest/event/eventLog/domain/EventLog.java

@@ -0,0 +1,70 @@
+package com.sooka.sponest.event.eventLog.domain;
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.sooka.sponest.event.eventAttach.domain.EventAttach;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 事件操作日志对象
+ *
+ * @author 李猛
+ * @since 2025/07/04
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class EventLog extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Integer id;
+
+    /**
+     * 事件ID
+     */
+    private Integer eventId;
+
+    /**
+     * 操作内容
+     */
+    private String content;
+
+    /**
+     * 填报纬度
+     */
+    private String latitude;
+
+    /**
+     * 填报经度
+     */
+    private String longitude;
+
+    /**
+     * 业务操作
+     */
+    private String operationType;
+
+    /**
+     * 操作类型(PC/APP/AI)
+     */
+    private String operationSource;
+
+    /**
+     * 附件列表
+     */
+    private List<EventAttach> attachList;
+
+    public EventLog buildEventLog(Integer eventId, String operationType, String operationSource, String content, String createBy, Date createTime) {
+        this.eventId = eventId;
+        this.operationType = operationType;
+        this.operationSource = operationSource;
+        this.content = content;
+        this.setCreateBy(createBy);
+        this.setCreateTime(createTime);
+        return this;
+    }
+}

+ 11 - 0
src/main/java/com/sooka/sponest/event/eventLog/mapper/EventLogMapper.java

@@ -0,0 +1,11 @@
+package com.sooka.sponest.event.eventLog.mapper;
+
+import com.sooka.sponest.event.eventLog.domain.EventLog;
+
+public interface EventLogMapper {
+
+    /**
+     * 新增设事件日志
+     */
+    int insertEventLog(EventLog eventLog);
+}

+ 8 - 0
src/main/java/com/sooka/sponest/event/eventLog/service/EventLogService.java

@@ -0,0 +1,8 @@
+package com.sooka.sponest.event.eventLog.service;
+
+import com.sooka.sponest.event.eventLog.domain.EventLog;
+
+public interface EventLogService {
+
+    public int insertEventLog(EventLog eventLog);
+}

+ 20 - 0
src/main/java/com/sooka/sponest/event/eventLog/service/impl/EventLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.sooka.sponest.event.eventLog.service.impl;
+
+import com.sooka.sponest.event.eventLog.domain.EventLog;
+import com.sooka.sponest.event.eventLog.mapper.EventLogMapper;
+import com.sooka.sponest.event.eventLog.service.EventLogService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class EventLogServiceImpl implements EventLogService {
+
+    @Resource
+    private EventLogMapper eventLogMapper;
+
+
+    public int insertEventLog(EventLog eventLog){
+        return eventLogMapper.insertEventLog(eventLog);
+    }
+}

+ 81 - 0
src/main/java/com/sooka/sponest/event/eventMessage/controller/EventMessageController.java

@@ -0,0 +1,81 @@
+package com.sooka.sponest.event.eventMessage.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+import com.sooka.sponest.event.eventMessage.service.EventMessageService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 事件接收Controller
+ * @author limeng
+ * @since 2025/07/03
+ */
+@RestController
+@RequestMapping("eventMessage")
+public class EventMessageController extends BaseController {
+
+    @Resource
+    private EventMessageService eventMessageService;
+
+    /**
+     * 查询事件列表
+     *
+     * @param eventMessage 报文
+     * @return 结果
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(EventMessage eventMessage) {
+        startPage();
+        List<EventMessage> list = eventMessageService.selectEventMessageList(eventMessage);
+        return getDataTable(list);
+    }
+
+    //======================================   DSS START  ======================================//
+
+    /**
+     * DSS - 接收大华xc5300事件
+     * */
+    @PostMapping("/dahua@OtherEventMessageReceiver")
+    public AjaxResult DH_OtherEventsMessageReceiver(@RequestBody JSONObject jsonObject) {
+        String alarmTypeName = StringUtils.isBlank(jsonObject.getString("alarmName")) ? jsonObject.getString("alarmTypeName") : jsonObject.getString("alarmName");
+        String alarmType = StringUtils.isBlank(jsonObject.getString("alarmType")) ? jsonObject.getString("alarmTypeCode") : jsonObject.getString("alarmType");
+        return insertEventMessage(jsonObject, alarmTypeName, alarmType);
+    }
+
+    /**
+     * DSS - 接收大华火险、烟雾事件 5122 313
+     * */
+    @PostMapping("/dahua@FireEventMessageReceiver")
+    public AjaxResult DH_FireEventsMessageReceiver(@RequestBody JSONObject jsonObject) {
+        String alarmTypeName = jsonObject.getJSONObject("info").getString("alarmTypeName");
+        String alarmType = jsonObject.getJSONObject("info").getString("alarmType");
+        return insertEventMessage(jsonObject, alarmTypeName, alarmType);
+    }
+
+    private AjaxResult insertEventMessage(@RequestBody JSONObject jsonObject, String alarmTypeName, String alarmType) {
+        if (alarmTypeName == null || alarmType == null) {
+            return AjaxResult.error("Message reception failed");
+        }
+        EventMessage message = new EventMessage();
+        message.setSource("大华-" + alarmTypeName);
+        message.setEventMessage(jsonObject.toJSONString());
+        message.setCreateTime(DateUtils.getNowDate());
+        eventMessageService.insertEventMessage(message,alarmType);
+        return AjaxResult.success("Message received successfully");
+    }
+
+    //======================================   DSS END  ======================================//
+
+
+    //======================================   HIK START  ======================================//
+
+    //======================================   HIK END  ======================================//
+}

+ 44 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/DaHuaFireEventVO.java

@@ -0,0 +1,44 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class DaHuaFireEventVO {
+
+    /**
+     * 序号
+     */
+    Long id;
+
+    /**
+     * 事件大类
+     */
+    String category;
+
+    /**
+     * 方法名
+     */
+    String method;
+
+    /**
+     * 报文内容
+     */
+    FireEventInfoVO info;
+
+    /**
+     * 子系统名称
+     */
+    String subsystem;
+
+    /**
+     * 域ID-级联消息下级发给mac时需要带上
+     */
+    String domainId;
+
+    /**
+     * 创建时间
+     */
+    Date createTime;
+}

+ 58 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/DaHuaOtherEventVO.java

@@ -0,0 +1,58 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+@Data
+public class DaHuaOtherEventVO {
+
+    private String districtName;// 行政区
+
+    private String address;// 点位地址
+
+    private Long occurrenceTime;// 告警时间, 毫秒数
+
+    private String alarmName;// 告警规则名称
+
+    private String deviceId;// 设备编号,不一定存在
+
+    private String imageList;// 图片信息JSON 串,包含目标框objectRect信息
+
+    private String point;// 告警画框坐标信息JSON 串
+
+    private String recordId;// 告警编码
+
+    private String alarmType;// 告警类型
+
+    private String resultType;// 事件类别
+
+    private String classType;
+
+    private String channelCode;// 视频通道编码code
+
+    private String latitude;// 地球纬度
+
+    private String longitude; //地球经度
+
+    private String channelSn;// 摄像机编码
+
+    private Date createTime;// 创建时间
+
+    @Override
+    public String toString() {
+        String toString = new ToStringBuilder(this, ToStringStyle.NO_CLASS_NAME_STYLE)
+                .append("行政区:", getDistrictName())
+                .append("瞭望塔:", getAddress())
+//                .append("方向:", getDirection())
+//                .append("距离:", getDistance())
+//                .append("高程:", getHeight())
+                .append("经度:", getLongitude())
+                .append("纬度:", getLatitude())
+                .toString().replaceAll("=", "");
+        return toString.substring(1, toString.length() - 1);
+    }
+
+}

+ 24 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/EventMessage.java

@@ -0,0 +1,24 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class EventMessage extends BaseEntity {
+    /**
+     * 主键id
+     */
+    private Integer id;
+
+    /**
+     * 报文来源
+     */
+    private String source;
+
+    /**
+     * 原始报文
+     */
+    private String eventMessage;
+}

+ 120 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/FireEventInfoVO.java

@@ -0,0 +1,120 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import com.ruoyi.common.core.utils.StringUtils;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.text.DecimalFormat;
+import java.util.List;
+
+@Data
+public class FireEventInfoVO {
+
+    private FirePointVO[] firePoint;
+
+    private PtzPositionVO ptzPosition;
+
+    private Long resourceId;
+
+    private String orgName;
+
+    /**
+     * 该设备关联的其他通道的唯一标识码
+     */
+    private List<String> otherChannelSns;
+
+    private String nodeCode;
+
+    private String distance;
+
+    private String alarmTypeName;
+
+    private String alarmPictures;
+
+    private String alarmDateStr;
+
+    private String resourceName;
+
+    private String deviceCode;
+
+    private String alarmCode;
+
+    private String alarmPicture;
+
+    private Long nodeType;
+
+    private Long alarmDate;
+
+    private String deviceName;
+
+    private String picture;
+
+    private Long alarmGrade;
+
+    private Long alarmType;
+
+    private String orgCode;
+
+    private String alarmPosition;
+
+    private String angle;
+
+    private String channelName;
+
+    /**
+     * 通道唯一标示码
+     */
+    private String channelSn;
+
+    private String elevation;
+
+
+    public String toString(String lng, String lat) {
+        String toString = new ToStringBuilder(this, ToStringStyle.NO_CLASS_NAME_STYLE)
+                .append("行政区:", getAlarmPosition())
+                .append("瞭望塔:", getChannelName())
+                .append("方向:", getDirection(getAngle()))
+                .append("距离:", getStr(getDistance()))
+                .append("高程:", getStr(getElevation()))
+                .append("经度:", StringUtils.isEmpty(getFirePoint()) ? lng : getFirePoint()[0].getGpsX())
+                .append("纬度:", StringUtils.isEmpty(getFirePoint()) ? lat : getFirePoint()[0].getGpsY())
+                .toString().replaceAll("=", "");
+        return toString.substring(1, toString.length() - 1);
+    }
+
+    public String getStr(String str) {
+        if (StringUtils.isBlank(str)) {
+            return "";
+        }
+        return str;
+    }
+
+    public String getDirection(String str) {
+        if (StringUtils.isBlank(str)) {
+            return "";
+        }
+        double angleStr = Double.parseDouble(str);//转成double进行比较
+        DecimalFormat df = new DecimalFormat(".00");
+        String newAngle = df.format(angleStr)+"°";//保留两位小数 转成字符串进行拼接
+        String outAngle = "";
+        if (67d <= angleStr && angleStr <= 111d) {
+            outAngle = "东" + newAngle;
+        } else if (158d <= angleStr && angleStr <= 202d) {
+            outAngle = "南" + newAngle;
+        } else if (247d <= angleStr && angleStr <= 288d) {
+            outAngle = "西" + newAngle;
+        } else if ((338d <= angleStr && angleStr <= 359d) || (0d <= angleStr && angleStr <= 21d)) {
+            outAngle = "北" + newAngle;
+        } else if (203d <= angleStr && angleStr <= 246d) {
+            outAngle = "西南" + newAngle;
+        } else if (22d <= angleStr && angleStr <= 66d) {
+            outAngle = "东北" + newAngle;
+        } else if (292d <= angleStr && angleStr <= 337d) {
+            outAngle = "西北" + newAngle;
+        } else if (112d <= angleStr && angleStr <= 157d) {
+            outAngle = "东南" + newAngle;
+        }
+        return outAngle;
+    }
+}

+ 19 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/FirePointVO.java

@@ -0,0 +1,19 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import lombok.Data;
+
+@Data
+public class FirePointVO {
+
+    private String gpsZ;
+
+    private Long id;
+
+    private String alarmCode;
+
+    private Long alarmDate;
+
+    private String gpsX;
+
+    private String gpsY;
+}

+ 13 - 0
src/main/java/com/sooka/sponest/event/eventMessage/domain/PtzPositionVO.java

@@ -0,0 +1,13 @@
+package com.sooka.sponest.event.eventMessage.domain;
+
+import lombok.Data;
+
+@Data
+public class PtzPositionVO {
+
+    private String zoom;
+
+    private String positionY;
+
+    private String positionX;
+}

+ 24 - 0
src/main/java/com/sooka/sponest/event/eventMessage/mapper/EventMessageMapper.java

@@ -0,0 +1,24 @@
+package com.sooka.sponest.event.eventMessage.mapper;
+
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+
+import java.util.List;
+
+public interface EventMessageMapper {
+
+    /**
+     * 新增事件报文
+     *
+     * @param eventMessage 报文
+     * @return 结果
+     */
+    int insertEventMessage(EventMessage eventMessage);
+
+    /**
+     * 查询报文列表
+     *
+     * @param eventMessage 报文
+     * @return 结果
+     */
+    List<EventMessage> selectEventMessageList(EventMessage eventMessage);
+}

+ 24 - 0
src/main/java/com/sooka/sponest/event/eventMessage/service/EventMessageService.java

@@ -0,0 +1,24 @@
+package com.sooka.sponest.event.eventMessage.service;
+
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+
+import java.util.List;
+
+public interface EventMessageService {
+
+    /**
+     * 新增事件报文
+     *
+     * @param eventMessage 报文
+     */
+    void insertEventMessage(EventMessage eventMessage, String alarmType);
+
+    /**
+     * 查询报文列表
+     *
+     * @param eventMessage 报文
+     * @return 结果
+     */
+    List<EventMessage> selectEventMessageList(EventMessage eventMessage);
+
+}

+ 60 - 0
src/main/java/com/sooka/sponest/event/eventMessage/service/impl/EventMessageServiceImpl.java

@@ -0,0 +1,60 @@
+package com.sooka.sponest.event.eventMessage.service.impl;
+
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+import com.sooka.sponest.event.eventMessage.mapper.EventMessageMapper;
+import com.sooka.sponest.event.eventMessage.service.EventMessageService;
+import com.sooka.sponest.event.listener.carrier.EventMessageInsertedEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@Service
+public class EventMessageServiceImpl implements EventMessageService {
+
+    Logger logger = LoggerFactory.getLogger(EventMessageServiceImpl.class);
+
+    @Resource
+    private ApplicationEventPublisher eventPublisher;
+
+    @Resource
+    private EventMessageMapper eventMessageMapper;
+
+    @Async("taskExecutor") // 标记为异步方法, 使用自定义线程池
+    public void publishEventAsync(EventMessage eventMessage, String alarmType) {
+        eventPublisher.publishEvent(new EventMessageInsertedEvent(this, eventMessage, alarmType));
+    }
+
+    /**
+     * 新增事件报文
+     *
+     * @param eventMessage 报文
+     */
+    public void insertEventMessage(EventMessage eventMessage, String alarmType) {
+        int result = 0;
+        try {
+            result = eventMessageMapper.insertEventMessage(eventMessage);
+            if (result > 0) {
+                publishEventAsync(eventMessage, alarmType); // 调用异步方法
+            }
+        }catch (Exception e) {
+            logger.error("事件报文插入条数:{} 条",result);
+            throw new RuntimeException("insertEventMessage Error:", e);
+        }
+    }
+
+    /**
+     * 查询报文列表
+     *
+     * @param eventMessage 报文
+     * @return 结果
+     */
+    @Override
+    public List<EventMessage> selectEventMessageList(EventMessage eventMessage) {
+        return eventMessageMapper.selectEventMessageList(eventMessage);
+    }
+}

+ 139 - 0
src/main/java/com/sooka/sponest/event/eventProcess/controller/EventProcessController.java

@@ -0,0 +1,139 @@
+package com.sooka.sponest.event.eventProcess.controller;
+
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+import com.sooka.sponest.event.eventProcess.domain.EventInfo;
+import com.sooka.sponest.event.eventProcess.service.EventProcessService;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 事件处置Controller
+ * @author limeng
+ * @since  2025/07/03
+ */
+@RestController
+@RequestMapping("eventProcess")
+public class EventProcessController extends BaseController {
+
+    @Resource
+    private EventProcessService eventProcessService;
+
+    /**
+     * 待确认事件列表
+     * @author limeng
+     * */
+    @GetMapping("/selectUnConfirmedList")
+    public TableDataInfo selectUnConfirmedList(EventInfo eventInfo) {
+        startPage();
+        List<EventInfo> list = eventProcessService.selectUnConfirmedList(eventInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 已确认事件列表
+     * @author limeng
+     * */
+    @GetMapping("/selectEventProcessList")
+    public TableDataInfo selectEventProcessList(EventInfo eventInfo) {
+        startPage();
+        List<EventInfo> list = eventProcessService.selectEventProcessList(eventInfo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 无异常事件列表
+     * @author limeng
+     * */
+    @GetMapping("/selectUsualList")
+    public TableDataInfo selectUsualList(EventInfo eventInfo) {
+        startPage();
+        List<EventInfo> list = eventProcessService.selectUsualList(eventInfo);
+        return getDataTable(list);
+    }
+
+
+    /**
+     * 查询待确认事件详情
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @GetMapping("/getUnconfirmedEventDetailById/{id}")
+    public AjaxResult getUnconfirmedEventDetailById(@PathVariable("id") Integer id) {
+        return eventProcessService.getUnconfirmedEventDetailById(id);
+    }
+
+    /**
+     * 查询已确认事件详情
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @GetMapping("/getConfirmedEventDetailById/{id}")
+    public AjaxResult getConfirmedEventDetailById(@PathVariable("id") Integer id) {
+        return eventProcessService.getConfirmedEventDetailById(id);
+    }
+
+    /**
+     * 查询无异常事件详情
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @GetMapping("/getUsualEventDetailById/{id}")
+    public AjaxResult getUsualEventDetailById(@PathVariable("id") Integer id) {
+        return eventProcessService.getUsualEventDetailById(id);
+    }
+
+    /**
+     * 确认
+     * @param eventInfo => id  事件信息主键 eventType  事件类型
+     * @author limeng
+     * */
+    @PostMapping("/confirm")
+    public AjaxResult confirm(EventInfo eventInfo) {
+        return eventProcessService.confirm(eventInfo);
+    }
+
+    /**
+     * 无异常
+     * @param eventInfo => id  事件信息主键
+     * @author limeng
+     * */
+    @PostMapping("/usual")
+    public AjaxResult usual(EventInfo eventInfo){
+        return eventProcessService.usual(eventInfo);
+    }
+
+    /**
+     * 签收
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @PostMapping("/signFor")
+    public AjaxResult signFor(Integer id){
+        return eventProcessService.signFor(id);
+    }
+
+    /**
+     * 办结
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @PostMapping("/completed")
+    public AjaxResult completed(Integer id){
+        return eventProcessService.completed(id);
+    }
+
+    /**
+     * 归档
+     * @param id  事件信息主键
+     * @author limeng
+     * */
+    @PostMapping("/archive")
+    public AjaxResult archive(Integer id){
+        return eventProcessService.archive(id);
+    }
+
+
+}

+ 136 - 0
src/main/java/com/sooka/sponest/event/eventProcess/domain/EventInfo.java

@@ -0,0 +1,136 @@
+package com.sooka.sponest.event.eventProcess.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+import com.sooka.sponest.event.eventLog.domain.EventLog;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 事件对象
+ *
+ * @author limeng
+ * @since  2025/07/04
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class EventInfo extends BaseEntity {
+
+    /**
+     * 主键id
+     */
+    private Integer id;
+
+    /**
+     * 部门id
+     */
+    private Long deptId;
+
+    /**
+     * 事件分类
+     */
+    @NotBlank(message = "事件分类不能为空")
+    private String eventType;
+
+    /**
+     * 事件名称
+     */
+    @NotBlank(message = "事件名称不能为空")
+    private String eventName;
+
+    /**
+     * 事件描述
+     */
+    @NotBlank(message = "事件描述不能为空")
+    private String eventDescription;
+
+    /**
+     * 事件来源
+     */
+    private String reportSource;
+
+    /**
+     * 经度
+     */
+    @NotBlank(message = "经度不能为空")
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    @NotBlank(message = "纬度不能为空")
+    private String latitude;
+
+    /**
+     * 上报者
+     */
+    private String reporter;
+
+    /**
+     * 上报时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date reportTime;
+
+    /**
+     * 摄像头编码
+     */
+    private String cameraCode;
+
+    /**
+     * 事件状态key
+     */
+    private String eventStatus;
+
+    /**
+     * 上报具体位置
+     */
+    private String address;
+
+
+    /**
+     * 是否被催办
+     */
+    private String isUrged;
+
+    /**
+     * 催办次数
+     */
+    private Integer urgeCount;
+
+    /**
+     * 事件图片
+     */
+    private List<String> pictureList = new ArrayList<>();
+
+    /**
+     * 事件日志
+     */
+    private List<EventLog> eventLogList = new ArrayList<>();
+
+
+    public EventInfo buildEventInfo(Integer id, String eventStatus) {
+        this.id = id;
+        this.eventStatus = eventStatus;
+        return this;
+    }
+    public EventInfo buildEventInfo(Long deptId, String eventType, String eventName, String eventDescription, String longitude, String latitude, String reporter, Date reportTime, String cameraCode, String address) {
+        this.deptId = deptId;
+        this.eventType = eventType;
+        this.eventName = eventName;
+        this.eventDescription = eventDescription;
+        this.longitude = longitude;
+        this.latitude = latitude;
+        this.reporter = reporter;
+        this.reportTime = reportTime;
+        this.cameraCode = cameraCode;
+        this.address = address;
+        return this;
+    }
+
+}

+ 40 - 0
src/main/java/com/sooka/sponest/event/eventProcess/mapper/EventProcessMapper.java

@@ -0,0 +1,40 @@
+package com.sooka.sponest.event.eventProcess.mapper;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.event.eventProcess.domain.EventInfo;
+
+import java.util.List;
+
+public interface EventProcessMapper {
+
+    void insertEventInfo(EventInfo eventInfo);
+
+    List<EventInfo> selectUnConfirmedList(EventInfo eventInfo);
+
+    List<EventInfo> selectEventProcessList(EventInfo eventInfo);
+
+    List<EventInfo> selectUsualList(EventInfo eventInfo);
+
+    EventInfo getUnconfirmedEventDetailById(Integer id);
+
+    EventInfo getConfirmedEventDetailById(Integer id);
+
+    EventInfo getUsualEventDetailById(Integer id);
+
+    AjaxResult signFor(Integer id);
+
+    AjaxResult completed(Integer id);
+
+    AjaxResult archive(Integer id);
+
+    void insertEventProcess(EventInfo eventInfo);
+
+    void updateEventProcess(EventInfo eventInfo);
+
+    void insertEventUsual(EventInfo eventInfo);
+
+    void deleteEventUnconfirmed(EventInfo eventInfo);
+
+    EventInfo getEventUnconfirmedById(Integer id);
+
+}

+ 38 - 0
src/main/java/com/sooka/sponest/event/eventProcess/service/EventProcessService.java

@@ -0,0 +1,38 @@
+package com.sooka.sponest.event.eventProcess.service;
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaFireEventVO;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaOtherEventVO;
+import com.sooka.sponest.event.eventProcess.domain.EventInfo;
+
+import java.util.List;
+
+public interface EventProcessService {
+
+    void insertDaHuaOtherEvent(DaHuaOtherEventVO daHuaOtherEventVO);
+
+    void insertDaHuaFireEvent(DaHuaFireEventVO daHuaFireEventVO);
+
+    List<EventInfo> selectUnConfirmedList(EventInfo eventInfo);
+
+    List<EventInfo> selectEventProcessList(EventInfo eventInfo);
+
+    List<EventInfo> selectUsualList(EventInfo eventInfo);
+
+    AjaxResult getUnconfirmedEventDetailById(Integer id);
+
+    AjaxResult getUsualEventDetailById(Integer id);
+
+    AjaxResult getConfirmedEventDetailById(Integer id);
+
+    AjaxResult confirm(EventInfo eventInfo);
+
+    AjaxResult usual(EventInfo eventInfo);
+
+    AjaxResult signFor(Integer id);
+
+    AjaxResult completed(Integer id);
+
+    AjaxResult archive(Integer id);
+
+}

+ 194 - 0
src/main/java/com/sooka/sponest/event/eventProcess/service/impl/EventProcessServiceImpl.java

@@ -0,0 +1,194 @@
+package com.sooka.sponest.event.eventProcess.service.impl;
+
+
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.system.api.model.LoginUser;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaFireEventVO;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaOtherEventVO;
+import com.sooka.sponest.event.eventProcess.domain.EventInfo;
+import com.sooka.sponest.event.eventProcess.service.EventProcessService;
+import com.sooka.sponest.event.utils.eventEnum.EventEnum;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Service
+public class EventProcessServiceImpl implements EventProcessService {
+
+    Logger logger = LoggerFactory.getLogger(EventProcessServiceImpl.class);
+
+    private final Lock lock = new ReentrantLock(true); // 公平锁
+
+    @Override
+    public void insertDaHuaOtherEvent(DaHuaOtherEventVO daHuaOtherEventVO){
+        try {
+            if (daHuaOtherEventVO != null && daHuaOtherEventVO.getChannelSn() != null) {
+                String code = daHuaOtherEventVO.getChannelSn();
+                //验证设备是否存在
+                logger.error("无法匹配相关设备!ChannelSn:{}", code);
+                //验证指挥中心是否配置
+                logger.error("无法匹配指挥中心!ChannelSn:{}", code);
+                //验证事件类型是否存在
+                logger.error("无法匹配事件类型!!AlarmType:{}", daHuaOtherEventVO.getAlarmType());
+                // 构建事件对象
+                // 插入事件信息
+                // 插入事件日志
+                // 插入事件图片
+            }
+        }catch (Exception e){
+            logger.error("事件新增失败!输入参数:{}", daHuaOtherEventVO, e);
+        }
+    }
+
+    @Override
+    public void insertDaHuaFireEvent(DaHuaFireEventVO daHuaFireEventVO){
+        try {
+            if (daHuaFireEventVO != null && daHuaFireEventVO.getInfo().getChannelSn() != null) {
+                String code = daHuaFireEventVO.getInfo().getChannelSn();
+                //验证设备是否存在
+                logger.error("无法匹配相关设备!ChannelSn:{}", code);
+                //验证设备是否存在
+                logger.error("无法匹配相关设备!ChannelSn:{}", code);
+                //验证指挥中心是否配置
+                logger.error("无法匹配指挥中心!ChannelSn:{}", code);
+                // 构建事件对象
+                // 插入事件信息
+                // 插入事件日志
+                // 插入事件图片
+            }
+        }catch (Exception e){
+            logger.error("事件新增失败!输入参数:{}", daHuaFireEventVO, e);
+        }
+    }
+    @Override
+    public List<EventInfo> selectUnConfirmedList(EventInfo eventInfo){
+        return null;
+    }
+
+    @Override
+    public List<EventInfo> selectEventProcessList(EventInfo eventInfo){
+        return null;
+    }
+
+    @Override
+    public List<EventInfo> selectUsualList(EventInfo eventInfo){
+        return null;
+    }
+
+    @Override
+    public AjaxResult getUnconfirmedEventDetailById(Integer id) {
+        return null;
+    }
+
+    @Override
+    public AjaxResult getUsualEventDetailById(Integer id) {
+        return null;
+    }
+
+    @Override
+    public AjaxResult getConfirmedEventDetailById(Integer id) {
+        return null;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult confirm(EventInfo eventInfo){
+        if (lock.tryLock()){ //获取锁
+            try {
+                //业务代码
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                logger.error("事件处置失败!输入参数:{}", eventInfo, e);
+                return AjaxResult.error();
+            }finally {
+                lock.unlock(); //释放锁
+            }
+        }else{
+            return AjaxResult.error(EventEnum.METHOD_LOCKED.getDescribe()); //已锁
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult usual(EventInfo eventInfo){
+        if (lock.tryLock()) { //获取锁
+            try {
+                //业务代码
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                logger.error("事件处置失败!输入参数:{}", eventInfo, e);
+                return AjaxResult.error();
+            }finally {
+                lock.unlock(); //释放锁
+            }
+        }else{
+            return AjaxResult.error(EventEnum.METHOD_LOCKED.getDescribe()); //已锁
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult signFor(Integer id) {
+        if (lock.tryLock()) { //获取锁
+            try {
+                //业务代码
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                logger.error("事件签收失败!输入参数:{}", id, e);
+                return AjaxResult.error("事件签收失败!");
+            }finally {
+                lock.unlock(); //释放锁
+            }
+        }else{
+            return AjaxResult.error(EventEnum.METHOD_LOCKED.getDescribe()); //已锁
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult completed(Integer id) {
+        if (lock.tryLock()) { //获取锁
+            try {
+                //业务代码
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                logger.error("事件办结失败!输入参数:{}", id, e);
+                return AjaxResult.error("事件办结失败!");
+            }finally {
+                lock.unlock(); //释放锁
+            }
+        }else{
+            return AjaxResult.error(EventEnum.METHOD_LOCKED.getDescribe()); //已锁
+        }
+        return AjaxResult.success();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AjaxResult archive(Integer id) {
+        if (lock.tryLock()) { //获取锁
+            try {
+                //业务代码
+                LoginUser loginUser = SecurityUtils.getLoginUser();
+            } catch (Exception e) {
+                logger.error("事件归档失败!输入参数:{}", id, e);
+                return AjaxResult.error("事件归档失败!");
+            }finally {
+                lock.unlock(); //释放锁
+            }
+        }else{
+            return AjaxResult.error(EventEnum.METHOD_LOCKED.getDescribe()); //已锁
+        }
+        return AjaxResult.success();
+    }
+
+
+}

+ 27 - 0
src/main/java/com/sooka/sponest/event/listener/carrier/EventMessageInsertedEvent.java

@@ -0,0 +1,27 @@
+package com.sooka.sponest.event.listener.carrier;
+
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * 承载者类
+ * @author limeng
+ * @since  2025/07/04
+ * */
+@Getter
+public class EventMessageInsertedEvent extends ApplicationEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    private final EventMessage eventMessage;
+
+    private final String alarmType;
+
+    public EventMessageInsertedEvent(Object source, EventMessage eventMessage, String alarmType) {
+        super(source);
+        this.eventMessage = eventMessage;
+        this.alarmType = alarmType;
+    }
+
+}

+ 24 - 0
src/main/java/com/sooka/sponest/event/listener/config/AsyncConfig.java

@@ -0,0 +1,24 @@
+package com.sooka.sponest.event.listener.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+@Configuration
+@EnableAsync
+public class AsyncConfig {
+
+    @Bean(name = "taskExecutor")
+    public Executor taskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(10); // 核心线程数
+        executor.setMaxPoolSize(20);  // 最大线程数
+        executor.setQueueCapacity(50); // 队列容量
+        executor.setThreadNamePrefix("Async-"); // 线程名前缀
+        executor.initialize();
+        return executor;
+    }
+}

+ 48 - 0
src/main/java/com/sooka/sponest/event/listener/listener/EventMessageEventListener.java

@@ -0,0 +1,48 @@
+package com.sooka.sponest.event.listener.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaFireEventVO;
+import com.sooka.sponest.event.eventMessage.domain.DaHuaOtherEventVO;
+import com.sooka.sponest.event.eventMessage.domain.EventMessage;
+import com.sooka.sponest.event.eventProcess.service.EventProcessService;
+import com.sooka.sponest.event.listener.carrier.EventMessageInsertedEvent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 监听者类 用于监听事件报文插入事件
+ * @author limeng
+ * @since  2025/07/04
+ * */
+@Component
+public class EventMessageEventListener {
+
+    Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Resource
+    private EventProcessService eventProcessService;
+
+    @Async // 标记为异步方法
+    @EventListener
+    public void onEvent(EventMessageInsertedEvent event) {
+        EventMessage eventMessage = event.getEventMessage();
+        String alarmType = event.getAlarmType();
+        try {
+            // 313:烟雾,5122:热感
+            if (alarmType.equals("313") || alarmType.equals("5122")) {
+                DaHuaFireEventVO daHuaFireEventVO = JSONObject.parseObject(eventMessage.getEventMessage(), DaHuaFireEventVO.class);
+                eventProcessService.insertDaHuaFireEvent(daHuaFireEventVO);
+            } else {
+                DaHuaOtherEventVO daHuaOtherEventVO = JSONObject.parseObject(eventMessage.getEventMessage(), DaHuaOtherEventVO.class);
+                eventProcessService.insertDaHuaOtherEvent(daHuaOtherEventVO);
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+    }
+}

+ 17 - 0
src/main/java/com/sooka/sponest/event/utils/database/DynamicDataSource.java

@@ -0,0 +1,17 @@
+package com.sooka.sponest.event.utils.database;
+
+import com.ruoyi.common.datascope.base.util.database.DynamicDataSourceSwitcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+public class DynamicDataSource extends AbstractRoutingDataSource {
+
+    Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);
+
+    @Override
+    protected Object determineCurrentLookupKey() {
+        logger.info("------------------当前数据源 {}", DynamicDataSourceSwitcher.getDataSource());
+        return DynamicDataSourceSwitcher.getDataSource();
+    }
+}

+ 36 - 0
src/main/java/com/sooka/sponest/event/utils/database/DynamicDataSourceAspect.java

@@ -0,0 +1,36 @@
+package com.sooka.sponest.event.utils.database;
+
+import com.ruoyi.common.datascope.base.util.database.DynamicDataSourceSwitcher;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+@Order(1)
+public class DynamicDataSourceAspect {
+
+    /**
+     * 切入点只对@Service注解的类上的@DataSource方法生效
+     */
+    @Pointcut(value="(@within(org.springframework.stereotype.Service) ||@within(org.springframework.stereotype.Repository)) && @annotation(myDataSource)" )
+    public void dynamicDataSourcePointCut(MyDataSource myDataSource){}
+
+    @Before(value = "dynamicDataSourcePointCut(myDataSource)", argNames = "myDataSource")
+    public void switchDataSource(MyDataSource myDataSource) {
+        DynamicDataSourceSwitcher.setDataSource(myDataSource.value());
+    }
+
+    /**
+     * 切点执行完后 切换成主数据库
+     */
+    @After(value="dynamicDataSourcePointCut(myDataSource)", argNames = "myDataSource")
+    public void after(MyDataSource myDataSource){
+        DynamicDataSourceSwitcher.cleanDataSource();
+    }
+}

+ 134 - 0
src/main/java/com/sooka/sponest/event/utils/database/MultipleDataSourceConfig.java

@@ -0,0 +1,134 @@
+package com.sooka.sponest.event.utils.database;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class MultipleDataSourceConfig {
+
+    @Bean("master")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.master")
+    public DataSource createMasterDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbSystemData")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-system")
+    public DataSource createSystemDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterTranManager")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-manager")
+    public DataSource createTranmanagerDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterData")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-data")
+    public DataSource createDataDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterEvent")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-event")
+    public DataSource createEventDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterMonitor")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-monitor")
+    public DataSource createMonitorDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterTask")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-task")
+    public DataSource createTaskDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterEvaluation")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-evaluation")
+    public DataSource createEvaluationDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterFire")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-fire")
+    public DataSource createFireDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterStraw")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-straw")
+    public DataSource createStrawDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterPests")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-pests")
+    public DataSource createPestsDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterComprehensive")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-comprehensive")
+    public DataSource createComprehensiveDataSource() {
+        return new DruidDataSource();
+    }
+
+    @Bean("dbCenterOnes")
+    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.db-center-ones")
+    public DataSource createOnestDataSource() {
+        return new DruidDataSource();
+    }
+
+    /**
+     * 设置动态数据源,通过@Primary 来确定主DataSource
+     */
+    @Bean
+    @Primary
+    public DataSource createDynamicDataSource(@Qualifier("master") DataSource master,
+                                              @Qualifier("dbSystemData") DataSource dbSystemData,
+                                              @Qualifier("dbCenterData") DataSource dbCenterData,
+                                              @Qualifier("dbCenterEvent") DataSource dbCenterEvent,
+                                              @Qualifier("dbCenterMonitor") DataSource dbCenterMonitor,
+                                              @Qualifier("dbCenterTask") DataSource dbCenterTask,
+                                              @Qualifier("dbCenterEvaluation") DataSource dbCenterEvaluation,
+                                              @Qualifier("dbCenterFire") DataSource dbCenterFire,
+                                              @Qualifier("dbCenterStraw") DataSource dbCenterStraw,
+                                              @Qualifier("dbCenterPests") DataSource dbCenterPests,
+                                              @Qualifier("dbCenterComprehensive") DataSource dbCenterComprehensive,
+                                              @Qualifier("dbCenterOnes") DataSource dbCenterOnes,
+                                              @Qualifier("dbCenterTranManager") DataSource dbCenterTranManager) {
+        DynamicDataSource dynamicDataSource = new DynamicDataSource();
+        //设置默认数据源
+        dynamicDataSource.setDefaultTargetDataSource(master);
+        //配置多数据源
+        Map<Object, Object> map = new HashMap<>();
+        map.put("master", master);
+        map.put("db-system", dbSystemData);
+        map.put("db-center-tran-manager", dbCenterTranManager);
+        map.put("db-center-data", dbCenterData);
+        map.put("db-center-event", dbCenterEvent);
+        map.put("db-center-monitor", dbCenterMonitor);
+        map.put("db-center-task", dbCenterTask);
+        map.put("db-center-evaluation", dbCenterEvaluation);
+        map.put("db-center-fire", dbCenterFire);
+        map.put("db-center-straw", dbCenterStraw);
+        map.put("db-center-pests", dbCenterPests);
+        map.put("db-center-comprehensive", dbCenterComprehensive);
+        map.put("db-center-ones", dbCenterOnes);
+        dynamicDataSource.setTargetDataSources(map);
+        return dynamicDataSource;
+    }
+}

+ 14 - 0
src/main/java/com/sooka/sponest/event/utils/database/MyDataSource.java

@@ -0,0 +1,14 @@
+package com.sooka.sponest.event.utils.database;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({
+        ElementType.METHOD
+})
+public @interface MyDataSource {
+    String value() default "";
+}

+ 61 - 0
src/main/java/com/sooka/sponest/event/utils/eventConstants/EventConstants.java

@@ -0,0 +1,61 @@
+package com.sooka.sponest.event.utils.eventConstants;
+
+public class EventConstants {
+
+    /**
+     * 事件状态
+     * */
+    public static final String EVENT_STATUS_1 = "event_status_1";// 上报
+
+    public static final String EVENT_STATUS_2 = "event_status_2";// 确认
+
+    public static final String EVENT_STATUS_3 = "event_status_3";// 签收
+
+    public static final String EVENT_STATUS_4 = "event_status_4";// 办结
+
+    public static final String EVENT_STATUS_5 = "event_status_5";// 归档
+
+    public static final String EVENT_STATUS_100 = "event_status_100";// 无异常
+
+    /**
+     * 事件来源
+     * */
+    public static final String REPORTING_SOURCE_1 = "reporting_source_1";// 监控上报
+
+    public static final String REPORTING_SOURCE_2 = "reporting_source_2";// 传感器上报
+
+
+    /**
+     * 是否催办
+     * */
+    public static final String IS_URGE_0 = "is_urge_0";// 否
+
+    public static final String IS_URGE_1 = "is_urge_1";// 是
+
+    /**
+     * 事件日志操作类型
+     * */
+    public static final String EVENT_LOG_TYPE_1 = "event_log_type_1";// 上报
+
+    public static final String EVENT_LOG_TYPE_2 = "event_log_type_2";// 签收
+
+    public static final String EVENT_LOG_TYPE_3 = "event_log_type_3";// 办结
+
+    public static final String EVENT_LOG_TYPE_4 = "event_log_type_4";// 归档
+
+
+    /**
+     * 事件日志操作来源
+     * */
+    public static final String EVENT_LOG_SOURCE_1 = "event_log_source_1";// AI
+
+    public static final String EVENT_LOG_SOURCE_2 = "event_log_source_2";// PC
+
+    public static final String EVENT_LOG_SOURCE_3 = "event_log_source_3";// APP
+
+    /**
+     * 事件日志附件来源
+     * */
+    public static final String LOG_FILE_FIRE = "FIRE";// 火情附件
+    public static final String LOG_FILE_OTHER = "OTHER";// 5300 附件
+}

+ 41 - 0
src/main/java/com/sooka/sponest/event/utils/eventEnum/EventEnum.java

@@ -0,0 +1,41 @@
+package com.sooka.sponest.event.utils.eventEnum;
+
+
+import lombok.Getter;
+
+@Getter
+public enum EventEnum {
+
+    EVENT_NOT_FOUND("事件不存在或已被流转,请刷新后重试!"), // 事件不存在或已被流转,请刷新后重试!
+
+    EVENT_CONFIRM("确认该事件!"), // 确认事件!
+
+    EVENT_USUAL("判定该事件为[无异常]!"), // 无异常!
+
+    EVENT_SIGN_FOR("签收该事件!"), // 签收该事件!
+
+    EVENT_COMPLETED("办结该事件!"), // 办结该事件!
+
+    EVENT_ARCHIVE("归档该事件!"), // 归档该事件!
+
+    USER_NOT_FOUND("未找到登录用户信息!"), // 未找到登录用户信息!
+
+    DEPT_NOT_FOUND("未查询到责任单位!"), // 未查询到责任单位!
+
+    METHOD_LOCKED("系统繁忙,请稍后重试!"); // 系统繁忙,请稍后重试!
+
+
+
+    // 获取描述
+    private final String describe;
+
+    // 构造函数
+    EventEnum(String describe) {
+        this.describe = describe;
+    }
+
+//    public String getDescribe(String code) {
+//        return this.describe + "(" + code + ")";
+//    }
+
+}