EventHandlerImpl.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package com.hfln.device.application.event;
  2. import com.hfln.device.domain.service.DeviceService;
  3. import com.hfln.device.domain.entity.Device;
  4. import com.hfln.device.domain.event.*;
  5. import com.hfln.device.domain.constant.EventConstants;
  6. import com.hfln.device.domain.gateway.DeviceGateway;
  7. import com.hfln.device.domain.gateway.MqttGateway;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Service;
  11. import java.util.Collections;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 事件处理器实现类
  17. * 处理各种设备事件
  18. */
  19. @Service
  20. @Slf4j
  21. public class EventHandlerImpl implements EventHandler {
  22. @Autowired
  23. private DeviceService deviceService;
  24. @Autowired
  25. private MqttGateway mqttGateway;
  26. @Autowired
  27. private DeviceGateway deviceGateway;
  28. @Override
  29. public void handleFallEvent(FallEvent event) {
  30. log.debug("处理跌倒事件: {}", event);
  31. String deviceId = event.getDeviceId();
  32. try {
  33. Device device = deviceService.getDeviceById(deviceId);
  34. if (device == null) {
  35. log.debug("设备不存在: {}", deviceId);
  36. return;
  37. }
  38. device.setLastReportFallTime(event.getTimestamp());
  39. String fallStatus = event.getFallStatus();
  40. if (EventConstants.FallStatus.FALL_SUSPECTED.equals(fallStatus)) {
  41. mqttGateway.sendFallAlarmMessage(deviceId, event.getPose(), event.getTargetPoint());
  42. deviceGateway.recordFallEvent(deviceId, event.getPose(), event.getTargetPoint());
  43. log.info("疑似跌倒事件: {}", deviceId);
  44. } else if (EventConstants.FallStatus.FALL_CONFIRMED.equals(fallStatus)) {
  45. mqttGateway.sendFallAlarmMessage(deviceId, event.getPose(), event.getTargetPoint());
  46. deviceGateway.recordFallEvent(deviceId, event.getPose(), event.getTargetPoint());
  47. log.info("确认跌倒事件: {}", deviceId);
  48. device.setAlarmAck(false);
  49. device.setLastAlarmAckTime(event.getTimestamp());
  50. saveAlarmRecord(device, event);
  51. } else if (EventConstants.FallStatus.FALL_CANCELED.equals(fallStatus)) {
  52. List<List<Float>> targets = Collections.singletonList(event.getTargetPoint());
  53. mqttGateway.sendEventMessage(deviceId, Collections.emptyList(), event.getPose(), targets, fallStatus);
  54. log.info("取消跌倒事件: {}", deviceId);
  55. }
  56. deviceService.updateDevice(device);
  57. } catch (Exception e) {
  58. log.error("处理跌倒事件异常: {}", deviceId, e);
  59. }
  60. }
  61. @Override
  62. public void handlePresenceEvent(PresenceEvent event) {
  63. log.debug("处理存在事件: {}", event);
  64. String deviceId = event.getDeviceId();
  65. try {
  66. Device device = deviceService.getDeviceById(deviceId);
  67. if (device == null) {
  68. log.warn("设备不存在: {}", deviceId);
  69. return;
  70. }
  71. String presenceStatus = event.getPresenceStatus();
  72. if (EventConstants.PresenceStatus.PRESENCE_DETECTED.equals(presenceStatus)) {
  73. device.setEnterTs(event.getTimestamp());
  74. device.resetLeaveTs();
  75. mqttGateway.sendExistenceMessage(deviceId, presenceStatus);
  76. deviceGateway.recordExistEvent(deviceId, presenceStatus);
  77. log.info("检测到存在事件: {}", deviceId);
  78. } else if (EventConstants.PresenceStatus.PRESENCE_LOST.equals(presenceStatus)) {
  79. device.setLeaveTs(event.getTimestamp());
  80. device.updateStayTime();
  81. mqttGateway.sendExistenceMessage(deviceId, presenceStatus);
  82. deviceGateway.recordExistEvent(deviceId, presenceStatus);
  83. log.info("存在消失事件: {}, 停留时间: {}秒", deviceId, device.getStayTime() / 1000);
  84. saveStayTimeRecord(device);
  85. }
  86. deviceService.updateDevice(device);
  87. } catch (Exception e) {
  88. log.error("处理存在事件异常: {}", deviceId, e);
  89. }
  90. }
  91. @Override
  92. public void handleRetentionEvent(RetentionEvent event) {
  93. log.debug("处理滞留事件: {}", event);
  94. String deviceId = event.getDeviceId();
  95. try {
  96. Device device = deviceService.getDeviceById(deviceId);
  97. if (device == null) {
  98. log.warn("设备不存在: {}", deviceId);
  99. return;
  100. }
  101. String retentionStatus = event.getRetentionStatus();
  102. if (EventConstants.RetentionStatus.RETENTION_STARTED.equals(retentionStatus)) {
  103. device.setRetentionTime(event.getStartTimestamp());
  104. mqttGateway.sendAlarmMessage(deviceId, EventConstants.EventType.RETENTION_EVENT, buildRetentionMessage(event));
  105. deviceGateway.recordDeviceRetentionAlarm(deviceId, event.getStartTimestamp(), EventConstants.EventType.RETENTION_EVENT, retentionStatus);
  106. log.info("开始滞留事件: {}", deviceId);
  107. } else if (EventConstants.RetentionStatus.RETENTION_ONGOING.equals(retentionStatus)) {
  108. device.setRetentionKeepTime(event.getDuration());
  109. log.debug("滞留持续事件: {}, 持续时间: {}秒", deviceId, event.getDuration());
  110. } else if (EventConstants.RetentionStatus.RETENTION_ENDED.equals(retentionStatus)) {
  111. device.setRetentionTime(null);
  112. device.setRetentionKeepTime(null);
  113. mqttGateway.sendAlarmMessage(deviceId, EventConstants.EventType.RETENTION_EVENT, buildRetentionMessage(event));
  114. deviceGateway.recordDeviceStayTime(deviceId, event.getStartTimestamp(), event.getDuration(), retentionStatus);
  115. log.info("滞留结束事件: {}", deviceId);
  116. } else if (EventConstants.RetentionStatus.RETENTION_ALARM.equals(retentionStatus)) {
  117. String description = "滞留告警: 设备" + deviceId + "滞留时间超过阈值";
  118. mqttGateway.sendAlarmEventMessage(deviceId, description, "retention_alarm", 0);
  119. log.info("滞留告警事件: {}, 滞留时间: {}秒", deviceId, event.getDuration());
  120. device.setAlarmAck(false);
  121. device.setLastAlarmAckTime(event.getTimestamp());
  122. saveRetentionAlarmRecord(device, event);
  123. }
  124. deviceService.updateDevice(device);
  125. } catch (Exception e) {
  126. log.error("处理滞留事件异常: {}", deviceId, e);
  127. }
  128. }
  129. private Map<String, Object> buildRetentionMessage(RetentionEvent event) {
  130. Map<String, Object> message = new HashMap<>();
  131. message.put("status", event.getRetentionStatus());
  132. message.put("startTime", event.getStartTimestamp());
  133. message.put("duration", event.getDuration());
  134. return message;
  135. }
  136. @Override
  137. public void handleAlarmAcknowledgement(String deviceId, Long eventId, String eventType) {
  138. log.debug("处理告警确认: 设备={}, 事件ID={}, 事件类型={}", deviceId, eventId, eventType);
  139. Device device = deviceService.getDeviceById(deviceId);
  140. if (device == null) {
  141. log.warn("设备不存在: {}", deviceId);
  142. return;
  143. }
  144. // 设置告警已确认
  145. device.setAlarmAck(true);
  146. device.setLastAlarmAckTime(System.currentTimeMillis());
  147. // 发送告警确认消息
  148. mqttGateway.sendAlarmAckMessage(deviceId, eventId);
  149. log.info("告警已确认: 设备={}, 事件ID={}", deviceId, eventId);
  150. // 更新数据库中的告警记录
  151. updateAlarmAckStatus(eventId, eventType);
  152. // 更新设备信息
  153. deviceService.updateDevice(device);
  154. }
  155. /**
  156. * 保存告警记录到数据库
  157. * @param device 设备信息
  158. * @param event 跌倒事件
  159. */
  160. private void saveAlarmRecord(Device device, FallEvent event) {
  161. // 持久化告警事件到数据库
  162. deviceGateway.recordAlarmEvent(device.getDevId(), "跌倒告警", "fall_event", 1, event.getTimestamp());
  163. log.debug("保存跌倒告警记录: {}", event);
  164. }
  165. /**
  166. * 保存停留记录到数据库
  167. * @param device 设备信息
  168. */
  169. private void saveStayTimeRecord(Device device) {
  170. // 持久化停留事件到数据库
  171. deviceGateway.recordDeviceStayTime(device.getDevId(), device.getEnterTs(), device.getLeaveTs(), "未知区域");
  172. log.debug("保存停留记录: 设备={}, 进入时间={}, 离开时间={}, 停留时间={}秒",
  173. device.getDevId(), device.getEnterTs(), device.getLeaveTs(), device.getStayTime() / 1000);
  174. }
  175. /**
  176. * 保存滞留告警记录到数据库
  177. * @param device 设备信息
  178. * @param event 滞留事件
  179. */
  180. private void saveRetentionAlarmRecord(Device device, RetentionEvent event) {
  181. // 持久化滞留告警到数据库
  182. deviceGateway.recordDeviceRetentionAlarm(device.getDevId(), event.getTimestamp(), "retention_alarm", "滞留超时");
  183. log.debug("保存滞留告警记录: {}", event);
  184. }
  185. /**
  186. * 更新告警确认状态
  187. * @param eventId 事件ID
  188. * @param eventType 事件类型
  189. */
  190. private void updateAlarmAckStatus(Long eventId, String eventType) {
  191. // 更新告警确认状态到数据库
  192. deviceGateway.updateAlarmAckStatus(eventId, null); // userId可从上下文获取
  193. log.debug("更新告警确认状态: 事件ID={}, 事件类型={}", eventId, eventType);
  194. }
  195. }