大调整

This commit is contained in:
zhangchenbiao
2023-06-08 15:57:28 +08:00
parent 8e866554a1
commit 071725fb3d
44 changed files with 740 additions and 2352 deletions

View File

@@ -3,7 +3,6 @@ package com.cool.store.context;
import com.cool.store.entity.SysRoleDO;
import lombok.Data;
@Data
public class CurrentUser {

View File

@@ -14,21 +14,6 @@ import java.util.Map;
*/
public interface EnterpriseUserService {
void updateUserRegionPathList(List<String> userIds);
List<EnterpriseUserPageVO> listUser(String userName, String deptId,
String orderBy, String orderRule,
Long roleId, Integer userStatus, Integer pageNum, Integer pageSize, String jobNumber, String regionId, Boolean hasPage);
List<String> initUserRole(List<EnterpriseUserPageVO> enterpriseUserList);
/**
* 更新用户的部门全路径
* @param user
* @param deptIdMap
*/
void updateUserDeptPath(EnterpriseUserRequest user, Map<String, String> deptIdMap);
EnterpriseUserDO getUserInfoByUserId(String userId);
}

View File

@@ -5,5 +5,5 @@ public interface LoginService {
Object feiShuLogin(String userId, String corpId, Boolean needRefreshToken , String appType, String avatar);
Object feiShuLogin(String userId, Boolean needRefreshToken, String avatar);
}

View File

@@ -1,9 +1,5 @@
package com.cool.store.service;
import com.cool.store.entity.RegionDO;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: RegionService
@@ -12,8 +8,4 @@ import java.util.List;
*/
public interface RegionService {
void saveRegionAndStore(RegionDO regionDO, String userId);
void removeRegions(List<Long> regionIds);
}

View File

@@ -1,14 +1,23 @@
package com.cool.store.service.impl;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.*;
import com.cool.store.dto.enterprise.*;
import com.cool.store.entity.*;
import com.cool.store.enums.DataSourceEnum;
import com.cool.store.http.ISVHttpRequest;
import com.cool.store.service.EnterpriseSyncService;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zhangchenbiao
@@ -20,12 +29,107 @@ import java.util.*;
@Slf4j
@Service
public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
@Resource
private ISVHttpRequest isvHttpRequest;
@Resource
private RegionDAO regionDAO;
@Resource
private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private EnterpriseUserRoleDAO enterpriseUserRoleDAO;
@Resource
private SysRoleDAO sysRoleDAO;
@Resource
private UserRegionMappingDAO userRegionMappingDAO;
@Override
public void syncAll() {
//同步部门
List<SysDepartmentDTO> departments = isvHttpRequest.getSubDepartments(CommonConstants.ROOT_DEPT_ID_STR, true);
//获取企业信息
AuthInfoDTO authInfo = isvHttpRequest.getAuthInfo();
Multimap<String, String> leaderDeptMap = ArrayListMultimap.create();
//组织架构中增加根节点,处理部门上下级关系
List<RegionDO> regionList = SysDepartmentDTO.convertRegionDO(departments, leaderDeptMap);
List<String> regionIds = regionList.stream().map(RegionDO::getRegionId).distinct().collect(Collectors.toList());
//添加根节点
regionList.add(getRootRegion(authInfo));
//批量插入
regionDAO.batchInsertOrUpdate(regionList);
//删除不存在的区域
regionDAO.deleteNotExistRegion(regionIds);
Multimap<String, String> roleUserMap = ArrayListMultimap.create();
//同步用户及部门
syncUserAndUserRegion(regionList, roleUserMap, leaderDeptMap);
//处理用户角色 删除多余的角色
if(!roleUserMap.isEmpty()){
List<SysRoleDO> insertOrUpdateList = new ArrayList<>();
List<EnterpriseUserRoleDO> userRoleInsertOrUpdateList = new ArrayList<>();
List<String> roleIds = new ArrayList<>();
for (String roleName : roleUserMap.keys()) {
SysRoleDO sysRole = SysRoleDO.convertSyncDO(roleName);
roleIds.add(sysRole.getRoleId());
Collection<String> userIds = roleUserMap.get(roleName);
insertOrUpdateList.add(sysRole);
userRoleInsertOrUpdateList.addAll(EnterpriseUserRoleDO.convertDO(sysRole.getRoleId(), new ArrayList<>(userIds)));
//删除角色下不存在的用户
enterpriseUserRoleDAO.deleteUserRole(sysRole.getRoleId(), DataSourceEnum.SYNC, new ArrayList<>(userIds));
}
sysRoleDAO.batchInsertSelective(insertOrUpdateList);
enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList);
//删除不存在的角色?
sysRoleDAO.deleteRole(DataSourceEnum.SYNC, roleIds);
}
}
private void syncUserAndUserRegion(List<RegionDO> regionList, Multimap<String, String> roleUserMap, Multimap<String, String> leaderDeptMap){
Map<String, String> regionPathMap = regionList.stream().collect(Collectors.toMap(RegionDO::getRegionId, RegionDO::getRegionPath));
List<EnterpriseUserDO> userList = new ArrayList<>();
List<UserRegionMappingDO> userRegionList = new ArrayList<>();
List<String> userIds = new ArrayList<>();
//按部门获取用户
for (RegionDO region : regionList) {
List<EnterpriseUserDTO> departmentUsers = isvHttpRequest.getDepartmentUsers(region.getRegionId());
List<String> deptUserIds = ListUtils.emptyIfNull(departmentUsers).stream().map(EnterpriseUserDTO::getUserId).collect(Collectors.toList());
userRegionMappingDAO.deleteUserRegion(region.getRegionId(), DataSourceEnum.SYNC, deptUserIds);
if(CollectionUtils.isEmpty(departmentUsers)){
continue;
}
userIds.addAll(deptUserIds);
userRegionList.addAll(UserRegionMappingDO.convertSyncDO(region.getRegionId(), departmentUsers));
//系统内的角色 获取飞书的职务 一个人只能一个职务
List<EnterpriseUserDO> deptUserList = EnterpriseUserDTO.transUserDtoToDo(departmentUsers, regionPathMap, leaderDeptMap, roleUserMap);
userList.addAll(deptUserList);
if(userList.size() > CommonConstants.DEAL_RECORD_MAX_SIZE){
enterpriseUserDAO.batchInsertOrUpdate(userList);
userList.clear();
}
if(userRegionList.size() > CommonConstants.DEAL_RECORD_MAX_SIZE){
userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList);
userRegionList.clear();
}
}
enterpriseUserDAO.batchInsertOrUpdate(userList);
userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList);
//删除不存在的用户
enterpriseUserDAO.deleteUser(userIds);
}
/**
* 获取跟部门
* @param authInfo
* @return
*/
private RegionDO getRootRegion(AuthInfoDTO authInfo){
RegionDO rootRegion = new RegionDO();
rootRegion.setName(authInfo.getAuthCorpInfo().getCorpName());
rootRegion.setRegionId(CommonConstants.ROOT_DEPT_ID_STR);
rootRegion.setParentId(CommonConstants.ZERO_STR);
rootRegion.setThirdDeptId(CommonConstants.ROOT_DEPT_ID_STR);
rootRegion.setOrderNum(CommonConstants.ZERO);
rootRegion.setRegionPath(CommonConstants.PATH_SPILT + rootRegion.getRegionId() + CommonConstants.PATH_SPILT);
return rootRegion;
}
}

View File

@@ -1,23 +1,11 @@
package com.cool.store.service.impl;
import com.cool.store.constants.CommonConstants;
import com.cool.store.context.CurrentUser;
import com.cool.store.dao.*;
import com.cool.store.dto.buser.UserRoleDTO;
import com.cool.store.entity.*;
import com.cool.store.request.EnterpriseUserRequest;
import com.cool.store.service.EnterpriseUserService;
import com.cool.store.vo.buser.EnterpriseUserPageVO;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zhangchenbiao
@@ -29,153 +17,12 @@ import java.util.stream.Collectors;
@Service
public class EnterpriseUserServiceImpl implements EnterpriseUserService {
@Resource
private UserRegionMappingDAO userRegionMappingDAO;
@Resource
private RegionDAO regionDAO;
@Resource
private EnterpriseUserDAO enterpriseUserDAO;
@Resource
private EnterpriseUserRoleDAO enterpriseUserRoleDAO;
@Override
public void updateUserRegionPathList(List<String> userIds) {
if (CollectionUtils.isEmpty(userIds)) {
return;
}
//查询该人员的最新部门情况 同步到enterpriseUser 表usereginIds表中
List<UserRegionMappingDO> userRegionMappingDOS = userRegionMappingDAO.listUserRegionMappingByUserId(userIds);
Map<String, List<UserRegionMappingDO>> userRegionMappingMap = ListUtils.emptyIfNull(userRegionMappingDOS)
.stream()
.collect(Collectors.groupingBy(UserRegionMappingDO::getUserId));
List<String> regionIds = userRegionMappingDOS.stream()
.map(UserRegionMappingDO::getRegionId).distinct().collect(Collectors.toList());
List<RegionDO> regionDOS = regionDAO.getRegionByRegionIds(regionIds);
Map<String, RegionDO> regionMap = regionDOS.stream()
.collect(Collectors.toMap(RegionDO::getRegionId, data -> data));
List<EnterpriseUserDO> enterpriseUserList= new ArrayList<>();
for (String userId:userIds) {
EnterpriseUserDO enterpriseUserDO = new EnterpriseUserDO();
enterpriseUserDO.setUserId(userId);
String regionPathString = "";
List<RegionDO> regionDOList = new ArrayList<>();
//如果没有对应部门 默认未null 正常情况下不会出现userRegionId不为null的情况
enterpriseUserDO.setUserRegionIds(null);
List<UserRegionMappingDO> userRegionMappingList = userRegionMappingMap.get(userId);
//异常情况下处理
if (CollectionUtils.isEmpty(userRegionMappingList)){
log.info("getUserRegionPathListStr exception 该人员没有任何部门");
//查询未分组
RegionDO unclassifiedRegionDO = regionDAO.getUnclassifiedRegionDO();
//将人添加到未分组中
addUserRegionMappingDO(userId,unclassifiedRegionDO.getRegionId(),new CurrentUser());
regionDOList.add(unclassifiedRegionDO);
}
ListUtils.emptyIfNull(userRegionMappingList)
.stream()
.forEach(userRegionMappingDO -> {
RegionDO regionDO = regionMap.get(userRegionMappingDO.getRegionId());
if (Objects.nonNull(regionDO)){
regionDOList.add(regionDO);
}
});
regionPathString = regionDOList.stream()
.map(e -> e.getFullRegionPath()).collect(Collectors.joining(CommonConstants.COMMA));
if (StringUtils.isNotBlank(regionPathString)){
enterpriseUserDO.setUserRegionIds(CommonConstants.SQUAREBRACKETSLEFT+ regionPathString+ CommonConstants.SQUAREBRACKETSRIGHT);
}
enterpriseUserList.add(enterpriseUserDO);
}
//enterpriseUserDAO.batchUpdateDiffUserDiffRegionIds(enterpriseUserList);
}
@Override
public List<EnterpriseUserPageVO> listUser(String userName, String deptId,
String orderBy, String orderRule,
Long roleId, Integer userStatus, Integer pageNum, Integer pageSize, String jobNumber, String regionId, Boolean hasPage) {
return null;
}
private void addUserRegionMappingDO(String userId,String regionId,CurrentUser currentUser){
UserRegionMappingDO userRegionMappingDO = new UserRegionMappingDO();
userRegionMappingDO.setUserId(userId);
userRegionMappingDO.setRegionId(regionId);
userRegionMappingDO.setCreateId(currentUser.getUserId());
userRegionMappingDO.setUpdateId(currentUser.getUserId());
userRegionMappingDO.setCreateTime(System.currentTimeMillis());
userRegionMappingDO.setUpdateTime(System.currentTimeMillis());
//将用户添加到未分组
userRegionMappingDAO.batchInsertRegionMapping(Arrays.asList(userRegionMappingDO));
}
@Override
public List<String> initUserRole(List<EnterpriseUserPageVO> enterpriseUserList) {
List<String> userIdList = ListUtils.emptyIfNull(enterpriseUserList)
.stream()
.map(EnterpriseUserPageVO::getUserId)
.collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(userIdList)){
List<UserRoleDTO> userRoleDTOS = enterpriseUserRoleDAO.getUserAndRolesByUserId(userIdList);
//封装 userId-userRole map,以表示一个用户对应几个角色
Map<String, List<Long>> userRoleDtoMap = new HashMap<>();
userRoleDTOS.forEach(roleDto -> {
List<Long> check = userRoleDtoMap.get(roleDto.getUserId());
if (check == null) {
List<Long> roleDtoList = new ArrayList<>();
roleDtoList.add(roleDto.getRoleId());
userRoleDtoMap.put(roleDto.getUserId(), roleDtoList);
} else {
check.add(roleDto.getRoleId());
userRoleDtoMap.put(roleDto.getUserId(), check);
}
});
//获得角色id -角色名称的map
Map<Long, String> roleNameMap = ListUtils.emptyIfNull(userRoleDTOS)
.stream()
.filter(data -> StringUtils.isNotBlank(data.getRoleName()))
.collect(Collectors.toMap(UserRoleDTO::getRoleId, UserRoleDTO::getRoleName, (a, b) -> a));
enterpriseUserList.forEach(user -> {
List<Long> roleIdList = userRoleDtoMap.get(user.getUserId());
if (roleIdList != null && roleIdList.size() != 0) {
String roleName = roleIdList.stream()
.filter(data -> roleNameMap.get(data) != null)
.map(role -> roleNameMap.get(role))
.collect(Collectors.joining(","));
user.setRoleName(roleName);
}
});
}
return userIdList;
}
@Override
public void updateUserDeptPath(EnterpriseUserRequest user, Map<String, String> deptIdMap) {
List<String> departmentLists = user.getDepartmentLists();
//logger.info("设置用户部门全路径 start department:{},user:{},id:{}",department,user.getUnionid(),user.getId());
if (CollectionUtils.isNotEmpty(departmentLists)) {
//logger.info("into if else department ");
List<String> deptList = Lists.newArrayList();
departmentLists.forEach(deptId -> {
List<String> tmpList = Lists.newArrayList(deptId);
String parentId;
while ((parentId = deptIdMap.get(deptId)) != null && (!parentId.equals(deptId))) {
tmpList.add(parentId);
deptId = parentId;
}
String collect = Lists.reverse(tmpList).stream().map(String::valueOf).collect(Collectors.joining("/"));
String data = collect.startsWith("/") ? collect : "/" + collect;
data = data.endsWith("/") ? data : data + "/";
deptList.add(data);
});
user.setDepartments("[" + String.join(",", deptList) + "]");
}
}
@Override
public EnterpriseUserDO getUserInfoByUserId(String userId) {

View File

@@ -37,20 +37,17 @@ public class LoginServiceImpl implements LoginService {
@Resource
private SysRoleDAO sysRoleDAO;
@Resource
private LoginRecordDAO loginRecordDAO;
@Resource
private RedisUtilPool redisUtilPool;
@Resource
private EnterpriseUserRoleDAO enterpriseUserRoleDAO;
@Override
public Object feiShuLogin(String userId, String corpId, Boolean needRefreshToken, String appType, String avatar) {
log.info("isvLogin, corpId={}, userId={}, appType={}", corpId, userId, appType);
public Object feiShuLogin(String userId, Boolean needRefreshToken, String avatar) {
log.info("isvLogin, corpId={}, userId={}", userId);
DataSourceContext.clearDataSourceType();
if (StringUtils.isEmpty(userId)) {
throw new ServiceException(ErrorCodeEnum.USER_NOT_EXIST);
}
if (StringUtils.isEmpty(corpId)) {
throw new ServiceException(ErrorCodeEnum.ENTERPRISE_NOT_EXIST);
}
CurrentUser currentUser = new CurrentUser();
RefreshUser refreshUser = new RefreshUser();
// 查企业用户
@@ -58,7 +55,7 @@ public class LoginServiceImpl implements LoginService {
if(enterpriseUser == null){
throw new ServiceException(ErrorCodeEnum.NOT_AUTH);
}
SysRoleDO sysRole = sysRoleDAO.getHighestPrioritySysRoleDoByUserId(userId);
SysRoleDO sysRole = sysRoleDAO.getHighestPriorityRoleByUserId(userId);
if(Objects.isNull(sysRole)){
log.info("当前用户没角色:{}", userId);
throw new ServiceException(ErrorCodeEnum.NOT_AUTH);
@@ -77,7 +74,7 @@ public class LoginServiceImpl implements LoginService {
currentUser.setUserId(enterpriseUser.getUserId());
currentUser.setIsAdmin(enterpriseUser.getIsAdmin());
//设置当前登录人使用的企业相关信息
currentUser.setRoleAuth(sysRole.getRoleAuth());
//currentUser.setRoleAuth(sysRole.getRoleAuth());
currentUser.setSysRoleDO(sysRole);
//生成令牌
RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();
@@ -85,7 +82,6 @@ public class LoginServiceImpl implements LoginService {
String refreshToken = randomNumberGenerator.nextBytes().toHex();
currentUser.setName(enterpriseUser.getName());
currentUser.setAccessToken(token);
currentUser.setAppType(appType);
JSONObject jsonObject = new JSONObject();
jsonObject.put("action_token", token);
jsonObject.put("user", currentUser);
@@ -94,7 +90,6 @@ public class LoginServiceImpl implements LoginService {
redisUtilPool.setString(currentUser.getUserId(), token);
redisUtilPool.setString(CommonConstants.REFRESH_TOKEN_KEY+":"+refreshToken,JSON.toJSONString(refreshUser), CommonConstants.REFRESH_TOKEN_EXPIRE);
jsonObject.put("refresh_token",refreshToken);
loginRecordDAO.addLoginRecord(currentUser.getUserId());
log.info("[" + enterpriseUser.getName() + "; action_token"+ token + "; userId" + currentUser.getUserId() +"]登入系统成功");
return jsonObject;
}

View File

@@ -1,18 +1,12 @@
package com.cool.store.service.impl;
import com.cool.store.dao.RegionDAO;
import com.cool.store.entity.RegionDO;
import com.cool.store.enums.RegionTypeEnum;
import com.cool.store.mq.producer.SimpleMessageService;
import com.cool.store.service.RegionService;
import com.cool.store.utils.RedisConstantUtil;
import com.cool.store.utils.RedisUtil;
import com.cool.store.utils.UUIDUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* @author zhangchenbiao
@@ -28,38 +22,7 @@ public class RegionServiceImpl implements RegionService {
@Resource
private RedisConstantUtil redisConstantUtil;
@Resource
private RegionDAO regionDAO;
@Resource
private SimpleMessageService simpleMessageService;
@Transactional(rollbackFor = Exception.class)
@Override
public void saveRegionAndStore(RegionDO regionDO, String userId) {
String storeId = null;
if(regionDO.getStoreRange()){
storeId = UUIDUtils.get32UUID();
}
regionDO.setStoreId(storeId);
regionDO.setRegionType(RegionTypeEnum.PATH.getType());
RegionDO oldRegion = regionDAO.getBySynDingDeptId(regionDO.getSynDingDeptId());
boolean isAdd = oldRegion == null;
if (isAdd) {
if(regionDO.getStoreRange()){
regionDO.setStoreId(storeId);
regionDO.setRegionType(RegionTypeEnum.STORE.getType());
}
regionDAO.ignoreInsert(regionDO);
} else {
if(regionDO.getStoreRange()){
regionDO.setRegionType(RegionTypeEnum.STORE.getType());
}
regionDAO.updateSyncRegion(regionDO);
}
}
@Override
public void removeRegions(List<Long> regionIds) {
regionDAO.removeRegion(regionIds);
}
}