package com.ruoyi.device.service.impl; import com.alibaba.fastjson2.JSON; import com.ruoyi.device.domain.api.IDeviceDomain; import com.ruoyi.device.domain.api.IDockDomain; import com.ruoyi.device.domain.api.IAircraftDomain; import com.ruoyi.device.domain.api.IThingsBoardDomain; import com.ruoyi.device.domain.model.Device; import com.ruoyi.device.domain.model.Dock; import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.TelemetryMap; import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes; import com.ruoyi.device.service.api.IBufferDeviceService; import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.enums.DockStatusEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.stream.Collectors; /** * 设备缓冲服务实现 * 整合数据库数据和ThingsBoard数据 * * @author ruoyi * @date 2026-01-20 */ @Service @Slf4j public class BufferDeviceImpl implements IBufferDeviceService { @Autowired private IDockDomain dockDomain; @Autowired private IDeviceDomain deviceDomain; @Autowired private IAircraftDomain aircraftDomain; @Autowired private IThingsBoardDomain thingsBoardDomain; @Override public DockDetailDTO getDockDetailById(Long dockId) { Dock dock = dockDomain.selectDockByDockId(dockId); log.info("selectDockByDockId {}",JSON.toJSONString(dock)); if (dock == null) { return null; } Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); log.info("selectDeviceByDeviceId {}",JSON.toJSONString(device)); DockDetailDTO dto = getChangeAbleDockDetailDTO(device.getIotDeviceId()); dto.setDockId(dock.getDockId()); dto.setDockName(dock.getDockName()); dto.setDockLocation(dock.getDockLocation()); dto.setDockIotId(device.getIotDeviceId()); return dto; } @Override public AircraftDetailDTO getAircraftDetailById(Long aircraftId) { return null; } private DockDetailDTO getChangeAbleDockDetailDTO(String deviceIotId) { DockDetailDTO dto = new DockDetailDTO(); AttributeMap attributeMap = thingsBoardDomain.getPredefinedDeviceAttributes(deviceIotId); TelemetryMap telemetryMap = thingsBoardDomain.getPredefinedDeviceTelemetry(deviceIotId); // 根据 MODE_CODE 设置机场状态 // MODE_CODE 定义: {"0":"空闲中","1":"现场调试","2":"远程调试","3":"固件升级中","4":"作业中","5":"待标定"} attributeMap.get(DeviceAttributes.MODE_CODE).ifPresent(modeCode -> { String dockStatus = mapModeCodeToDockStatus(modeCode); dto.setDockStatus(dockStatus); }); return dto; } /** * 将 MODE_CODE 映射到机场状态 * @param modeCode 模式代码 * @return 机场状态字符串 */ private String mapModeCodeToDockStatus(Integer modeCode) { switch (modeCode) { case 0: return DockStatusEnum.IDLE.getCode(); case 1: case 2: return DockStatusEnum.Debugging.getCode(); case 3: return DockStatusEnum.FIRMWARE_UPGRADING.getCode(); case 4: return DockStatusEnum.WORKING.getCode(); case 5: default: return DockStatusEnum.UNKNOWN.getCode(); } } private AircraftDetailDTO getChangeAbleAirDetailDTO(String deviceIotId) { return null; } }