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 a025562..ca0e24c 100644 --- a/src/main/java/com/ruoyi/device/service/impl/SynService.java +++ b/src/main/java/com/ruoyi/device/service/impl/SynService.java @@ -9,6 +9,7 @@ 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.DeviceTelemetry; +import com.ruoyi.device.domain.model.thingsboard.tuoheng.constants.TuohengDeviceAttributes; import com.ruoyi.device.api.enums.PayloadTypeEnum; import com.ruoyi.device.service.enums.DeviceType; import org.slf4j.Logger; @@ -73,6 +74,7 @@ public class SynService { /** * 初始化设备名称过滤正则表达式列表 * 延迟初始化,在第一次使用时编译正则表达式 + * 改动点: 首先不要用这个过滤了,TH开头的就是拓恒无人机 */ private void initExcludePatterns() { if (excludePatternList == null) { @@ -188,17 +190,20 @@ public class SynService { } try { - // 获取子设备属性 - AttributeMap attributes = iThingsBoardDomain.getPredefinedDeviceAttributes(childDeviceId); + String deviceName = childDeviceInfo.getName(); - // 判断设备类型 - DeviceType deviceType = determineDeviceType(childDeviceInfo, attributes); - - // 同步子设备(传入网关ID) - Long deviceId = syncDevice(childDeviceInfo, deviceType, gatewayInfo.getId()); - - // 根据设备类型进行不同的处理 - syncDeviceByType(deviceId, childDeviceInfo.getName(), deviceType, attributes); + // 判断是大疆还是拓恒设备(通过设备名称是否以 TH 开头) + if (deviceName.startsWith("TH")) { + // 拓恒设备处理逻辑 + log.info("检测到拓恒设备: {}", deviceName); + syncTuohengDevice(childDeviceInfo, gatewayInfo.getId()); + } else { + // 大疆设备处理逻辑(原有逻辑) + AttributeMap attributes = iThingsBoardDomain.getPredefinedDeviceAttributes(childDeviceId); + DeviceType deviceType = determineDeviceType(childDeviceInfo, attributes); + Long deviceId = syncDevice(childDeviceInfo, deviceType, gatewayInfo.getId()); + syncDeviceByType(deviceId, childDeviceInfo.getName(), deviceType, attributes); + } totalCount++; @@ -321,8 +326,12 @@ public class SynService { newDevice.setGateway(gatewayId); newDevice.setCreateBy("system"); - log.info("准备插入新设备: deviceName={}, deviceType={}, deviceSn={}", - deviceName, deviceType, deviceSn); + // 根据设备名称判断厂商 + String manufacturer = deviceName.startsWith("TH") ? "tuoheng" : "dajiang"; + newDevice.setDeviceManufacturer(manufacturer); + + log.info("准备插入新设备: deviceName={}, deviceType={}, deviceSn={}, manufacturer={}", + deviceName, deviceType, deviceSn, manufacturer); deviceDomain.insertDevice(newDevice); Long deviceId = newDevice.getDeviceId(); @@ -657,4 +666,117 @@ public class SynService { log.info("将机场添加到默认分组: dockId={}, dockName={}, groupId={}", dockId, dockName, defaultGroupId); } + + /** + * 同步拓恒设备(机场和无人机不区分类型,同时落三个表) + * + * @param deviceInfo 设备信息 + * @param gatewayId 网关ID + */ + private void syncTuohengDevice(DeviceInfo deviceInfo, String gatewayId) { + String deviceId = deviceInfo.getId(); + String deviceName = deviceInfo.getName(); // 这是SN号,如 THJSQ03B2410TGJ3MCJY + + log.info("开始同步拓恒设备: deviceName(SN)={}", deviceName); + + try { + // 获取拓恒设备属性 + AttributeMap attributes = iThingsBoardDomain.getPredefinedTuohengDeviceAttributes(deviceId); + + // 获取 airportID(机场和无人机的名称) + Optional airportIdOpt = attributes.get(TuohengDeviceAttributes.AIRPORT_ID); + String airportId = airportIdOpt.orElse(deviceName); // 如果没有 airportID,使用设备名称 + + // 获取固件版本 + Optional firmwareVersionOpt = attributes.get(TuohengDeviceAttributes.HARDWARE_VERSION); + String firmwareVersion = firmwareVersionOpt.orElse(""); + + log.info("拓恒设备属性: SN={}, airportID={}, firmwareVersion={}", + deviceName, airportId, firmwareVersion); + + // 1. 同步到 device 表(作为机场) + Long dockDeviceId = syncDevice(deviceInfo, DeviceType.DOCK, gatewayId); + + // 2. 同步到 device_dock 表 + syncTuohengDock(dockDeviceId, deviceName, airportId, firmwareVersion); + + // 3. 同步到 device 表(作为无人机) + Long aircraftDeviceId = syncDevice(deviceInfo, DeviceType.AIRCRAFT, gatewayId); + + // 4. 同步到 device_aircraft 表 + syncTuohengAircraft(aircraftDeviceId, deviceName, airportId, firmwareVersion); + + // 5. 同步到 device_dock_aircraft 表(建立机场-无人机关联) + syncDockAircraft(dockDeviceId, aircraftDeviceId); + + log.info("拓恒设备同步完成: SN={}, dockDeviceId={}, aircraftDeviceId={}", + deviceName, dockDeviceId, aircraftDeviceId); + + } catch (Exception e) { + log.error("同步拓恒设备失败: deviceName={}, error={}", deviceName, e.getMessage(), e); + throw e; + } + } + + /** + * 同步拓恒机场数据 + * + * @param deviceId 设备主键ID + * @param sn 设备SN号(设备名称) + * @param airportId 机场ID(airportID属性) + * @param firmwareVersion 固件版本 + */ + private void syncTuohengDock(Long deviceId, String sn, String airportId, String firmwareVersion) { + log.info("开始同步拓恒机场: deviceId={}, SN={}, airportID={}", deviceId, sn, airportId); + + // 查询机场是否已存在 + Dock existingDock = dockDomain.selectDockByDeviceId(deviceId); + + if (existingDock == null) { + // 机场不存在,插入新机场 + Dock newDock = new Dock(); + newDock.setDockName(airportId); // 使用 airportID 作为机场名称 + newDock.setDeviceId(deviceId); + newDock.setCreateBy("system"); + + log.info("准备插入新拓恒机场: deviceId={}, dockName={}, SN={}", deviceId, airportId, sn); + dockDomain.insertDock(newDock); + log.info("插入新拓恒机场成功: dockId={}", newDock.getDockId()); + + // 确保默认分组存在并加入 + ensureDefaultGroupExists(); + insertDockToDefaultGroup(newDock.getDockId(), airportId); + } else { + log.info("拓恒机场已存在: deviceId={}, dockId={}", deviceId, existingDock.getDockId()); + } + } + + /** + * 同步拓恒无人机数据 + * + * @param deviceId 设备主键ID + * @param sn 设备SN号(设备名称) + * @param airportId 机场ID(airportID属性) + * @param firmwareVersion 固件版本 + */ + private void syncTuohengAircraft(Long deviceId, String sn, String airportId, String firmwareVersion) { + log.info("开始同步拓恒无人机: deviceId={}, SN={}, airportID={}", deviceId, sn, airportId); + + // 查询无人机是否已存在 + Aircraft existingAircraft = aircraftDomain.selectAircraftByDeviceId(deviceId); + + if (existingAircraft == null) { + // 无人机不存在,插入新无人机 + Aircraft newAircraft = new Aircraft(); + newAircraft.setAircraftName(airportId); // 使用 airportID 作为无人机名称 + newAircraft.setDeviceId(deviceId); + newAircraft.setCreateBy("system"); + + log.info("准备插入新拓恒无人机: deviceId={}, aircraftName={}, SN={}", deviceId, airportId, sn); + aircraftDomain.insertAircraft(newAircraft); + log.info("插入新拓恒无人机成功: aircraftId={}", newAircraft.getAircraftId()); + } else { + log.info("拓恒无人机已存在: deviceId={}, aircraftId={}", deviceId, existingAircraft.getAircraftId()); + } + } }