package com.ard.work.device.camera.service; import com.ard.work.api.domian.ArdCamera; import com.ard.work.api.domian.ArdChannel; import com.ard.work.api.domian.CameraCmd; import com.ard.work.api.domian.PtzDto; import com.ard.work.device.camera.domain.PtzParamDTO; import com.ard.work.sdk.service.CameraSDKService; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @Slf4j @Component @RequiredArgsConstructor public class PtzDataCollector { private final CameraSDKService cameraSDKService; private final PtzCacheManager ptzCacheManager; private static final Set EXCLUDE_FACTORY = new HashSet<>(Arrays.asList("7")); private static final String CAMERA_ENABLE = "1"; private static final Set SUPPORT_TYPES = new HashSet<>(Arrays.asList("1", "4")); @Async("cameraPTZExecutor") public void collectCamera(ArdCamera camera, Set runningCamera) { String camId = camera.getId(); try { if (!isValidCamera(camera)) return; List channels = camera.getChannelList(); if (channels == null || channels.isEmpty()) return; for (ArdChannel channel : channels) { String key = camId + "_" + channel.getChanNo(); PtzParamDTO dto= fetchPtz(camera, channel); if (dto != null) { ptzCacheManager.updatePtzData(key, dto); } } } finally { // ✅ 必须释放(防死锁) runningCamera.remove(camId); } } /** * 原始SDK调用(不改) */ private PtzParamDTO fetchPtz(ArdCamera camera, ArdChannel channel) { CameraCmd cmd = new CameraCmd(); cmd.setCameraId(camera.getId()); cmd.setChanNo(channel.getChanNo()); PtzParamDTO dto = cameraSDKService.getGisInfo(cmd); if (dto == null) return null; dto.setCameraId(camera.getId()); dto.setChanNo(channel.getChanNo()); dto.setLongitude(camera.getLongitude()); dto.setLatitude(camera.getLatitude()); dto.setAltitude(camera.getAltitude()); PtzDto ptz = cameraSDKService.getPtz(cmd); if (ptz != null) { if ("4".equals(camera.getType())) { ptz.setP((ptz.getP() + camera.getBaseYaw() + 360) % 360); } dto.setP(ptz.getP()); dto.setT(ptz.getT()); dto.setZ(ptz.getZ()); } return dto; } private boolean isValidCamera(ArdCamera camera) { return CAMERA_ENABLE.equals(camera.getState()) && !EXCLUDE_FACTORY.contains(camera.getFactory()) && SUPPORT_TYPES.contains(camera.getType()); } }