/* * 【机场1】航线准备异常通知消费者(flight_setup_exception_notify)。 * Dock1/M30 在 flighttask_prepare 失败时会发送该事件;共享层原枚举未注册此方法, * 消息会被路由到 default 通道后丢弃。这里新增独立通道与 dock1 消费者, * 仅处理 Dock1 设备,机场2/3 收到同名事件时保持原行为(只记录日志)。 */ package com.ard.sample.dock1.manage.service.impl; import com.ard.sample.component.mqtt.model.ChannelName; import com.ard.sample.component.mqtt.model.CommonTopicReceiver; import com.ard.sample.component.websocket.enums.MessageType; import com.ard.sample.component.websocket.handler.DockWebSocketHandler; import com.ard.sample.manage.model.dto.DeviceDTO; import com.ard.sample.manage.service.IDeviceService; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.integration.annotation.ServiceActivator; import org.springframework.messaging.MessageHeaders; import org.springframework.stereotype.Service; import java.util.Objects; import java.util.Optional; /** * 机场1航线准备异常通知处理器。 * * @author ard */ @Slf4j @Service public class Dock1FlightSetupExceptionHandler { /** * 机场1:Dock1 设备类型。 */ private static final int DOCK1_DEVICE_TYPE = 1; @Autowired private IDeviceService deviceService; @Autowired private DockWebSocketHandler dockWebSocketHandler; @Autowired private ObjectMapper mapper; @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_FLIGHT_SETUP_EXCEPTION_NOTIFY) public void handleFlightSetupException(CommonTopicReceiver receiver, MessageHeaders headers) { String dockSn = receiver.getGateway(); Optional deviceOpt = deviceService.getDeviceBySn(dockSn); if (deviceOpt.isEmpty() || !Objects.equals(DOCK1_DEVICE_TYPE, deviceOpt.get().getType())) { // 机场2/3 的事件仍按原逻辑只记录日志,不改变其行为。 log.info("非机场1设备的航线准备异常通知,忽略。sn={}, method={}, data={}", dockSn, receiver.getMethod(), receiver.getData()); return; } log.warn("机场1航线准备异常:sn={}, bid={}, data={}", dockSn, receiver.getBid(), receiver.getData()); try { // 原样推送给前端,便于机场1页面展示准备失败原因。 dockWebSocketHandler.sendMessageToSubscribers(dockSn, MessageType.STATUS.getType(), mapper.writeValueAsString(receiver), ""); } catch (Exception e) { log.error("机场1航线准备异常通知推送失败:sn={}", dockSn, e); } } }