Merge branch 'master' of http://47.109.37.87:3000/by2025/SmartParks
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
package org.dromara.sis.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.domain.AlarmRecord;
|
||||
import org.dromara.sis.domain.bo.SisAlarmEventsBo;
|
||||
import org.dromara.sis.service.AlarmRecordService;
|
||||
import org.dromara.sis.service.ISisAlarmEventsService;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
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 java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 告警数据主动推送控制器
|
||||
* 接收外部系统推送的告警数据并同步到数据库
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/alarm/push")
|
||||
@RequiredArgsConstructor
|
||||
public class AlarmPushController {
|
||||
|
||||
private final AlarmRecordService alarmRecordService;
|
||||
private final ISisAlarmEventsService sisAlarmEventsService;
|
||||
|
||||
/**
|
||||
* 接收单条告警数据推送
|
||||
*/
|
||||
@PostMapping("/single")
|
||||
public ResponseEntity<Map<String, Object>> pushSingleAlarm(@RequestBody Map<String, Object> alarmData) {
|
||||
try {
|
||||
// 处理单条数据
|
||||
processAlarmData(Collections.singletonList(alarmData));
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", true);
|
||||
result.put("message", "告警数据推送成功");
|
||||
result.put("timestamp", new Date());
|
||||
return ResponseEntity.ok(result);
|
||||
} catch (Exception e) {
|
||||
log.error("处理单条告警推送失败: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收批量告警数据推送
|
||||
*/
|
||||
@PostMapping("/batch")
|
||||
public ResponseEntity<Map<String, Object>> pushBatchAlarms(@RequestBody List<Map<String, Object>> alarmDataList) {
|
||||
if (alarmDataList == null || alarmDataList.isEmpty()) {
|
||||
return ResponseEntity.badRequest().body(Collections.singletonMap("error", "推送数据不能为空"));
|
||||
}
|
||||
|
||||
try {
|
||||
int processedCount = processAlarmData(alarmDataList);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", true);
|
||||
result.put("message", "批量告警数据推送成功");
|
||||
result.put("processedCount", processedCount);
|
||||
result.put("totalReceived", alarmDataList.size());
|
||||
result.put("timestamp", new Date());
|
||||
return ResponseEntity.ok(result);
|
||||
} catch (Exception e) {
|
||||
log.error("处理批量告警推送失败: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理告警数据并保存到数据库
|
||||
* @param alarmDataList 告警数据列表
|
||||
* @return 处理成功的数量
|
||||
*/
|
||||
private int processAlarmData(List<Map<String, Object>> alarmDataList) {
|
||||
log.info("开始处理推送的告警数据,共 {} 条", alarmDataList.size());
|
||||
|
||||
// 转换报警记录
|
||||
List<AlarmRecord> records = alarmDataList.stream()
|
||||
.map(alarmRecordService::convertFromMap)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 提取操作记录数据
|
||||
Map<Long, List<Map<String, Object>>> operatorMap = new HashMap<>();
|
||||
for (Map<String, Object> recordMap : alarmDataList) {
|
||||
// 确保Id存在且为有效数字
|
||||
Object idObj = recordMap.get("Id");
|
||||
if (idObj == null) {
|
||||
log.warn("跳过缺少Id的告警数据: {}", recordMap);
|
||||
continue;
|
||||
}
|
||||
|
||||
Long recordId;
|
||||
try {
|
||||
recordId = Long.valueOf(idObj.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("告警数据Id格式错误: {}", idObj, e);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 处理操作记录
|
||||
List<Map<String, Object>> operators = (List<Map<String, Object>>) recordMap.get("TaskOperators");
|
||||
if (operators != null && !operators.isEmpty()) {
|
||||
operatorMap.put(recordId, operators);
|
||||
}
|
||||
|
||||
// 同步到alarmEvents表
|
||||
SisAlarmEventsBo sisAlarmEvents = convertToAlarmEvents(recordMap, recordId);
|
||||
sisAlarmEventsService.insertByBo(sisAlarmEvents);
|
||||
}
|
||||
|
||||
// 保存数据(包含操作记录)
|
||||
return alarmRecordService.saveOrUpdateRecords(records, operatorMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将原始告警数据转换为SisAlarmEventsBo对象
|
||||
*/
|
||||
private SisAlarmEventsBo convertToAlarmEvents(Map<String, Object> recordMap, Long recordId) {
|
||||
SisAlarmEventsBo sisAlarmEvents = new SisAlarmEventsBo();
|
||||
sisAlarmEvents.setId(recordId);
|
||||
|
||||
// 转换类型和级别
|
||||
sisAlarmEvents.setType(convertToLong(recordMap.get("Type")));
|
||||
sisAlarmEvents.setLevel(convertToLong(recordMap.get("Level")));
|
||||
|
||||
// 设备信息
|
||||
sisAlarmEvents.setDeviceIp((String) recordMap.get("DeviceSipNum"));
|
||||
sisAlarmEvents.setDeviceName(Objects.toString(recordMap.get("DeviceName"), ""));
|
||||
sisAlarmEvents.setDeviceGroupId(convertToLong(recordMap.get("GroupId")));
|
||||
sisAlarmEvents.setDeviceGroupName(Objects.toString(recordMap.get("GroupName"), ""));
|
||||
|
||||
// 时间和状态
|
||||
sisAlarmEvents.setReportTime((Date) recordMap.get("StartTime"));
|
||||
sisAlarmEvents.setState(convertToInteger(recordMap.get("State")));
|
||||
|
||||
// 工单ID(仅当状态为3时)
|
||||
if (sisAlarmEvents.getState() == 3) {
|
||||
sisAlarmEvents.setWorkOrderId(convertToLong(recordMap.get("WorkOrderId")));
|
||||
}
|
||||
|
||||
return sisAlarmEvents;
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全地将对象转换为Long类型
|
||||
*/
|
||||
private Long convertToLong(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
try {
|
||||
return Long.valueOf(value.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("转换为Long失败: {}", value, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全地将对象转换为Integer类型
|
||||
*/
|
||||
private Integer convertToInteger(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).intValue();
|
||||
}
|
||||
try {
|
||||
return Integer.valueOf(value.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("转换为Integer失败: {}", value, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user