| | |
| | | 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; |
| | |
| | | @Slf4j(topic = "camera") |
| | | @Order(4) |
| | | public class ArdCamerasServiceImpl implements IArdCamerasService, ApplicationRunner { |
| | | private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); |
| | | |
| | | public static List<ArdCameras> ardCameraList = new ArrayList<>(); |
| | | |
| | | @Resource |
| | | private ArdCamerasMapper ardCamerasMapper; |
| | | @Resource |
| | | private ArdEquipExternalMapper ardEquipExternalMapper; |
| | | |
| | | @Override |
| | | public void run(ApplicationArguments args) { |
| | | public void run(ApplicationArguments args) { |
| | | //加载sdk库 |
| | | HikClientUtil.loadHCNetSDKLib(); |
| | | //获取全部海康光电尝试登录 |
| | | List<ArdCameras> ardCameras = ardCamerasMapper.selectArdCamerasList(new ArdCameras()); |
| | | HikClientUtil.loginAllCamera(ardCameras); |
| | | //获取全部海康报警主机尝试登录 |
| | | ArdEquipExternal alarmHost = new ArdEquipExternal(); |
| | | alarmHost.setFactory("1"); |
| | | alarmHost.setType("1"); |
| | | List<ArdEquipExternal> alarmHosts = ardEquipExternalMapper.selectArdEquipExternalList(alarmHost); |
| | | HikClientUtil.loginAllAlarmHost(alarmHosts); |
| | | //获取全部门禁主机尝试登录 |
| | | ArdEquipExternal accessControlHost = new ArdEquipExternal(); |
| | | accessControlHost.setFactory("1"); |
| | | accessControlHost.setType("6"); |
| | | List<ArdEquipExternal>accessControlHosts = ardEquipExternalMapper.selectArdEquipExternalList(accessControlHost); |
| | | HikClientUtil.loginAllAccessControlHost(accessControlHosts); |
| | | //获取小光电尝试登录 |
| | | ArdCameras ardCamera=new ArdCameras(); |
| | | ardCamera.setGdtype("0"); |
| | | ardCameraList = ardCamerasMapper.selectArdCamerasList(ardCamera); |
| | | HikClientUtil.loginAllCamera(ardCameraList); |
| | | syncTask(); |
| | | } |
| | | |
| | | /** |
| | | * 同步任务 |
| | | * 刘苏义 |
| | | * 2023/8/11 9:09:27 |
| | | */ |
| | | private void syncTask() { |
| | | scheduler.scheduleAtFixedRate(() -> { |
| | | try { |
| | | //region 定时同步小光电 |
| | | ArdCameras ardCamera=new ArdCameras(); |
| | | ardCamera.setGdtype("0"); |
| | | List<ArdCameras> newArdCameraList = ardCamerasMapper.selectArdCamerasList(ardCamera); |
| | | //需要更新的数据 |
| | | List<ArdCameras> updateList = sameListWithDifferent(ardCameraList, newArdCameraList); |
| | | if (updateList.size() > 0) { |
| | | HikClientUtil.logoutAllCamera(updateList); |
| | | HikClientUtil.loginAllCamera(updateList); |
| | | ardCameraList.clear(); |
| | | ardCameraList.addAll(newArdCameraList); |
| | | } |
| | | //需要删除的数据 |
| | | List<ArdCameras> delList = diffList(ardCameraList, newArdCameraList); |
| | | if (delList.size() > 0) { |
| | | HikClientUtil.logoutAllCamera(delList); |
| | | for (ArdCameras ardCameras : delList) { |
| | | ardCameraList.remove(ardCameras); |
| | | } |
| | | } |
| | | //需要新增的数据 |
| | | List<ArdCameras> 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | |
| | | // 求两个对象List的差集 |
| | | private List<ArdCameras> diffList(List<ArdCameras> oldArrayList, List<ArdCameras> newArrayList) { |
| | | List<ArdCameras> 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<ArdCameras> sameListWithDifferent(List<ArdCameras> oldList, List<ArdCameras> newList) { |
| | | List<ArdCameras> 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; |
| | | } |
| | | } |