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

This commit is contained in:
lxj
2025-08-12 15:49:15 +08:00
24 changed files with 669 additions and 79 deletions

View File

@@ -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;
}
}
}