package com.dongni.collisionavoidance.geofence.event; import com.dongni.collisionavoidance.geofence.model.entity.RuleViolationEvent; import com.dongni.collisionavoidance.geofence.model.entity.SpatialRule; import com.dongni.collisionavoidance.geofence.model.enums.RuleExecutionResult; import com.dongni.collisionavoidance.geofence.model.enums.RuleStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; import java.util.Map; /** * 规则事件发布器 * 负责统一发布各种规则相关事件 */ @Slf4j @Component public class RuleEventPublisher { @Autowired private ApplicationEventPublisher eventPublisher; /** * 发布规则违规事件 * * @param violationEvent 违规事件详情 * @param source 事件源对象 * @param contextInfo 上下文信息 */ public void publishViolationEvent(RuleViolationEvent violationEvent, Object source, String contextInfo) { try { RuleViolationEventOccurred event = new RuleViolationEventOccurred(source, violationEvent, "RuleEngine", contextInfo); log.info("发布规则违规事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); // 记录事件发布统计 recordEventPublication("VIOLATION", event.getPriority().name()); } catch (Exception e) { log.error("发布规则违规事件失败: violationEventId={}, error={}", violationEvent.getEventId(), e.getMessage(), e); } } // 异步发布方法已移除 - 简化架构,统一使用同步发布 /** * 批量发布规则违规事件 */ public void publishBatchViolationEvents(List violationEvents, Object source) { if (violationEvents == null || violationEvents.isEmpty()) { return; } log.info("批量发布规则违规事件,数量: {}", violationEvents.size()); violationEvents.forEach(violationEvent -> { publishViolationEvent(violationEvent, source, String.format("批量违规检测 - 共%d个事件", violationEvents.size())); }); } /** * 发布规则执行开始事件 */ public void publishRuleExecutionStarted(SpatialRule rule, String vehicleId, Object source, Map executionContext) { try { RuleExecutionEvent event = RuleExecutionEvent.executionStarted(source, rule, vehicleId, "RuleExecutionEngine", executionContext); log.debug("发布规则执行开始事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("EXECUTION_STARTED", "NORMAL"); } catch (Exception e) { log.error("发布规则执行开始事件失败: ruleId={}, vehicleId={}, error={}", rule.getRuleId(), vehicleId, e.getMessage(), e); } } /** * 发布规则执行完成事件 */ public void publishRuleExecutionCompleted(SpatialRule rule, String vehicleId, RuleExecutionResult result, LocalDateTime startTime, Object source, Map executionContext, String details) { try { RuleExecutionEvent event = RuleExecutionEvent.executionCompleted(source, rule, vehicleId, result, startTime, "RuleExecutionEngine", executionContext, details); log.debug("发布规则执行完成事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("EXECUTION_COMPLETED", result.name()); } catch (Exception e) { log.error("发布规则执行完成事件失败: ruleId={}, vehicleId={}, result={}, error={}", rule.getRuleId(), vehicleId, result.name(), e.getMessage(), e); } } /** * 发布规则执行失败事件 */ public void publishRuleExecutionFailed(SpatialRule rule, String vehicleId, LocalDateTime startTime, Object source, Map executionContext, String errorMessage) { try { RuleExecutionEvent event = RuleExecutionEvent.executionFailed(source, rule, vehicleId, startTime, "RuleExecutionEngine", executionContext, errorMessage); log.warn("发布规则执行失败事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("EXECUTION_FAILED", "ERROR"); } catch (Exception e) { log.error("发布规则执行失败事件失败: ruleId={}, vehicleId={}, error={}", rule.getRuleId(), vehicleId, e.getMessage(), e); } } /** * 发布规则状态变更事件 */ public void publishRuleStateChange(SpatialRule rule, RuleStatus previousStatus, RuleStatus newStatus, String changeReason, String changedBy, Object source, Map changeContext) { try { RuleStateChangeEvent event = new RuleStateChangeEvent(source, rule, previousStatus, newStatus, changeReason, changedBy, "RuleManager", changeContext, RuleStateChangeEvent.StateChangeType.MANUAL_CHANGE); log.info("发布规则状态变更事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("STATE_CHANGE", event.getChangeType().name()); } catch (Exception e) { log.error("发布规则状态变更事件失败: ruleId={}, previousStatus={}, newStatus={}, error={}", rule.getRuleId(), previousStatus, newStatus, e.getMessage(), e); } } /** * 发布规则激活事件 */ public void publishRuleActivated(SpatialRule rule, String changedBy, String reason, Object source) { try { RuleStateChangeEvent event = RuleStateChangeEvent.ruleActivated(source, rule, changedBy, reason); log.info("发布规则激活事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("RULE_ACTIVATED", "HIGH"); } catch (Exception e) { log.error("发布规则激活事件失败: ruleId={}, changedBy={}, error={}", rule.getRuleId(), changedBy, e.getMessage(), e); } } /** * 发布规则停用事件 */ public void publishRuleDeactivated(SpatialRule rule, String changedBy, String reason, Object source) { try { RuleStateChangeEvent event = RuleStateChangeEvent.ruleDeactivated(source, rule, changedBy, reason); log.info("发布规则停用事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("RULE_DEACTIVATED", "HIGH"); } catch (Exception e) { log.error("发布规则停用事件失败: ruleId={}, changedBy={}, error={}", rule.getRuleId(), changedBy, e.getMessage(), e); } } /** * 发布规则配置更新事件 */ public void publishRuleConfigUpdated(SpatialRule rule, String changedBy, Map updateContext, Object source) { try { RuleStateChangeEvent event = RuleStateChangeEvent.ruleConfigUpdated(source, rule, changedBy, updateContext); log.info("发布规则配置更新事件: {}", event.getEventDescription()); eventPublisher.publishEvent(event); recordEventPublication("CONFIG_UPDATED", "NORMAL"); } catch (Exception e) { log.error("发布规则配置更新事件失败: ruleId={}, changedBy={}, error={}", rule.getRuleId(), changedBy, e.getMessage(), e); } } /** * 批量发布规则状态变更事件 */ public void publishBatchRuleStateChanges(List rules, RuleStatus newStatus, String changeReason, String changedBy, Object source) { if (rules == null || rules.isEmpty()) { return; } log.info("批量发布规则状态变更事件,数量: {}, 新状态: {}", rules.size(), newStatus); rules.forEach(rule -> { publishRuleStateChange(rule, rule.getStatus(), newStatus, changeReason, changedBy, source, null); }); } // 异步发布方法已移除 - 简化架构,统一使用同步发布 /** * 检查事件发布是否启用 */ public boolean isEventPublishingEnabled() { return eventPublisher != null; } /** * 获取事件发布统计信息 */ public Map getEventPublishingStatistics() { // 这里可以集成实际的统计存储,暂时返回空Map return Map.of( "totalEventsPublished", 0L, "violationEvents", 0L, "executionEvents", 0L, "stateChangeEvents", 0L ); } /** * 记录事件发布统计 */ private void recordEventPublication(String eventType, String eventCategory) { // 这里可以集成实际的统计记录逻辑 log.debug("记录事件发布统计: type={}, category={}", eventType, eventCategory); } /** * 紧急事件发布(用于高优先级事件) */ public void publishEmergencyEvent(RuleViolationEvent violationEvent, Object source) { // 紧急事件同步发布,确保立即处理 publishViolationEvent(violationEvent, source, "紧急违规事件"); // 额外的紧急处理逻辑 log.error("紧急规则违规事件已发布: vehicleId={}, ruleId={}, violationType={}", violationEvent.getVehicleId(), violationEvent.getRuleId(), violationEvent.getViolationType()); } }