Compare commits
2 Commits
4a36cdf89f
...
a9623faf24
| Author | SHA1 | Date |
|---|---|---|
|
|
a9623faf24 | |
|
|
41a86fb8b7 |
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 同步机场无人机关联数据
|
* 同步机场无人机关联数据
|
||||||
* 按照一个机场只会挂载一台无人机的逻辑进行处理
|
* 按照一个机场只会挂载一台无人机的逻辑进行处理
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue