java 递归20210416

package com.orcas.iso.user.service.impl;

import com.orcas.common.enums.OrcasProductType;
import com.orcas.common.enums.ProductStateType;
import com.orcas.common.enums.YesOrNo;
import com.orcas.common.menu.entity.MenuEntity;
import com.orcas.common.menu.entity.MenuTreeTable;
import com.orcas.common.menu.model.MenuRpc;
import com.orcas.common.menu.model.MicroappMenu;
import com.orcas.common.menu.model.ProductMenu;
import com.orcas.common.model.IdNameObject;
import com.orcas.common.product.entity.MicroAppEntity;
import com.orcas.common.product.entity.ProductEntity;
import com.orcas.common.usercenter.entity.RoleEntity;
import com.orcas.common.usercenter.entity.RoleMenuRelationEntity;
import com.orcas.common.usercenter.entity.RoleStaffRelationEntity;
import com.orcas.common.usercenter.entity.StaffEntity;
import com.orcas.common.usercenter.model.*;
import com.orcas.common.util.CommonUtil;
import com.orcas.dictionary.common.convert.DataDictConvert;
import com.orcas.dictionary.common.convert.DataDictConverts;
import com.orcas.iso.config.common.user.CurrentUserHolder;
import com.orcas.iso.menu.dao.MenuMapper;
import com.orcas.iso.menu.service.IMenuService;
import com.orcas.iso.product.dao.MicroAppDao;
import com.orcas.iso.product.dao.ProductDao;
import com.orcas.iso.user.dao.RoleDao;
import com.orcas.iso.user.service.ExternalService;
import com.orcas.iso.user.service.OrgService;
import com.orcas.common.usercenter.constant.DataDictConstant;
import com.orcas.iso.user.service.RoleService;
import com.orcas.iso.user.service.StaffService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author lqc
 */
@Service
@Transactional
public class RoleServiceImpl implements RoleService {

	@Autowired
	private RoleDao roleDao;
	@Autowired
	private MicroAppDao microAppDao;
	@Autowired
	private StaffService staffService;

	@Autowired
	private ProductDao productDao;

	/**
	 * 新增角色
	 *
	 * @param request 角色请求对象
	 */
	@Override
	public void addRole(RoleRequest request) {
		Assert.hasText(request.getName(), "名称不能为空!");
		Assert.hasText(request.getCode(), "编码不能为空!");
		Assert.hasText(request.getMicroId(), "服务ID不能为空!");
		Assert.hasText(request.getProductId(), "产品id不能为空!");

		// 先判断编码是否存在,校验规则:同一租户同一微服务下,角色编码不重复
		List<RoleEntity> entities = getRoles(request.getMicroId(), request.getCode());
		if (CollectionUtils.isNotEmpty(entities)) {
			throw new RuntimeException(String.format("角色编码[%s]已存在!", request.getCode()));
		}

		RoleEntity entity = new RoleEntity();
		BeanUtils.copyProperties(request, entity);
		entity.setId(CommonUtil.getUuid());
		entity.setCreateTime(LocalDateTime.now());
		entity.setUnitOrganizeId(CurrentUserHolder.get().getUnitOrganizeId());
		roleDao.addRole(entity);
	}

	/**
	 * 获取产品列表
	 *
	 * @param request
	 * @return 产品列表
	 */
	@Override
	public List<Product> getProducts(ProductsOfRoleRequest request) {
		Assert.hasText(request.getUnitOrganizeId(), "组织ID不能为空!");
		// 获取产品列表
//		String unitOrganizeId = request.getUnitOrganizeId();
		List<Product> productList = roleDao.getProducts(request);
		// 获取微服务列表
		if (!CollectionUtils.isEmpty(productList)) {
			for (Product product : productList) {
				List<MicroApp> microappList = roleDao.getMicroappByProductId(product.getId());
				if (!CollectionUtils.isEmpty(microappList)) {
					for (MicroApp microApp : microappList) {
						// 获取角色个数
						Integer roleNum = roleDao.getRoleNumByMicroId(microApp.getId(), product.getId());
						microApp.setRoleNum(roleNum);
						product.setRoleNum(product.getRoleNum() + microApp.getRoleNum());
					}
				}
				product.setMicroAppList(microappList);
			}
		}

		return productList;
	}

	/**
	 * 根据关键字获取角色列表
	 *
	 * @param request 角色列表请求对象
	 * @return 角色实体列表
	 */
	@DataDictConverts({ @DataDictConvert(dictCode = DataDictConstant.ROLE_TYPE, fromProperty = "type") })
	@Override
	public List<RoleEntity> getRolesByKeyword(RolesRequest request) {
		RoleEntity entity = new RoleEntity();
		if (request != null) {
			entity.setUnitOrganizeId(CurrentUserHolder.get().getUnitOrganizeId());
			entity.setMicroId(request.getMicroId());
			entity.setType(request.getRoleType());
			entity.setProductId(request.getProductId());
			entity.setKeyword(request.getKeyword());
		}
		return roleDao.getRolesByKeyword(entity);
	}

	/**
	 * 删除角色列表
	 *
	 * @param ids 角色ID列表
	 */
	@Override
	public void deleteRoles(List<String> ids) {
		Assert.notEmpty(ids, "角色ID列表不能为空!");

		ids.forEach(id -> {
			RoleEntity entity = new RoleEntity();
			entity.setId(id);
			entity.setUpdateTime(LocalDateTime.now());
			entity.setDeleteFlag(YesOrNo.YES.getValue());
			roleDao.updateRole(entity);
		});
	}

	/**
	 * 更新角色
	 *
	 * @param request 角色请求对象
	 */
	@Override
	public void updateRole(RoleRequest request) {
		Assert.hasText(request.getId(), "角色ID不能为空!");
		Assert.hasText(request.getMicroId(), "服务ID不能为空!");

		// 同一租户同一产品下的角色编码不能重复
		if (StringUtils.isNotBlank(request.getCode())) {
			List<RoleEntity> entities = getRoles(request.getMicroId(), request.getCode());
			if (CollectionUtils.isNotEmpty(entities) && !entities.get(0).getId().equals(request.getId())) {
				throw new RuntimeException(String.format("角色编码[%s]已存在!", request.getCode()));
			}
		}

		RoleEntity entity = new RoleEntity();
		BeanUtils.copyProperties(request, entity);
		entity.setUpdateTime(LocalDateTime.now());
		roleDao.updateRole(entity);
	}

	/**
	 * 获取角色
	 *
	 * @param id 角色ID
	 * @return 角色实体
	 */
	@Override
	public RoleEntity getRole(String id) {
		RoleEntity entity = new RoleEntity();
		entity.setId(id);
		List<RoleEntity> entities = roleDao.getRoles(entity);
		return CollectionUtils.isEmpty(entities) ? null : entities.get(0);
	}

	/**
	 * 根据角色ID获取产品名称
	 *
	 * @param roleId 角色ID
	 * @return 产品名称
	 */
	@Override
	public ProductEntity getProductNameByRoleId(String roleId) {
		// 先根据角色ID获取角色
		ProductEntity productEntity = productDao.getProductByRoleId(roleId);
		return productEntity;
	}

	/**
	 * 分配人员列表
	 *
	 * @param request 角色人员列表请求对象
	 */
	@Override
	public void assignStaffs(RoleStaffsRequest request) {
		staffService.addRoleStaffRelations(request.getRoleId(), request.getStaffIds());
	}

	/**
	 * 获取已分配人员列表
	 *
	 * @param roleId 角色ID
	 * @return ID名称对象列表
	 */
	@Override
	public List<IdNameObject> getAssignedStaffs(String roleId) {
		List<StaffEntity> entities = staffService.getStaffsByRoleId(roleId);
		if (CollectionUtils.isEmpty(entities)) {
			return Collections.emptyList();
		}
		return entities.stream().map(entity -> new IdNameObject(entity.getId(), entity.getAccountName()))
				.collect(Collectors.toList());
	}

	/**
	 * 获取机构人员树
	 *
	 * @return 机构人员树节点列表
	 */
	@Override
	public List<InstitutionStaffTreeNode> getInstitutionStaffTree() {
		return staffService.getInstitutionStaffTree();
	}

	@Autowired
	private IMenuService iMenuService;

	/**
	 * 根据角色ID获取已选菜单列表
	 *
	 * @param id 角色ID
	 * @return 已选菜单列表响应对象
	 */
	@Override
	public SelectedMenusResponse getSelectedMenus(String id) {
		RoleEntity entity = getRole(id);
		if (entity == null) {
			return null;
		}
		// 获取菜单树
		SelectedMenusResponse response = new SelectedMenusResponse();
		MenuRpc menuRpc = new MenuRpc();
		menuRpc.setUnitOrganizeId(CurrentUserHolder.get().getUnitOrganizeId());
		menuRpc.setMicroappId(entity.getMicroId());
		List<MenuTreeTable> menuTreeTables = iMenuService.getMenuTree(menuRpc);
		response.setMenuTreeNodes(menuTreeTables);

		// 获取已选菜单列表
		List<IdNameObject> selectedMenus = roleDao.getRoleSelectedMenuByRoleId(id);
		response.setSelectedMenus(selectedMenus);
		return response;
	}

	/**
	 * 保存已选菜单列表 先删除再新增
	 *
	 * @param request 已选菜单列表请求对象
	 */
	@Override
	public void saveSelectedMenus(SelectedMenusRequest request) {
		Assert.hasText(request.getRoleId(), "角色ID不能为空!");
		Assert.notEmpty(request.getMenuIds(), "菜单ID列表不能为空!");

		roleDao.deleteRoleMenuRelationByRoleId(request.getRoleId());

		List<RoleMenuRelationEntity> entities = request.getMenuIds().stream().map(menuId -> {
			RoleMenuRelationEntity entity = new RoleMenuRelationEntity();
			entity.setId(CommonUtil.getUuid());
			entity.setCreateTime(LocalDateTime.now());
			entity.setUnitOrganizeId(CurrentUserHolder.get().getUnitOrganizeId());
			entity.setRoleId(request.getRoleId());
			entity.setMenuId(menuId);
			return entity;
		}).collect(Collectors.toList());
		roleDao.addRoleMenuRelations(entities);
	}

	/**
	 * 根据关键字获取人员列表
	 *
	 * @param keyword 关键字
	 * @return 人员实体列表
	 */
	@Override
	public List<StaffEntity> getStaffsByKeyword(String keyword) {
		StaffsRequest request = new StaffsRequest();
		request.setKeyword(keyword);
		return staffService.getStaffsByKeyword(request);
	}

	public List<RoleEntity> getRolesByMicroappId(String microappId) {
		RoleEntity entity = new RoleEntity();
		entity.setMicroId(microappId);
		return roleDao.getRoles(entity);
	}

	/**
	 * 获取角色列表
	 *
	 * @param microId  产品ID
	 * @param roleCode 角色编码
	 * @return 角色实体列表
	 */
	private List<RoleEntity> getRoles(String microId, String roleCode) {
		RoleEntity entity = new RoleEntity();
		entity.setUnitOrganizeId(CurrentUserHolder.get().getUnitOrganizeId());
		entity.setMicroId(microId);
		entity.setCode(roleCode);
		return roleDao.getRoles(entity);
	}

	@Override
	public List<SelectedRolesResponse> getSelectedRoles(String staffId) {
		// 根据人员ID获取角色列表
		List<RoleEntity> entities = roleDao.getRolesByStaffId(staffId);
		if (CollectionUtils.isEmpty(entities)) {
			return Collections.emptyList();
		}
		// 获取去重后的微应用id数组
		List<String> microIds = entities.stream().map(RoleEntity::getMicroId).distinct().collect(Collectors.toList());
		// 获取去重后的产品id数组
		List<String> productIds = entities.stream().map(RoleEntity::getProductId).distinct()
				.collect(Collectors.toList());
		// 查询微应用名称 所属产品id、名称
		List<SelectedRolesResponse> selectedRolesResponseList = new ArrayList<>();
		if (!CollectionUtils.isEmpty(productIds)) {
			for (String productId : productIds) {
				for (String mircoId : microIds) {
					SelectedRolesResponse response = new SelectedRolesResponse();
					response.setSelectedRoles(new ArrayList<>());
					for (RoleEntity roleEntity : entities) {
						if (roleEntity.getMicroId().equals(mircoId) && roleEntity.getProductId().equals(productId)) {
							response.setProductId(productId);
							response.setMicroId(mircoId);
							response.setProductName(roleEntity.getProductName());
							response.setMicroappName(roleEntity.getMicroName());
							response.getSelectedRoles().add(roleEntity);
						}
					}
					if (!CollectionUtils.isEmpty(response.getSelectedRoles())) {
						selectedRolesResponseList.add(response);
					}
				}
			}
		}
		return selectedRolesResponseList;
	}

	@Override
	public List<RoleEntity> getRoleListByMicroId(String microId, String productId) {
		List<RoleEntity> roleEntityList = roleDao.selectRoleListByMicroId(microId, productId);
		return roleEntityList;
	}

	@Override
	public void saveStaffSelectedRole(SelectedRolesRequest request) {
		// 人员id
		String staffId = request.getStaffId();
		List<String> roleIds = request.getRoleIds();
		// 通过人员id删除原有的关系信息
		roleDao.deleteSRRelationByStaffId(staffId);
		// 插入新的人员角色关系信息
		if (!CollectionUtils.isEmpty(roleIds)) {
			List<RoleStaffRelationEntity> list = new ArrayList<>();
			String unitOrganizeId = CurrentUserHolder.get().getUnitOrganizeId();
			for (String roleId : roleIds) {
				RoleStaffRelationEntity roleStaffRelationEntity = new RoleStaffRelationEntity();
				roleStaffRelationEntity.setId(CommonUtil.getUuid());
				roleStaffRelationEntity.setStaffId(staffId);
				roleStaffRelationEntity.setRoleId(roleId);
				roleStaffRelationEntity.setUnitOrganizeId(unitOrganizeId);
				list.add(roleStaffRelationEntity);
			}
			// 执行批量插入
			roleDao.addSRRelationBatch(list);
		}
	}

	@Autowired
	private MenuMapper menuMapper;

	@Override
	public List<MenuTreeNode> getMenuTree(MenuTreeRequest request) {
//		String productNo = OrcasProductType.orcas.getCode();
		Assert.hasText(request.getProductNo(), "产品编号不能为空!");
		Assert.hasText(request.getMicroNo(), "应用编号不能为空!");
		String unitOrganizeId = request.getUnitOrganizeId();
		String staffId = request.getStaffId();
		String productNo = request.getProductNo();
		String microNo = request.getMicroNo();
		Integer isAdmin = request.getIsAdmin();
		List<MenuEntity> menus = new ArrayList<>();
		// 通过微应用编号获取微应用信息
		MicroAppEntity microAppEntity = microAppDao.getMicroAppInfoByCode(unitOrganizeId, microNo);
		if (microAppEntity == null) {
			return Collections.emptyList();
		}
		// 如果是管理员 则拥有该应用下的所有菜单
		if (isAdmin == 1) {
			menus = menuMapper.getAllMenuList(unitOrganizeId, microAppEntity.getId());
		} else {
			// 通过租户id、产品编号获取产品信息
			ProductEntity productEntity = productDao.getInfoByOrgAndCode(unitOrganizeId, productNo);
			if (productEntity == null) {
				return Collections.emptyList();
			}
			// 通过人员id、产品id、应用id获取已有权限的私有菜单资源
			List<MenuEntity> privateMenuEntities = menuMapper.getPrivateMenu(staffId, productEntity.getId(),
					microAppEntity.getId());
			// 获取该产品、该应用下的公共资源菜单列表
			List<MenuEntity> commonMenuEntities = menuMapper.getCommonMenu(unitOrganizeId, microAppEntity.getId());
			menus.addAll(privateMenuEntities);
			menus.addAll(commonMenuEntities);
			menus.stream().distinct().collect(Collectors.toList()); // 去重
		}

		return buildTopMenuTree(menus);
	}

	private List<MenuTreeNode> buildTopMenuTree(List<MenuEntity> menus) {
		if (CollectionUtils.isEmpty(menus)) {
			return Collections.emptyList();
		}

		List<MenuEntity> topMenuEntities = menus.stream().filter(menu -> StringUtils.isBlank(menu.getMenuParentId()))
				.collect(Collectors.toList());
		if (CollectionUtils.isEmpty(topMenuEntities)) {
			return Collections.emptyList();
		}

		return buildTopMenuTreeNodes(topMenuEntities, menus);
	}

	private List<MenuTreeNode> buildTopMenuTreeNodes(List<MenuEntity> topMenuEntities, List<MenuEntity> menus) {
		return topMenuEntities.stream().map(topMenuEntity -> {
			MenuTreeNode node = new MenuTreeNode();
			node.setMenuId(topMenuEntity.getId());
			node.setMenuName(topMenuEntity.getMenuName());
			node.setMenuCode(topMenuEntity.getMenuCode());
			node.setMenuUrl(topMenuEntity.getMenuUrl());
			node.setMenuType(topMenuEntity.getMenuType());
			node.setMenuLogoUrl(topMenuEntity.getMenuLogo());
			node.setMenuRemark(topMenuEntity.getRemark());
			node.setMenuParentId(topMenuEntity.getMenuParentId());
			node.setRoute(topMenuEntity.getRoute());
			node.setChildren(buildMenuTreeNodes(node, menus));
			return node;
		}).collect(Collectors.toList());
	}

	private List<MenuTreeNode> buildMenuTreeNodes(MenuTreeNode node, List<MenuEntity> menus) {
		List<MenuEntity> subs = menus.stream().filter(menu -> node.getMenuId().equals(menu.getMenuParentId()))
				.collect(Collectors.toList());
		if (CollectionUtils.isEmpty(subs)) {
			return Collections.emptyList();
		}
		return subs.stream().map(sub -> {
			MenuTreeNode treeNode = new MenuTreeNode();
			treeNode.setMenuId(sub.getId());
			treeNode.setMenuName(sub.getMenuName());
			treeNode.setMenuCode(sub.getMenuCode());
			treeNode.setMenuUrl(sub.getMenuUrl());
			treeNode.setMenuType(sub.getMenuType());
			treeNode.setMenuLogoUrl(sub.getMenuLogo());
			treeNode.setMenuRemark(sub.getRemark());
			treeNode.setMenuParentId(sub.getMenuParentId());
			treeNode.setRoute(sub.getRoute());
			treeNode.setChildren(buildMenuTreeNodes(treeNode, menus));
			return treeNode;
		}).collect(Collectors.toList());
	}

	@Override
	public List<MenuTreeNode> getMenuTreeByAccountName(String accountName) {
		Assert.hasText(accountName, "用户账号不能为空!");
		List<MenuEntity> menus = this.iMenuService.selectMenuListByStaffId(accountName);
		if (CollectionUtils.isNotEmpty(menus)) {
			return buildTopMenuTree(menus);
		}
		return buildTopMenuTree(Collections.EMPTY_LIST);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值