From a9623faf2446edcc3abf3c0fdb4b81dbfe0612b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Mon, 19 Jan 2026 09:30:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=96=8A=E8=AF=9D=E5=99=A8?= =?UTF-8?q?=E7=9A=84=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/service/enums/PayloadType.java | 47 ++++++++ .../ruoyi/device/service/impl/SynService.java | 112 ++++++++++++++---- 2 files changed, 139 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/ruoyi/device/service/enums/PayloadType.java diff --git a/src/main/java/com/ruoyi/device/service/enums/PayloadType.java b/src/main/java/com/ruoyi/device/service/enums/PayloadType.java new file mode 100644 index 0000000..65a7284 --- /dev/null +++ b/src/main/java/com/ruoyi/device/service/enums/PayloadType.java @@ -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; + } +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/device/service/impl/SynService.java b/src/main/java/com/ruoyi/device/service/impl/SynService.java index 351948d..e71e5cc 100644 --- a/src/main/java/com/ruoyi/device/service/impl/SynService.java +++ b/src/main/java/com/ruoyi/device/service/impl/SynService.java @@ -1,14 +1,7 @@ package com.ruoyi.device.service.impl; -import com.ruoyi.device.domain.api.IAircraftDomain; -import com.ruoyi.device.domain.api.IDeviceDomain; -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.api.*; +import com.ruoyi.device.domain.model.*; import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.DeviceInfo; import com.ruoyi.device.domain.model.thingsboard.TelemetryMap; @@ -17,6 +10,7 @@ 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.DeviceTelemetry; import com.ruoyi.device.service.enums.DeviceType; +import com.ruoyi.device.service.enums.PayloadType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -60,6 +54,12 @@ public class SynService { @Autowired private IDockAircraftDomain dockAircraftDomain; + @Autowired + private IPayloadDomain payloadDomain; + + @Autowired + private IAircraftPayloadDomain aircraftPayloadDomain; + public SynService(IThingsBoardDomain iThingsBoardDomain) { this.iThingsBoardDomain = iThingsBoardDomain; } @@ -415,20 +415,75 @@ public class SynService { for (PsdkDevice psdkDevice : psdkDevices) { if(Objects.nonNull(psdkDevice.getSpeaker()) && Objects.nonNull(psdkDevice.getPsdk_sn()) && !psdkDevice.getPsdk_sn().isEmpty()) { - // 第一步 插入喊话器设备 (没有则新增) - // 判断 device_payload 中 挂载SN号 中如果不存在为Psdk_sn的数据则插入 - // 插入 device_payload 挂载类为喊话器(需要定义一个挂载的枚举类型) - // 挂载显示名称为喊话器 挂载SN号(string)为 Psdk_sn,IOT中的设备ID 为空 - // 更新 无人机挂载表 表 + log.info("开始同步PSDK喊话器设备: psdkSn={}, psdkName={}", + psdkDevice.getPsdk_sn(), psdkDevice.getPsdk_name()); + // 第一步:同步挂载设备(喊话器) + Payload payload = new Payload(); + payload.setPayloadSn(psdkDevice.getPsdk_sn()); + List payloads = payloadDomain.selectPayloadList(payload); - // 更新 device_aircraft_payload 表 - // 判断改表中是否存在 payload_id 为 device_payload 中主键的数据 - // 存在的话,判断 aircraft_id 字段是否等于 deviceName , 不等于则更新 aircraft_id - // 等于则什么都不做; - // 表中不否存在 payload_id 为 device_payload 中主键的数据,则插入数据 - // dock_id为 无人机表关联的基础表的主键 + 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 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); + } } } } @@ -452,6 +507,23 @@ public class SynService { return (devices != null && !devices.isEmpty()) ? devices.get(0) : null; } + /** + * 根据无人机ID获取关联的机场ID + * + * @param aircraftId 无人机主键ID + * @return 机场主键ID,如果没有关联则返回null + */ + private Long getDockIdByAircraftId(Long aircraftId) { + List 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; + } + /** * 同步机场无人机关联数据 * 按照一个机场只会挂载一台无人机的逻辑进行处理