Compare commits

...

2 Commits

Author SHA1 Message Date
孙小云 a9623faf24 添加喊话器的同步 2026-01-19 09:30:12 +08:00
孙小云 41a86fb8b7 添加挂载 2026-01-19 09:12:27 +08:00
2 changed files with 166 additions and 15 deletions

View File

@ -0,0 +1,47 @@
package com.ruoyi.device.service.enums;
/**
* 挂载类型枚举
* Service层使用
*
* @author ruoyi
* @date 2026-01-19
*/
public enum PayloadType {
/**
* 喊话器
*/
SPEAKER("SPEAKER", "喊话器"),
/**
* 相机
*/
CAMERA("CAMERA", "相机"),
/**
* 其他挂载
*/
OTHER("OTHER", "其他");
private final String code;
private final String description;
PayloadType(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return code;
}
}

View File

@ -1,32 +1,26 @@
package com.ruoyi.device.service.impl; package com.ruoyi.device.service.impl;
import com.ruoyi.device.domain.api.IAircraftDomain; import com.ruoyi.device.domain.api.*;
import com.ruoyi.device.domain.api.IDeviceDomain; import com.ruoyi.device.domain.model.*;
import com.ruoyi.device.domain.api.IDockAircraftDomain;
import com.ruoyi.device.domain.api.IDockDomain;
import com.ruoyi.device.domain.api.IThingsBoardDomain;
import com.ruoyi.device.domain.model.Aircraft;
import com.ruoyi.device.domain.model.Device;
import com.ruoyi.device.domain.model.Dock;
import com.ruoyi.device.domain.model.DockAircraft;
import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.AttributeMap;
import com.ruoyi.device.domain.model.thingsboard.DeviceInfo; import com.ruoyi.device.domain.model.thingsboard.DeviceInfo;
import com.ruoyi.device.domain.model.thingsboard.TelemetryMap;
import com.ruoyi.device.domain.model.thingsboard.TelemetryValue;
import com.ruoyi.device.domain.model.thingsboard.attributes.psdk.PsdkDevice;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes; import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceTelemetry;
import com.ruoyi.device.service.enums.DeviceType; import com.ruoyi.device.service.enums.DeviceType;
import com.ruoyi.device.service.enums.PayloadType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@Service @Service
@ -60,6 +54,12 @@ public class SynService {
@Autowired @Autowired
private IDockAircraftDomain dockAircraftDomain; private IDockAircraftDomain dockAircraftDomain;
@Autowired
private IPayloadDomain payloadDomain;
@Autowired
private IAircraftPayloadDomain aircraftPayloadDomain;
public SynService(IThingsBoardDomain iThingsBoardDomain) { public SynService(IThingsBoardDomain iThingsBoardDomain) {
this.iThingsBoardDomain = iThingsBoardDomain; this.iThingsBoardDomain = iThingsBoardDomain;
} }
@ -403,6 +403,93 @@ public class SynService {
} else { } else {
log.info("无人机已存在,跳过插入: deviceId={}, aircraftName={}", deviceId, deviceName); log.info("无人机已存在,跳过插入: deviceId={}, aircraftName={}", deviceId, deviceName);
} }
TelemetryMap telemetryMap = iThingsBoardDomain.getPredefinedDeviceTelemetry(deviceName);
Optional<TelemetryValue<List<PsdkDevice>>>
psdkDevicesOption = telemetryMap.get(DeviceTelemetry.PSDK_WIDGET_VALUES);
if(psdkDevicesOption.isPresent()) {
List<PsdkDevice> psdkDevices = psdkDevicesOption.get().getValue();
if(!CollectionUtils.isEmpty(psdkDevices)) {
for (PsdkDevice psdkDevice : psdkDevices) {
if(Objects.nonNull(psdkDevice.getSpeaker()) &&
Objects.nonNull(psdkDevice.getPsdk_sn()) && !psdkDevice.getPsdk_sn().isEmpty()) {
log.info("开始同步PSDK喊话器设备: psdkSn={}, psdkName={}",
psdkDevice.getPsdk_sn(), psdkDevice.getPsdk_name());
// 第一步同步挂载设备喊话器
Payload payload = new Payload();
payload.setPayloadSn(psdkDevice.getPsdk_sn());
List<Payload> payloads = payloadDomain.selectPayloadList(payload);
if(CollectionUtils.isEmpty(payloads)) {
// 挂载不存在插入新挂载
payload.setPayloadName(psdkDevice.getPsdk_name());
payload.setPayloadDisplayName("喊话器");
payload.setPayloadType(PayloadType.SPEAKER.getCode());
payload.setCreateBy("system");
payloadDomain.insertPayload(payload);
log.info("插入新挂载设备: payloadSn={}, payloadName={}, payloadId={}",
psdkDevice.getPsdk_sn(), psdkDevice.getPsdk_name(), payload.getPayloadId());
} else {
// 挂载已存在使用已有的挂载
payload = payloads.get(0);
log.info("挂载设备已存在: payloadSn={}, payloadId={}",
psdkDevice.getPsdk_sn(), payload.getPayloadId());
}
// 第二步同步无人机挂载关联表
Long payloadId = payload.getPayloadId();
Long aircraftId = existingAircraft.getAircraftId();
// 获取无人机关联的机场ID
Long dockId = getDockIdByAircraftId(aircraftId);
List<AircraftPayload> aircraftPayloads =
aircraftPayloadDomain.selectAircraftPayloadByPayloadId(payloadId);
if(!CollectionUtils.isEmpty(aircraftPayloads)) {
// 关联已存在检查是否需要更新
AircraftPayload existingRelation = aircraftPayloads.get(0);
boolean needUpdate = false;
if(!Objects.equals(existingRelation.getAircraftId(), aircraftId)) {
existingRelation.setAircraftId(aircraftId);
needUpdate = true;
}
if(!Objects.equals(existingRelation.getDockId(), dockId)) {
existingRelation.setDockId(dockId);
needUpdate = true;
}
if(needUpdate) {
existingRelation.setUpdateBy("system");
aircraftPayloadDomain.updateAircraftPayload(existingRelation);
log.info("更新无人机挂载关联: aircraftId={}, payloadId={}, dockId={}",
aircraftId, payloadId, dockId);
} else {
log.info("无人机挂载关联无需更新: aircraftId={}, payloadId={}",
aircraftId, payloadId);
}
} else {
// 关联不存在插入新关联
AircraftPayload newRelation = new AircraftPayload();
newRelation.setAircraftId(aircraftId);
newRelation.setPayloadId(payloadId);
newRelation.setDockId(dockId);
newRelation.setCreateBy("system");
aircraftPayloadDomain.insertAircraftPayload(newRelation);
log.info("插入无人机挂载关联: aircraftId={}, payloadId={}, dockId={}",
aircraftId, payloadId, dockId);
}
}
}
}
}
// 无人机已存在无需更新 // 无人机已存在无需更新
return existingAircraft.getAircraftId(); return existingAircraft.getAircraftId();
} }
@ -420,6 +507,23 @@ public class SynService {
return (devices != null && !devices.isEmpty()) ? devices.get(0) : null; return (devices != null && !devices.isEmpty()) ? devices.get(0) : null;
} }
/**
* 根据无人机ID获取关联的机场ID
*
* @param aircraftId 无人机主键ID
* @return 机场主键ID如果没有关联则返回null
*/
private Long getDockIdByAircraftId(Long aircraftId) {
List<DockAircraft> dockAircrafts = dockAircraftDomain.selectDockAircraftByAircraftId(aircraftId);
if (dockAircrafts != null && !dockAircrafts.isEmpty()) {
Long dockId = dockAircrafts.get(0).getDockId();
log.debug("无人机 {} 关联的机场ID: {}", aircraftId, dockId);
return dockId;
}
log.debug("无人机 {} 没有关联的机场", aircraftId);
return null;
}
/** /**
* 同步机场无人机关联数据 * 同步机场无人机关联数据
* 按照一个机场只会挂载一台无人机的逻辑进行处理 * 按照一个机场只会挂载一台无人机的逻辑进行处理