修改 TuohengBufferDeviceImpl 中机场和无人机的状态判断

This commit is contained in:
孙小云 2026-02-11 16:13:40 +08:00
parent 15fbad2334
commit a0eb7202ff
1 changed files with 132 additions and 75 deletions

View File

@ -1,6 +1,10 @@
package com.ruoyi.device.service.impl; package com.ruoyi.device.service.impl;
import com.ruoyi.device.domain.api.*; import com.ruoyi.device.domain.api.*;
import com.ruoyi.device.domain.impl.machine.state.CoverState;
import com.ruoyi.device.domain.impl.machine.state.DroneState;
import com.ruoyi.device.domain.impl.machine.state.MachineStates;
import com.ruoyi.device.domain.impl.machine.statemachine.MachineStateManager;
import com.ruoyi.device.domain.model.*; import com.ruoyi.device.domain.model.*;
import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.AttributeMap;
import com.ruoyi.device.domain.model.thingsboard.TelemetryMap; import com.ruoyi.device.domain.model.thingsboard.TelemetryMap;
@ -51,6 +55,9 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
@Autowired @Autowired
private IThingsBoardDomain thingsBoardDomain; private IThingsBoardDomain thingsBoardDomain;
@Autowired
private MachineStateManager machineStateManager;
@Override @Override
public DockDetailDTO getDockDetailById(Long dockId) { public DockDetailDTO getDockDetailById(Long dockId) {
log.info("获取拓恒机场详情: dockId={}", dockId); log.info("获取拓恒机场详情: dockId={}", dockId);
@ -145,8 +152,23 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
dto.setBindTime(device.getCreateTime().getTime()); dto.setBindTime(device.getCreateTime().getTime());
dto.setAircraftManufacturer(device.getDeviceManufacturer()); dto.setAircraftManufacturer(device.getDeviceManufacturer());
// 获取ThingsBoard数据并填充到DTO // 查询无人机关联的机场获取机场SN用于从MachineStateManager获取状态
fillTuohengAircraftDetail(dto, device.getIotDeviceId()); // String dockSn = null;
// List<DockAircraft> dockAircrafts = dockAircraftDomain.selectDockAircraftByAircraftId(aircraftId);
// if (!CollectionUtils.isEmpty(dockAircrafts)) {
// DockAircraft dockAircraft = dockAircrafts.get(0);
// Dock dock = dockDomain.selectDockByDockId(dockAircraft.getDockId());
// if (dock != null) {
// Device dockDevice = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId());
// if (dockDevice != null) {
// dockSn = dockDevice.getDeviceSn();
// }
// }
// }
// 获取ThingsBoard数据并填充到DTO传入机场SN用于获取状态
// 这边的SN号是通用的
fillTuohengAircraftDetail(dto, device.getIotDeviceId(), device.getDeviceSn());
return dto; return dto;
} }
@ -307,23 +329,31 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
log.info("无人机MODE值: {}", mode); log.info("无人机MODE值: {}", mode);
// 获取舱门状态从机场遥测数据中获取 // 通过 MachineStateManager 获取舱门状态;只通过舱门状态判断是否作业
Integer doorStatus = telemetry.get(TuohengDeviceTelemetry.NEST_DOOR_STATUS) MachineStates machineStates =
.map(TelemetryValue::getValue) machineStateManager.getStates(dto.getSnNumber());
.orElse(null); CoverState coverState =
log.info("机场舱门状态: {}", doorStatus); machineStates.getCoverState();
log.info("机场舱门状态(从MachineStateManager): {}", coverState);
// WORKING状态需要同时满足mode=="auto" 且舱门打开(doorStatus==0) if(coverState == CoverState.OPENED){
if ("auto".equalsIgnoreCase(mode) && doorStatus != null && doorStatus == 0) { dockStatus = "WORKING"; //只通过舱门状态判断是否作业
dockStatus = "WORKING"; // auto模式且舱门打开表示正在执行任务
log.info("无人机处于auto模式且舱门打开设置机场状态为 WORKING"); log.info("无人机处于auto模式且舱门打开设置机场状态为 WORKING");
} else {
if ("auto".equalsIgnoreCase(mode) && (doorStatus == null || doorStatus != 0)) {
log.info("无人机处于auto模式但舱门未打开(doorStatus={}), 设置机场状态为 IDLE", doorStatus);
} else {
log.info("无人机处于{}模式,设置机场状态为 IDLE", mode);
}
} }
//
// // WORKING状态需要同时满足mode=="auto" 且舱门打开
// if ("auto".equalsIgnoreCase(mode) &&
// coverState == CoverState.OPENED) {
// dockStatus = "WORKING"; // auto模式且舱门打开表示正在执行任务
// log.info("无人机处于auto模式且舱门打开设置机场状态为 WORKING");
// } else {
// if ("auto".equalsIgnoreCase(mode) &&
// coverState != CoverState.OPENED) {
// log.info("无人机处于auto模式但舱门未打开(coverState={}), 设置机场状态为 IDLE", coverState);
// } else {
// log.info("无人机处于{}模式,设置机场状态为 IDLE", mode);
// }
// }
} catch (Exception e) { } catch (Exception e) {
log.warn("获取无人机mode或舱门状态失败默认设置为IDLE: {}", e.getMessage()); log.warn("获取无人机mode或舱门状态失败默认设置为IDLE: {}", e.getMessage());
} }
@ -352,17 +382,34 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
dto.setCabinHumidity(value.getValue()); dto.setCabinHumidity(value.getValue());
}); });
/**
* 通过 MachineStateManager 获取舱门状态
*/
// 设置舱门状态 // 设置舱门状态
log.info("---------- 解析舱门状态 ----------"); log.info("---------- 解析舱门状态 ----------");
telemetry.get(TuohengDeviceTelemetry.NEST_DOOR_STATUS) try {
.ifPresent(value -> { MachineStates machineStates =
Integer doorStatus = value.getValue(); machineStateManager.getStates(dto.getSnNumber());
log.info("NEST_DOOR_STATUS 舱门状态原始值: {}", doorStatus); CoverState coverState =
// 0=打开, 1=关闭 machineStates.getCoverState();
String cabinDoorStatus = (doorStatus != null && doorStatus == 0) ? "OPEN" : "CLOSED"; log.info("舱门状态(从MachineStateManager): {}", coverState);
dto.setCabinDoorStatus(cabinDoorStatus);
log.info("设置舱门状态: {}", cabinDoorStatus); String cabinDoorStatus;
}); if (coverState == CoverState.OPENED) {
cabinDoorStatus = "OPEN";
} else if (coverState == CoverState.CLOSED) {
cabinDoorStatus = "CLOSED";
} else {
cabinDoorStatus = "UNKNOWN";
}
dto.setCabinDoorStatus(cabinDoorStatus);
log.info("设置舱门状态: {}", cabinDoorStatus);
} catch (Exception e) {
log.warn("从MachineStateManager获取舱门状态失败: {}", e.getMessage());
dto.setCabinDoorStatus("UNKNOWN");
}
// 设置空调状态从属性中获取 airConditionerStatus取不到则默认为 IDLE // 设置空调状态从属性中获取 airConditionerStatus取不到则默认为 IDLE
log.info("---------- 解析空调状态 ----------"); log.info("---------- 解析空调状态 ----------");
@ -513,59 +560,54 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
.orElse(""); .orElse("");
log.info("无人机 MODE 值: {}", mode); log.info("无人机 MODE 值: {}", mode);
// 获取 tsingal图传信号强度用于判断开关机 // 通过 MachineStateManager 获取舱门状态使用机场SN
Integer tsingal = aircraftTelemetry.get(TuohengDeviceTelemetry.TSINGAL) CoverState coverState = null;
.map(TelemetryValue::getValue) try {
.orElse(0); MachineStates machineStates =
log.info("无人机 TSINGAL 值: {}", tsingal); machineStateManager.getStates(dto.getSnNumber());
coverState = machineStates.getCoverState();
boolean isPowerOn = tsingal > 60; // tsingal > 60 表示开机 log.info("机场舱门状态(从MachineStateManager): {}", coverState);
log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机"); } catch (Exception e) {
log.warn("从MachineStateManager获取舱门状态失败: {}", e.getMessage());
// 获取 nest_door_status舱门状态
Integer doorStatus = null;
if (dockTelemetry != null) {
doorStatus = dockTelemetry.get(TuohengDeviceTelemetry.NEST_DOOR_STATUS)
.map(TelemetryValue::getValue)
.orElse(null);
log.info("机场舱门状态: {}", doorStatus);
} }
// 判断逻辑IN_MISSION 需要同时满足 mode=="auto" 且舱门打开 // MachineStateManager 获取无人机开关机状态
DroneState droneState = null;
try {
MachineStates machineStates =
machineStateManager.getStates(dto.getSnNumber());
droneState = machineStates.getDroneState();
log.info("无人机状态(从MachineStateManager): {}", droneState);
} catch (Exception e) {
log.warn("从MachineStateManager获取无人机状态失败: {}", e.getMessage());
}
boolean isPowerOn = (droneState != null && droneState != DroneState.POWER_OFF && droneState != DroneState.UNKNOWN);
log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机");
// 判断逻辑舱门打开就是任务中
String aircraftStatus; String aircraftStatus;
if ("auto".equalsIgnoreCase(mode) && doorStatus != null && doorStatus == 0) { if (coverState == CoverState.OPENED) {
// mode == "auto" 且舱门打开表示正在执行任务 // 舱门打开表示正在执行任务
aircraftStatus = "IN_MISSION"; aircraftStatus = "IN_MISSION";
log.info("无人机处于 auto 模式且舱门打开,设置状态: IN_MISSION"); log.info("舱门打开,设置状态: IN_MISSION");
} else { } else if (coverState == CoverState.CLOSED) {
// 其他情况根据 tsingal nest_door_status 判断 // 舱门关闭舱内根据开关机状态判断
if (doorStatus != null && doorStatus == 1) { if (isPowerOn) {
// 舱门关闭舱内 aircraftStatus = "POWER_ON_IN_CABIN";
if (isPowerOn) { log.info("舱门关闭 + 开机 → POWER_ON_IN_CABIN");
aircraftStatus = "POWER_ON_IN_CABIN";
log.info("舱门关闭 + 开机 → POWER_ON_IN_CABIN");
} else {
aircraftStatus = "POWER_OFF_IN_CABIN";
log.info("舱门关闭 + 关机 → POWER_OFF_IN_CABIN");
}
} else if (doorStatus != null && doorStatus == 0) {
// 舱门打开舱外但不是 auto 模式
if (isPowerOn) {
aircraftStatus = "POWER_ON_OUT_CABIN";
log.info("舱门打开 + 开机(非auto模式) → POWER_ON_OUT_CABIN");
} else {
aircraftStatus = "POWER_OFF_OUT_CABIN";
log.info("舱门打开 + 关机 → POWER_OFF_OUT_CABIN");
}
} else { } else {
// 无法获取舱门状态默认根据开关机状态判断 aircraftStatus = "POWER_OFF_IN_CABIN";
if (isPowerOn) { log.info("舱门关闭 + 关机 → POWER_OFF_IN_CABIN");
aircraftStatus = "POWER_ON_IN_CABIN"; }
log.warn("无法获取舱门状态,默认设置: POWER_ON_IN_CABIN"); } else {
} else { // 无法获取舱门状态默认根据开关机状态判断
aircraftStatus = "POWER_OFF_IN_CABIN"; if (isPowerOn) {
log.warn("无法获取舱门状态,默认设置: POWER_OFF_IN_CABIN"); aircraftStatus = "POWER_ON_IN_CABIN";
} log.warn("无法获取舱门状态,默认设置: POWER_ON_IN_CABIN");
} else {
aircraftStatus = "POWER_OFF_IN_CABIN";
log.warn("无法获取舱门状态,默认设置: POWER_OFF_IN_CABIN");
} }
} }
@ -585,8 +627,9 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
* *
* @param dto 无人机详情DTO * @param dto 无人机详情DTO
* @param iotDeviceId ThingsBoard设备ID * @param iotDeviceId ThingsBoard设备ID
* @param dockSn 机场SN号用于从MachineStateManager获取状态
*/ */
private void fillTuohengAircraftDetail(AircraftDetailDTO dto, String iotDeviceId) { private void fillTuohengAircraftDetail(AircraftDetailDTO dto, String iotDeviceId, String dockSn) {
try { try {
log.info("========== 开始填充拓恒无人机详情 =========="); log.info("========== 开始填充拓恒无人机详情 ==========");
log.info("iotDeviceId: {}", iotDeviceId); log.info("iotDeviceId: {}", iotDeviceId);
@ -614,7 +657,21 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
.orElse(0); .orElse(0);
log.info("无人机 TSINGAL 值: {}", tsingal); log.info("无人机 TSINGAL 值: {}", tsingal);
boolean isPowerOn = tsingal > 60; // tsingal > 60 表示开机 // MachineStateManager 获取无人机开关机状态
DroneState droneState = null;
if (dockSn != null) {
try {
MachineStates machineStates = machineStateManager.getStates(dockSn);
droneState = machineStates.getDroneState();
log.info("无人机状态(从MachineStateManager): {}", droneState);
} catch (Exception e) {
log.warn("从MachineStateManager获取无人机状态失败: {}", e.getMessage());
}
} else {
log.warn("机场SN为空无法从MachineStateManager获取无人机状态");
}
boolean isPowerOn = (droneState != null && droneState != DroneState.POWER_OFF && droneState != DroneState.UNKNOWN);
log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机"); log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机");
// 判断逻辑 // 判断逻辑