liusuyi
2024-10-10 38f29e38fcc668171dc05c53d40a36b895c86102
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -18,19 +18,25 @@
import com.ruoyi.device.camera.factory.CameraSDKFactory;
import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone;
import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService;
import com.ruoyi.device.terrain.domain.ArdTerrainMark;
import com.ruoyi.device.terrain.service.IArdTerrainMarkService;
import com.ruoyi.utils.gis.GisUtil;
import com.ruoyi.utils.gis.Point;
import com.ruoyi.utils.sdk.common.GlobalVariable;
import com.ruoyi.utils.tools.ArdTool;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -40,7 +46,7 @@
 * @Date: 2023年10月16日15:21:01
 **/
@Service
@Slf4j(topic = "SDK")
@Slf4j(topic = "sdk")
public class CameraSdkServiceImpl implements ICameraSdkService, ApplicationRunner {
    @Resource
    private IArdCamerasService ardCamerasService;
@@ -52,6 +58,8 @@
    private IArdAlarmpointsWellService ardAlarmpointsWellService;
    @Resource
    private IArdCameraNoGuideZoneService ardCameraNoGuideZoneService;
    @Resource
    private IArdTerrainMarkService ardTerrainMarkService;
    /**
     * 启动线程方法,用于执行初始化登录相机的逻辑
@@ -61,10 +69,27 @@
    @Override
    public void run(ApplicationArguments args) {
        try {
            log.info("初始化登录相机开始");
            ardCamerasService.resetCameraLoginId();
            List<ArdCameras> ardCameras = ardCamerasService.selectArdCamerasListNoDataScope(new ArdCameras());
            for (ArdCameras camera : ardCameras) {
                asyncLogin(camera);
            }
            ardCameras.stream().forEach(ardCamera -> asyncLogin(ardCamera));
            //开启登录失败相机重连定时任务
            ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
            executor.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    try {
                        log.info("开始执行登录失败相机重连定时任务");
                        List<Object> ardCameras = redisCache.getListKey(CacheConstants.CAMERA_LIST_KEY);
                        ardCameras.stream()
                                .map(object -> (ArdCameras) object) // 将Object转换为ArdCameras
                                .filter(camera -> !GlobalVariable.loginMap.containsKey(camera.getId()))
                                .forEach(camera -> asyncLogin(camera));
                    } catch (Exception ex) {
                        log.error("重连相机异常:" + ex.getMessage());
                    }
                }
            }, 30, 30, TimeUnit.SECONDS);  // 任务延迟
        } catch (Exception ex) {
            log.error("初始化登录相机异常:" + ex.getMessage());
        }
@@ -508,6 +533,37 @@
        }
    }
    /**
     * @return
     * @Author 刘苏义
     * @Description 修正俯仰值(根据相机ID获取500米范围内的地形参数集合,计算平均值加上T值)
     * @Date 2024/6/22 11:16
     * @Param
     */
    @Override
    public Double correctPitch(CameraCmd cmd) {
        Double pitchAngle = 0.0;
        try {
            double[] targetPositions = cmd.getTargetPosition();
            ArdTerrainMark ardTerrainMark = new ArdTerrainMark();
            ardTerrainMark.setCameraId(cmd.getCameraId());
            List<ArdTerrainMark> ardTerrainMarks = ardTerrainMarkService.selectArdTerrainMarkList(ardTerrainMark);
            //过滤500米范围内的集合
            ardTerrainMarks = ardTerrainMarks.stream().filter(n -> GisUtil.getDistance(targetPositions, new double[]{n.getLongitude(), n.getLatitude(), n.getAltitude()}) <= 500).collect(Collectors.toList());
            //计算T平均值
            OptionalDouble averageT = ardTerrainMarks.stream().mapToDouble(ArdTerrainMark::getT).average();
            // 输出
            if (averageT.isPresent()) {
                pitchAngle = averageT.getAsDouble();
                log.debug("修正俯仰值:" + pitchAngle);
            }
        } catch (Exception ex) {
            log.error("修正俯仰值异常:" + ex.getMessage());
        }
        return pitchAngle;
    }
    //引导指向井
    @Override
    public AjaxResult guideTargetWell(CameraCmd cmd) {