a-tuoheng-device/src/main/java/com/ruoyi/device/service/impl/BufferDeviceImpl.java

760 lines
23 KiB
Java
Raw Normal View History

2026-01-20 14:54:53 +08:00
package com.ruoyi.device.service.impl;
2026-01-21 13:43:27 +08:00
import com.alibaba.fastjson2.JSON;
2026-01-20 17:05:25 +08:00
import com.ruoyi.device.domain.api.IDeviceDomain;
2026-01-20 15:37:54 +08:00
import com.ruoyi.device.domain.api.IDockDomain;
import com.ruoyi.device.domain.api.IAircraftDomain;
import com.ruoyi.device.domain.api.IThingsBoardDomain;
2026-01-20 17:05:25 +08:00
import com.ruoyi.device.domain.model.Device;
2026-01-20 15:37:54 +08:00
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;
2026-01-20 14:54:53 +08:00
import com.ruoyi.device.service.api.IBufferDeviceService;
2026-01-20 15:37:54 +08:00
import com.ruoyi.device.service.dto.AircraftDTO;
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;
2026-01-21 13:18:33 +08:00
import com.ruoyi.device.service.convert.AircraftDTOConvert;
2026-01-21 13:43:27 +08:00
import lombok.extern.slf4j.Slf4j;
2026-01-20 15:37:54 +08:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
2026-01-20 14:54:53 +08:00
/**
2026-01-20 15:37:54 +08:00
* 设备缓冲服务实现
* 整合数据库数据和ThingsBoard数据
2026-01-20 14:54:53 +08:00
*
2026-01-20 15:37:54 +08:00
* @author ruoyi
* @date 2026-01-20
2026-01-20 14:54:53 +08:00
*/
2026-01-20 15:37:54 +08:00
@Service
2026-01-21 13:43:27 +08:00
@Slf4j
2026-01-20 15:37:54 +08:00
public class BufferDeviceImpl implements IBufferDeviceService
{
@Autowired
private IDockDomain dockDomain;
2026-01-20 17:05:25 +08:00
@Autowired
private IDeviceDomain deviceDomain;
2026-01-20 15:37:54 +08:00
@Autowired
private IAircraftDomain aircraftDomain;
@Autowired
private IThingsBoardDomain thingsBoardDomain;
@Override
public DockDetailDTO getDockDetailById(Long dockId)
{
Dock dock = dockDomain.selectDockByDockId(dockId);
if (dock == null)
{
return null;
}
2026-01-20 17:05:25 +08:00
Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId());
2026-01-20 15:37:54 +08:00
DockDetailDTO result = new DockDetailDTO();
2026-01-20 17:05:25 +08:00
result.setDockId(dock.getDockId());
result.setDockName(dock.getDockName());
result.setDockLocation(dock.getDockLocation());
ThingsBoardData thingsBoardData = getThingsBoardData("dock", device.getIotDeviceId());
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());
2026-01-20 15:37:54 +08:00
return result;
}
@Override
public AircraftDetailDTO getAircraftDetailById(Long aircraftId)
{
Aircraft aircraft = aircraftDomain.selectAircraftByAircraftId(aircraftId);
if (aircraft == null)
{
return null;
}
2026-01-21 13:18:33 +08:00
AircraftDTO aircraftDTO = AircraftDTOConvert.from(aircraft);
2026-01-20 15:37:54 +08:00
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<PsdkDevice> psdkDevices = telemetry.get(DeviceTelemetry.PSDK_WIDGET_VALUES).map(TelemetryValue::getValue).orElse(null);
if (psdkDevices != null)
{
List<PayloadDTO> payloadList = psdkDevices.stream()
.map(this::convertToPayloadDTO)
.collect(Collectors.toList());
data.setPayloadList(payloadList);
}
}
2026-01-21 13:51:04 +08:00
2026-01-21 13:43:27 +08:00
log.info("getThingsBoardData {}", JSON.toJSONString(data));
2026-01-20 15:37:54 +08:00
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<NetworkDTO> 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<PayloadDTO> 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<NetworkDTO> getNetworkList()
{
return networkList;
}
public void setNetworkList(List<NetworkDTO> 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;
}
2026-01-20 14:54:53 +08:00
2026-01-20 15:37:54 +08:00
public List<PayloadDTO> getPayloadList()
{
return payloadList;
}
2026-01-20 14:54:53 +08:00
2026-01-20 15:37:54 +08:00
public void setPayloadList(List<PayloadDTO> payloadList)
{
this.payloadList = payloadList;
}
}
2026-01-20 14:54:53 +08:00
}