Browse Source

Merge branch 'drone' into event_hk

# Conflicts:
#	src/main/java/com/sooka/sponest/event/centereventteventcatalogue/controller/AlarmEventController.java
Memory_LG 1 tháng trước cách đây
mục cha
commit
6d832f3a0e
21 tập tin đã thay đổi với 1015 bổ sung16 xóa
  1. 28 3
      event-ui/src/views/event/eventhandling/index.vue
  2. 11 0
      pom.xml
  3. 85 2
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/controller/AlarmEventController.java
  4. 7 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/controller/FireIncidentController.java
  5. 1 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/bo/VisuForestCloudMapEventListBO.java
  6. 80 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/tower/TowerEventVo.java
  7. 67 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/vo/DroneVO.java
  8. 1 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/vo/VisuForestCloudMapVO.java
  9. 9 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/mapper/AlarmEventMapper.java
  10. 12 0
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/service/AlarmEventService.java
  11. 279 4
      src/main/java/com/sooka/sponest/event/centereventteventcatalogue/service/impl/AlarmEventServiceImpl.java
  12. 11 3
      src/main/java/com/sooka/sponest/event/centereventteventtype/mapper/CentereventTEventtypeMapper.java
  13. 10 1
      src/main/java/com/sooka/sponest/event/centereventteventtype/service/ICentereventTEventtypeService.java
  14. 11 0
      src/main/java/com/sooka/sponest/event/centereventteventtype/service/impl/CentereventTEventtypeServiceImpl.java
  15. 3 0
      src/main/java/com/sooka/sponest/event/utils/EventConstants.java
  16. 191 0
      src/main/java/com/sooka/sponest/event/utils/GWHttpUtilsTest65.java
  17. 112 0
      src/main/java/com/sooka/sponest/event/utils/NetworkImageToMultipartFile.java
  18. 48 0
      src/main/java/com/sooka/sponest/event/utils/URLToJSONConverter.java
  19. 28 0
      src/main/resources/mapper/centereventteventcatalogue/AlarmEventMapper.xml
  20. 16 3
      src/main/resources/mapper/centereventteventcatalogue/CenterEventViewMapper.xml
  21. 5 0
      src/main/resources/mapper/centereventteventtype/CentereventTEventtypeMapper.xml

+ 28 - 3
event-ui/src/views/event/eventhandling/index.vue

@@ -16,6 +16,13 @@
         <el-date-picker v-model="queryParams.day" type="date" placeholder="选择日期" value-format="yyyy-MM-dd">
         </el-date-picker>
       </el-form-item>
+      <el-form-item label="事件分类" prop="eventTypeXls">
+        <el-select v-model="queryParams.eventTypeXls" placeholder="请选择事件分类" clearable filterable
+                   multiple @keyup.enter.native="handleQuery">
+          <el-option v-for="item in defaultTypeXl" :key="item.id" :label="item.eventTypeName"
+                     :value="item.typeXlId"/>
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -25,6 +32,7 @@
       <el-table-column type="selection" align="center" width="50"/>
       <!--<el-table-column label="事件编号" align="center" prop="eventCode" width="150"/>-->
       <el-table-column label="事件名称" align="center" prop="eventName"/>
+      <el-table-column label="事件分类" align="center" prop="eventTypeName"/>
       <el-table-column label="事件状态" align="center" prop="eventStatus"/>
       <el-table-column label="事件图片" align="center" prop="picturePathList">
         <template slot-scope="scope">
@@ -161,6 +169,9 @@ import {
 } from "@/api/event/eventcatalogue/eventcatalogue";
 import Cookies from 'js-cookie';
 import TcPlayer from '@/components/TcPlayer'; // 视频预览
+import {listByParentId} from "@/api/event/eventtypemonitor/eventtypemonitor";
+
+import {getConfigKey} from "@/api/system/config";
 export default {
   name: "Eventcatalogue",
   components: {TcPlayer},
@@ -202,6 +213,7 @@ export default {
       activities: [],
       showTcPlayer: false,//视频预览弹窗
       playVideo: '',//视频预览地址
+      defaultTypeXl: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -209,6 +221,7 @@ export default {
         eventName: undefined,
         eventStatusValue: null,
         day: this.getNowTime(),
+
       },
       // 表单校验
       rules: {
@@ -222,9 +235,21 @@ export default {
     };
   },
   created() {
-  },
-  mounted() {
-    this.getList();
+    listByParentId({parentId: this.$route.query.pid}).then(response => {
+      let obj = {};
+      let reduce = response.data.reduce((curr, next) => {
+        /*判断对象中是否已经有该属性  没有的话 push 到 curr数组*/
+        obj[next.eventTypeName] ? '' : obj[next.eventTypeName] = curr.push(next);
+        return curr;
+      }, []);// 去重
+      this.defaultTypeXl = reduce.filter(item => {
+        return item.parentId != 0;
+      });
+      this.queryParams.defaultTypeXl = this.defaultTypeXl.map(item => {
+        return item.typeXlId;
+      })
+      this.getList();
+    });
   },
   methods: {
     getUrl(url) {

+ 11 - 0
pom.xml

@@ -119,6 +119,17 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.24</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 85 - 2
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/controller/AlarmEventController.java

@@ -6,9 +6,12 @@ import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.controller.BaseController;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.dahua.DaHuaFireEventVO;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.dahua.DaHuaOtherEventVO;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.haikang.HaiKangEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.tower.TowerEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.vo.DroneVO;
 import com.sooka.sponest.event.centereventteventcatalogue.service.AlarmEventService;
 import com.sooka.sponest.event.centereventtreportmessage.domain.CentereventTReportmessage;
 import com.sooka.sponest.event.centereventtreportmessage.service.ICentereventTReportmessageService;
@@ -22,13 +25,15 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import com.sooka.sponest.event.utils.URLToJSONConverter;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Api(tags = "海康")
 @RestController
 @RequestMapping("AlarmEventController")
-public class AlarmEventController {
+public class AlarmEventController extends BaseController {
 
     protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
@@ -106,7 +111,8 @@ public class AlarmEventController {
         try {
             CentereventTReportmessage tReportMessage = new CentereventTReportmessage();
             tReportMessage.setId(eventCode);
-            tReportMessage.setSource("大华摄像头-" + MapUtils.getString(daHuaFireEventVO.getInfo(), "alarmType"));
+            String alarmName = StringUtils.isBlank(MapUtils.getString(daHuaFireEventVO.getInfo(), "alarmTypeName")) ? MapUtils.getString(daHuaFireEventVO.getInfo(), "alarmType") : MapUtils.getString(daHuaFireEventVO.getInfo(), "alarmTypeName");
+            tReportMessage.setSource("大华摄像头-" + alarmName);
             tReportMessage.setContext(jsonStr);
             centereventTReportmessageService.insertCentereventTReportmessage(tReportMessage);
         } catch (Exception e) {
@@ -180,4 +186,81 @@ public class AlarmEventController {
         logger.info("eventConsumer接收到的消息:-->" + jsonStr);
         return AjaxResult.success();
     }
+
+    /**
+     * 铁塔事件上报
+     *
+     * @param jsonStr
+     * @return R
+     */
+    @PostMapping("/insertTowerEvent")
+    public R insertTowerEvent(@RequestBody String jsonStr) {
+        String eventCode = null;
+        TowerEventVo towerEventVo = new TowerEventVo();
+        try {
+            JSONObject jsonObject = JSONObject.parseObject(jsonStr);
+            towerEventVo = JSONObject.parseObject(jsonObject.getJSONObject("data").toJSONString(), TowerEventVo.class);
+            eventCode = alarmEventService.insertTowerEvent(towerEventVo);
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        if (StringUtils.isBlank(eventCode)) {
+            eventCode = String.valueOf(System.currentTimeMillis());
+        }
+        try {
+            CentereventTReportmessage tReportMessage = new CentereventTReportmessage();
+            tReportMessage.setId(eventCode);
+            tReportMessage.setSource("铁塔-" + towerEventVo.getAlarmType());
+            tReportMessage.setContext(jsonStr);
+            centereventTReportmessageService.insertCentereventTReportmessage(tReportMessage);
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+        return R.ok();
+    }
+
+    /**
+     * 无人机上报
+     */
+    /*
+     * {"data":
+     * [{
+     *  "timeStamp":0,                                                                      //时间戳
+     *  "altitude":0.0,                                                                     //海拔高度
+     *  "alarmType":"Sleep",                                                                //隐患类型
+     *  "createTime":1742354657000,                                                         //隐患时间
+     *  "photoPath":"https://47.93.50.30:443/media/dji-photos/wayline/1742354657053.JPG",   //隐患图片地址
+     *  "latitude":38.185382,                                                               //隐患纬度
+     *  "photoId":518,                                                                      //隐患图片id
+     *  "longitude":107.487296322                                                           //隐患经度
+     *  }]
+     * }
+     */
+    @PostMapping("/droneReport")
+    public AjaxResult droneReport(@RequestBody String jsonStr) {
+        if (StringUtils.isEmpty(jsonStr)) {
+            logger.error("参数为空");
+            return AjaxResult.error("参数为空");
+        }
+        logger.info("无人机数据: {}", jsonStr);
+
+        try {
+            JSONObject jsonObject = JSON.parseObject(URLToJSONConverter.convertURLToJSON(jsonStr));
+            JSONArray dataArray = jsonObject.getJSONArray("data");
+
+            if (dataArray == null || dataArray.isEmpty()) {
+                logger.error("数据格式异常: 缺少data数组");
+                return AjaxResult.error("数据格式异常");
+            }
+
+            List<DroneVO> droneArray = dataArray.stream()
+                    .map(data -> JSON.parseObject(data.toString(), DroneVO.class))
+                    .collect(Collectors.toList());
+
+            return toAjax(alarmEventService.insertDroneEvent(droneArray));
+        } catch (Exception e) {
+            logger.error("数据处理失败: {}", e.getMessage());
+            return AjaxResult.error("处理失败: " + e.getMessage());
+        }
+    }
 }

+ 7 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/controller/FireIncidentController.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.DaHuaEventBO;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.sensor.SensorEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.tower.TowerEventVo;
 import com.sooka.sponest.event.centereventteventcatalogue.service.AlarmEventService;
 import com.sooka.sponest.event.centereventtreportmessage.domain.CentereventTReportmessage;
 import com.sooka.sponest.event.centereventtreportmessage.service.ICentereventTReportmessageService;
@@ -85,6 +86,12 @@ public class FireIncidentController {
         if (StringUtils.isNull(centereventTReportmessage)) {
             return AjaxResult.success("参数异常");
         }
+        if (centereventTReportmessage.getSource().contains("铁塔")) {
+            // 解析报文
+            JSONObject jsonObject = JSONObject.parseObject(centereventTReportmessage.getContext());
+            TowerEventVo towerEventVo = JSONObject.parseObject(jsonObject.getJSONObject("data").toJSONString(), TowerEventVo.class);
+            return AjaxResult.success(alarmEventService.updateFireEventImage(towerEventVo, eventBO.getLogId()));
+        }
         // 解析报文
         JSONObject context = JSONObject.parseObject(centereventTReportmessage.getContext()).getJSONObject("info");
         eventBO.setAlarmCode(context.getString("alarmCode"));

+ 1 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/bo/VisuForestCloudMapEventListBO.java

@@ -46,4 +46,5 @@ public class VisuForestCloudMapEventListBO {
     private String cameraCode;
 
     private String isExamine;
+    private String eventTypeName;
 }

+ 80 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/tower/TowerEventVo.java

@@ -0,0 +1,80 @@
+package com.sooka.sponest.event.centereventteventcatalogue.domain.tower;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+@Data
+public class TowerEventVo {
+
+    private String alarmBody;
+
+    private String eventLatitude;
+
+    private String frontAlarmPicUrl;
+
+    private String regionName;
+
+    private String warningOrderId;
+
+    private String tilt;
+
+    private String alarmCode;
+
+    private String deviceName;
+
+    private String deviceLatitude;
+
+    private String regionCode;
+
+    private String originalPictureUrl;
+
+    private String alarmPictureUrl;
+
+    private String pan;
+
+    private String channelCode;
+
+    private String eventLongitude;
+
+    private String address;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date alarmTime;
+
+    private String frontAlarmVedioUrl;
+
+    private String zoom;
+
+    private String deviceCode;
+
+    private String alarmType;
+
+    private String alarmVideoUrl;
+
+    private String presetName;
+
+    private String channelName;
+
+    private String location;
+
+    private String deviceLongitude;
+
+    private String presetId;
+
+    public String toString() {
+        String toString = new ToStringBuilder(this, ToStringStyle.NO_CLASS_NAME_STYLE)
+                .append("行政区:", getRegionName())
+                .append("瞭望塔:", getChannelName())
+//                .append("方向:", getDirection(getAngle()))
+//                .append("距离:", getStr(getDistance()))
+//                .append("高程:", getStr(getElevation()))
+                .append("经度:", getEventLongitude())
+                .append("纬度:", getEventLatitude())
+                .toString().replaceAll("=", "");
+        return toString.substring(1, toString.length() - 1);
+    }
+}

+ 67 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/vo/DroneVO.java

@@ -0,0 +1,67 @@
+package com.sooka.sponest.event.centereventteventcatalogue.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.*;
+import org.apache.ibatis.type.Alias;
+
+import java.util.Date;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Alias("droneVo")
+public class DroneVO {
+
+    /**
+     * 数据id
+     */
+    private String id;
+    /**
+     * 上报无人机id
+     */
+    private String copterId;
+    /**
+     * 时间戳
+     */
+    private Long timeStamp;
+    /**
+     * 海拔高度
+     */
+    private Double altitude;
+    /**
+     * 隐患类型
+     */
+    private String alarmType;
+    /**
+     * 隐患时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date creationTime;
+    /**
+     * 隐患图片地址
+     */
+    private String photoPath;
+    /**
+     * 隐患纬度
+     */
+    private String latitude;
+    /**
+     * 隐患经度
+     */
+    private String longitude;
+    /**
+     * 隐患图片id
+     */
+    private Integer photoId;
+    /**
+     * 图片名称
+     */
+    private String photoName;
+    /**
+     * 本地图片路径
+     */
+    private String localPath;
+
+}

+ 1 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/domain/vo/VisuForestCloudMapVO.java

@@ -62,5 +62,6 @@ public class VisuForestCloudMapVO extends BaseBusinessEntity {
      */
     private String reportSource;
 
+    private List<String> eventTypeXls;
 
 }

+ 9 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/mapper/AlarmEventMapper.java

@@ -0,0 +1,9 @@
+package com.sooka.sponest.event.centereventteventcatalogue.mapper;
+
+import com.sooka.sponest.event.centereventteventcatalogue.domain.vo.DroneVO;
+
+import java.util.List;
+
+public interface AlarmEventMapper {
+    int insertDrone(List<DroneVO> alarmData);
+}

+ 12 - 0
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/service/AlarmEventService.java

@@ -6,6 +6,10 @@ import com.sooka.sponest.event.centereventteventcatalogue.domain.dahua.DaHuaFire
 import com.sooka.sponest.event.centereventteventcatalogue.domain.dahua.DaHuaOtherEventVO;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.haikang.HaiKangEventVo;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.sensor.SensorEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.tower.TowerEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.vo.DroneVO;
+
+import java.util.List;
 
 public interface AlarmEventService {
 
@@ -25,10 +29,18 @@ public interface AlarmEventService {
     // 大华5300事件
     String insertDaHuaOtherEvent(DaHuaOtherEventVO daHuaOtherEventVO);
 
+    // 铁塔事件
+    String insertTowerEvent(TowerEventVo towerEventVo);
+
+    // 铁塔事件-图片回查
+    String updateFireEventImage(TowerEventVo towerEventVo, String logId);
+
 
     // 传感器事件
     String insertSensorEvent(SensorEventVo sensorEventVo);
 
     // 住建事件
     String insertHousingConstructionEvent(SensorEventVo sensorEventVo);
+
+    int insertDroneEvent(List<DroneVO> droneArray);
 }

+ 279 - 4
src/main/java/com/sooka/sponest/event/centereventteventcatalogue/service/impl/AlarmEventServiceImpl.java

@@ -9,6 +9,7 @@ import com.ruoyi.common.core.utils.SpringUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.uuid.IdUtils;
 import com.ruoyi.system.api.RemoteDeptService;
+import com.ruoyi.system.api.RemoteFileService;
 import com.ruoyi.system.api.domain.SysDept;
 import com.sooka.sponest.event.centereventtdeptevent.domain.CentereventDeptEvent;
 import com.sooka.sponest.event.centereventtdeptevent.service.ICentereventDeptEventService;
@@ -18,6 +19,9 @@ import com.sooka.sponest.event.centereventteventcatalogue.domain.dahua.*;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.haikang.EventsVo;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.haikang.HaiKangEventVo;
 import com.sooka.sponest.event.centereventteventcatalogue.domain.sensor.SensorEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.tower.TowerEventVo;
+import com.sooka.sponest.event.centereventteventcatalogue.domain.vo.DroneVO;
+import com.sooka.sponest.event.centereventteventcatalogue.mapper.AlarmEventMapper;
 import com.sooka.sponest.event.centereventteventcatalogue.service.AlarmEventService;
 import com.sooka.sponest.event.centereventteventcatalogue.service.ICentereventTEventcatalogueService;
 import com.sooka.sponest.event.centereventteventtype.domain.CentereventTEventtype;
@@ -26,21 +30,26 @@ import com.sooka.sponest.event.centereventtfirelog.domain.CentereventTFireLog;
 import com.sooka.sponest.event.centereventtfirelog.service.ICentereventTFireLogService;
 import com.sooka.sponest.event.remoteapi.RemoteDataService;
 import com.sooka.sponest.event.remoteapi.domain.CenterdataTAttach;
+import com.sooka.sponest.event.utils.GWHttpUtilsTest65;
+import com.sooka.sponest.event.utils.NetworkImageToMultipartFile;
 import com.sooka.sponest.event.utils.RemoteApiUtil;
 import com.sooka.sponest.monitor.api.RemoteMonitorService;
 import com.sooka.sponest.monitor.api.domain.CenterdataTAidevicedept;
 import com.sooka.sponest.monitor.api.domain.CenterdataTCamera;
+import com.sooka.sponest.monitor.api.domain.CentermonitorTUav;
 import org.apache.commons.collections4.MapUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 import static com.ruoyi.common.core.utils.DateUtils.YYYY_MM_DD_HH_MM_SS;
 import static com.sooka.sponest.event.utils.EventConstants.*;
@@ -65,9 +74,18 @@ public class AlarmEventServiceImpl implements AlarmEventService {
     @Autowired
     private ICentereventTEventtypeService centereventTEventtypeService;
 
+    @Autowired
+    private RemoteFileService fileService;
+
+    @Autowired
+    private AlarmEventMapper alarmEventMapper;
+
     @Value("${sooka.dahuaservice.detail}")
     private String detailUrl;
 
+    @Value("${sooka.supermap.datasetUrl}")
+    private String datasetUrl;
+
     static final String ERROR_MSG_CHANNEL = "无法匹配相关设备!通道编号为:{}";
 
     static final String ERROR_MSG_DEPT = "无法匹配相关部门!摄像头编号为:{}";
@@ -187,6 +205,10 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         centereventTEventcatalogue.setIsUrged(SYS_ISURGE_2);//sys_isurge_2
         centereventTEventcatalogue.setEventStatus("上报");
         centereventTEventcatalogue.setEventStatusValue(FOREST_EVENT_STATUS_1);//forest_event_status_1
+        // 自动研判误报,218工程车、222区域入侵、237违章建筑
+        if ("218".equals(centereventTEventcatalogue.getEventTypeXl()) || "222".equals(centereventTEventcatalogue.getEventTypeXl()) || "237".equals(centereventTEventcatalogue.getEventTypeXl())) {
+            test(centereventTEventcatalogue);
+        }
         centereventTEventcatalogue.setCreateBy(centerdataTCamera.getId());
         centereventTEventcatalogue.setCreateName(centerdataTCamera.getCameraName());
         centereventTEventcatalogue.setCreateTime(null == createTime ? DateUtils.getNowDate() : createTime);
@@ -194,6 +216,41 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         return centereventTEventcatalogue;
     }
 
+    private void test(CentereventTEventcatalogue centereventTEventcatalogue) {
+        try {
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            for (String url : datasetUrl.split(";")) {
+                JSONObject requestBody = JSONObject.parseObject("{" +
+                        "\"getFeatureMode\": \"SPATIAL\"," +
+                        "\"datasetNames\": " + url.split("&datasetNames=")[1] + "," +
+                        "\"geometry\": {" +
+                        "\"id\": 0," +
+                        "\"style\": null," +
+                        "\"parts\": [1]," +
+                        "\"points\": [{" +
+                        "\"y\": " + Double.parseDouble(centereventTEventcatalogue.getLatitude()) + "," +
+                        "\"x\": " + Double.parseDouble(centereventTEventcatalogue.getLongitude()) +
+                        "}]," +
+                        "\"type\": \"POINT\"}," +
+                        "\"spatialQueryMode\": \"INTERSECT\"" +
+                        "}");
+                HttpEntity<JSONObject> entity = new HttpEntity<>(requestBody, headers);
+                RestTemplate restTemplate = new RestTemplate();
+                JSONObject result = restTemplate.postForEntity(url.split("&datasetNames=")[0], entity, JSONObject.class).getBody();
+                logger.info(result.toJSONString());
+                // {"features":[],"featureUriList":[],"datasetInfos":[],"totalCount":0,"featureCount":0}
+                if (result.getLong("totalCount") != 0 && result.getLong("featureCount") != 0) {
+                    centereventTEventcatalogue.setEventStatus("误报");
+                    centereventTEventcatalogue.setEventStatusValue("forest_event_status_3");
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            logger.error(e.getMessage());
+        }
+    }
+
     // 事件部门
     private void insertEventDept(CentereventTEventcatalogue centereventTEventcatalogue, List<CenterdataTAidevicedept> listDept) {
         listDept.forEach(item -> {
@@ -222,6 +279,12 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         centereventTFireLog.setOperationType(LOG_OPER_TYPE_3);
         centereventTFireLog.setCreateName(centereventTEventcatalogue.getCreateName());
         centereventTFireLog.setCreateTime(centereventTEventcatalogue.getCreateTime());
+        if(StringUtils.isNotEmpty(centereventTEventcatalogue.getLongitude())){
+            centereventTFireLog.setLongitude(centereventTEventcatalogue.getLongitude());
+        }
+        if(StringUtils.isNotEmpty(centereventTEventcatalogue.getLatitude())){
+            centereventTFireLog.setLatitude(centereventTEventcatalogue.getLatitude());
+        }
         centereventTFireLogService.insertCentereventTFireLog(centereventTFireLog);
         return centereventTFireLog.getId();
     }
@@ -377,6 +440,7 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         return "请刷新后重试";
     }
 
+    @Transactional
     @Override
     public String insertDaHuaOtherEvent(DaHuaOtherEventVO daHuaOtherEventVO) {
         // 验证是否配置摄像头通道
@@ -400,7 +464,7 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         // 事件目录
         String eventType = centereventTEventtype.getParentId();
         String eventTypeXl = centereventTEventtype.getId();
-        String eventName = centerdataTCamera.getCameraName() + DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, DateUtils.timestampToTime(daHuaOtherEventVO.getOccurrenceTime())) + daHuaOtherEventVO.getAlarmName();
+        String eventName = centerdataTCamera.getCameraName() + DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, DateUtils.timestampToTime(daHuaOtherEventVO.getOccurrenceTime())) + centereventTEventtype.getEventTypeName();
         String eventDescription = daHuaOtherEventVO.toString();
         String longitude = daHuaOtherEventVO.getLongitude();
         String latitude = daHuaOtherEventVO.getLatitude();
@@ -430,6 +494,120 @@ public class AlarmEventServiceImpl implements AlarmEventService {
 
     @Transactional
     @Override
+    public String insertTowerEvent(TowerEventVo towerEventVo) {
+        // 验证是否配置摄像头
+        CenterdataTCamera centerdataTCamera = SpringUtils.getBean(RemoteMonitorService.class).getCameraByChinaTowerDeviceCode(towerEventVo.getDeviceCode());
+        if (StringUtils.isNull(centerdataTCamera)) {
+            logger.info("无法匹配相关设备!铁塔摄像头为:{}", towerEventVo.getDeviceCode());
+            return "";
+        }
+        // 验证是否配置指挥中心
+        List<CenterdataTAidevicedept> listDept = SpringUtils.getBean(RemoteMonitorService.class).listForCommandCenter(centerdataTCamera.getId(), "1", "1").getData();
+        if (StringUtils.isEmpty(listDept)) {
+            logger.info(ERROR_MSG_DEPT, towerEventVo.getDeviceCode());
+            return "";
+        }
+        // 验证事件类型是否配置对应报文码值--只能从数据库配
+        CentereventTEventtype centereventTEventtype = centereventTEventtypeService.selectCentereventTEventtypeByCodeTower(towerEventVo.getAlarmType());
+        if (StringUtils.isNull(centereventTEventtype)) {
+            logger.info("无法匹配相关事件!报文码值为:{}", towerEventVo.getAlarmType());
+            return "";
+        }
+        // 事件目录
+        String eventType = centereventTEventtype.getParentId();
+        String eventTypeXl = centereventTEventtype.getId();
+        String eventName = towerEventVo.getDeviceName() + DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS, towerEventVo.getAlarmTime()) + centereventTEventtype.getEventTypeName();
+        String eventDescription = towerEventVo.toString();
+        String longitude = towerEventVo.getEventLongitude();
+        String latitude = towerEventVo.getEventLatitude();
+        String reportor = towerEventVo.getDeviceName();
+        Date reportTime = towerEventVo.getAlarmTime();
+        String address = towerEventVo.getAddress();
+        CentereventTEventcatalogue centereventTEventcatalogue = new CentereventTEventcatalogue(eventType, eventTypeXl, eventName, eventDescription, longitude, latitude, reportor, reportTime, address);
+        centereventTEventcatalogue = this.insertEventCatalogue(centereventTEventcatalogue, centerdataTCamera, null);
+        // 事件部门
+        this.insertEventDept(centereventTEventcatalogue, listDept);
+        // 事件日志
+        String logId = this.insertEventLog(centereventTEventcatalogue);
+        String orderCode = SpringUtils.getBean(RemoteMonitorService.class).getOrderCodeByChinaTowerDeviceCode(towerEventVo.getDeviceCode());
+        if (StringUtils.isNotBlank(towerEventVo.getOriginalPictureUrl())) {
+            String[] pictures = towerEventVo.getOriginalPictureUrl().split(",");
+            for (String picture : pictures) {
+                CenterdataTAttach tAttach = new CenterdataTAttach();
+                tAttach.setBusId(logId);
+                tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(picture, orderCode));
+                tAttach.setBusIndx(BUS_INDEX_2);
+                tAttach.setBusSource("TT_1");
+                tAttach.setFileType(FILE_TYPE_1);
+                remoteDataService.insertAttach(tAttach);
+            }
+        }
+        if (StringUtils.isNotBlank(towerEventVo.getAlarmPictureUrl())) {
+            String[] pictures = towerEventVo.getAlarmPictureUrl().split(",");
+            for (String picture : pictures) {
+                CenterdataTAttach tAttach = new CenterdataTAttach();
+                tAttach.setBusId(logId);
+                tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(picture, orderCode));
+                tAttach.setBusIndx(BUS_INDEX_2);
+                tAttach.setBusSource("TT_1");
+                tAttach.setFileType(FILE_TYPE_1);
+                remoteDataService.insertAttach(tAttach);
+            }
+        }
+        if (StringUtils.isNotBlank(towerEventVo.getAlarmVideoUrl())) {
+            CenterdataTAttach tAttach = new CenterdataTAttach();
+            tAttach.setBusId(logId);
+            tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(towerEventVo.getAlarmVideoUrl(), orderCode));
+            tAttach.setBusIndx(BUS_INDEX_2);
+            tAttach.setBusSource("TT_1");
+            tAttach.setFileType(FILE_TYPE_2);
+            remoteDataService.insertAttach(tAttach);
+        }
+        return centereventTEventcatalogue.getEventCode();
+    }
+
+    @Override
+    public String updateFireEventImage(TowerEventVo towerEventVo, String logId) {
+        List<CenterdataTAttach> attachList = new ArrayList<>();
+        String orderCode = SpringUtils.getBean(RemoteMonitorService.class).getOrderCodeByChinaTowerDeviceCode(towerEventVo.getDeviceCode());
+        if (StringUtils.isNotBlank(towerEventVo.getOriginalPictureUrl())) {
+            String[] pictures = towerEventVo.getOriginalPictureUrl().split(",");
+            for (String picture : pictures) {
+                CenterdataTAttach tAttach = new CenterdataTAttach();
+                tAttach.setBusId(logId);
+                tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(picture, orderCode));
+                tAttach.setBusIndx(BUS_INDEX_2);
+                tAttach.setBusSource("TT_1");
+                tAttach.setFileType(FILE_TYPE_1);
+                attachList.add(tAttach);
+            }
+        }
+        if (StringUtils.isNotBlank(towerEventVo.getAlarmPictureUrl())) {
+            String[] pictures = towerEventVo.getAlarmPictureUrl().split(",");
+            for (String picture : pictures) {
+                CenterdataTAttach tAttach = new CenterdataTAttach();
+                tAttach.setBusId(logId);
+                tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(picture, orderCode));
+                tAttach.setBusIndx(BUS_INDEX_2);
+                tAttach.setBusSource("TT_1");
+                tAttach.setFileType(FILE_TYPE_1);
+                attachList.add(tAttach);
+            }
+        }
+        if (StringUtils.isNotBlank(towerEventVo.getAlarmVideoUrl())) {
+            CenterdataTAttach tAttach = new CenterdataTAttach();
+            tAttach.setBusId(logId);
+            tAttach.setAttachPath(GWHttpUtilsTest65.encrypt(towerEventVo.getAlarmVideoUrl(), orderCode));
+            tAttach.setBusIndx(BUS_INDEX_2);
+            tAttach.setBusSource("TT_1");
+            tAttach.setFileType(FILE_TYPE_2);
+            attachList.add(tAttach);
+        }
+        return remoteDataService.delAndInsertBatch(JSON.toJSONString(attachList)).getMsg();
+    }
+
+    @Transactional
+    @Override
     public String insertSensorEvent(SensorEventVo sensorEventVo) {
         // 验证是否配置指挥中心
         List<CenterdataTAidevicedept> listDept = SpringUtils.getBean(RemoteMonitorService.class).listForCommandCenter(sensorEventVo.getSensorId(), "1", "1").getData();
@@ -512,4 +690,101 @@ public class AlarmEventServiceImpl implements AlarmEventService {
         this.insertEventLog(centereventTEventcatalogue);
         return centereventTEventcatalogue.getEventCode() + "_" + eventtype.getEventTypeName();
     }
+
+
+    @Override
+    public int insertDroneEvent(List<DroneVO> alarmData) {
+        Map<Object, Object> eventType = new HashMap<>();
+        eventType.put("Sheep","222");
+        eventType.put("Car","218");
+
+        Map<Object, Object> eventLabel = new HashMap<>();
+        eventLabel.put("Sheep","区域入侵");
+        eventLabel.put("Car","工程车检测");
+
+        // 将告警图片转换为本地图片
+        alarmData.parallelStream().forEach(item -> {
+            item.setId(IdUtils.simpleUUID());
+            try {
+                Optional.ofNullable(NetworkImageToMultipartFile.downloadImageToMultipartFile(item.getPhotoPath()))
+                        .map(multipartFile -> fileService.upload(multipartFile).getData())
+                        .ifPresent(data -> item.setLocalPath(data.getUrl()));
+            } catch (Exception e) {
+                logger.error("Failed to process image for item {}: {}", item.getId(), e.getMessage());
+            }
+        });
+        // 通过无人机id, 获取无人机信息和绑定的指挥中心
+        alarmData.forEach(alarm->{
+            CentermonitorTUav data = SpringUtils.getBean(RemoteMonitorService.class).selectUavByUavId(alarm.getCopterId()).getData();
+            /**
+             * 牛羊 Sheep:222
+             * 车辆 Car: 218
+             */
+
+            String eventName = data.getUavName()+"上报"+MapUtils.getString(eventLabel, alarm.getAlarmType())+"事件";
+            String eventDescription = "基站:"+data.getBaseStationName()+",无人机:"+data.getUavName()+",经度:"+alarm.getLongitude()+",纬度:"+alarm.getLatitude()+",海拔:"+alarm.getAltitude();
+
+            //创建事件主体, 写入事件表.
+            CentereventTEventcatalogue centereventTEventcatalogue = new CentereventTEventcatalogue("2", MapUtils.getString(eventType, alarm.getAlarmType()), eventName, eventDescription, alarm.getLongitude(), alarm.getLatitude(), data.getUavName(), alarm.getCreationTime(), "");
+            centereventTEventcatalogue.setLongitude(alarm.getLongitude());
+            centereventTEventcatalogue.setLatitude(alarm.getLatitude());
+            centereventTEventcatalogue.setReportSource(REPORTING_SOURCE_6);
+            CenterdataTCamera centerdataTCamera = new CenterdataTCamera();
+            centerdataTCamera.setId(alarm.getCopterId());
+            centerdataTCamera.setCameraName(data.getUavName());
+            centereventTEventcatalogue = this.insertEventCatalogue(centereventTEventcatalogue, centerdataTCamera, alarm.getCreationTime());
+
+            String eventCode = centereventTEventcatalogue.getEventCode();
+            String createName = centereventTEventcatalogue.getCreateName();
+            Date createTime = centereventTEventcatalogue.getCreateTime();
+            // 事件部门
+            data.getDeptList().forEach(item -> {
+                CentereventDeptEvent centereventTDeptEvent = new CentereventDeptEvent();
+                centereventTDeptEvent.setId(IdUtils.fastSimpleUUID());
+                centereventTDeptEvent.setEventCode(eventCode);
+                centereventTDeptEvent.setDeptId(item.getDeptId());
+                centereventTDeptEvent.setDeptName(item.getDeptName());
+                centereventTDeptEvent.setIsUrged(SYS_ISURGE_2);
+                centereventTDeptEvent.setEventStatus("上报");
+                centereventTDeptEvent.setEventStatusValue(FOREST_EVENT_STATUS_1);
+                centereventTDeptEvent.setDeptHandleType(DEPT_HANDLE_TYPE_2);
+                centereventTDeptEvent.setCreateBy(alarm.getCopterId());
+                centereventTDeptEvent.setCreateName(createName);
+                centereventTDeptEvent.setCreateTime(createTime);
+                centereventTDeptEventService.insertCentereventTDeptEvent(centereventTDeptEvent);
+            });
+
+
+            //事件日志
+            CentereventTFireLog centereventTFireLog = new CentereventTFireLog();
+            centereventTFireLog.setId(IdUtils.simpleUUID());
+            centereventTFireLog.setEventCode(centereventTEventcatalogue.getEventCode());
+            centereventTFireLog.setLogContent(centereventTEventcatalogue.getEventName() + System.getProperty("line.separator") + centereventTEventcatalogue.getEventDescription());
+            centereventTFireLog.setOperation(BUS_OPER_TYPE_2);
+            centereventTFireLog.setOperationType(LOG_OPER_TYPE_4);
+            centereventTFireLog.setCreateBy(alarm.getCopterId());
+            centereventTFireLog.setCreateName(centereventTEventcatalogue.getCreateName());
+            centereventTFireLog.setCreateTime(centereventTEventcatalogue.getCreateTime());
+            if(StringUtils.isNotEmpty(centereventTEventcatalogue.getLongitude())){
+                centereventTFireLog.setLongitude(centereventTEventcatalogue.getLongitude());
+            }
+            if(StringUtils.isNotEmpty(centereventTEventcatalogue.getLatitude())){
+                centereventTFireLog.setLatitude(centereventTEventcatalogue.getLatitude());
+            }
+            centereventTFireLogService.insertCentereventTFireLog(centereventTFireLog);
+
+            //事件附件
+            if (StringUtils.isNotBlank(alarm.getLocalPath())) {
+                CenterdataTAttach tAttach = new CenterdataTAttach();
+                tAttach.setBusId(centereventTFireLog.getId());
+                tAttach.setAttachPath(alarm.getLocalPath());
+                tAttach.setBusIndx(BUS_INDEX_2);
+                tAttach.setBusSource("UAV_1");
+                tAttach.setFileType(FILE_TYPE_1);
+                remoteDataService.insertAttach(tAttach);
+            }
+        });
+
+        return alarmEventMapper.insertDrone(alarmData);
+    }
 }

+ 11 - 3
src/main/java/com/sooka/sponest/event/centereventteventtype/mapper/CentereventTEventtypeMapper.java

@@ -39,6 +39,14 @@ public interface CentereventTEventtypeMapper {
     CentereventTEventtype selectCentereventTEventtypeByCode(String code);
 
     /**
+     * 查询事件类型
+     *
+     * @param code 事件类型编码
+     * @return 事件类型
+     */
+    CentereventTEventtype selectCentereventTEventtypeByCodeTower(String code);
+
+    /**
      * 新增事件类型
      *
      * @param centereventTEventtype 事件类型
@@ -63,14 +71,14 @@ public interface CentereventTEventtypeMapper {
     int deleteCentereventTEventtypeByIds(String[] ids);
 
     /**
-     *查询事件类型树结构
+     * 查询事件类型树结构
      *
      * @author hanfucheng
      * @date 2023/4/10 10:53
      */
-    List<Map<String,Object>> getCentereventTEventtypeTree();
-    List<Map<String,Object>> getCentereventTEventtypeTreeLx(CentereventTEventtype centereventTEventtype);
+    List<Map<String, Object>> getCentereventTEventtypeTree();
 
+    List<Map<String, Object>> getCentereventTEventtypeTreeLx(CentereventTEventtype centereventTEventtype);
 
 
     long getReminderTimeById(CentereventTEventcatalogue centereventTEventcatalogue);

+ 10 - 1
src/main/java/com/sooka/sponest/event/centereventteventtype/service/ICentereventTEventtypeService.java

@@ -33,12 +33,20 @@ public interface ICentereventTEventtypeService {
     /**
      * 查询事件类型
      *
-     * @param id 事件类型主键
+     * @param code 事件类型主键
      * @return 事件类型
      */
     CentereventTEventtype selectCentereventTEventtypeByCode(String code);
 
     /**
+     * 查询事件类型
+     *
+     * @param code 事件类型主键
+     * @return 事件类型
+     */
+    CentereventTEventtype selectCentereventTEventtypeByCodeTower(String code);
+
+    /**
      * 新增事件类型
      *
      * @param centereventTEventtype 事件类型
@@ -69,6 +77,7 @@ public interface ICentereventTEventtypeService {
      * @date 2023/4/10 10:53
      */
     List<Map<String, Object>> getCentereventTEventtypeTree();
+
     List<Map<String, Object>> getCentereventTEventtypeTreeLx(CentereventTEventtype centereventTEventtype);
 
     long getReminderTimeById(CentereventTEventcatalogue centereventTEventcatalogue);

+ 11 - 0
src/main/java/com/sooka/sponest/event/centereventteventtype/service/impl/CentereventTEventtypeServiceImpl.java

@@ -64,6 +64,17 @@ public class CentereventTEventtypeServiceImpl implements ICentereventTEventtypeS
     }
 
     /**
+     * 查询事件类型
+     *
+     * @param code 事件类型编码
+     * @return 事件类型
+     */
+    @Override
+    public CentereventTEventtype selectCentereventTEventtypeByCodeTower(String code) {
+        return centereventTEventtypeMapper.selectCentereventTEventtypeByCodeTower(code);
+    }
+
+    /**
      * 新增事件类型
      *
      * @param centereventTEventtype 事件类型

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

@@ -20,6 +20,7 @@ public class EventConstants {
     public static final String REPORTING_SOURCE_1 = "reporting_source_1";// AI
     public static final String REPORTING_SOURCE_4 = "reporting_source_4";// 传感器
     public static final String REPORTING_SOURCE_5 = "reporting_source_5";// 数字住建
+    public static final String REPORTING_SOURCE_6 = "reporting_source_6";// 数字住建
 
     // 是否催办
     public static final String SYS_ISURGE_2 = "sys_isurge_2";// 否
@@ -36,6 +37,7 @@ public class EventConstants {
     public static final String LOG_OPER_TYPE_1 = "log_oper_type_1";
     public static final String LOG_OPER_TYPE_2 = "log_oper_type_2";
     public static final String LOG_OPER_TYPE_3 = "log_oper_type_3";// AI反馈
+    public static final String LOG_OPER_TYPE_4 = "log_oper_type_4";// 无人机
 
     // 附件索引
     public static final String BUS_INDEX_1 = "bus_indx_forest";// 火情事件
@@ -44,6 +46,7 @@ public class EventConstants {
 
     // 文件类型
     public static final String FILE_TYPE_1 = "image";
+    public static final String FILE_TYPE_2 = "video";
 
     // 文件前缀
     public static final String FILE_PREFIX_LOCAL = "fileUrl";

+ 191 - 0
src/main/java/com/sooka/sponest/event/utils/GWHttpUtilsTest65.java

@@ -0,0 +1,191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.sooka.sponest.event.utils;
+
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * @Description: demo.
+ * @Author: newland
+ * 发生订购鉴权失败时请先仔细阅读一下内容:
+ * 首先可以让运管这边推送订购关系,由你们提供接收接口,运管可以进行订购关系推送
+ * 然后由于新接入的平台,没有订单关系,所以目前运管这边采取的是推送其他平台的订单
+ * 在这样的情况下,AK,SK,仍然是使用你们自己的,但是 appCode 则需要使用该订单本身的 appCode,不然网关这边鉴权过不去
+ */
+@Slf4j
+public class GWHttpUtilsTest65 {
+
+    /**
+     * 新网关
+     */
+    static String HOST_IP = "https://sl-neimenggu.chinatowercom.cn:9997";
+
+    /**
+     * AK 由运管这边提供
+     */
+    static String AK = "012626d75ab147858ff7fdf9ea44b74d";
+
+    /**
+     * SK 由运管这边提供
+     */
+    static String SK = "dce85f55cad140498936e7832e6528ad";
+
+    /**
+     * 行业编码 由运管这边提供
+     * 当发送订购鉴权失败时,请阅读最上面的解释,然后可以向运管那边提供订单号获得该订单正确的 appCode
+     * 当调试完成后,即可换成自己的 appCode
+     */
+    static String appCode = "700002";
+
+    /**
+     * 订购客户编码,用于订购鉴权,需要一一对应
+     */
+    static String customer = "124012301";
+
+    /**
+     * 订单号,用于订购鉴权,需要一一对应
+     */
+//    static String orderCode = "PO124012301202504047918802915328";
+//    static String orderCode = "PO124012301202503303260509147136";
+
+    /**
+     * 用户编码,暂可以填随意值
+     */
+    static String userCode = "0a97fb806ab24ca8bc788dc6ace3d4c2";
+
+    /**
+     * 访问方法路径
+     * /devices/{deviceCode}/channels/{channelCode}/getVideoRealtimeUrl
+     * 注: 这个路径在下面要参与到 sign加密,路径前面不要加服务名,比如 boot-out
+     * 例子:路径中的{deviceCode}、{channelCode},用于订购鉴权,需要一一对应
+     */
+    static String servicePath = "/file/obsFiles/getObsEncryptUrls";
+
+
+    public static String encrypt(String path, String orderCode) {
+        // 请求参数
+        JSONObject json = new JSONObject();
+        json.put("fileUrls", path.split(","));
+        return callServer(json.toJSONString(), orderCode);
+    }
+
+    /**
+     * 服务调用
+     */
+    public static String callServer(String json, String orderCode) {
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 这里的 url是发送请求拼接url
+        String url = HOST_IP + servicePath;
+        String msgId = UUID.randomUUID().toString().replace("-", "");
+        String requestTime = dateFormat.format(new Date());
+        // 下面两步是通过 AK,SK,servicePath 等参数生产 sign
+        // 注:加密方式尽量参考本例中的加密
+        // 大部分报错 signature value is error! 都是加密失败造成的,请仔细检查 AK, SK, path 是否正确
+        String signContext = getSignContext(servicePath, AK, msgId, requestTime, customer, userCode);
+        String sign = getGenerateSign(SK, signContext);
+
+        // ********模拟请求头参数,以下参数为通用必填参数************
+        Map<String, String> headerMap = new HashMap<>();
+        headerMap.put("X-AppKey", AK);
+        headerMap.put("X-Signature", sign);
+        headerMap.put("X-MsgId", msgId);
+        headerMap.put("X-RequestTime", requestTime);
+        headerMap.put("X-CustomerCode", customer);
+        headerMap.put("X-UserCode", userCode);
+        headerMap.put("X-AppCode", appCode);
+        headerMap.put("X-OrderCode", orderCode);
+        HttpResponse response = postObject(url, json, headerMap);
+        JSONObject jsonObject = JSONObject.parseObject(response.body());
+        return jsonObject.getJSONArray("data").getJSONObject(0).getString("encryptUrl");
+    }
+
+    /**
+     * 组装 post调用的header和请求体 .
+     *
+     * @param appAddress 发送地址 .
+     * @param params     参数 .
+     * @return postObject.
+     */
+    public static HttpResponse postObject(String appAddress, String params, Map<String, String> headerMap) {
+        HttpResponse result = null;
+        try {
+            result = HttpRequest.post(appAddress)
+                    .headerMap(headerMap, true)
+                    .body(params)
+                    .timeout(30000)
+                    .execute();
+            log.info("\n请求地址{},\n返回状态:{},\n返回信息{}", appAddress, result.getStatus(), result.body());
+        } catch (Exception e) {
+            log.error("地址{},参数{},发送异常:{}", appAddress, params, e.getMessage());
+        }
+        return result;
+    }
+
+    /**
+     * 签名
+     *
+     * @param secret
+     * @param signContext
+     * @return
+     */
+    public static String getGenerateSign(final String secret, final String signContext) {
+        String sign = null;
+        try {
+            Mac hmacSha256 = Mac.getInstance("HmacSHA1");
+            byte[] keyBytes = secret.getBytes();
+            hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA1"));
+            sign = HexUtil.encodeHexStr(hmacSha256.doFinal(signContext.getBytes()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return sign;
+    }
+
+    /**
+     * 签名字符串生成规则.
+     *
+     * @param appkey .
+     * @return 待签名字符串
+     */
+    private static String getSignContext(String path, String appkey, String msgId, String requestTime,
+                                         String customerCode, String userCode) {
+        StringBuilder append = new StringBuilder(path)
+                .append(appkey)
+                .append(msgId)
+                .append(requestTime);
+        if (customerCode != null) {
+            append.append(customerCode);
+        }
+        if (userCode != null) {
+            append.append(userCode);
+        }
+        System.out.println(append);
+        return append.toString().toUpperCase();
+    }
+}

+ 112 - 0
src/main/java/com/sooka/sponest/event/utils/NetworkImageToMultipartFile.java

@@ -0,0 +1,112 @@
+package com.sooka.sponest.event.utils;
+
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.net.ssl.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+
+public class NetworkImageToMultipartFile {
+
+    /**
+     * 从网络路径下载图片并转换为 MultipartFile
+     * @param imageUrl 图片的网络路径
+     * @return MultipartFile 对象
+     */
+    public static MultipartFile downloadImageToMultipartFile(String imageUrl) {
+        try {
+            // 禁用 SSL 证书验证(仅适用于开发环境)
+            disableSSLVerification();
+
+            // 打开连接
+            URL url = new URL(imageUrl);
+            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+            connection.setRequestMethod("GET");
+
+            int responseCode = connection.getResponseCode();
+            if (responseCode == HttpURLConnection.HTTP_OK) {
+                // 获取输入流
+                InputStream inputStream = connection.getInputStream();
+
+                // 获取文件名(从 URL 中提取)
+                String fileName = imageUrl.substring(imageUrl.lastIndexOf('/') + 1);
+
+                // 创建 MockMultipartFile
+                MultipartFile multipartFile = new MockMultipartFile(
+                        fileName, // 文件名
+                        fileName, // 原始文件名
+                        "image/jpeg", // 文件内容类型
+                        inputStream // 输入流
+                );
+
+                // 关闭输入流
+                inputStream.close();
+
+                return multipartFile;
+            } else {
+                System.out.println("Failed to download image. Server responded with code: " + responseCode);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+            System.out.println("Error downloading image: " + e.getMessage());
+        } catch (NoSuchAlgorithmException | KeyManagementException e) {
+            e.printStackTrace();
+            System.out.println("Error disabling SSL verification: " + e.getMessage());
+        }
+        return null;
+    }
+
+    /**
+     * 禁用 SSL 证书验证(仅适用于开发环境)
+     */
+    public static void disableSSLVerification() throws NoSuchAlgorithmException, KeyManagementException {
+        // 创建一个信任所有证书的 TrustManager
+        TrustManager[] trustAllCerts = new TrustManager[]{
+                new X509TrustManager() {
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return null;
+                    }
+
+                    public void checkClientTrusted(X509Certificate[] certs, String authType) {
+                    }
+
+                    public void checkServerTrusted(X509Certificate[] certs, String authType) {
+                    }
+                }
+        };
+
+        // 安装全局的信任管理器
+        SSLContext sc = SSLContext.getInstance("SSL");
+        sc.init(null, trustAllCerts, new java.security.SecureRandom());
+        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+
+        // 创建一个 HostnameVerifier,跳过主机名验证
+        HostnameVerifier allHostsValid = new HostnameVerifier() {
+            public boolean verify(String hostname, SSLSession session) {
+                return true;
+            }
+        };
+
+        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
+    }
+
+    public static void main(String[] args) {
+        String imageUrl = "https://47.93.50.30:443/media/dji-photos/wayline/1742354657053.JPG";
+
+        // 下载图片并转换为 MultipartFile
+        MultipartFile multipartFile = downloadImageToMultipartFile(imageUrl);
+
+        if (multipartFile != null) {
+            System.out.println("File Name: " + multipartFile.getOriginalFilename());
+            System.out.println("File Size: " + multipartFile.getSize() + " bytes");
+        } else {
+            System.out.println("Failed to convert image to MultipartFile.");
+        }
+    }
+}

+ 48 - 0
src/main/java/com/sooka/sponest/event/utils/URLToJSONConverter.java

@@ -0,0 +1,48 @@
+package com.sooka.sponest.event.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+public class URLToJSONConverter {
+
+    /**
+     * 将 URL 编码的字符串转换为格式化的 JSON 字符串
+     * @param encodedData URL 编码的字符串
+     * @return 格式化的 JSON 字符串
+     */
+    public static String convertURLToJSON(String encodedData) {
+        try {
+            // 解码 URL 编码的字符串
+            String decodedData = URLDecoder.decode(encodedData, "UTF-8");
+
+            // 去掉等号(如果存在)
+            if (decodedData.endsWith("=")) {
+                decodedData = decodedData.substring(0, decodedData.length() - 1);
+            }
+
+            // 将字符串解析为 JSON 对象
+            JSONObject jsonObject = JSON.parseObject(decodedData);
+
+            // 格式化 JSON 输出
+            return jsonObject.toJSONString();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+            return "Error: UnsupportedEncodingException";
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "Error: Invalid input format";
+        }
+    }
+
+    public static void main(String[] args) {
+        // 示例 URL 编码的 JSON 数据
+        String encodedData = "%7B%22data%22%3A%5B%7B%22alarmType%22%3A%22Sleep%22%2C%22altitude%22%3A0.0%2C%22createTime%22%3A1742354657000%2C%22latitude%22%3A38.185382%2C%22longitude%22%3A107.487296322%2C%22photoId%22%3A518%2C%22photoPath%22%3A%22https%3A%2F%2F47.93.50.30%3A443%2Fmedia%2Fdji-photos%2Fwayline%2F1742354657053.JPG%22%2C%22timeStamp%22%3A0%7D%5D%7D";
+
+        // 调用方法并打印结果
+        String result = convertURLToJSON(encodedData);
+        System.out.println(result);
+    }
+}

+ 28 - 0
src/main/resources/mapper/centereventteventcatalogue/AlarmEventMapper.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sooka.sponest.event.centereventteventcatalogue.mapper.AlarmEventMapper">
+    <resultMap id="resultDroneMapper" type="droneVo">
+        <id column="id" jdbcType="VARCHAR" property="id"/>
+        <result column="time_stamp" jdbcType="VARCHAR" property="timeStamp"/>
+        <result column="altitude" jdbcType="VARCHAR" property="altitude"/>
+        <result column="alarm_type" jdbcType="VARCHAR" property="alarmType"/>
+        <result column="create_time" jdbcType="VARCHAR" property="createTime"/>
+        <result column="photo_path" jdbcType="VARCHAR" property="photoPath"/>
+        <result column="latitude" jdbcType="VARCHAR" property="latitude"/>
+        <result column="longitude" jdbcType="VARCHAR" property="longitude"/>
+        <result column="photo_id" jdbcType="VARCHAR" property="photoId"/>
+        <result column="photo_name" jdbcType="VARCHAR" property="photoName"/>
+        <result column="local_path" jdbcType="VARCHAR" property="localPath"/>
+    </resultMap>
+
+    <insert id="insertDrone" parameterType="list">
+        insert into centerevent_t_drone
+        (id, time_stamp, altitude, alarm_type, create_time, photo_path, latitude, longitude, photo_id, photo_name, local_path)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.id}, #{item.timeStamp}, #{item.altitude}, #{item.alarmType}, #{item.creationTime}, #{item.photoPath}, #{item.latitude}, #{item.longitude}, #{item.photoId}, #{item.photoName}, #{item.localPath})
+        </foreach>
+    </insert>
+</mapper>

+ 16 - 3
src/main/resources/mapper/centereventteventcatalogue/CenterEventViewMapper.xml

@@ -364,6 +364,9 @@
                     #{eventTypeIdDl}
                 </foreach>
             </if>
+            <if test="eventName != null and eventName != ''">
+                and event_name like concat('%', #{eventName},'%')
+            </if>
             <if test="longitude != null and longitude!='' and latitude != null and latitude != '' and distance != null">
                 having distance &lt; #{distance}
             </if>
@@ -392,6 +395,9 @@
                 #{eventTypeId}
             </foreach>
         </if>
+        <if test="eventName != null and eventName != ''">
+            and event_name like concat('%', #{eventName},'%')
+        </if>
         <if test="longitude != null and longitude!='' and latitude != null and latitude != '' and distance != null">
             having distance &lt; #{distance}
         </if>
@@ -425,9 +431,10 @@
     </select>
 
     <select id="listAll" parameterType="VisuForestCloudMapVO" resultType="VisuForestCloudMapEventListBO">
-        select id eventId, event_code eventCode, event_name eventName, event_status_value eventStatusValue, event_status
-        eventStatus, is_examine isExamine, version, address, create_by cameraCode
-        from centerevent_t_eventcatalogue
+        select a.id eventId, a.event_code eventCode, a.event_name eventName, a.event_status_value eventStatusValue, a.event_status
+        eventStatus, a.is_examine isExamine, a.version, a.address, a.create_by cameraCode, e.event_type_name eventTypeName
+        from centerevent_t_eventcatalogue a
+        left join centerevent_t_eventtype e on a.event_type_xl = e.id
         where report_source = 'reporting_source_1' and event_status_value = 'forest_event_status_1'
         <if test="eventName != null and eventName != ''">
             and event_name like concat('%', #{eventName},'%')
@@ -438,6 +445,12 @@
         <if test="day != null and day != ''">
             and DATE_FORMAT(create_time,'%Y-%m-%d') = #{day}
         </if>
+        <if test="eventTypeXls!= null and eventTypeXls.size > 0">
+            and event_type_xl in
+            <foreach item="eventTypeXl" collection="eventTypeXls" open="(" separator="," close=")">
+                #{eventTypeXl}
+            </foreach>
+        </if>
         order by create_time desc
     </select>
 

+ 5 - 0
src/main/resources/mapper/centereventteventtype/CentereventTEventtypeMapper.xml

@@ -44,6 +44,11 @@
         from centerevent_t_eventtype where code = #{code}
     </select>
 
+    <select id="selectCentereventTEventtypeByCodeTower" parameterType="String" resultMap="CentereventTEventtypeResult">
+        <include refid="selectCentereventTEventtypeVo"/>
+        from centerevent_t_eventtype where code_tower = #{code}
+    </select>
+
     <insert id="insertCentereventTEventtype" parameterType="CentereventTEventtype">
         insert into centerevent_t_eventtype
         <trim prefix="(" suffix=")" suffixOverrides=",">