package com.ard.alarm.camera.service.impl; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.ard.alarm.camera.domain.ArdCameras; import com.ard.alarm.camera.mapper.ArdCamerasMapper; import com.ard.alarm.camera.service.IArdCamerasService; import com.ard.utils.sdk.hiksdk.service.HikClientUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * 相机设备Service业务层处理 * * @author 刘苏义 * @date 2023-02-11 */ @Service @Slf4j(topic = "camera") @Order(4) public class ArdCamerasServiceImpl implements IArdCamerasService, ApplicationRunner { private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static List ardCameraList = new ArrayList<>(); @Resource private ArdCamerasMapper ardCamerasMapper; //初始化执行 @Override public void run(ApplicationArguments args) { ardCameraList = selectArdCamerasList(new ArdCameras()); HikClientUtil.loginAllCamera(ardCameraList); syncCameraTask(); } /** * 同步相机列表任务 * 实时获取在线的小光电 * 刘苏义 * 2023/8/11 9:09:27 */ private void syncCameraTask() { scheduler.scheduleAtFixedRate(() -> { try { //region 定时同步光电设备 List newArdCameraList = selectArdCamerasList(new ArdCameras()); //需要更新的数据 List updateList = sameListWithDifferent(ardCameraList, newArdCameraList); if (updateList.size() > 0) { HikClientUtil.logoutAllCamera(updateList); HikClientUtil.loginAllCamera(updateList); ardCameraList.clear(); ardCameraList.addAll(newArdCameraList); } //需要删除的数据 List delList = diffList(ardCameraList, newArdCameraList); if (delList.size() > 0) { HikClientUtil.logoutAllCamera(delList); for (ArdCameras ardCameras : delList) { ardCameraList.remove(ardCameras); } } //需要新增的数据 List inserList = diffList(newArdCameraList, ardCameraList); if (inserList.size() > 0) { HikClientUtil.loginAllCamera(inserList); for (ArdCameras ardCameras : inserList) { ardCameraList.add(ardCameras); } } //endregion } catch (Exception e) { log.error("同步相机任务执行出错" + e.getMessage()); } }, 10, 10, TimeUnit.SECONDS); } /** * 查询相机设备列表 * * @param ardCamera 相机设备 * @return 相机设备 */ @Override public List selectArdCamerasList(ArdCameras ardCamera) { Wrapper queryWrapper=new QueryWrapper<>(ardCamera); return ardCamerasMapper.selectList(queryWrapper); } // 求两个对象List的差集 private List diffList(List oldArrayList, List newArrayList) { List resultList = oldArrayList.stream() .filter(item -> !newArrayList.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())) .collect(Collectors.toList()); return resultList; } //求两个对象List的交集字段不同Id相同 private List sameListWithDifferent(List oldList, List newList) { List differentFieldsList = newList.stream() .filter(newItem -> { ArdCameras oldItem = oldList.stream() .filter(item -> item.getId().equals(newItem.getId())) .findFirst() .orElse(null); return oldItem == null || !Objects.equals(oldItem.getUpdateTime(), newItem.getUpdateTime()); }) .collect(Collectors.toList()); return differentFieldsList; } }