package com.cloud.control.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cloud.common.utils.JsonUtil; import com.cloud.common.utils.RestTemplateUtil; import com.cloud.control.dao.TaskMapper; import com.cloud.control.dao.TaskUserMapper; import com.cloud.control.model.Task; import com.cloud.control.model.TaskUser; import com.cloud.control.service.TaskService; import com.cloud.control.service.ClusterService; import com.cloud.control.service.TaskUserService; import com.cloud.control.vo.TaskUserEditVo; import com.cloud.control.vo.TaskUserInfoVo; import com.cloud.control.utils.DevInfoColumnMap; import lombok.extern.slf4j.Slf4j; import com.cloud.control.utils.EnumStr; import com.cloud.control.vo.MenuTreeVo; import com.cloud.model.common.Result; import org.apache.commons.lang3.StringUtils; 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.util.MultiValueMap; import java.util.*; import java.util.List; import java.util.Map; @Slf4j @Service public class TaskUserServiceImpl implements TaskUserService { @Autowired private TaskUserMapper taskUserDao; @Autowired private TaskMapper taskDao; @Autowired private TaskService taskService; @Autowired private ClusterServiceImpl clusterServiceImpl; @Autowired private ClusterService clusterService; @Autowired private EnumStr enumStr; @Override public Map select(Map params) { Map map = new HashMap(); List list = taskUserDao.select(params); if(list !=null && list.size() >0) { list.forEach(map1 -> { List nameList = new ArrayList(); JSONArray scope = JSONArray.parseArray( taskDao.selectScopeById(map1.get("taskId").toString()).getScope().toString()); Integer syncType = taskDao.selectScopeById(map1.get("taskId").toString()).getSyncType(); String taskName = taskDao.selectScopeById(map1.get("taskId").toString()).getName(); scope.forEach(item->{ String cluId = JSON.parseObject(item.toString()).get("cluId").toString(); String cluName = taskService.getCluOrDevAndNameOrIpById(cluId, DevInfoColumnMap.CluType,DevInfoColumnMap.nameType); if(syncType == 0){ //本地库去请求nodes信息 JSONArray nodes = JSONArray.parseArray(JSON.parseObject(item.toString()).get("nodes").toString()); if(nodes != null){ nodes.forEach(node->{ String nodeIp = JSON.parseObject(node.toString()).get("id").toString(); String nodeName = taskService.getCluOrDevAndNameOrIpById(nodeIp, DevInfoColumnMap.DevType,DevInfoColumnMap.nameType); nameList.add(map1.get("taskName")+"(集群:"+cluName+"/"+"节点:"+nodeName+")"); }); }else{ nameList.add(map1.get("taskName")+"(集群:"+cluName+")"); } }else{ nameList.add(map1.get("taskName")+"(集群:"+cluName+")"); } }); map1.put("baseInfo",nameList); }); map.put("total", list.size()); map.put("list", list); }else{ map.put("total", 0); map.put("list", Collections.emptyList()); } return map; } @Override @Transactional public void stopControl(List ids) { ids.forEach(id->{ taskUserDao.stopControl(id); Map taskMap = taskUserDao.selectById(id); Integer syncType = (Integer)taskMap.get("syncType"); if(syncType != null && syncType == 1){ log.info("集群同步库"); JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); scope.forEach(item->{ String cluld = ((JSONObject)item).get(DevInfoColumnMap.cluId).toString(); String ip = taskService.getCluOrDevAndNameOrIpById(((JSONObject)item).get(DevInfoColumnMap.cluId).toString(), DevInfoColumnMap.CluType,DevInfoColumnMap.ipType); String url = "http://" + ip+ "/addPerson"; JSONObject jsonParam = new JSONObject(); jsonParam.put("uuid",taskMap.get("userId").toString()); jsonParam.put("TableId",taskMap.get("taskId").toString()); jsonParam.put("TableName",taskMap.get("name").toString()); jsonParam.put("SyncType","1"); jsonParam.put("enabled","0"); String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED,true); if(result.contains("error")){ throw new IllegalArgumentException("erlang is null"); } }); }else{ log.info("设备本地库"); JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); scope.forEach(item->{ JSONArray nodes = JSON.parseArray(JSON.parseObject(item.toString()).get(DevInfoColumnMap.nodes).toString()); nodes.forEach(node->{ String ip = taskService.getCluOrDevAndNameOrIpById(JSON.parseObject(node.toString()).get(DevInfoColumnMap.devId).toString(), DevInfoColumnMap.DevType,DevInfoColumnMap.ipType); String url = "http://" + ip+ "/addPerson"; JSONObject jsonParam = new JSONObject(); jsonParam.put("uuid",taskMap.get("userId").toString()); jsonParam.put("TableId",taskMap.get("taskId").toString()); jsonParam.put("TableName",taskMap.get("name").toString()); jsonParam.put("SyncType","0"); jsonParam.put("enabled","0"); String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED,true); if(result.contains("error")){ throw new IllegalArgumentException("erlang is null"); } }); }); } }); } @Override @Transactional public void deleteTaskUser(List list) { list.forEach(record-> { taskUserDao.deleteTaskUser(record); // Map taskMap = taskUserDao.selectById(record.getId()); // Integer syncType = (Integer)taskMap.get("syncType"); // // if(syncType != null && syncType == 1){ // log.info("集群同步库"); // JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); // scope.forEach(item->{ // String ip = taskService.getCluOrDevAndNameOrIpById(JSON.parseObject(item.toString()).get("cluld").toString(), DevInfoColumnMap.CluType,DevInfoColumnMap.ipType); // String url = "http://" + ip+ "/addPerson"; // JSONObject jsonParam = new JSONObject(); // jsonParam.put("uuid",taskMap.get("userId").toString()); // jsonParam.put("TableId",taskMap.get("taskId").toString()); // jsonParam.put("TableName",taskMap.get("name").toString()); // jsonParam.put("SyncType","1"); // jsonParam.put("enabled","0"); // String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED,true); // if(result.contains("error")){ // throw new IllegalArgumentException("erlang is null"); // } // }); // }else{ // log.info("设备本地库"); // JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); // scope.forEach(item->{ // JSONArray nodes = JSON.parseArray(JSON.parseObject(item.toString()).get("nodes").toString()); // nodes.forEach(node->{ // String ip = taskService.getCluOrDevAndNameOrIpById(JSON.parseObject(node.toString()).get("cluld").toString(), DevInfoColumnMap.DevType,DevInfoColumnMap.ipType); // String url = "http://" + ip+ "/addPerson"; // JSONObject jsonParam = new JSONObject(); // jsonParam.put("isAdd",false); // jsonParam.put("uuid",taskMap.get("userId").toString()); // jsonParam.put("TableId",taskMap.get("taskId").toString()); // jsonParam.put("TableName",taskMap.get("name").toString()); // jsonParam.put("SyncType","0"); // jsonParam.put("enabled","0"); // String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED,true); // if(result.contains("error")){ // throw new IllegalArgumentException("erlang is null"); // } // }); // }); // } }); } @Override public Map selectById(String id) { Map taskMap = taskUserDao.selectById(id); return taskMap; } @Override @Transactional public void save(TaskUser taskUser) { taskUserDao.updateByPrimaryKeySelective(taskUser); //判断身份证号是否变化了,变了的话需要往C同步 // Map taskMap = taskUserDao.selectById(taskUser.getId()); // if(!taskMap.get("idCard").toString().equals(taskUser.getIdCard())) { // log.info("身份证号改变,需要更新到C"); // Integer syncType = (Integer) taskMap.get("syncType"); // // if (syncType != null && syncType == 1) { // log.info("集群同步库"); // JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); // scope.forEach(item -> { // String ip = taskService.getCluOrDevAndNameOrIpById(JSON.parseObject(item.toString()).get("id").toString(), DevInfoColumnMap.CluType, DevInfoColumnMap.ipType); // String url = "http://" + ip + "/addPerson"; // JSONObject jsonParam = new JSONObject(); // jsonParam.put("uuid", taskMap.get("userId").toString()); // jsonParam.put("TableId", taskMap.get("taskId").toString()); // jsonParam.put("TableName", taskMap.get("name").toString()); // jsonParam.put("SyncType", "1"); // // String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED, true); // if (result.contains("error")) { // throw new IllegalArgumentException("erlang is null"); // } // }); // } else { // log.info("设备本地库"); // JSONArray scope = JSON.parseArray(taskMap.get("scope").toString()); // scope.forEach(item -> { // JSONArray nodes = JSON.parseArray(JSON.parseObject(item.toString()).get("nodes").toString()); // nodes.forEach(node -> { // String ip = taskService.getCluOrDevAndNameOrIpById(JSON.parseObject(node.toString()).get("id").toString(), DevInfoColumnMap.DevType, DevInfoColumnMap.ipType); // String url = "http://" + ip + "/addPerson"; // JSONObject jsonParam = new JSONObject(); // jsonParam.put("isAdd", false); // jsonParam.put("uuid", taskMap.get("userId").toString()); // jsonParam.put("TableId", taskMap.get("taskId").toString()); // jsonParam.put("TableName", taskMap.get("name").toString()); // jsonParam.put("SyncType", "0"); // String result = RestTemplateUtil.post(url, jsonParam, MediaType.APPLICATION_FORM_URLENCODED, true); // if (result.contains("error")) { // throw new IllegalArgumentException("erlang is null"); // } // }); // }); // } // } } @Override @Transactional public void saveFromC(List taskUsers) { taskUsers.forEach(taskUser -> { taskUserDao.selectById(taskUser.getId()); taskUserDao.updateByPrimaryKeySelective(taskUser); }); } @Override public void add(TaskUser taskUser) { taskUser.setId(UUID.randomUUID().toString()); taskUser.setDelFlag("0"); taskUser.setSource(2); taskUser.setCreateTime(new Date()); taskUser.setUpdateTime(new Date()); taskUserDao.insertSelective(taskUser); } @Override public void joinControl(TaskUser taskUser) { //先删除原有的用户布控任务关联 taskUserDao.deleteByUser(taskUser.getUserId()); List taskIds = taskUser.getTaskIds(); //再进行新的关联 taskIds.forEach(taskId->{ taskUser.setId(UUID.randomUUID().toString()); taskUser.setTaskId(taskId); taskUserDao.insertSelective(taskUser); }); } /** * 编辑布控任务人员时,从集群底库中选择 * @param params * @return */ @Override public List findTaskUserMenusFromCluster(Map params) { List result = new ArrayList<>(); List taskUserAll = taskUserDao.findAll(params); final String TYPE_MENU = "MENU"; Result allClusterInfo = clusterService.findAllNode();//查找所有集群-》节点(包含同步库)-》设备(本地库信息) if(allClusterInfo !=null && allClusterInfo.isSuccess()){ JSONArray jsonClusters = JSONArray.parseArray(allClusterInfo.getData().toString()); if(jsonClusters !=null && jsonClusters.size()>0){ for(Object clusterOjb: jsonClusters){ JSONObject clusterJson = (JSONObject)clusterOjb; JSONObject clusterMenu = new JSONObject(); clusterMenu.put("id", clusterJson.getString("id"));//集群id clusterMenu.put("type", TYPE_MENU);//菜单 clusterMenu.put("userInfo", clusterJson.getString("name"));//集群名称 List childs = new ArrayList<>(); JSONArray syncDbs = clusterJson.getJSONArray("syncDbs");//集群内同步库信息 if(syncDbs !=null && syncDbs.size()>0){ for(Object syncDb : syncDbs){ JSONObject jsonSyncDb = (JSONObject) syncDb; JSONObject syncMenu = new JSONObject(); String syncDbId = jsonSyncDb.getString("uuid");//同步库id syncMenu.put("id", syncDbId); syncMenu.put("userInfo", jsonSyncDb.getString("tableName"));//同步库名 syncMenu.put("type", TYPE_MENU); List syncUsers = getTaskUserChildren(syncDbId, taskUserAll); syncMenu.put("child", syncUsers); childs.add(syncMenu); } } JSONArray nodes = clusterJson.getJSONArray("nodes");//集群内节点信息 if(nodes !=null && nodes.size()>0){ for(Object node : nodes){ JSONObject jsonNode = (JSONObject)node; JSONArray nodeLocalDbs = jsonNode.getJSONArray("localDates"); if(nodeLocalDbs !=null && nodeLocalDbs.size()>0){ for(Object localDb : nodeLocalDbs){ JSONObject jsonLocalDb = (JSONObject) localDb; JSONObject localMenu = new JSONObject(); String localDbId = jsonLocalDb.getString("uuid"); localMenu.put("id", localDbId); localMenu.put("userInfo", jsonLocalDb.getString("tableName")+"("+jsonNode.getString("devName")+")"); localMenu.put("type", TYPE_MENU); List localUsers = getTaskUserChildren(localDbId, taskUserAll); localMenu.put("child", localUsers); childs.add(localMenu); } } } } clusterMenu.put("child", childs); result.add(clusterMenu); } } } return result; } /** * 计算同步库或本地库id下的人员,并生成对应的递归菜单结构 * @param parentId * @param taskUsers * @return */ private List getTaskUserChildren(String parentId,List taskUsers){ List list = new ArrayList<>(); if(taskUsers !=null && taskUsers.size()>0){ for(TaskUser taskUser : taskUsers){ if(taskUser.getTaskId().equals(parentId)){ JSONObject menu = new JSONObject(); menu.put("id", taskUser.getId()); menu.put("icon", taskUser.getImgUrl()); String showName = ""; TaskUserInfoVo userInfo = new TaskUserInfoVo(); if(StringUtils.isNotEmpty(taskUser.getUserName())) showName += taskUser.getUserName(); if(taskUser.getSex() != null) showName += "/" + (taskUser.getSex() == 1?"男":"女"); if(StringUtils.isNotEmpty(taskUser.getIdCard())) showName += "/" + taskUser.getIdCard(); if(StringUtils.isNotEmpty(taskUser.getMobile())) showName += "/" + taskUser.getMobile(); if(showName.startsWith("/")) showName = showName.substring(1); userInfo.setId(taskUser.getId()); userInfo.setSex(taskUser.getSex()); userInfo.setUsername(taskUser.getUserName()); userInfo.setIdCard(taskUser.getIdCard()); userInfo.setMobile(taskUser.getMobile()); userInfo.setImgUrl(taskUser.getImgUrl()); menu.put("userInfo", showName); menu.put("detail", userInfo); list.add(menu); } } } return list; } /** * 从人员管理选择布控人员 * @param params * @return */ public List findTaskUserMenusFromPlat(Map params){ List resultList = new ArrayList(); if(params !=null && params.containsKey("orgById") && params.get("orgById")!=null && StringUtils.isNotEmpty(params.get("orgById").toString())){ String baseUrl = "http://"+enumStr.getUserHOSTNAME()+":"+enumStr.getUserHTTP_PORT(); JSONObject orgParams = new JSONObject(); orgParams.put("currentId", params.get("orgById")); orgParams.put("name", params.get("name"));//模糊搜索组织名称 //1.获取这个人可以看到的组织机构列表 String strOrgs = RestTemplateUtil.get(baseUrl+"/data/api-u/org/findDownByType", orgParams,true); if(StringUtils.isNotEmpty(strOrgs)){//有组织机构id JSONArray orgList = JSONArray.parseArray(strOrgs); //2.获取人员总库中当前登录人可以管理的总库人员 JSONObject userQueryParams = new JSONObject(); userQueryParams.put("id", params.get("orgById")); userQueryParams.put("name", params.get("name"));//模糊搜索用户姓名 String strBbPersons = RestTemplateUtil.get(baseUrl+"/data/api-u/BbEmployee/findBbEmployeeByCurUser",userQueryParams, true); if(StringUtils.isNotEmpty(strBbPersons)){//底库中有人员信息 JSONArray userList = JSONArray.parseArray(strBbPersons); if(userList !=null && userList.size()>0){ String userParentOrgId = null; for(Object orgObj: orgList){ if(params.get("orgById").equals(((JSONObject)orgObj).getString("id"))){ userParentOrgId = ((JSONObject)orgObj).getString("parentId"); } } if(StringUtils.isNotEmpty(userParentOrgId)) setPlatOrgTreeUser(userParentOrgId, orgList, userList, resultList); } } } } return resultList; } /** * 保存任务布控人员 * 1.获取已布控人员列表 * 2.获取删除人员 * 3.获取新增人员 * @param map */ @Override @Transactional public String saveTaskUser(Map map) { String result = ""; Map oldMap = new HashMap<>(); Map newMap = new HashMap<>(); JSONObject jsonObj = JsonUtil.mapToJson(map); if(jsonObj !=null && jsonObj.get("taskId")!=null){ String taskId = jsonObj.get("taskId").toString(); JSONArray userList = jsonObj.getJSONArray("userList");//userList的size可以是0,表示清除了任务内的人员 log.info("taskId:"+taskId+"userList:"+userList); Map queryParam = new HashMap<>(); queryParam.put("taskId", taskId); List taskUsers = taskUserDao.findAll(queryParam);//任务内已布控人员 for(TaskUser taskUser : taskUsers){ oldMap.put(taskUser.getId(), taskUser); } for(Object curObj : userList){ JSONObject curJson = (JSONObject)curObj; String id = curJson.getString("id"); newMap.put(id,curObj);//保存时的新集合 if(!oldMap.containsKey(id)){ //新增的人员,解析后insert TaskUser taskUser = new TaskUser(); if(StringUtils.isEmpty(id)) { taskUser.setId(UUID.randomUUID().toString()); } taskUser.setImgUrl(curJson.getString("imgUrl")); taskUser.setTaskId(curJson.getString("taskId")); taskUserDao.insert(taskUser); } } for(TaskUser taskUser : taskUsers){ if(!newMap.containsKey(taskUser.getId())){//已删除的人员 taskUserDao.deleteTaskUser(taskUser); } } } return result; } private void setPlatOrgTreeUser(String parentId, JSONArray allOrgs, JSONArray allUsers, List list){ allOrgs.forEach(org->{ JSONObject jsonOrg = (JSONObject)org; if(parentId.equals(jsonOrg.getString("parentId"))){//当前人组织下的组织机构 JSONObject curMenu = new JSONObject(); curMenu.put("id",jsonOrg.getString("id")); curMenu.put("type", "MENU"); curMenu.put("userInfo", jsonOrg.getString("name")); List child = new ArrayList(); curMenu.put("child",child); setPlatOrgTreeUser(jsonOrg.getString("id"), allOrgs, allUsers, child); list.add(curMenu); } }); allUsers.forEach(user->{ JSONObject jsonUser = (JSONObject)user; if(parentId.equals(jsonUser.getString("orgId"))){ JSONObject userMenu = new JSONObject(); userMenu.put("id", jsonUser.getString("id")); userMenu.put("type",""); String showName = ""; TaskUserInfoVo userInfo = new TaskUserInfoVo(); if(StringUtils.isNotEmpty(jsonUser.getString("name"))) showName += jsonUser.getString("name"); if(StringUtils.isNotEmpty(jsonUser.getString("gender"))){ showName += "/" + jsonUser.getString("gender"); userInfo.setSex(jsonUser.getString("gender") == "男"? 1:0); }else{ userInfo.setSex(1); } if(StringUtils.isNotEmpty(jsonUser.getString("cardId"))) showName += "/" + jsonUser.getString("cardId"); if(StringUtils.isNotEmpty(jsonUser.getString("phone"))) showName += "/" + jsonUser.getString("phone"); userInfo.setId(jsonUser.getString("id")); userInfo.setUsername(jsonUser.getString("name")); userInfo.setIdCard(jsonUser.getString("cardId")); userInfo.setMobile(jsonUser.getString("phone")); userInfo.setImgUrl(jsonUser.getString("photos")); if(showName.startsWith("/")) showName = showName.substring(1); userMenu.put("userInfo", showName);//姓名 userMenu.put("icon", jsonUser.getString("photos"));//人脸图片 userMenu.put("child", Collections.emptyList()); userMenu.put("detail", userInfo); list.add(userMenu); } }); } }