diff --git a/RoleServiceImpl.java b/RoleServiceImpl.java new file mode 100644 index 0000000..142fb9a --- /dev/null +++ b/RoleServiceImpl.java @@ -0,0 +1,270 @@ +package com.rabbiter.market.service.system.role.impl; + +import com.rabbiter.market.common.exception.BusinessException; +import com.rabbiter.market.common.redis.service.RedisTemplateService; +import com.rabbiter.market.domain.personnel_management.employee.Employee; +import com.rabbiter.market.domain.system.menu.Menu; +import com.rabbiter.market.domain.system.role.Role; +import com.rabbiter.market.mapper.system.role.RoleMapper; +import com.rabbiter.market.qo.system.RoleQuery; +import com.rabbiter.market.service.personnel_management.employee.IEmployeeService; +import com.rabbiter.market.service.system.menu.IMenuService; +import com.rabbiter.market.service.system.role.IRoleService; +import com.rabbiter.market.vo.role.RolePermissonVo; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.util.*; + +@Service +public class RoleServiceImpl extends ServiceImpl implements IRoleService { + @Autowired + private RoleMapper roleMapper; + @Autowired + private IMenuService menuService; + @Autowired + private RedisTemplateService redisTemplateService; + @Autowired + private IEmployeeService employeeService; + + @Override + public Set queryByEid(Long eid) { + Set roles = roleMapper.queryByEid(eid); + return roles; + } + + @Override + public List listByQo(RoleQuery qo) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like(StringUtils.hasText(qo.getName()), "name", qo.getName()); + wrapper.eq(StringUtils.hasText(qo.getState()), "state", qo.getState()); + wrapper.ne("id",Role.SYS_ID); + wrapper.ne("id",2L); + List list = super.list(wrapper); + return list; + } + + @Override + public void forbiddenRole(Long rid) { + Role role = super.getById(rid); + if (Role.SYS_ID==role.getId() || 2L==role.getId()) { + throw new BusinessException("不能停用系统拥有者"); + } + UpdateWrapper wrapper = new UpdateWrapper() + .set("state", Role.STATE_BAN) + .eq("id", rid); + super.update(wrapper); + } + + @Override + public void saveRole(Role role) { + if (role == null) { + throw new BusinessException("操作失败"); + } + if (StringUtils.hasText(role.getName())) { + //查询是否保存过 + Role role1 = super.getOne(new QueryWrapper().eq("name", role.getName())); + if (role1 != null) { + throw new BusinessException("操作失败,角色名重复"); + } else { + role.setState(Role.STATE_NORMAL); + super.save(role); + } + } else { + throw new BusinessException("角色名称格式有误"); + } + + } + + @Transactional + @Override + public RolePermissonVo checkPermissons(Long rid) { + RolePermissonVo vo = new RolePermissonVo(); + /*角色所拥有的菜单id集合*/ + List menuIds = new ArrayList<>(); + /*所有的菜单信息*/ + List menus1 = new ArrayList<>(); + //步骤1:查询所有的菜单信息 + List menus = menuService.findAll(); + if (menus == null) { + throw new BusinessException("授权功能还待上线..."); + } + //封装菜单信息 + for (Menu menu : menus) { + RolePermissonVo.RoleMenu roleMenu_catalogs = vo.getRoleMenu(); + roleMenu_catalogs.setValue(menu.getId()); + roleMenu_catalogs.setLabel(menu.getLabel()); + /*目录下的菜单*/ + List children = new ArrayList<>(); + //目录 + if (menu.getChildren() != null) { + for (Menu child : menu.getChildren()) { + //菜单 + RolePermissonVo.RoleMenu roleMenu_menu = vo.getRoleMenu(); + roleMenu_menu.setValue(child.getId()); + roleMenu_menu.setLabel(child.getLabel()); + List children1 = new ArrayList<>(); + if (child.getChildren() != null) { + for (Menu childChild : child.getChildren()) { + //按钮 + RolePermissonVo.RoleMenu roleMenu_button = vo.getRoleMenu(); + roleMenu_button.setValue(childChild.getId()); + roleMenu_button.setLabel(childChild.getLabel()); + children1.add(roleMenu_button); + } + roleMenu_menu.setChildren(children1); + } + children.add(roleMenu_menu); + } + roleMenu_catalogs.setChildren(children); + } + menus1.add(roleMenu_catalogs); + } + vo.setMenus(menus1); + + //步骤2:是否是系统管理员 + if (rid == Role.SYS_ID) { + //系统管理员 + //封装角色拥有的菜单id集合 + for (Menu menu : menus) { + menuIds.add(menu.getId()); + //目录 + if (menu.getChildren() != null) { + for (Menu child : menu.getChildren()) { + //菜单 + menuIds.add(child.getId()); + if (child.getChildren() != null) { + for (Menu childChild : child.getChildren()) { + //按钮 + menuIds.add(childChild.getId()); + } + } + + } + } + + } + vo.setMenuIds(menuIds); + } else { + //非系统管理员 + menuIds = roleMapper.getMenuIdByRid(rid); + vo.setMenuIds(menuIds); + } + return vo; + } + + @Transactional + @Override + public void saveRolePermissons(Long rid, Long[] menuIds) { + //判断是否是系统管理员 + if (rid == Role.SYS_ID || rid==2L) { + //系统管理员 + throw new BusinessException("系统管理员的权限不可操作"); + } else { + //非系统管理员 + //重新建立关系 + if (menuIds == null || menuIds.length == 0) { + return; + } else { + List ids = new ArrayList<>(); + for (Long menuId : menuIds) { + ids.add(menuId); + } + + Set totalIds = new HashSet<>(); + QueryWrapper qoWrapper = new QueryWrapper().in("id", ids); + List list1 = menuService.list(qoWrapper); + for (Menu menu : list1) { + //按钮 + if (menu.getParentId()!=null && Menu.TYPE_BUTTON.equals(menu.getType())){ + totalIds.add(menu.getId()); + QueryWrapper btnWrapper = new QueryWrapper().eq("id", menu.getParentId()) + .eq("type",Menu.TYPE_MENU); + Menu menu1 = menuService.getOne(btnWrapper); + totalIds.add(menu1.getId()); + totalIds.add(menu1.getParentId()); + } else if (menu.getParentId()!=null && Menu.TYPE_MENU.equals(menu.getType())){ + //菜单 + totalIds.add(menu.getId()); + totalIds.add(menu.getParentId()); + }else if (menu.getParentId()==null && Menu.TYPE_CATALOGUE.equals(menu.getType())){ + //目录 + totalIds.add(menu.getId()); + } + } + //清除关系 + roleMapper.clearRecordsByRid(rid); + List> list = new ArrayList<>(); + for (Long id : totalIds) { + Map map = new HashMap<>(); + map.put("rid", rid); + map.put("mid", id); + list.add(map); + } + roleMapper.saveRolePermissons(list); + } + } + + } + + @Override + public List> getRoleAll() { + List> list = new ArrayList<>(); + QueryWrapper wrapper = new QueryWrapper().eq("state", Role.STATE_NORMAL).ne("id",Role.SYS_ID).ne("id",2L); + List roles = super.list(wrapper); + for (Role role : roles) { + Map map=new HashMap<>(); + map.put("id",role.getId()); + map.put("label",role.getName()); + list.add(map); + } + return list; + } + + @Override + public List queryRoleIdsByEid(Long eid) { + Employee emp = employeeService.getById(eid); + if (emp.getIsAdmin()){ + return roleMapper.queryRoleIdsAll(); + }else { + return roleMapper.queryRoleIdsByEid(eid); + } + } + + @Override + public void saveRoleEmp(Long eid, Long[] roleIds,String token) { + Employee emp = JSONObject.parseObject(redisTemplateService.getCacheObject(token), Employee.class); + if (emp.getId()==eid){ + throw new BusinessException("无法为自己赋予职务"); + } + //查询用户的信息,判断是否是系统管理员 + Employee employee = employeeService.getById(eid); + if (employee.getIsAdmin()){ + throw new BusinessException("无法操作系统管理员的职务"); + } + /*根据员工编号清除关系*/ + roleMapper.clearRelationByEid(eid); + /*重新保存关系*/ + List> list=new ArrayList<>(); + for (Long roleId : roleIds) { + Map map = new HashMap<>(); + map.put("eid",eid); + map.put("rid",roleId); + list.add(map); + } + if (list.size()>0){ + roleMapper.reSaveRelation(list); + } + } + + @Override + public void clearEmpPermission(Long id) { + roleMapper.clearRelationByEid(id); + } +}