liusuyi
2026-05-14 9958bc1501d0daee954d9bba383475e55e24ebab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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<String> EXCLUDE_FACTORY = new HashSet<>(Arrays.asList("7"));
    private static final String CAMERA_ENABLE = "1";
    private static final Set<String> SUPPORT_TYPES = new HashSet<>(Arrays.asList("1", "4"));
 
    @Async("cameraPTZExecutor")
    public void collectCamera(ArdCamera camera, Set<String> runningCamera) {
 
        String camId = camera.getId();
 
        try {
            if (!isValidCamera(camera)) return;
            List<ArdChannel> 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());
    }
}