使用类: ApiRoleServiceImpl.java
方法:handleRoleList
package com.cwp.system.center.service.impl;
import com.cwp.data.intelligence.common.exception.RRException;
import com.cwp.system.center.config.properties.SystemCenterConfig;
import com.cwp.system.center.constant.RoleTypeEnum;
import com.cwp.system.center.entity.SysRoleEntity;
import com.cwp.system.center.model.dto.ApiRoleDto;
import com.cwp.system.center.model.dto.SyncRoleData;
import com.cwp.system.center.model.event.SyncRoleEvent;
import com.cwp.system.center.service.ApiRoleService;
import com.cwp.system.center.service.SysRoleService;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.ListUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @ClassName ApiRoleServiceImpl
* @Description TODO
* @Author Getech
* @Date 2020/9/4 15:32
*/
@Slf4j
@Service
public class ApiRoleServiceImpl implements ApiRoleService {
@Autowired
private SysRoleService sysRoleService;
@Autowired
private SystemCenterConfig systemCenterConfig;
@Autowired
private ApplicationContext applicationContext;
/**
* @Description 处理角色列表
* @Author chengweiping
* @Date 2020/9/4 15:33
*/
@Override
@Transactional(rollbackFor = {Exception.class, RRException.class},isolation = Isolation.READ_COMMITTED)
public void handleRoleList(List<ApiRoleDto> apiRoleDtoList, String apiAccessToken) {
if(CollectionUtil.isEmpty(apiRoleDtoList)){
return;
}
//获取接口拿到的所有角色
List<SysRoleEntity> roleListFromPoros=apiRoleDtoList.stream().map(e->{
SysRoleEntity sysRoleEntity=new SysRoleEntity();
sysRoleEntity.setRoleId(e.getId());
sysRoleEntity.setCreateTime(new Date());
sysRoleEntity.setCreateUserId(0L);
sysRoleEntity.setRoleName(e.getName());
//根据技术中台角色编码查询出对应的角色类型
String roleCode=e.getCode();
Integer roleType= RoleTypeEnum.User.findRoleTypeByPorosRoleCode(roleCode);
sysRoleEntity.setRoleType(roleType);
sysRoleEntity.setRoleCode(e.getCode());
return sysRoleEntity;
}).collect(Collectors.toList());
//获取数据库中拿到的所有角色
List<SysRoleEntity> roleListFromDB=sysRoleService.list();
List<Long> roleIdListFromDB=roleListFromDB.stream().map(SysRoleEntity::getRoleId).collect(Collectors.toList());
//从接口数据中找出在数据库中没有的角色列表:进行新增角色处理
List<SysRoleEntity> addRoleList=roleListFromPoros.stream().filter(e->{
return !roleIdListFromDB.contains(e.getRoleId());
}).collect(Collectors.toList());
//新增角色
batchAddRole(addRoleList);
//从数据库数据中找出在接口没有的角色列表:进行删除角色处理
List<Long> roleIdListFromPoros=roleListFromDB.stream().map(SysRoleEntity::getRoleId).collect(Collectors.toList());
List<SysRoleEntity> deleteRoleList=roleListFromDB.stream().filter(e->{
return !roleIdListFromPoros.contains(e.getRoleId());
}).collect(Collectors.toList());
batchDeleteRole(deleteRoleList);
//找出数据库与接口中都存在的角色列表,进行更新处理
// List<Long> updateRoleIdList=ListUtils.intersection(roleListFromPoros,roleIdListFromDB);
List<SysRoleEntity> upadateRoleList= roleListFromPoros.stream().filter(e->{
return roleIdListFromDB.contains(e.getRoleId());
}).collect(Collectors.toList());
batchUpdateRole(upadateRoleList);
//业务逻辑解耦,发布同步角色事件,进行其他逻辑处理
SyncRoleData syncRoleData =new SyncRoleData();
syncRoleData.setApiAccessToken(apiAccessToken);
syncRoleData.setAddRoleList(addRoleList);
syncRoleData.setUpadateRoleList(upadateRoleList);
syncRoleData.setDeleteRoleList(deleteRoleList);
syncRoleData.setRoleListFromPoros(roleListFromPoros);
SyncRoleEvent syncRoleEvent=new SyncRoleEvent(this,syncRoleData);
try{
applicationContext.publishEvent(syncRoleEvent);
}catch (Exception e){
log.error("发布同步事件异常",e);
}
}
/**
* @Description 新增角色
* @Author chengweiping
* @Date 2020/9/4 16:13
*/
private void batchAddRole(List<SysRoleEntity> addRoleList){
if(CollectionUtil.isEmpty(addRoleList)){
return;
}
//循环新增没角色数据
for(SysRoleEntity sysRoleEntity:addRoleList){
try{
sysRoleService.saveOrUpdate(sysRoleEntity);
saveRangerRole(sysRoleEntity);
}catch (Exception e){
log.error("循环更新角色异常,角色ID={}"+"异常",e);
}
}
}
/**
* @Description 新增角色ranger权限
* @Author chengweiping
* @Date 2020/9/4 16:17
*/
private void saveRangerRole(SysRoleEntity sysRoleEntity ){
//新增对应的数据
JSONObject rangerGroup = new JSONObject();
rangerGroup.put("name",systemCenterConfig.getRolePreffix() + sysRoleEntity.getRoleId());
rangerGroup.put("isVisible",1);
rangerGroup.put("description",sysRoleEntity.getRoleName());
//所有操作权限的用户
try {
String runUrl = systemCenterConfig.getClientUrl() + "/bdp/ranger/addRangerGroup";
String result = HttpUtil.post(runUrl, rangerGroup.toJSONString(), 2000);
log.info("保存ranger-角色 res:{}",result);
} catch (Exception e) {
log.error("保存ranger-角色:{}异常,error:{}", rangerGroup, e.getMessage());
}
}
/**
* @Description 删除角色处理
* @Author chengweiping
* @Date 2020/9/4 16:24
*/
private void batchDeleteRole(List<SysRoleEntity> deleteRoleList){
if(CollectionUtil.isEmpty(deleteRoleList)){
return;
}
//循环删除没有绑定用户的角色数据,需一个个删除,这样互相不影响
for(SysRoleEntity sysRoleEntity:deleteRoleList){
try{
sysRoleService.deleteBatch(new Long[]{sysRoleEntity.getRoleId()});
}catch (Exception e){
log.error("循环删除角色异常,角色ID={}"+"异常",e);
}
}
}
/**
* @Description 更新角色列表
* @Author chengweiping
* @Date 2020/9/4 16:59
*/
private void batchUpdateRole(List<SysRoleEntity> updateRoleList){
if(CollectionUtil.isEmpty(updateRoleList)){
return;
}
//循环删除没有绑定用户的角色数据,需一个个删除,这样互相不影响
for(SysRoleEntity sysRoleEntity:updateRoleList){
try{
sysRoleService.updateById(sysRoleEntity);
}catch (Exception e){
log.error("循环更新角色异常,角色ID={}"+"异常",e);
}
}
}
}
事件类:SyncRoleEvent.java
package com.cwp.system.center.model.event;
import com.cwp.system.center.model.dto.SyncRoleData;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* @ClassName SyncRoleEvent
* @Description TODO
* @Author Getech
* @Date 2020/9/7 11:30
*/
@Getter
public class SyncRoleEvent extends ApplicationEvent {
//同步角色附带的角色数据
private SyncRoleData syncRoleData;
public SyncRoleEvent(Object source, SyncRoleData syncRoleData) {
super(source);
this.syncRoleData=syncRoleData;
}
}
监听器类:SyncRoleListener.java
package com.cwp.system.center.service.listener;
import com.cwp.system.center.entity.SysRoleEntity;
import com.cwp.system.center.model.dto.SyncRoleData;
import com.cwp.system.center.model.event.SyncRoleEvent;
import com.cwp.system.center.service.ApiUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @ClassName SyncRoleListener
* @Description 同步角色监听器
* @Date 2020/9/7 14:05
*/
@Component
@Slf4j
public class SyncRoleListener {
@Autowired
private ApiUserService apiUserService;
/**
* @Description 同步用户角色-监听方法(处理新增角色下的用户数据,以及新增用户-角色关联数据)
* @Author chengweiping
* @Date 2020/9/7 15:44
*/
@EventListener
public void syncUserRole(SyncRoleEvent syncRoleEvent){
SyncRoleData syscRoleData= syncRoleEvent.getSyncRoleData();
String apiAccessToken=syscRoleData.getApiAccessToken();
log.info("进入监听同步角色方法syncUserRole,token={}",apiAccessToken);
List<SysRoleEntity> roleListFormPoros= syscRoleData.getRoleListFromPoros();
apiUserService.synUserRole(apiAccessToken,roleListFormPoros);
}
}