package com.ruoyi.device.service.impl; 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.Dock; import com.ruoyi.device.domain.model.Aircraft; import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.TelemetryMap; import com.ruoyi.device.domain.model.thingsboard.TelemetryValue; import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes; import com.ruoyi.device.domain.model.thingsboard.constants.DeviceTelemetry; import com.ruoyi.device.domain.model.thingsboard.attributes.battery.BatteryData; import com.ruoyi.device.domain.model.thingsboard.attributes.psdk.PsdkDevice; import com.ruoyi.device.service.api.IBufferDeviceService; import com.ruoyi.device.service.dto.AircraftDTO; import com.ruoyi.device.service.dto.DockDTO; import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.dto.NetworkDTO; import com.ruoyi.device.service.dto.PayloadDTO; import com.ruoyi.device.service.convert.DockServiceConvert; import com.ruoyi.device.service.convert.AircraftServiceConvert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 设备缓冲服务实现 * 整合数据库数据和ThingsBoard数据 * * @author ruoyi * @date 2026-01-20 */ @Service public class BufferDeviceImpl implements IBufferDeviceService { @Autowired private IDockDomain dockDomain; @Autowired private IAircraftDomain aircraftDomain; @Autowired private IThingsBoardDomain thingsBoardDomain; @Override public DockDetailDTO getDockDetailById(Long dockId) { Dock dock = dockDomain.selectDockByDockId(dockId); if (dock == null) { return null; } DockDTO dockDTO = DockServiceConvert.toDTO(dock); DockDetailDTO result = new DockDetailDTO(); result.setDockId(dockDTO.getDockId()); result.setDockName(dockDTO.getDockName()); result.setDockLocation(dockDTO.getDockLocation()); ThingsBoardData thingsBoardData = getThingsBoardData("dock", null); if (thingsBoardData != null) { result.setFirmwareVersion(thingsBoardData.getFirmwareVersion()); result.setSnNumber(thingsBoardData.getSnNumber()); result.setBindTime(thingsBoardData.getBindTime()); result.setMaintenanceDays(thingsBoardData.getMaintenanceDays()); result.setDockName(thingsBoardData.getDockName()); result.setDockStatus(thingsBoardData.getDockStatus()); result.setBackupLongitude(thingsBoardData.getBackupLongitude()); result.setBackupLatitude(thingsBoardData.getBackupLatitude()); result.setRunningDuration(thingsBoardData.getRunningDuration()); result.setMissionCount(thingsBoardData.getMissionCount()); result.setWindSpeed(thingsBoardData.getWindSpeed()); result.setRainfall(thingsBoardData.getRainfall()); result.setEnvironmentTemperature(thingsBoardData.getEnvironmentTemperature()); result.setEnvironmentHumidity(thingsBoardData.getEnvironmentHumidity()); result.setNetworkType(thingsBoardData.getNetworkType()); result.setNetworkDelay(thingsBoardData.getNetworkDelay()); result.setAirConditionerStatus(thingsBoardData.getAirConditionerStatus()); result.setCabinDoorStatus(thingsBoardData.getCabinDoorStatus()); result.setDockRunStatus(thingsBoardData.getDockRunStatus()); result.setInternalCamera(thingsBoardData.getInternalCamera()); result.setExternalCamera(thingsBoardData.getExternalCamera()); result.setChargingStatus(thingsBoardData.getChargingStatus()); result.setCabinTemperature(thingsBoardData.getCabinTemperature()); result.setCabinHumidity(thingsBoardData.getCabinHumidity()); result.setElevatorPosition(thingsBoardData.getElevatorPosition()); result.setXAxisClampStatus(thingsBoardData.getXAxisClampStatus()); result.setYAxisClampStatus(thingsBoardData.getYAxisClampStatus()); } return result; } @Override public AircraftDetailDTO getAircraftDetailById(Long aircraftId) { Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(aircraftId); if (aircraft == null) { return null; } AircraftDTO aircraftDTO = AircraftServiceConvert.toDTO(aircraft); AircraftDetailDTO result = new AircraftDetailDTO(); result.setAircraftId(aircraftDTO.getAircraftId()); result.setAircraftName(aircraftDTO.getAircraftName()); ThingsBoardData thingsBoardData = getThingsBoardData("aircraft", null); if (thingsBoardData != null) { result.setManufacturerName(thingsBoardData.getManufacturerName()); result.setAircraftVersion(thingsBoardData.getAircraftVersion()); result.setSnNumber(thingsBoardData.getSnNumber()); result.setBatterySn(thingsBoardData.getBatterySn()); result.setBindTime(thingsBoardData.getBindTime()); result.setMaintenanceDays(thingsBoardData.getMaintenanceDays()); result.setFlightDuration(thingsBoardData.getFlightDuration()); result.setMissionCount(thingsBoardData.getMissionCount()); result.setNetworkList(thingsBoardData.getNetworkList()); result.setRtkSignal(thingsBoardData.getRtkSignal()); result.setMaxAltitude(thingsBoardData.getMaxAltitude()); result.setMaxDistance(thingsBoardData.getMaxDistance()); result.setVoltage(thingsBoardData.getVoltage()); result.setBatteryLevel(thingsBoardData.getBatteryLevel()); result.setFlightTimeRemaining(thingsBoardData.getFlightTimeRemaining()); result.setBatteryTemperature(thingsBoardData.getBatteryTemperature()); result.setCycleCount(thingsBoardData.getCycleCount()); result.setPayloadList(thingsBoardData.getPayloadList()); } return result; } private ThingsBoardData getThingsBoardData(String deviceType, String deviceIotId) { ThingsBoardData data = new ThingsBoardData(); AttributeMap attributes = thingsBoardDomain.getPredefinedDeviceAttributes(deviceIotId); if (attributes != null) { data.setFirmwareVersion(attributes.get(DeviceAttributes.Firmware_Version).orElse(null)); data.setSnNumber(attributes.get(DeviceAttributes.DOCK_SN).orElse(null)); data.setSubDeviceSn(attributes.get(DeviceAttributes.SUB_DEVICE_SN).orElse(null)); Integer modeCode = attributes.get(DeviceAttributes.MODE_CODE).orElse(null); if (modeCode != null) { if ("dock".equals(deviceType)) { data.setDockStatus(getDockStatus(modeCode)); } else if ("aircraft".equals(deviceType)) { data.setAircraftStatus(getAircraftStatus(modeCode)); } } } TelemetryMap telemetry = thingsBoardDomain.getPredefinedDeviceTelemetry(deviceIotId); if (telemetry != null) { data.setRunningDuration(telemetry.get(DeviceTelemetry.Acc_Time).map(TelemetryValue::getValue).orElse(null)); data.setMissionCount(telemetry.get(DeviceTelemetry.Total_Flight_Sorties).map(TelemetryValue::getValue).orElse(null)); data.setWindSpeed(telemetry.get(DeviceTelemetry.Wind_Speed).map(TelemetryValue::getValue).orElse(null)); // data.setRainfall(telemetry.get(DeviceTelemetry.Rainfall).map(TelemetryValue::getValue).orElse(null)); data.setEnvironmentTemperature(telemetry.get(DeviceTelemetry.TEMPERATURE).map(TelemetryValue::getValue).orElse(null)); data.setEnvironmentHumidity(telemetry.get(DeviceTelemetry.HUMIDITY).map(TelemetryValue::getValue).orElse(null)); Integer networkType = telemetry.get(DeviceTelemetry.Network_State_Type).map(TelemetryValue::getValue).orElse(null); if (networkType != null) { data.setNetworkType(getNetworkType(networkType)); } data.setCabinTemperature(telemetry.get(DeviceTelemetry.TEMPERATURE).map(TelemetryValue::getValue).orElse(null)); data.setCabinHumidity(telemetry.get(DeviceTelemetry.HUMIDITY).map(TelemetryValue::getValue).orElse(null)); data.setFlightDuration(telemetry.get(DeviceTelemetry.Acc_Time).map(TelemetryValue::getValue).orElse(null)); data.setRtkSignal(getRtkSignal(telemetry.get(DeviceTelemetry.Position_State_Rtk_Number).map(TelemetryValue::getValue).orElse(null))); data.setMaxAltitude(telemetry.get(DeviceTelemetry.Height_Limit).map(TelemetryValue::getValue).orElse(null)); data.setMaxDistance(telemetry.get(DeviceTelemetry.Distance_Limit_Status_Distance_Limit).map(TelemetryValue::getValue).orElse(null)); BatteryData battery = telemetry.get(DeviceTelemetry.BATTERY).map(TelemetryValue::getValue).orElse(null); if (battery != null) { data.setBatteryLevel(battery.getCapacityPercent()); data.setFlightTimeRemaining(battery.getRemainFlightTime() != null ? battery.getRemainFlightTime().doubleValue() : null); } List psdkDevices = telemetry.get(DeviceTelemetry.PSDK_WIDGET_VALUES).map(TelemetryValue::getValue).orElse(null); if (psdkDevices != null) { List payloadList = psdkDevices.stream() .map(this::convertToPayloadDTO) .collect(Collectors.toList()); data.setPayloadList(payloadList); } } return data; } private String getDockStatus(Integer modeCode) { if (modeCode == null) { return null; } String[] statusMap = {"空闲中", "现场调试", "远程调试", "固件升级中", "作业中", "待标定"}; if (modeCode >= 0 && modeCode < statusMap.length) { return statusMap[modeCode]; } return null; } private String getAircraftStatus(Integer modeCode) { if (modeCode == null) { return null; } String[] statusMap = {"待机", "起飞准备", "起飞准备完毕", "手动飞行", "自动起飞", "航线飞行", "全景拍照", "智能跟随", "ADS-B 躲避", "自动返航", "自动降落", "强制降落", "三桨叶降落", "升级中", "未连接", "APAS", "虚拟摇杆状态", "指令飞行", "空中 RTK 收敛模式", "机场选址中", "POI环绕"}; if (modeCode >= 0 && modeCode < statusMap.length) { return statusMap[modeCode]; } return null; } private String getNetworkType(Integer networkType) { if (networkType == null) { return null; } if (networkType == 1) { return "4G"; } else if (networkType == 2) { return "以太网"; } return null; } private Double getRtkSignal(Integer rtkNumber) { if (rtkNumber == null) { return null; } return rtkNumber.doubleValue(); } private PayloadDTO convertToPayloadDTO(PsdkDevice psdkDevice) { PayloadDTO dto = new PayloadDTO(); dto.setPayloadName(psdkDevice.getPsdk_name()); dto.setPayloadType(psdkDevice.getPsdk_lib_version()); // dto.setPayloadStatus(psdkDevice.getPsdk_version()); return dto; } private static class ThingsBoardData { private String firmwareVersion; private String snNumber; private String subDeviceSn; private String dockName; private String dockStatus; private String aircraftStatus; private Long bindTime; private Integer maintenanceDays; private Double backupLongitude; private Double backupLatitude; private Integer runningDuration; private Integer missionCount; private Double windSpeed; private Double rainfall; private Double environmentTemperature; private Double environmentHumidity; private String networkType; private Integer networkDelay; private String airConditionerStatus; private String cabinDoorStatus; private String dockRunStatus; private String internalCamera; private String externalCamera; private String chargingStatus; private Double cabinTemperature; private Double cabinHumidity; private String elevatorPosition; private String xAxisClampStatus; private String yAxisClampStatus; private String manufacturerName; private String aircraftVersion; private String batterySn; private Integer flightDuration; private List networkList; private Double rtkSignal; private Integer maxAltitude; private Integer maxDistance; private Double voltage; private Integer batteryLevel; private Double flightTimeRemaining; private Double batteryTemperature; private Integer cycleCount; private List payloadList; public String getFirmwareVersion() { return firmwareVersion; } public void setFirmwareVersion(String firmwareVersion) { this.firmwareVersion = firmwareVersion; } public String getSnNumber() { return snNumber; } public void setSnNumber(String snNumber) { this.snNumber = snNumber; } public String getSubDeviceSn() { return subDeviceSn; } public void setSubDeviceSn(String subDeviceSn) { this.subDeviceSn = subDeviceSn; } public String getDockName() { return dockName; } public void setDockName(String dockName) { this.dockName = dockName; } public String getDockStatus() { return dockStatus; } public void setDockStatus(String dockStatus) { this.dockStatus = dockStatus; } public String getAircraftStatus() { return aircraftStatus; } public void setAircraftStatus(String aircraftStatus) { this.aircraftStatus = aircraftStatus; } public Long getBindTime() { return bindTime; } public void setBindTime(Long bindTime) { this.bindTime = bindTime; } public Integer getMaintenanceDays() { return maintenanceDays; } public void setMaintenanceDays(Integer maintenanceDays) { this.maintenanceDays = maintenanceDays; } public Double getBackupLongitude() { return backupLongitude; } public void setBackupLongitude(Double backupLongitude) { this.backupLongitude = backupLongitude; } public Double getBackupLatitude() { return backupLatitude; } public void setBackupLatitude(Double backupLatitude) { this.backupLatitude = backupLatitude; } public Integer getRunningDuration() { return runningDuration; } public void setRunningDuration(Integer runningDuration) { this.runningDuration = runningDuration; } public Integer getMissionCount() { return missionCount; } public void setMissionCount(Integer missionCount) { this.missionCount = missionCount; } public Double getWindSpeed() { return windSpeed; } public void setWindSpeed(Double windSpeed) { this.windSpeed = windSpeed; } public Double getRainfall() { return rainfall; } public void setRainfall(Double rainfall) { this.rainfall = rainfall; } public Double getEnvironmentTemperature() { return environmentTemperature; } public void setEnvironmentTemperature(Double environmentTemperature) { this.environmentTemperature = environmentTemperature; } public Double getEnvironmentHumidity() { return environmentHumidity; } public void setEnvironmentHumidity(Double environmentHumidity) { this.environmentHumidity = environmentHumidity; } public String getNetworkType() { return networkType; } public void setNetworkType(String networkType) { this.networkType = networkType; } public Integer getNetworkDelay() { return networkDelay; } public void setNetworkDelay(Integer networkDelay) { this.networkDelay = networkDelay; } public String getAirConditionerStatus() { return airConditionerStatus; } public void setAirConditionerStatus(String airConditionerStatus) { this.airConditionerStatus = airConditionerStatus; } public String getCabinDoorStatus() { return cabinDoorStatus; } public void setCabinDoorStatus(String cabinDoorStatus) { this.cabinDoorStatus = cabinDoorStatus; } public String getDockRunStatus() { return dockRunStatus; } public void setDockRunStatus(String dockRunStatus) { this.dockRunStatus = dockRunStatus; } public String getInternalCamera() { return internalCamera; } public void setInternalCamera(String internalCamera) { this.internalCamera = internalCamera; } public String getExternalCamera() { return externalCamera; } public void setExternalCamera(String externalCamera) { this.externalCamera = externalCamera; } public String getChargingStatus() { return chargingStatus; } public void setChargingStatus(String chargingStatus) { this.chargingStatus = chargingStatus; } public Double getCabinTemperature() { return cabinTemperature; } public void setCabinTemperature(Double cabinTemperature) { this.cabinTemperature = cabinTemperature; } public Double getCabinHumidity() { return cabinHumidity; } public void setCabinHumidity(Double cabinHumidity) { this.cabinHumidity = cabinHumidity; } public String getElevatorPosition() { return elevatorPosition; } public void setElevatorPosition(String elevatorPosition) { this.elevatorPosition = elevatorPosition; } public String getXAxisClampStatus() { return xAxisClampStatus; } public void setXAxisClampStatus(String xAxisClampStatus) { this.xAxisClampStatus = xAxisClampStatus; } public String getYAxisClampStatus() { return yAxisClampStatus; } public void setYAxisClampStatus(String yAxisClampStatus) { this.yAxisClampStatus = yAxisClampStatus; } public String getManufacturerName() { return manufacturerName; } public void setManufacturerName(String manufacturerName) { this.manufacturerName = manufacturerName; } public String getAircraftVersion() { return aircraftVersion; } public void setAircraftVersion(String aircraftVersion) { this.aircraftVersion = aircraftVersion; } public String getBatterySn() { return batterySn; } public void setBatterySn(String batterySn) { this.batterySn = batterySn; } public Integer getFlightDuration() { return flightDuration; } public void setFlightDuration(Integer flightDuration) { this.flightDuration = flightDuration; } public List getNetworkList() { return networkList; } public void setNetworkList(List networkList) { this.networkList = networkList; } public Double getRtkSignal() { return rtkSignal; } public void setRtkSignal(Double rtkSignal) { this.rtkSignal = rtkSignal; } public Integer getMaxAltitude() { return maxAltitude; } public void setMaxAltitude(Integer maxAltitude) { this.maxAltitude = maxAltitude; } public Integer getMaxDistance() { return maxDistance; } public void setMaxDistance(Integer maxDistance) { this.maxDistance = maxDistance; } public Double getVoltage() { return voltage; } public void setVoltage(Double voltage) { this.voltage = voltage; } public Integer getBatteryLevel() { return batteryLevel; } public void setBatteryLevel(Integer batteryLevel) { this.batteryLevel = batteryLevel; } public Double getFlightTimeRemaining() { return flightTimeRemaining; } public void setFlightTimeRemaining(Double flightTimeRemaining) { this.flightTimeRemaining = flightTimeRemaining; } public Double getBatteryTemperature() { return batteryTemperature; } public void setBatteryTemperature(Double batteryTemperature) { this.batteryTemperature = batteryTemperature; } public Integer getCycleCount() { return cycleCount; } public void setCycleCount(Integer cycleCount) { this.cycleCount = cycleCount; } public List getPayloadList() { return payloadList; } public void setPayloadList(List payloadList) { this.payloadList = payloadList; } } }