package com.nis.web.service.basics; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.beust.jcommander.internal.Lists; import com.nis.domain.Page; import com.nis.domain.basics.AsnGroupInfo; import com.nis.domain.basics.AsnIpCfg; import com.nis.domain.configuration.BaseIpCfg; import com.nis.domain.configuration.CfgIndexInfo; import com.nis.domain.maat.MaatCfg; import com.nis.domain.maat.MaatCfg.DigestCfg; import com.nis.domain.maat.MaatCfg.GroupCfg; import com.nis.domain.maat.MaatCfg.IpCfg; import com.nis.domain.maat.MaatCfg.NumBoundaryCfg; import com.nis.domain.maat.MaatCfg.StringCfg; import com.nis.domain.maat.ToMaatBean; import com.nis.domain.maat.ToMaatResult; import com.nis.domain.specific.ConfigGroupInfo; import com.nis.util.ConfigServiceUtil; import com.nis.util.Constants; import com.nis.web.dao.CrudDao; import com.nis.web.dao.basics.AsnGroupInfoDao; import com.nis.web.dao.basics.AsnIpCfgDao; import com.nis.web.dao.configuration.IpCfgDao; import com.nis.web.dao.specific.ConfigGroupInfoDao; import com.nis.web.security.UserUtils; import com.nis.web.service.CrudService; import com.nis.web.service.SpringContextHolder; @Service public class AsnIpCfgService extends CrudService, AsnIpCfg> { @Autowired private AsnIpCfgDao asnIpCfgDao; // @Autowired // private SpecificServiceCfgDao specificServiceCfgDao; @Autowired private ConfigGroupInfoDao configGroupInfoDao; @Autowired private AsnGroupInfoDao asnGroupInfoDao; /** * @param page * @param entity * @return */ public Page findPage(Page page, AsnIpCfg entity) { entity.getSqlMap().put("dsf", configScopeFilter(entity.getCurrentUser(),"r")); entity.setPage(page); List list=asnIpCfgDao.findPage(entity); page.setList(list); return page; } public List findByPage(String ids) { List list=asnIpCfgDao.findByPage(ids); return list; } public boolean hasValidAsnIp(Long asnId) { return asnIpCfgDao.hasValidAsnIp(asnId)>0; } public AsnIpCfg get(Long id ) { return asnIpCfgDao.get(id); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void save(List entitys) { logger.warn("Start to save IP,size:"+entitys.size()); long start=System.currentTimeMillis(); SqlSessionFactory sqlSessionFactory=SpringContextHolder.getBean(SqlSessionFactory.class); SqlSession batchSqlSession = null; try{ batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); for(AsnIpCfg asnIpCfg:entitys) { ((AsnIpCfgDao) batchSqlSession.getMapper(AsnIpCfgDao.class)).insert(asnIpCfg); } batchSqlSession.commit(); }finally { if(batchSqlSession != null){ batchSqlSession.close(); } } long end=System.currentTimeMillis(); logger.warn("Save IP finish,cost:"+(end-start)); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void update(AsnIpCfg entity){ Date editTime=new Date(); entity.setEditTime(editTime); entity.setEditorId(entity.getCurrentUser().getId()); String org=entity.getOrganization().trim(); String country=entity.getCountry().trim(); String detail=entity.getDetail().trim(); entity.setOrganization(org); entity.setCountry(country); entity.setDetail(detail); asnIpCfgDao.update(entity); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void processGroup(Map asnNoMap){ logger.warn("Start to save group"); long start=System.currentTimeMillis(); Date createTime=new Date(); int index=0; SqlSessionFactory sqlSessionFactory=SpringContextHolder.getBean(SqlSessionFactory.class); SqlSession batchSqlSession = null; Set groupSet=new HashSet<>(); try{ batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); if(!asnNoMap.isEmpty()) { List compileIds=ConfigServiceUtil.getId(1, asnNoMap.size()); List groupIds=ConfigServiceUtil.getId(2, asnNoMap.size()); for(Entry e:asnNoMap.entrySet()) { AsnGroupInfo info=e.getValue(); info.setAsnId(e.getKey()); info.setIsValid(0); info.setCreatorId(UserUtils.getUser().getId()); info.setCreateTime(createTime); info.setGroupId(groupIds.get(index)); info.setCompileId(compileIds.get(index)); if(!groupSet.contains(info.getOrganization())) { groupSet.add(info.getOrganization()); } ((AsnGroupInfoDao) batchSqlSession.getMapper(AsnGroupInfoDao.class)).insert(info); if(index%Constants.IMPORT_LIMIT==0) { batchSqlSession.commit(); } index++; } batchSqlSession.commit(); } }finally { if(batchSqlSession != null){ batchSqlSession.close(); } } batchSaveConfigGroupInfo(groupSet); //刷新缓存 //AsnCacheUtils.init(true); long end=System.currentTimeMillis(); logger.warn("Save group finish,cost:"+(end-start)); } public void batchSaveConfigGroupInfo(Set groupSet) { SqlSessionFactory sqlSessionFactory=SpringContextHolder.getBean(SqlSessionFactory.class); SqlSession batchSqlSession = null; try{ batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); if(groupSet.size()>0) { int index=0; List groupIds=ConfigServiceUtil.getId(2, groupSet.size()); for(String org:groupSet) { ConfigGroupInfo configGroupInfo=new ConfigGroupInfo(); configGroupInfo.setGroupName(org); configGroupInfo.setIsIssued(0); configGroupInfo.setGroupType(4); configGroupInfo.setInsertTime(new Date()); configGroupInfo.setGroupId(groupIds.get(index)); ((ConfigGroupInfoDao) batchSqlSession.getMapper(ConfigGroupInfoDao.class)).insertConfigGroupInfo(configGroupInfo); if(index%Constants.IMPORT_LIMIT==0) { batchSqlSession.commit(); } index++; } batchSqlSession.commit(); } }finally { if(batchSqlSession != null){ batchSqlSession.close(); } } } // public void deleteIps(Map asnNoMap){ // List toDelAndSendAsnIpCfgs=Lists.newArrayList(); // List asnIds=Lists.newArrayList(asnNoMap.size()); // for(Entry e:asnNoMap.entrySet()) { // AsnGroupInfo asnGroupInfo=e.getValue(); // if(asnGroupInfo==null) { // asnGroupInfo=this.getAsnGroupInfoByAsnNo(e.getKey()); // } // if(asnGroupInfo.getIsValid()==1) {//已下发 // List _toDelAsnIpCfgs=this.getByAsnNo(asnGroupInfo.getAsnId()); // toDelAndSendAsnIpCfgs.addAll(_toDelAsnIpCfgs); // }else { // asnIds.add(e.getKey()); // } // } // if(asnIds.size()>0) { // this.deleteByAsnNo(asnIds); // } // if(toDelAndSendAsnIpCfgs.size()>0) { // int pointsDataLimit = Constants.MAAT_JSON_SEND_SIZE;//限制条数 // Integer size = toDelAndSendAsnIpCfgs.size(); // //判断是否有必要分批 // if(pointsDataLimit listPage = toDelAndSendAsnIpCfgs.subList(0, pointsDataLimit); // delAndSend(listPage); // //剔除 // toDelAndSendAsnIpCfgs.subList(0, pointsDataLimit).clear(); // } // //最后剩下的 // if(!toDelAndSendAsnIpCfgs.isEmpty()){ // delAndSend(toDelAndSendAsnIpCfgs); // // } // }else { // delAndSend(toDelAndSendAsnIpCfgs); // } // } // } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void delAndSend(List entities) { StringBuilder sb=new StringBuilder(); for(AsnIpCfg ip:entities) { sb.append(ip.getCfgId()); sb.append(","); } sb.deleteCharAt(sb.toString().lastIndexOf(",")); asnIpCfgDao.delete(sb.toString()); asnIPRegionSendToMaat(entities,Constants.VALID_NO); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void saveAsnIpCfg(CfgIndexInfo entity) { Date createTime=new Date(); //组织去除首尾空格 entity.setOrganization(entity.getOrganization().trim()); entity.setCountry(entity.getCountry().trim()); entity.setDetail(entity.getDetail().trim()); ConfigGroupInfo configGroupInfo=configGroupInfoDao.getAsnGroupByName(entity.getOrganization()); AsnGroupInfo asnGroupInfo=asnGroupInfoDao.getGroupIdByNameAndASNId(entity.getOrganization(), entity.getCountry(), Long.parseLong(entity.getUserRegion1())); Integer orgGroup=0; Integer compileId=0; Integer asnIdGroup=0; if(configGroupInfo==null) { configGroupInfo=new ConfigGroupInfo(); configGroupInfo.setGroupName(entity.getOrganization()); configGroupInfo.setGroupType(4); configGroupInfo.setInsertTime(new Date()); configGroupInfo.setIsIssued(0); if(asnGroupInfo==null) { List groupIdList=ConfigServiceUtil.getId(2, 2); orgGroup=groupIdList.get(0); asnIdGroup=groupIdList.get(1); }else { List groupIdList=ConfigServiceUtil.getId(2, 1); orgGroup=groupIdList.get(0); configGroupInfo.setGroupId(orgGroup); asnIdGroup=asnGroupInfo.getGroupId(); } configGroupInfo.setGroupId(orgGroup); configGroupInfoDao.insertConfigGroupInfo(configGroupInfo); }else { orgGroup=configGroupInfo.getGroupId(); if(asnGroupInfo==null) { List groupIdList=ConfigServiceUtil.getId(2, 1); asnIdGroup=groupIdList.get(0); }else { asnIdGroup=asnGroupInfo.getGroupId(); } } if(asnGroupInfo==null) { asnGroupInfo=new AsnGroupInfo(); asnGroupInfo.setOrganization(entity.getOrganization()); asnGroupInfo.setCountry(entity.getCountry()); asnGroupInfo.setDetail(entity.getDetail()); asnGroupInfo.setIsValid(0); asnGroupInfo.setCreateTime(new Date()); asnGroupInfo.setCreatorId(entity.getCurrentUser().getId()); asnGroupInfo.setAsnId(Long.parseLong(entity.getUserRegion1())); asnGroupInfo.setGroupId(asnIdGroup); List compileIds=ConfigServiceUtil.getId(1, 1); asnGroupInfo.setCompileId(compileIds.get(0)); asnGroupInfoDao.insert(asnGroupInfo); } entity.setAsnIpGroup(asnIdGroup); entity.setCompileId(asnGroupInfo.getCompileId()); List idList=ConfigServiceUtil.getId(3, entity.getAsnIpCfgs().size()); int index=0; if(entity.getAsnIpCfgs()!=null) { for(AsnIpCfg cfg:entity.getAsnIpCfgs()) { BeanUtils.copyProperties(entity, cfg, new String[]{"cfgId"}); cfg.setRequestId(0); cfg.setClassify("0"); cfg.setAttribute("0"); cfg.setLable("0"); cfg.setCreateTime(createTime); cfg.setCreatorId(entity.getCurrentUser().getId()); cfg.setAsnIpGroup(entity.getAsnIpGroup().intValue()); cfg.setIsValid(Constants.VALID_NO); cfg.setIsAudit(Constants.AUDIT_NOT_YET); cfg.setRegionId(idList.get(index)); index++; } } this.save(entity.getAsnIpCfgs()); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void delete(String ids) { /*for(String id:ids.split(",")) { Long.parseLong(id); }*/ List issuedList=new ArrayList<>(); List asnIpCfgList= asnIpCfgDao.getByIds(ids); for(AsnIpCfg asnIpCfg:asnIpCfgList) { if(asnIpCfg.getIsValid()==Constants.VALID_YES) {//代表下发过了 asnIpCfg.setIsValid(Constants.VALID_DEL); issuedList.add(asnIpCfg); // groupId=asnIpCfg.getAsnIpGroup(); //List result=asnIpCfgDao.findOtherIps(groupId, asnIpCfg.getCfgId().intValue()); //if(result==null||result.size()==0) { // throw new RuntimeException("Cant not delete ip from asn group, there is only one ip left in the group!"); //} } } asnIpCfgDao.delete(ids); //已经下发过的,调用分组复用配置删除接口 // splitAndSend(issuedList,Constants.VALID_NO); if(issuedList.size() > 0){ asnIPRegionSendToMaat(issuedList,Constants.VALID_NO); } } /** * 选中组中是否含有只剩一个未删除IP的组 * @param serviceGroupIds * @return */ public boolean hasLastIp(String serviceGroupIds,String ids) { // TODO Auto-generated method stub for(String groupId:serviceGroupIds.split(",")) { Long.parseLong(groupId); } List countList=asnIpCfgDao.countValidIPs(serviceGroupIds,ids); if(countList.size()==0) { return true; } for(Integer count:countList) { if(count==0) { return true; } } return false; } public AsnGroupInfo getAsnGroupInfoByAsnNo(Long asnNo) { AsnGroupInfo configGroupInfo=new AsnGroupInfo(); configGroupInfo.setAsnId(asnNo); configGroupInfo=asnGroupInfoDao.getInfoByAsnNo(configGroupInfo); return configGroupInfo; } public List getByAsnNo(Long asnNo) { if(asnNo==null) { throw new RuntimeException("groupId or asnNo is null!"); } return asnIpCfgDao.getByAsnNo(asnNo.longValue()); } public List getByIds(String ids) { if(ids==null) { throw new RuntimeException("ids is null!"); } return asnIpCfgDao.getByIds(ids); } @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void deleteByAsnNo(List asnNoList) { int pointsDataLimit = 1000;//限制条数 Integer size = asnNoList.size(); if(pointsDataLimit listPage = asnNoList.subList(0, pointsDataLimit); StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); //剔除 asnNoList.subList(0, pointsDataLimit).clear(); } if(!asnNoList.isEmpty()){ StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); asnNoList.clear(); } }else { StringBuilder asnNoStr=new StringBuilder(); for(Long asnNo:asnNoList) { asnNoStr.append(asnNo); asnNoStr.append(","); } int result=0; do { result=asnIpCfgDao.deleteByAsnId(asnNoStr.toString().substring(0,asnNoStr.toString().length()-1)); }while(result>0); asnNoList.clear(); } } public void ajaxDeleteAsnIp(String ids) { asnIpCfgDao.ajaxDeleteAsnIp(ids); } /** * * auditIpBatch(非IP类配置用,审核区域IP) * (这里描述这个方法适用条件 – 可选) * @param data *void * @exception * @since 1.0.0 */ @Transactional(readOnly=false,rollbackFor=RuntimeException.class) public void auditIpBatch(Map> data,Integer isValid) { SqlSessionFactory sqlSessionFactory=SpringContextHolder.getBean(SqlSessionFactory.class); final SqlSession batchSqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false); try{ data.entrySet().stream().forEach( enrty->{ Long asn=enrty.getKey();//ans group 的group id List asnIpCfgs=enrty.getValue(); for(int index = 0; index < asnIpCfgs.size();index++){ AsnIpCfg t = asnIpCfgs.get(index); BaseIpCfg ipCfg=new BaseIpCfg(); BeanUtils.copyProperties(t, ipCfg); ipCfg.setTableName(AsnIpCfg.getTablename()); ((IpCfgDao) batchSqlSession.getMapper(IpCfgDao.class)).audit(ipCfg); } batchSqlSession.commit(); AsnGroupInfo asnGroupInfo=new AsnGroupInfo(); asnGroupInfo.setAsnId(asn); asnGroupInfo=asnGroupInfoDao.getInfoByAsnNo(asnGroupInfo); Integer groupId=asnGroupInfo.getGroupId(); MaatCfg maatCfg = new MaatCfg(); List configCompileList = new ArrayList(); List groupRelationList = new ArrayList(); List ipRegionList = new ArrayList(); List strRegionList = new ArrayList(); List numRegionList = new ArrayList(); List digestRegionList = new ArrayList(); List areaIpRegionList = new ArrayList(); if(isValid==Constants.VALID_YES) {//审核通过 if(asnGroupInfo.getIsValid()==0) {//ans组未下发过,下发编译配置 asnGroupInfo.setIsValid(1); asnGroupInfo.setEditorId(UserUtils.getUser().getId()); asnGroupInfo.setEditTime(new Date()); asnGroupInfoDao.updateValid(asnGroupInfo); maatCfg.initDefaultValue(); ToMaatBean maatBean = new ToMaatBean(); //group GroupCfg groupCfg=new GroupCfg(); groupCfg.setCompileId(asnGroupInfo.getCompileId()); groupCfg.setGroupId(groupId); groupCfg.setIsValid(Constants.VALID_YES); groupCfg.setAuditTime(asnIpCfgs.get(0).getAuditTime()); groupRelationList.add(groupCfg); BeanUtils.copyProperties(asnIpCfgs.get(0), maatCfg); ipRegionList.addAll(groupReuseCfgAddRemoveConvert(asnIpCfgs,Constants.VALID_YES,groupId)); maatCfg.setCompileId(asnGroupInfo.getCompileId()); maatCfg.setAction(asnIpCfgs.get(0).getAction()); maatCfg.setAuditTime(asnIpCfgs.get(0).getAuditTime()); maatCfg.setIpRegionList(ipRegionList); maatCfg.setStrRegionList(strRegionList); maatCfg.setNumRegionList(numRegionList); maatCfg.setDigestRegionList(digestRegionList); maatCfg.setGroupRelationList(groupRelationList); maatCfg.setGroupNum(groupRelationList.size()); maatCfg.setAreaIpRegionList(areaIpRegionList); maatCfg.setIsValid(isValid); // 设置ASN自定义域 String userRegion = "ASN_ID=" + asnIpCfgs.get(0).getUserRegion1(); maatCfg.setUserRegion(userRegion); configCompileList.add(maatCfg); maatBean.setConfigCompileList(configCompileList); maatBean.setAuditTime(asnIpCfgs.get(0).getAuditTime()); maatBean.setCreatorName(asnIpCfgs.get(0).getCurrentUser().getName()); maatBean.setVersion(Constants.MAAT_VERSION); maatBean.setOpAction(Constants.INSERT_ACTION); // 调用服务接口下发配置数据 String json = gsonToJson(maatBean); logger.info("ASN IP配置下发配置参数:" + json); // 调用服务接口下发配置 ToMaatResult result = ConfigServiceUtil.postMaatCfg(json); logger.info("ASN IP配置下发响应信息:" + result.getMsg()); }else if(asnGroupInfo.getIsValid()==1){//已经下发过,走分组复用 asnIPRegionSendToMaat(asnIpCfgs,isValid); }else { throw new RuntimeException("asnGroupInfo isValid value is "+asnGroupInfo.getIsValid()); } }else if(isValid==Constants.VALID_NO) {//取消审核通过 //已经下发过的,调用分组复用配置删除接口 // GroupReuseAddBean maatBean = new GroupReuseAddBean(); // List groupReuseList=new ArrayList<>(); // GroupReuseCfg groupReuseCfg=new GroupReuseCfg(); // ipRegionList.addAll(groupReuseCfgAddRemoveConvert(asnIpCfgs,Constants.VALID_NO,groupId)); // groupReuseCfg.setIpRegionList(ipRegionList); // groupReuseCfg.setStrRegionList(strRegionList); // groupReuseCfg.setNumRegionList(numRegionList); // groupReuseList.add(groupReuseCfg); // maatBean.setGroupReuseCfgList(groupReuseList); // maatBean.setAuditTime(asnIpCfgs.get(0).getAuditTime()); // maatBean.setCreatorName(asnIpCfgs.get(0).getCurrentUser().getName()); // maatBean.setVersion(Constants.MAAT_VERSION); // maatBean.setOpAction(Constants.UPDATE_ACTION); // //调用服务接口下发配置数据 // String json=gsonToJson(maatBean); // logger.info("ASN IP域删除配置下发配置参数:"+json); // //调用服务接口下发配置 // ToMaatResult result = ConfigServiceUtil.put(json,3); // logger.info("ASN IP域删除配置响应信息:"+result.getMsg()); asnIPRegionSendToMaat(asnIpCfgs,isValid); //如果一个asn组下没有IP了,修改有效状态 //if(hasValidAsnIp(asn)) { // asnGroupInfo.setIsValid(0); // asnGroupInfo.setEditorId(UserUtils.getUser().getId()); // asnGroupInfo.setEditTime(new Date()); // asnGroupInfoDao.updateValid(asnGroupInfo); //} }else { throw new RuntimeException("isValid value is "+isValid); } }); }finally { if(batchSqlSession != null){ batchSqlSession.close(); } } } }