RoleServiceImpl.java 8.88 KB
package com.bsth.service.sys.impl;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;

import com.bsth.security.util.SecurityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bsth.common.ResponseCode;
import com.bsth.entity.sys.Module;
import com.bsth.entity.sys.Role;
import com.bsth.entity.sys.SysUser;
import com.bsth.repository.sys.ModuleRepository;
import com.bsth.repository.sys.RoleRepository;
import com.bsth.service.impl.BaseServiceImpl;
import com.bsth.service.sys.RoleService;

@Service
public class RoleServiceImpl extends BaseServiceImpl<Role, Integer> implements
		RoleService {

	Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	RoleRepository roleRepository;

	@Autowired
	ModuleRepository moduleRepository;

	SimpleDateFormat sdfMinute = new SimpleDateFormat("yyyy-MM-dd HH:mm");

	@Override
	public Map<String, Object> findSubordinate() {
		SysUser user = SecurityUtils.getCurrentUser();
		Iterator<Role> itRole = user.getRoles().iterator();
		Role ro = new Role();
		while(itRole.hasNext()){//判断是否有下一个
			ro = itRole.next();
		}
		Map<String, Object> map = new HashMap<>();
		List<Map<String, Object>> rsRoleList = new ArrayList<>();
		try {
			// 读取层次数据结果集列表
			Iterator<Role> roleList = roleRepository.findAll().iterator();

			// 节点列表(散列表,用于临时存储节点对象)
			Map<String, Object> nodeList = new HashMap<>();
			// 根节点
			List rootlist = new ArrayList();
			while(roleList.hasNext()){
				Role role = roleList.next();
				HashMap map0 = new HashMap();
				map0.put("id", role.getId());
				map0.put("roleCode", role.getRoleCode());
				map0.put("upCode", role.getUpCode());
				map0.put("roleName", role.getRoleName());
				map0.put("codeName", role.getCodeName());
				map0.put("level", role.getLevel());
				map0.put("levelCode", role.getLevelCode());
				nodeList.put(role.getLevelCode(), map0);
			}
			// 构造无序的多叉树
			Set entrySet = nodeList.entrySet();
			for (Iterator it = entrySet.iterator(); it.hasNext();) {
				Map<String, Object> map1 = (HashMap) ((Map.Entry) it.next()).getValue();
//				Map<String, Object> map1 = objectToMap(it.next());
				if (map1.get("upCode") == null || map1.get("upCode").equals("")
						|| Integer.parseInt(map1.get("upCode").toString()) == 0) {
					// root = node;
					rootlist.add(map1);
				} else {
					Map<String, Object> tempmap = ((HashMap)nodeList.get((Integer.parseInt(map1.get("level").toString())-1)+"_"+map1.get("upCode")));
//					Map<String, Object> tempmap = objectToMap(nodeList.get((Integer.parseInt(map1.get("level").toString())-1)+"_"+map1.get("upCode")));
					System.out.println(tempmap);

					List templist = (List) tempmap.get("children");
					if (null != templist) {
						templist.add(map1);
					} else {
						templist = new ArrayList();
						templist.add(map1);
					}
					tempmap.put("children", templist);
				}
			}
			getRoleList(rootlist,ro.getLevelCode(),rsRoleList,false);

			// 排序后输出
//			ComparatorSysrole(rootlist);
			map.put("list", rsRoleList);
			map.put("status", ResponseCode.SUCCESS);
			map.put("msg", "成功");
		} catch (Exception e) {
			map.put("status", ResponseCode.ERROR);
			map.put("msg", e);
			logger.error("error",e);
		}
		return map;
	}

	private void getRoleList(List<Map<String, Object>> list, String levelCode, List<Map<String, Object>> roleList,boolean isChildren){
		try{
			if(isChildren){
				for (Map<String, Object> map : list) {
					roleList.add(map);
					List mapList = (List) map.get("children");
					if (mapList != null && mapList.size() > 0) {
						getRoleList(mapList,levelCode,roleList,isChildren);
					}
				}
				
			} else {
				for (Map<String, Object> map : list) {
					if(map.get("levelCode").equals(levelCode)){
						isChildren = true;
						List mapList = (List) map.get("children");
						if (mapList != null && mapList.size() > 0) {
							getRoleList(mapList,levelCode,roleList,isChildren);
						}
						break;
					} else {
						List mapList = (List) map.get("children");
						if (mapList != null && mapList.size() > 0) {
							getRoleList(mapList,levelCode,roleList,isChildren);
						}
					}
				}
			}			
		} catch (Exception e) {
			logger.error("error",e);
		}
	}

	public Map<String, Object> objectToMap(Object obj) throws Exception {
		if(obj == null)
			return null;

		Map<String, Object> map = new HashMap<>();

		BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
		PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
		for (PropertyDescriptor property : propertyDescriptors) {
			String key = property.getName();
			if (key.compareToIgnoreCase("class") == 0) {
				continue;
			}
			Method getter = property.getReadMethod();
			Object value = getter!=null ? getter.invoke(obj) : null;
			map.put(key, value);
		}

		return map;
	}

	private void ComparatorSysrole(List<HashMap> list) {
		ComparatorSysrole comparator = new ComparatorSysrole();
		Collections.sort(list, comparator);
		for (HashMap map : list) {
			List mapList = (List) map.get("children");
			if (mapList != null && mapList.size() > 0) {
				ComparatorSysrole(mapList);
			}
		}
	}

	private class ComparatorSysrole implements Comparator {
		public int compare(Object arg0, Object arg1) {
			HashMap role0 = (HashMap) arg0;
			HashMap role1 = (HashMap) arg1;

			// 首先比较父节点 相同比较 子 位序
			Long role0Pid = (Long) (role0.get("upCode") == null ? (long) 0 : role0.get("upCode"));
			Long role1Pid = (Long) (role1.get("upCode") == null ? (long) 0 : role1.get("upCode"));
			int flag = role0Pid.compareTo(role1Pid);
			if (flag == 0) {
				return (Integer.valueOf(role0.get("roleIndex").toString())).compareTo(Integer.valueOf(role1.get(
						"roleIndex").toString()));
			} else {
				return flag;
			}
		}
	}

	@Override
	public Map<String, Object> add(Role role) {
		Map<String, Object> rs = new HashMap();
		try{
			SysUser user = SecurityUtils.getCurrentUser();
			Iterator<Role> itRole = user.getRoles().iterator();
			Role ro = new Role();
			while(itRole.hasNext()){//判断是否有下一个
				ro = itRole.next();
			}
			int id = roleRepository.roleMaxId()+1;
			role.setUpCode(ro.getRoleCode());
			role.setLevel(ro.getLevel()+1);
			role.setRoleCode(id);
			role.setId(id);
			return super.save(role);
		}catch (Exception e){
			logger.error("", e);
			rs.put("status", ResponseCode.ERROR);
			rs.put("msg", e.getMessage());
		}
		return rs;
	}

	@Override
	public Map<String, Object> save(Role t) {
		if (t.getId() != null) {
			// 更新
			Map<String, Object> map = new HashMap<>();
			try {
				roleRepository.update(t.getCodeName(), t.getRoleName(),
						t.isEnable(), t.getDescriptions(), t.getId());
				map.put("status", ResponseCode.SUCCESS);
			} catch (Exception e) {
				map.put("status", ResponseCode.ERROR);
			}
			return map;
		}
		return super.save(t);
	}

	@Override
	public Map<String, Object> settRoleModules(Integer roleCode, String mIds) {

		Map<String, Object> map = new HashMap<>();
		try {
			Role role = roleRepository.findById(roleCode).get();

			List<Integer> idList = new ArrayList<>();
			String[] array = mIds.split(",");
			for (String id : array) {
				if (null == id || id.trim().equals(""))
					continue;
				idList.add(Integer.parseInt(id));
			}

			Set<Module> mList = moduleRepository.findByIds(idList);
			role.setModules(mList);
			roleRepository.save(role);
			map.put("status", ResponseCode.SUCCESS);
		} catch (Exception e) {
			logger.error("", e);
			map.put("status", ResponseCode.ERROR);
		}
		return map;
	}

	@Override
	public Map<String, Object> roleInfo(Integer id) {
		Map<String, Object> map = new HashMap<>();
		Role role = roleRepository.findById(id).get();
		map.put("codeName", role.getCodeName());
		map.put("roleName", role.getRoleName());
		map.put("createDate", sdfMinute.format(role.getCreateDate()));
		map.put("updateDate", sdfMinute.format(role.getUpdateDate()));
		map.put("enable", role.isEnable()==true?1:0);
		map.put("descriptions", role.getDescriptions());
		map.put("modules", role.getModules().size());
		map.put("resources", role.getResources().size());
		String userNames = "";
		Set<SysUser> users = role.getUsers();
		if(!users.isEmpty()){
			Iterator<SysUser> it = users.iterator();
			while(it.hasNext()){
				SysUser user = it.next();
				userNames = user.getUserName()+"...";
			}
		}
		map.put("userNames", userNames);
		return map;
	}

	@Override
	public List<Role> findAllByIds(String ids) {
		return roleRepository.findAllById(ids);
	}

	@Override
	public boolean checkOperationLegality(Integer operationRoleId){
		boolean isLegality = false;
		Map<String, Object> roleMap = findSubordinate();
		isLegality = (roleMap.get(operationRoleId) == null ? true:false );
		return isLegality;
	}
}