【8.1.0】【user-role】更新用户授权界面列表接口

pull/60/head
fengshuonan 2024-01-18 00:16:11 +08:00
parent 780a8940f5
commit 536eed620c
11 changed files with 411 additions and 1 deletions

View File

@ -72,4 +72,12 @@ public interface SysRoleServiceApi {
*/
List<SysRoleDTO> getRolesByIds(List<Long> roleIds);
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:28
*/
List<SysRoleDTO> getBusinessRoleAndCompanyRole(List<Long> companyIdList);
}

View File

@ -1,5 +1,7 @@
package cn.stylefeng.roses.kernel.sys.api;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.UserRoleDTO;
import java.util.List;
import java.util.Set;
@ -27,6 +29,14 @@ public interface SysUserRoleServiceApi {
*/
Set<Long> getUserSystemRoleIdList(Long userId);
/**
* id
*
* @author fengshuonan
* @since 2024/1/17 23:45
*/
List<UserRoleDTO> getUserLinkedOrgRoleList(Long userId);
/**
* id
*

View File

@ -64,6 +64,6 @@ public class SysRoleDTO {
* id20
*/
@ChineseDescription("角色所属机构id当角色类型为20时传此值")
private Long roleOrgId;
private Long roleCompanyId;
}

View File

@ -1,5 +1,6 @@
package cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
import java.util.List;
@ -16,16 +17,31 @@ public class NewUserRoleBindResponse {
/**
* id
*/
@ChineseDescription("用户所属机构id")
private Long orgId;
/**
*
*/
@ChineseDescription("组织机构名称标识")
private String orgName;
/**
*
*/
@ChineseDescription("是否启用本公司身份")
private Boolean enableThisOrg;
/**
*
*/
@ChineseDescription("角色绑定的详情")
private List<NewUserRoleBindItem> roleBindItemList;
/**
* 使
*/
@ChineseDescription("(后端组装参数临时使用的字段,前端不用管)")
private Long companyId;
}

View File

@ -0,0 +1,63 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole;
import cn.stylefeng.roses.kernel.rule.annotation.ChineseDescription;
import lombok.Data;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:44
*/
@Data
public class UserRoleDTO {
/**
* id
*/
@ChineseDescription("用户id")
private Long userId;
/**
* id
*/
@ChineseDescription("角色id")
private Long roleId;
/**
* 10-15-20-
*/
@ChineseDescription("角色类型10-系统角色15-业务角色20-公司角色")
private Integer roleType;
/**
* id
*/
@ChineseDescription("用户所属机构id")
private Long roleOrgId;
}

View File

@ -0,0 +1,41 @@
package cn.stylefeng.roses.kernel.sys.modular.user.controller;
import cn.stylefeng.roses.kernel.rule.pojo.response.ResponseData;
import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.NewUserRoleBindResponse;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysRoleAssignService;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:01
*/
@RestController
@ApiResource(name = "用户授权界面接口")
public class UserRoleAssignPageController {
@Resource
private SysRoleAssignService sysRoleAssignService;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:57
*/
@GetResource(name = "获取用户的角色授权信息列表", path = "/sysRoleAssign/getUserAssignList")
public ResponseData<List<NewUserRoleBindResponse>> getUserAssignList(@RequestParam("userId") Long userId) {
List<NewUserRoleBindResponse> list = sysRoleAssignService.getUserAssignList(userId);
return new SuccessResponseData<>(list);
}
}

View File

@ -0,0 +1,152 @@
package cn.stylefeng.roses.kernel.sys.modular.user.factory;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.enums.StatusEnum;
import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserOrgDTO;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.NewUserRoleBindItem;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.NewUserRoleBindResponse;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.UserRoleDTO;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:16
*/
public class RoleAssignFactory {
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:16
*/
public static List<NewUserRoleBindResponse> createBaseResponse(List<UserOrgDTO> userOrgDTOList) {
List<NewUserRoleBindResponse> baseResponse = new ArrayList<>();
if (ObjectUtil.isEmpty(userOrgDTOList)) {
return baseResponse;
}
for (UserOrgDTO userOrgDTO : userOrgDTOList) {
NewUserRoleBindResponse newUserRoleBindResponse = new NewUserRoleBindResponse();
Long orgId = userOrgDTO.getDeptId();
if (orgId == null) {
orgId = userOrgDTO.getCompanyId();
}
// 设置机构id
newUserRoleBindResponse.setOrgId(orgId);
// 设置机构名称
String orgInfoName = userOrgDTO.getCompanyName()
+ "/"
+ (userOrgDTO.getDeptName() == null ? "" : userOrgDTO.getDeptName() + "/")
+ userOrgDTO.getPositionName();
newUserRoleBindResponse.setOrgName(orgInfoName);
// 设置是否启用这个机构
newUserRoleBindResponse.setEnableThisOrg(StatusEnum.ENABLE.getCode().equals(userOrgDTO.getStatusFlag()));
// 设置公司id后台组装数据用前端不用这个字段
newUserRoleBindResponse.setCompanyId(userOrgDTO.getCompanyId());
baseResponse.add(newUserRoleBindResponse);
}
return baseResponse;
}
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:33
*/
public static void fillRoleSelectList(List<NewUserRoleBindResponse> baseResponse, List<SysRoleDTO> businessRoleAndCompanyRole) {
List<SysRoleDTO> businessRoleList = businessRoleAndCompanyRole.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.BUSINESS_ROLE.getCode()))
.collect(Collectors.toList());
// 1. 首先每个结构下边先添加一遍业务角色,业务角色各个机构下都一样
for (NewUserRoleBindResponse item : baseResponse) {
List<NewUserRoleBindItem> roleBindItemList = item.getRoleBindItemList();
if (ObjectUtil.isEmpty(roleBindItemList)) {
roleBindItemList = new ArrayList<>();
item.setRoleBindItemList(roleBindItemList);
}
for (SysRoleDTO businessRole : businessRoleList) {
NewUserRoleBindItem newUserRoleBindItem = new NewUserRoleBindItem();
newUserRoleBindItem.setRoleId(businessRole.getRoleId());
newUserRoleBindItem.setRoleName(businessRole.getRoleName());
newUserRoleBindItem.setRoleType(businessRole.getRoleType());
newUserRoleBindItem.setCheckedFlag(false);
roleBindItemList.add(newUserRoleBindItem);
}
}
// 2. 然后再添加公司角色,公司角色每个机构下不一样
List<SysRoleDTO> companyRoleList = businessRoleAndCompanyRole.stream().filter(i -> i.getRoleType().equals(RoleTypeEnum.COMPANY_ROLE.getCode()))
.collect(Collectors.toList());
for (SysRoleDTO companyRole : companyRoleList) {
for (NewUserRoleBindResponse item : baseResponse) {
if (!companyRole.getRoleCompanyId().equals(item.getCompanyId())) {
continue;
}
List<NewUserRoleBindItem> roleBindItemList = item.getRoleBindItemList();
NewUserRoleBindItem newUserRoleBindItem = new NewUserRoleBindItem();
newUserRoleBindItem.setRoleId(companyRole.getRoleId());
newUserRoleBindItem.setRoleName(companyRole.getRoleName());
newUserRoleBindItem.setRoleType(companyRole.getRoleType());
newUserRoleBindItem.setCheckedFlag(false);
roleBindItemList.add(newUserRoleBindItem);
}
}
}
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:49
*/
public static List<NewUserRoleBindResponse> fillRoleBind(List<NewUserRoleBindResponse> baseResponse, List<UserRoleDTO> userLinkedOrgRoleList) {
if (ObjectUtil.isEmpty(userLinkedOrgRoleList)) {
return baseResponse;
}
for (NewUserRoleBindResponse item : baseResponse) {
// 获取指定机构id
Long orgId = item.getOrgId();
// 获取这个机构下的填充的所有角色
List<NewUserRoleBindItem> roleBindItemList = item.getRoleBindItemList();
// 获取用户是否在这个公司下有相关的角色绑定
for (UserRoleDTO userAlreadyBind : userLinkedOrgRoleList) {
if (userAlreadyBind.getRoleOrgId().equals(orgId)) {
for (NewUserRoleBindItem newUserRoleBindItem : roleBindItemList) {
if (newUserRoleBindItem.getRoleId().equals(userAlreadyBind.getRoleId())) {
newUserRoleBindItem.setCheckedFlag(true);
}
}
}
}
}
return baseResponse;
}
}

View File

@ -0,0 +1,23 @@
package cn.stylefeng.roses.kernel.sys.modular.user.service;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.NewUserRoleBindResponse;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:08
*/
public interface SysRoleAssignService {
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:09
*/
List<NewUserRoleBindResponse> getUserAssignList(Long userId);
}

View File

@ -0,0 +1,59 @@
package cn.stylefeng.roses.kernel.sys.modular.user.service.impl;
import cn.stylefeng.roses.kernel.sys.api.SysRoleServiceApi;
import cn.stylefeng.roses.kernel.sys.api.pojo.role.SysRoleDTO;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.UserOrgDTO;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.NewUserRoleBindResponse;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.UserRoleDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.factory.RoleAssignFactory;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysRoleAssignService;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserOrgService;
import cn.stylefeng.roses.kernel.sys.modular.user.service.SysUserRoleService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
* @author fengshuonan
* @since 2024/1/17 23:08
*/
@Service
public class SysRoleAssignServiceImpl implements SysRoleAssignService {
@Resource
private SysUserOrgService sysUserOrgService;
@Resource
private SysRoleServiceApi sysRoleServiceApi;
@Resource
private SysUserRoleService sysUserRoleService;
@Override
public List<NewUserRoleBindResponse> getUserAssignList(Long userId) {
// 1. 获取用户的所有绑定的组织机构信息
List<UserOrgDTO> userOrgList = sysUserOrgService.getUserOrgList(userId, true);
// 2. 组装NewUserRoleBindResponse
List<NewUserRoleBindResponse> baseResponse = RoleAssignFactory.createBaseResponse(userOrgList);
// 3. 获取系统中所有的业务角色type=15以及所有的公司角色type=20
List<SysRoleDTO> businessRoleAndCompanyRole = sysRoleServiceApi.getBusinessRoleAndCompanyRole(
userOrgList.stream().map(UserOrgDTO::getCompanyId).collect(Collectors.toList()));
// 4. 组装每个机构下的角色信息下拉列表
RoleAssignFactory.fillRoleSelectList(baseResponse, businessRoleAndCompanyRole);
// 5. 获取用户已经绑定的关联机构的角色(为了赋值选中状态)
List<UserRoleDTO> userLinkedOrgRoleList = sysUserRoleService.getUserLinkedOrgRoleList(userId);
// 6. 填充绑定关系,返回结果
return RoleAssignFactory.fillRoleBind(baseResponse, userLinkedOrgRoleList);
}
}

View File

@ -1,5 +1,6 @@
package cn.stylefeng.roses.kernel.sys.modular.user.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.cache.api.CacheOperatorApi;
@ -12,6 +13,7 @@ import cn.stylefeng.roses.kernel.sys.api.callback.RemoveRoleCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.callback.RemoveUserCallbackApi;
import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants;
import cn.stylefeng.roses.kernel.sys.api.enums.role.RoleTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.user.newrole.UserRoleDTO;
import cn.stylefeng.roses.kernel.sys.modular.user.entity.SysUserRole;
import cn.stylefeng.roses.kernel.sys.modular.user.enums.SysUserExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.user.mapper.SysUserRoleMapper;
@ -173,6 +175,27 @@ public class SysUserRoleServiceImpl extends ServiceImpl<SysUserRoleMapper, SysUs
return sysUserRoleList.stream().filter(i -> RoleTypeEnum.SYSTEM_ROLE.getCode().equals(i.getRoleType())).map(SysUserRole::getRoleId).collect(Collectors.toSet());
}
@Override
public List<UserRoleDTO> getUserLinkedOrgRoleList(Long userId) {
// 先从缓存查找用户的角色
List<SysUserRole> cachedRoleList = userRoleCache.get(userId.toString());
if (ObjectUtil.isNotEmpty(cachedRoleList)) {
List<SysUserRole> result = cachedRoleList.stream().filter(i -> ObjectUtil.isNotEmpty(i.getRoleOrgId())).collect(Collectors.toList());
return BeanUtil.copyToList(result, UserRoleDTO.class);
}
List<SysUserRole> sysUserRoleList = this.dbGetUserTotalRoleList(userId);
// 查询结果缓存起来
if (ObjectUtil.isNotEmpty(sysUserRoleList)) {
userRoleCache.put(userId.toString(), sysUserRoleList, SysConstants.DEFAULT_SYS_CACHE_TIMEOUT_SECONDS);
}
List<SysUserRole> finalResult = sysUserRoleList.stream().filter(i -> ObjectUtil.isNotEmpty(i.getRoleOrgId())).collect(Collectors.toList());
return BeanUtil.copyToList(finalResult, UserRoleDTO.class);
}
@Override
public List<Long> getUserRoleIdListCurrentCompany(Long userId, Long orgId) {

View File

@ -347,6 +347,21 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError());
}
@Override
public List<SysRoleDTO> getBusinessRoleAndCompanyRole(List<Long> companyIdList) {
LambdaQueryWrapper<SysRole> sysRoleLambdaQueryWrapper = new LambdaQueryWrapper<>();
sysRoleLambdaQueryWrapper.eq(SysRole::getRoleType, RoleTypeEnum.BUSINESS_ROLE.getCode());
sysRoleLambdaQueryWrapper.or().nested(i -> i.eq(SysRole::getRoleType, RoleTypeEnum.COMPANY_ROLE.getCode()).and(j -> j.in(SysRole::getRoleCompanyId, companyIdList)));
sysRoleLambdaQueryWrapper.select(SysRole::getRoleId, SysRole::getRoleName, SysRole::getRoleType, SysRole::getRoleCompanyId);
sysRoleLambdaQueryWrapper.orderByAsc(SysRole::getRoleType);
List<SysRole> sysRoleList = this.list(sysRoleLambdaQueryWrapper);
if (ObjectUtil.isEmpty(sysRoleList)) {
return new ArrayList<>();
} else {
return BeanUtil.copyToList(sysRoleList, SysRoleDTO.class, CopyOptions.create().ignoreError());
}
}
/**
*
*