package com.cloud.device.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cloud.common.exception.ApplicationException; import com.cloud.common.utils.RestTemplateUtil; import com.cloud.common.utils.StringUtil; import com.cloud.device.constants.Constants; import com.cloud.device.dao.*; import com.cloud.device.model.*; import com.cloud.device.service.ClusterService; import com.cloud.device.service.TokenService; import com.cloud.device.vo.*; import lombok.extern.log4j.Log4j; import org.apache.commons.lang3.StringUtils; import org.apache.tomcat.util.bcel.Const; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.ResourceAccessException; import java.awt.*; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @Log4j @Service public class ClusterServiceImpl implements ClusterService { /*接口定义*/ /** * 获取本地库接口 */ public static final String HTTP_FIND_LOCAL_DATABASE = "findLocalDatabase"; /** * 获取同步库接口 */ public static final String HTTP_FIND_ALL_DATABASE = "findAllDatabase"; public static final String HTTP_VERIFY_CLUSTER_PWD = "verifyClusterPwd"; /** * 获取同步库接口 */ public static final String HTTP_SEARCH_NODE="searchNode"; /** * 获取摄像机接口 */ public static final String HTTP_CAMERA_SHOW = "cam_show"; public static final String HTTP_SEARCH_PORT = "11111"; /** * 是否获取设备下数据库信息 */ public static final String IS_CONTAINER_DB = "isContainerDb"; public static final String IS_CONTAINER_DB_YES = "1"; @Autowired private ClusterDao clusterDao; @Autowired private TokenService tokenService; @Autowired private NodeDao nodeDao; @Autowired private DicDao dicDao; @Autowired private DeviceDao deviceDao; @Autowired private OrgDao orgDao; @Override public Cluster selectById(String id){ return clusterDao.selectById(id); } public boolean verifyClusterPwdByCServer(String address, String pwd){ String url; if(address.split(":").length > 1) url = "http://"+address+"/"+HTTP_VERIFY_CLUSTER_PWD; else url = "http://"+address+":"+HTTP_SEARCH_PORT+"/"+HTTP_VERIFY_CLUSTER_PWD; JSONObject param = new JSONObject(); param.put("password", pwd); try { String result = RestTemplateUtil.post(url, param, MediaType.APPLICATION_JSON_UTF8, false); if(StringUtils.isNotEmpty(result)){ JSONObject jsonResult = JSONObject.parseObject(result); if(jsonResult.get("result") !=null && jsonResult.get("result") == "1")//表示集群密码正确 return true; } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 删除集群信息 * @param id * @param cookie * @return */ public boolean deleteById(String id, String cookie){ Cluster cluster = clusterDao.selectById(id); if(cluster !=null){ if(cookie.equals(cluster.getCookie())){ Integer status = clusterDao.deleteById(id); if(status >0){ deviceDao.deleteByClusterId(id); return true; } } } return false; } /** * 保存Cluster * * @param * @return */ @Override @Transactional public int save(String address, String cookie){ String cluster_ip_port = address+":"+HTTP_SEARCH_PORT; log.info("添加集群时任一节点ip和端口:"+cluster_ip_port); ClusterNodeVo clusterNodeVo = searchNode(cluster_ip_port); if(clusterNodeVo !=null){ //判断集群是否已加入 Cluster clusterModel = clusterDao.selectById(clusterNodeVo.getCluster_id()); final String clusterId = clusterNodeVo.getCluster_id(); if(clusterModel == null){//集群不存在 log.info("集群不存在,新增集群信息"); clusterModel = new Cluster(); clusterModel.setId(clusterNodeVo.getCluster_id()); clusterModel.setName(clusterNodeVo.getCluster_name()); clusterModel.setCookie(cookie); clusterModel.setAddress(cluster_ip_port); // clusterModel.preInsert(tokenService.currentUser()); clusterModel.setRevJson("{}"); int saveStatus = clusterDao.saveSelective(clusterModel); if(saveStatus>0){ //保存集群节点信息和节点下的摄像机信息 clusterNodeVo.getList().parallelStream().forEach(n->{ Node node = new Node(); node.setId(n.getUuid()); node.setNodeId(n.getNode_id()); node.setCreateTime(n.getCreate_time()); node.setDevId(n.getDev_id()); node.setDevName(n.getDev_name()); node.setNodeIp(n.getNode_ip()); node.setClusterId(clusterId); Integer insertResult = nodeDao.insertSelective(node);//保存节点 if(insertResult > 0){ log.info("节点ip:"+node.getNodeIp()); List cameraList = searchCamera(node.getNodeIp()); if(cameraList !=null && cameraList.size()>0){ for (CameraVo cv : cameraList){//保存节点下摄像机 Device model = new Device(); model.setId(cv.getStr_cam_dev_id());//摄像机编码 model.setIp(cv.getStr_ip()); model.setPort(cv.getN_port()); model.setAddress(cv.getStr_addr()); model.setBrand(cv.getStr_brand());//品牌 model.setName(cv.getStr_name()); model.setUsername(cv.getStr_username()); model.setPassword(cv.getStr_password()); model.setRemarks(cv.getStr_reserved()); model.setType(Device.DEVICE_TYPE_CAMERA); model.setNodeId(n.getUuid()); model.setDelFlag("0"); model.setStatus(0); model.setCameraType(cv.getType()); deviceDao.insertSelective(model);//保存摄像机设备 } } } }); return saveStatus; } }else{//如果集群已经存在 log.info("更新集群信息"); // clusterModel.preUpdate(tokenService.currentUser()); clusterModel.setName(clusterNodeVo.getCluster_name()); clusterModel.setDelFlag("0"); clusterModel.setCookie(cookie); int updateStatus = clusterDao.updateByIdSelective(clusterModel);//更新集群信息 if(updateStatus > 0){ clusterNodeVo.getList().parallelStream().forEach(n->{ Node node = nodeDao.selectById(n.getUuid()); if(node == null){ node = new Node(); node.setId(n.getUuid()); node.setNodeId(n.getNode_id()); node.setCreateTime(n.getCreate_time()); node.setDevId(n.getDev_id()); node.setDevName(n.getDev_name()); node.setNodeIp(n.getNode_ip()); node.setClusterId(clusterId); nodeDao.insertSelective(node);//保存节点 }else{ node.setId(n.getUuid()); node.setNodeId(n.getNode_id()); node.setCreateTime(n.getCreate_time()); node.setDevId(n.getDev_id()); node.setDevName(n.getDev_name()); node.setNodeIp(n.getNode_ip()); node.setClusterId(clusterId); nodeDao.updateByIdSelective(node); } log.info("节点ip:"+n.getNode_ip()); List cameraList = searchCamera(n.getNode_ip()); if(cameraList !=null && cameraList.size()>0){ for (CameraVo cv : cameraList){//保存节点下摄像机 Device model = deviceDao.selectById(cv.getStr_cam_dev_id()); boolean isEdit = false; if(model == null){ model = new Device(); }else{ isEdit = true; } model.setId(cv.getStr_cam_dev_id());//摄像机编码 model.setIp(cv.getStr_ip()); model.setPort(cv.getN_port()); model.setAddress(cv.getStr_addr()); model.setBrand(cv.getStr_brand());//品牌 model.setName(cv.getStr_name()); model.setUsername(cv.getStr_username()); model.setPassword(cv.getStr_password()); model.setRemarks(cv.getStr_reserved()); model.setType(Device.DEVICE_TYPE_CAMERA); model.setNodeId(n.getUuid()); model.setDelFlag("0"); model.setCameraType(cv.getType());//0:本地摄像机,1:GB28181 if(!isEdit){ model.setStatus(0); deviceDao.insert(model);//保存摄像机设备 } else deviceDao.updateById(model); } } }); } return updateStatus; } } return 0; } @Override public MenuTreeVo refreshCluster(String clusterIp,String type,String id){ MenuTreeVo result = new MenuTreeVo(); Map param = new HashMap<>(); param.put("type", Constants.DEVICE_TYPE); Map deviceTypes = dicDao.getByType(param).stream().collect(Collectors.toMap(Dic::getValue, Dic::getName)); List nodeMenus = new ArrayList<>(); List deviceMenus = new ArrayList<>(); Cluster newCluster = null; if(type.equals(Constants.TYPE_CLUSTER)){//点击的是集群 newCluster = clusterDao.selectById(id); result.setId(newCluster.getId()); result.setName(newCluster.getName()); nodeMenus = new ArrayList<>(); List nodes = nodeDao.findByClusterId(id); if(nodes !=null && nodes.size()>0){ for(Node node : nodes){ MenuTreeVo nodeMenu = new MenuTreeVo(); nodeMenu.setId(node.getId()); nodeMenu.setName(node.getDevName()); nodeMenu.setIp(node.getNodeIp()); nodeMenu.setAddress(node.getAddress()); nodeMenu.setType(deviceTypes.get(Device.DEVICE_TYPE_IP)); nodeMenu.setPublicIp(node.getPublicIp()); nodeMenu.setPublicPort(node.getPublicPort()); List devices = deviceDao.findByNodeId(node.getId()); if(devices!=null && devices.size()>0){ for(Device device : devices){ MenuTreeVo deviceMenu = new MenuTreeVo(); deviceMenu.setId(device.getId()); deviceMenu.setName(device.getName()); deviceMenu.setIp(device.getIp()); deviceMenu.setAddress(device.getAddress()); deviceMenu.setType(deviceTypes.get(device.getType())); deviceMenu.setPublicIp(node.getPublicIp()); deviceMenu.setPublicPort(node.getPublicPort()); deviceMenu.setOrgId(device.getOrgId()); if(device.getOrgId() !=null){ Org org = orgDao.selectById(device.getOrgId()); if(org !=null) deviceMenu.setOrgName(org.getName()); } deviceMenus.add(deviceMenu); } } nodeMenu.setChild(deviceMenus); nodeMenus.add(nodeMenu); } } result.setChild(nodeMenus); }else if(type.equals(Constants.TYPE_NODE)){//点击的是节点 Node node = nodeDao.selectById(id); newCluster = clusterDao.selectById(node.getClusterId()); MenuTreeVo nodeMenu = new MenuTreeVo(); nodeMenu.setId(node.getId()); nodeMenu.setName(node.getDevName()); nodeMenu.setIp(node.getNodeIp()); nodeMenu.setAddress(node.getAddress()); nodeMenu.setType(deviceTypes.get(Device.DEVICE_TYPE_IP)); nodeMenu.setPublicIp(node.getPublicIp()); nodeMenu.setPublicPort(node.getPublicPort()); List devices = deviceDao.findByNodeId(node.getId()); if(devices!=null && devices.size()>0){ for(Device device : devices){ MenuTreeVo deviceMenu = new MenuTreeVo(); deviceMenu.setId(device.getId()); deviceMenu.setName(device.getName()); deviceMenu.setIp(device.getIp()); deviceMenu.setAddress(device.getAddress()); deviceMenu.setType(deviceTypes.get(device.getType())); deviceMenu.setPublicIp(node.getPublicIp()); deviceMenu.setPublicPort(node.getPublicPort()); deviceMenu.setOrgId(device.getOrgId()); if(device.getOrgId() !=null){ Org org = orgDao.selectById(device.getOrgId()); if(org !=null) deviceMenu.setOrgName(org.getName()); } deviceMenus.add(deviceMenu); } } nodeMenu.setChild(deviceMenus); nodeMenus.add(nodeMenu); }else if(type.equals(Constants.TYPE_DEVICE)){//点击的是设备 Device device = deviceDao.selectById(id); Node node = nodeDao.selectById(device.getNodeId()); newCluster = clusterDao.selectById(node.getClusterId()); // List devices = deviceDao.findByNodeId(device.getNodeId()); List newList = new ArrayList<>(); MenuTreeVo nodeMenu = new MenuTreeVo(); nodeMenu.setId(node.getId()); nodeMenu.setName(node.getDevName()); nodeMenu.setIp(node.getNodeIp()); nodeMenu.setAddress(node.getAddress()); nodeMenu.setType(deviceTypes.get(Device.DEVICE_TYPE_IP)); nodeMenu.setPublicIp(node.getPublicIp()); nodeMenu.setPublicPort(node.getPublicPort()); MenuTreeVo deviceMenu = new MenuTreeVo(); deviceMenu.setId(device.getId()); deviceMenu.setName(device.getName()); deviceMenu.setIp(device.getIp()); deviceMenu.setAddress(device.getAddress()); deviceMenu.setType(deviceTypes.get(device.getType())); deviceMenu.setPublicIp(node.getPublicIp()); deviceMenu.setPublicPort(node.getPublicPort()); deviceMenu.setOrgId(device.getOrgId()); if(device.getOrgId() !=null){ Org org = orgDao.selectById(device.getOrgId()); if(org !=null) deviceMenu.setOrgName(org.getName()); } newList.add(deviceMenu); //点击设备的时候 只显示这个设备 /*for(Device d : devices){ if(!d.getId().equals(id)){ deviceMenu = new MenuTreeVo(); deviceMenu.setId(d.getId()); deviceMenu.setName(d.getName()); deviceMenu.setIp(d.getIp()); deviceMenu.setAddress(d.getAddress()); deviceMenu.setType(deviceTypes.get(d.getType())); deviceMenu.setPublicIp(node.getPublicIp()); deviceMenu.setPublicPort(node.getPublicPort()); newList.add(deviceMenu); } }*/ nodeMenu.setChild(newList); nodeMenus.add(nodeMenu); } result.setId(newCluster.getId()); result.setName(newCluster.getName()); result.setChild(nodeMenus); return result; } public List getAllClusterMenuInfo(String condition){ List list = new ArrayList<>(); /** * condition是IP地址或设备名称或设备地址模糊搜索 */ Map param = new HashMap<>(); param.put("type", Constants.DEVICE_TYPE); Map deviceTypes = dicDao.getByType(param).stream().collect(Collectors.toMap(Dic::getValue, Dic::getName)); // List clusters = clusterDao.findClusterByParam(null); // if(clusters !=null && clusters.size()>0){ // for(Cluster cluster : clusters){ // MenuTreeVo clusterMenu = new MenuTreeVo(); // clusterMenu.setId(cluster.getId()); // clusterMenu.setName(cluster.getName()); // clusterMenu.setType(""); // clusterMenu.setIp(cluster.getAddress()); // clusterMenu.setAddress(""); // // List nodeList = new ArrayList<>(); // List nodes = nodeDao.findByClusterId(cluster.getId()); // if(nodes !=null && nodes.size()>0){ // for(Node node:nodes){ // MenuTreeVo nodeMenu = new MenuTreeVo(); // nodeMenu.setId(node.getId()); // nodeMenu.setName(node.getDevName()); // nodeMenu.setIp(node.getNodeIp()); // nodeMenu.setAddress(node.getAddress()); // nodeMenu.setType(deviceTypes.get(Device.DEVICE_TYPE_IP)); // nodeMenu.setPublicIp(node.getPublicIp()); // nodeMenu.setPublicPort(node.getPublicPort()); // // List deviceList = new ArrayList<>(); // List devices = deviceDao.findByNodeId(node.getId()); // for(Device device : devices){ // MenuTreeVo deviceMenu = new MenuTreeVo(); // deviceMenu.setId(device.getId()); // deviceMenu.setName(device.getName()); // deviceMenu.setIp(device.getIp()); // deviceMenu.setAddress(device.getAddress()); // deviceMenu.setType(deviceTypes.get(device.getType())); // deviceMenu.setPublicIp(node.getPublicIp()); // deviceMenu.setPublicPort(node.getPublicPort()); // deviceMenu.setOrgId(device.getOrgId()); // if(device.getOrgId() !=null){ // Org org = orgDao.selectById(device.getOrgId()); // if(org !=null) // deviceMenu.setOrgName(org.getName()); // } // deviceList.add(deviceMenu); // } // nodeMenu.setChild(deviceList); // nodeList.add(nodeMenu); // } // } // clusterMenu.setChild(nodeList); // list.add(clusterMenu); // } // } Map devParam = new HashMap(); devParam.put("condition",condition); List deviceList = deviceDao.findAllClusterDevice(devParam);//查找符合条件的摄像机信息 if(deviceList !=null && deviceList.size() >0){ Map nodeMap = new HashMap<>(); Map clusterMap = new HashMap<>(); for(Device device : deviceList){ String nodeId = device.getNodeId(); if(!nodeMap.containsKey(nodeId)){ Node node = nodeDao.selectById(nodeId); if(node !=null){ nodeMap.put(nodeId, node); if(!clusterMap.containsKey(node.getClusterId())){ clusterMap.put(node.getClusterId(), clusterDao.selectById(node.getClusterId())); } } } } for(Map.Entry entry : clusterMap.entrySet()){ Cluster cluster = entry.getValue(); MenuTreeVo clusterMenu = new MenuTreeVo(); clusterMenu.setId(cluster.getId()); clusterMenu.setName(cluster.getName()); clusterMenu.setType(""); clusterMenu.setIp(cluster.getAddress()); clusterMenu.setAddress(""); List nodeMenus = new ArrayList<>(); for(Map.Entry nodeEntry : nodeMap.entrySet()){ Node node = nodeEntry.getValue(); if(node.getClusterId().equals(cluster.getId())){ MenuTreeVo nodeMenu = new MenuTreeVo(); nodeMenu.setId(node.getId()); nodeMenu.setName(node.getDevName()); nodeMenu.setIp(node.getNodeIp()); nodeMenu.setAddress(node.getAddress()); nodeMenu.setType(deviceTypes.get(Device.DEVICE_TYPE_IP)); nodeMenu.setPublicIp(node.getPublicIp()); nodeMenu.setPublicPort(node.getPublicPort()); List deviceMenus = new ArrayList<>(); for(Device device : deviceList){ if(device.getNodeId().equals(node.getId())){ MenuTreeVo deviceMenu = new MenuTreeVo(); deviceMenu.setId(device.getId()); deviceMenu.setName(device.getName()); deviceMenu.setIp(device.getIp()); deviceMenu.setAddress(device.getAddress()); deviceMenu.setType(deviceTypes.get(device.getType())); deviceMenu.setPublicIp(node.getPublicIp()); deviceMenu.setPublicPort(node.getPublicPort()); deviceMenu.setOrgId(device.getOrgId()); if(device.getOrgId() !=null){ Org org = orgDao.selectById(device.getOrgId()); if(org !=null) deviceMenu.setOrgName(org.getName()); } deviceMenus.add(deviceMenu); } } nodeMenu.setChild(deviceMenus); nodeMenus.add(nodeMenu); } } clusterMenu.setChild(nodeMenus); list.add(clusterMenu); } } return list; } public List findAllClusterList(){ List clusters = clusterDao.findClusterByParam(null); if(clusters !=null && clusters.size()>0){ for(Cluster cluster : clusters){ List nodes = nodeDao.findByClusterId(cluster.getId()); if(nodes !=null && nodes.size()>0){ for(Node node:nodes){ List devices = deviceDao.findByNodeId(node.getId()); node.setDevices(devices); } } cluster.setNodes(nodes); } } return clusters; } /** * 获取数据库中集群 * @param params * @return */ @Override public List findClusters(Map params){ return clusterDao.findClusterByParam(params); } /** * 通过集群ids获取集群信息 * @param ids * @return */ public List findClusterByIds(List ids){ return clusterDao.findClusterByIds(ids); } /** * 获取集群及节点信息,isContainerDb=1,表示需要获取节点下的数据库信息 * @param params * @return */ @Override public List findAllNode(Map params) { /** * 1. 获取集群信息 * 2. 获取集群中的同步库 * 3. 获取节点 */ boolean isContainerDb = false; if(params !=null && params.get(IS_CONTAINER_DB) !=null && IS_CONTAINER_DB_YES.equals(params.get(IS_CONTAINER_DB))){ isContainerDb =true; } List list= clusterDao.findClusterByParam(params); boolean finalIsContainerDb = isContainerDb; list.parallelStream().forEach(e -> { //if(finalIsContainerDb) {//是否获取同步库信息 try { e.setSyncDbs(getSyncDatabases(getSyncDataUrl(e.getAddress()))); } catch (ResourceAccessException ex) { log.error("集群获取同步库失败"); ex.printStackTrace(); } //} try { //获取节点信息,不获取本地库信息 e.setNodes(findNodes(e.getAddress(), finalIsContainerDb)); }catch (ResourceAccessException ex){ log.error("集群获取节点失败"); ex.printStackTrace(); } } ); return list; } /** * 根据节点查询节点信息及所属集群信息(有可能一个节点属于多个集群) * * @param nodeIds * @return */ @Override public List findNodesByIds(String nodeIds) { /** * 1. 遍历nodeIds,查询所属集群 * 2. 调用接口查询节点详细信息 * 3. 拼装VO */ if(StringUtils.isEmpty(nodeIds)){ throw new ApplicationException("节点Id不能为空"); } return getNodeCluster(nodeIds); } /** * 通过集群地址,获取集群信息和节点信息 * @param address * @return */ @Override public List findByCLuster(String address) { return null; } /** * 根据多个集群ids来获取集群及节点信息 * @param clusterIds * @return */ @Override public List findClusterNodesByClusterIds(String clusterIds) { List list = new ArrayList<>(); String[] arrIds = clusterIds.split(","); if(arrIds !=null && arrIds.length>0){ List clusters = clusterDao.findClusterByIds(Arrays.asList(arrIds)); if(clusters !=null && clusters.size()>0){ clusters.parallelStream().forEach(e->{ if(StringUtils.isNotEmpty(e.getAddress())){ Map map = new HashMap(); ClusterNodeVo clusterNodeVo = searchNode(e.getAddress()); log.info("clusterNodeVo:"+clusterNodeVo); if(clusterNodeVo !=null){ map.put("cluster_id",clusterNodeVo.getCluster_id()); map.put("cluster_name",clusterNodeVo.getCluster_name()); map.put("list",clusterNodeVo.getList()); } list.add(map); } }); } return list; } return null; } /** * 将人员分享到 集群节点 * * @param sharePersonParamVo * @return */ @Override public List sharePersonToCluster(SharePersonParamVo sharePersonParamVo) { /** * 1. 循环调用节点接口 * 1)获得接口地址 * 2)传递参数 personIds 和 DB Ids * * 2. 记录接口的返回值,将共享失败的数据,返回前台 */ return null; } @Override public ClusterNodeVo findClusteInfoByNodeIp(Map params) { String url = params.get("nodeIp").toString()+":"+ HTTP_SEARCH_PORT; return searchNode(url); } @Override public List getClusterDeviceTree() { List list = new ArrayList<>(); List clusters = clusterDao.findClusterByParam(null); if(clusters !=null && clusters.size() > 0){ for(Cluster cluster : clusters){ MenuTreeVo clusterMenu = new MenuTreeVo(); clusterMenu.setId(cluster.getId()); clusterMenu.setName(cluster.getName()); if(StringUtils.isNotEmpty(cluster.getAddress())){ String[] ipAddr = cluster.getAddress().split(":"); if(ipAddr !=null && ipAddr.length == 2){ clusterMenu.setIp(ipAddr[0]); } } clusterMenu.setType(Constants.TYPE_CLUSTER); List nodeList = new ArrayList<>(); List nodes = nodeDao.findByClusterId(cluster.getId()); if(nodes !=null && nodes.size() > 0){ for(Node node : nodes){ MenuTreeVo nodeMenu = new MenuTreeVo(); nodeMenu.setId(node.getId()); nodeMenu.setName(node.getDevName()); nodeMenu.setType(Constants.TYPE_NODE); nodeMenu.setIp(node.getNodeIp()); nodeMenu.setParentId(cluster.getId());//父id List devices = deviceDao.findByNodeId(node.getId()); List deviceList = new ArrayList<>(); if(devices !=null && devices.size() > 0){ for(Device device : devices){ MenuTreeVo deviceMenu = new MenuTreeVo(); deviceMenu.setId(device.getId()); deviceMenu.setName(device.getName()); deviceMenu.setType(Constants.TYPE_DEVICE); deviceMenu.setStatus(Constants.DEVICE_STATUS_OK); deviceMenu.setParentId(node.getId()); if(StringUtils.isNotEmpty(device.getLongitude()) && StringUtils.isNotEmpty(device.getLatitude())){ deviceMenu.setIsOnMap(1);//已定位到地图 deviceMenu.setLongitude(device.getLongitude()); deviceMenu.setLatitude(device.getLatitude()); } else deviceMenu.setIsOnMap(0);//未定位到地图 deviceList.add(deviceMenu); } } nodeMenu.setChild(deviceList); nodeList.add(nodeMenu); } } clusterMenu.setChild(nodeList); list.add(clusterMenu); } } return list; } /** * 获取节点所属的集群信息(可能节点属于多个集群) * @param nodeIds 节点列表 * @return */ private List getNodeCluster(String nodeIds){ List clusterNodeVos=new ArrayList<>(); List clusters = findAllNode(null); String[] ids = nodeIds.split(","); for(String nodeId:ids){ for(Cluster c : clusters){ List nodes =c.getNodes(); AtomicBoolean isGet = new AtomicBoolean(false); for(Node node : nodes){ if(nodeId.equals(node.getId())){//表示找到节点所属的集群 ClusterNodeVo clusterNodeVo = new ClusterNodeVo(); clusterNodeVo.setCluster_id(c.getId().toString()); clusterNodeVo.setCluster_name(c.getName()); clusterNodeVos.add(clusterNodeVo); isGet.set(true); break; } } if(isGet.get()){ break; } } } return clusterNodeVos; } /** * 节点本地库地址 * @param nodeId * @param port * @return */ private String getLocalDataUrl(String nodeId,String port){ return "http://"+nodeId.substring(nodeId.indexOf("@")+1,nodeId.length())+":"+port+"/"+HTTP_FIND_LOCAL_DATABASE; } /** * 同步库地址 * @param url * @return */ private String getSyncDataUrl(String url){ return "http://"+url+"/"+HTTP_FIND_ALL_DATABASE; } /** * 节点接口地址 * @param url * @return */ private String getNodeUrl(String url){ return "http://"+url+"/"+HTTP_SEARCH_NODE; } /** * 获取摄像机地址 * @param url * @return */ private String getCameraUrl(String url){ return "http://"+ url + ":" + HTTP_SEARCH_PORT + "/" + HTTP_CAMERA_SHOW; } /** * 获取端口号 * @param url * @return */ private String getPort(String url){ return url.substring(url.lastIndexOf(":")+1,url.length()); } /** * 获取所有集群信息和节点信息 * @return */ @Override public List getAllCluListData(){ List list = new ArrayList<>(); List clusters = clusterDao.findClusterByParam(null); clusters.parallelStream().forEach(e->{ Map map = new HashMap<>(); ClusterNodeVo clusterNodeVo = searchNode(e.getAddress()); log.info("clusterNodeVo:"+clusterNodeVo); if(clusterNodeVo !=null){ map.put("cluster_id",clusterNodeVo.getCluster_id()); map.put("cluster_name",clusterNodeVo.getCluster_name()); map.put("list",clusterNodeVo.getList()); } list.add(map); }); return list; } public Map getClusterTreeData(){ Map selectAll = new HashMap(); selectAll.put("parentId","0"); selectAll.put("id","-1"); selectAll.put("label","全选"); List list = new ArrayList<>(); List clusters = clusterDao.findClusterByParam(null); clusters.parallelStream().forEach(e-> { Map map = new HashMap<>(); ClusterNodeVo clusterNodeVo = searchNode(e.getAddress()); if(clusterNodeVo !=null){ map.put("parentId","-1"); map.put("id",clusterNodeVo.getCluster_id()); map.put("label",clusterNodeVo.getCluster_name()); if(clusterNodeVo.getList() !=null && clusterNodeVo.getList().size()>0){ List nodeChildren = new ArrayList<>(); Map node; for(NodeVo nodeVo : clusterNodeVo.getList()){ node = new HashMap(); node.put("parentId",clusterNodeVo.getCluster_id()); node.put("id",nodeVo.getNode_id()); node.put("label",nodeVo.getDev_name()); nodeChildren.add(node); } map.put("children", nodeChildren); } list.add(map); } }); selectAll.put("children",list); return selectAll; } /** * 获取集群节点及底库信息 * @return */ @Override public List getAllCluDataBaseList() { List list = new ArrayList<>(); List clusters = clusterDao.findClusterByParam(null);//查询所有集群 clusters.parallelStream().forEach(e->{ Map map = new HashMap(); ClusterNodeVo clusterNodeVo = searchNode(e.getAddress()); if(clusterNodeVo !=null){ map.put("cluster_id",clusterNodeVo.getCluster_id());//集群id map.put("cluster_name",clusterNodeVo.getCluster_name());//集群名称 List nodeIPList = new ArrayList<>(); for (NodeVo nodeVo : clusterNodeVo.getList()) { Map nodeMap = new HashMap(); nodeMap.put("uuid",nodeVo.getUuid()); nodeMap.put("node_ip",nodeVo.getNode_ip()); nodeIPList.add(nodeMap); } map.put("cluIPList", nodeIPList);//集群节点ip列表 map.put("syncDataBase", getSyncDatabases(getSyncDataUrl(e.getAddress())));//集群中的同步库 } list.add(map); }); return list; } /** * 通过集群address获取集群信息和所有节点信息 * @param url * @return */ private ClusterNodeVo searchNode(String url){ try { log.info("searchNode url:"+url); String result = RestTemplateUtil.post(getNodeUrl(url), new JSONObject(), MediaType.APPLICATION_JSON_UTF8, String.class, false); if(StringUtils.isNotEmpty(result)){ String all = new String(result.getBytes("ISO-8859-1"),"utf-8"); return JSONObject.parseObject(all, ClusterNodeVo.class); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 获取集群节点列表 * @param url * @param isContainerDb 是否获取节点本地库列表 * @return */ private List findNodes(String url , boolean isContainerDb){ List nodeList = new ArrayList<>(); ClusterNodeVo clusterNodeVo = searchNode(url); if(clusterNodeVo != null && clusterNodeVo.getList()!=null && clusterNodeVo.getList().size()>0){ List list = clusterNodeVo.getList(); list.parallelStream().forEach(e -> { Node node = new Node(); node.setId(e.getUuid()); node.setAddress(""); node.setNodeIp(e.getNode_ip()); node.setNodeId(e.getNode_id()); node.setDevId(e.getDev_id()); node.setDevName(e.getDev_name()); //获取节点下的设备信息 node.setDevices(deviceDao.findByNodeId(e.getUuid())); if(isContainerDb) { try { node.setLocalDates(findLocalDataBases(getLocalDataUrl(e.getNode_id(), getPort(url)))); } catch (ResourceAccessException ex) { log.error("节点获取本地库失败"); ex.printStackTrace(); } } nodeList.add(node); }); } return nodeList; } /** * 获取本地库列表 * @param url * @return */ private List findLocalDataBases(String url){ JSONObject a = new JSONObject(); String all= null; try { all = new String( RestTemplateUtil.post(url, a, MediaType.APPLICATION_JSON_UTF8, String.class, false).getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } List list = JSONObject.parseArray(all, Database.class); return list; } /** * 同步库列表 * @param url * @return */ private List getSyncDatabases(String url){ String all= null; try { all = new String(RestTemplateUtil.post(url, new JSONObject(), MediaType.APPLICATION_JSON_UTF8, String.class, false).getBytes("ISO-8859-1"),"utf-8"); } catch (Exception e) { e.printStackTrace(); } List list = JSONObject.parseArray(all, Database.class); return list; } private List searchCamera(String url){ try { log.info("CameraShow url:"+url); String result = RestTemplateUtil.post(getCameraUrl(url), new JSONObject(), MediaType.APPLICATION_JSON_UTF8, String.class, false); if(StringUtils.isNotEmpty(result)){ String all = new String(result.getBytes("ISO-8859-1"),"utf-8"); return JSONArray.parseArray(all, CameraVo.class); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } }