新增组织架构相关

This commit is contained in:
zhangchenbiao
2023-06-12 16:42:39 +08:00
parent eb9dc4116a
commit a2d58d3dcc
27 changed files with 552 additions and 34 deletions

View File

@@ -8,7 +8,7 @@ import com.aliyun.openservices.ons.api.bean.Subscription;
import com.cool.store.constants.CommonConstants;
import com.cool.store.enums.RocketMqGroupEnum;
import com.cool.store.mq.RocketMqConfig;
import com.cool.store.mq.consumer.listener.TestListener;
import com.cool.store.mq.consumer.listener.UserEventDealListener;
import com.google.common.collect.Maps;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -29,7 +29,7 @@ public class ConsumerClient {
@Resource
private RocketMqConfig rocketMqConfig;
@Resource
private TestListener testListener;
private UserEventDealListener userEventDealListener;
/**
* 获取通用配置
@@ -71,12 +71,12 @@ public class ConsumerClient {
*/
@Bean(initMethod = "start", destroyMethod = "shutdown")
public ConsumerBean test() {
RocketMqGroupEnum groupEnum = RocketMqGroupEnum.TEST;
RocketMqGroupEnum groupEnum = RocketMqGroupEnum.DING_MSG_DEAL;
ConsumerBean consumerBean = new ConsumerBean();
//配置文件
Properties properties = getCommonProperties(groupEnum);
consumerBean.setProperties(properties);
Map<Subscription, MessageListener> commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, testListener);
Map<Subscription, MessageListener> commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, userEventDealListener);
//订阅多个topic如上面设置
consumerBean.setSubscriptionTable(commonSubscriptionTable);
return consumerBean;

View File

@@ -0,0 +1,58 @@
package com.cool.store.mq.consumer.listener;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dto.buser.UserEventDTO;
import com.cool.store.service.EnterpriseSyncService;
import com.cool.store.utils.RedisUtilPool;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author zhangchenbiao
* @FileName: EnterpriseInitService
* @Description: 消息监听
* @date 2023-06-09 16:28
*/
@Slf4j
@Service
public class UserEventDealListener implements MessageListener {
@Autowired
private RedisUtilPool redisUtilPool;
@Autowired
private EnterpriseSyncService enterpriseSyncService;
@Override
public Action consume(Message message, ConsumeContext context) {
String text = new String(message.getBody());
if(StringUtils.isBlank(text)){
log.info("消息体为空,tag:{},messageId:{}",message.getTag(),message.getMsgID());
return Action.CommitMessage;
}
log.info("重试消费次数 messageId{}try times{}", message.getMsgID(), message.getReconsumeTimes());
String lockKey = "DingMsgDealListener:" + message.getMsgID();
boolean lock = redisUtilPool.setNxExpire(lockKey, message.getMsgID(), CommonConstants.NORMAL_LOCK_TIMES);
if(lock){
try {
UserEventDTO reqBody = JSONObject.parseObject(text, UserEventDTO.class);
enterpriseSyncService.userUpdateEvent(reqBody);
}catch (Exception e){
log.error("DingMsgDealListener consume dealAddressBookChange error",e);
return Action.ReconsumeLater;
} finally {
redisUtilPool.delKey(lockKey);
}
log.info("消费成功,tag:{},messageId:{}",message.getTag(),message.getMsgID());
return Action.CommitMessage;
}
return Action.ReconsumeLater;
}
}

View File

@@ -1,5 +1,7 @@
package com.cool.store.service;
import com.cool.store.dto.buser.UserEventDTO;
/**
* @author zhangchenbiao
* @FileName: EnterpriseInitService
@@ -9,4 +11,10 @@ package com.cool.store.service;
public interface EnterpriseSyncService {
void syncAll();
/**
* 飞书人员事件
* @param param
*/
void userUpdateEvent(UserEventDTO param);
}

View File

@@ -1,5 +1,9 @@
package com.cool.store.service;
import com.cool.store.vo.region.RegionBaseInfoVO;
import java.util.List;
/**
* @author zhangchenbiao
* @FileName: RegionService
@@ -8,4 +12,10 @@ package com.cool.store.service;
*/
public interface RegionService {
/**
* 获取组织架构基本信息列表
* @return
*/
RegionBaseInfoVO getRegionBaseInfoList();
}

View File

@@ -2,6 +2,7 @@ package com.cool.store.service.impl;
import com.cool.store.constants.CommonConstants;
import com.cool.store.dao.*;
import com.cool.store.dto.buser.UserEventDTO;
import com.cool.store.dto.enterprise.*;
import com.cool.store.entity.*;
import com.cool.store.enums.DataSourceEnum;
@@ -9,6 +10,7 @@ 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 javafx.util.Pair;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils;
@@ -19,6 +21,8 @@ import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
import static com.cool.store.enums.FSEventTypeEnum.*;
/**
* @author zhangchenbiao
* @FileName: EnterpriseInitService
@@ -46,19 +50,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
@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);
Pair<List<RegionDO>, Multimap<String, String>> listMultimapPair = syncRegion();
List<RegionDO> regionList = listMultimapPair.getKey();
Multimap<String, String> leaderDeptMap = listMultimapPair.getValue();
Multimap<String, String> roleUserMap = ArrayListMultimap.create();
//同步用户及部门
syncUserAndUserRegion(regionList, roleUserMap, leaderDeptMap);
@@ -72,9 +66,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
roleIds.add(sysRole.getRoleId());
Collection<String> userIds = roleUserMap.get(roleName);
insertOrUpdateList.add(sysRole);
userRoleInsertOrUpdateList.addAll(EnterpriseUserRoleDO.convertDO(sysRole.getRoleId(), new ArrayList<>(userIds)));
userRoleInsertOrUpdateList.addAll(EnterpriseUserRoleDO.convertSyncDO(sysRole.getRoleId(), new ArrayList<>(userIds)));
//删除角色下不存在的用户
enterpriseUserRoleDAO.deleteUserRole(sysRole.getRoleId(), DataSourceEnum.SYNC, new ArrayList<>(userIds));
enterpriseUserRoleDAO.deleteRoleInUser(sysRole.getRoleId(), DataSourceEnum.SYNC, new ArrayList<>(userIds));
}
sysRoleDAO.batchInsertSelective(insertOrUpdateList);
enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList);
@@ -86,6 +80,32 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
}
private Pair<List<RegionDO>, Multimap<String, String>> syncRegion(){
//同步部门
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);
//添加根节点
regionList.add(getRootRegion(authInfo));
List<String> regionIds = regionList.stream().map(RegionDO::getRegionId).distinct().collect(Collectors.toList());
//批量插入
regionDAO.batchInsertOrUpdate(regionList);
//删除不存在的区域
regionDAO.deleteNotExistRegion(regionIds);
//删除区域管理的人员
userRegionMappingDAO.deleteRegionUserByExcludeRegionIds(regionIds);
return new Pair<>(regionList, leaderDeptMap);
}
/**
* 处理用户及部门之间的关系
* @param regionList
* @param roleUserMap
* @param leaderDeptMap
*/
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<>();
@@ -117,6 +137,7 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList);
//删除不存在的用户
enterpriseUserDAO.deleteUser(userIds);
userRegionMappingDAO.deleteRegionUserByExcludeUserIds(userIds);
}
/**
@@ -132,6 +153,50 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
rootRegion.setThirdDeptId(CommonConstants.ROOT_DEPT_ID_STR);
rootRegion.setOrderNum(CommonConstants.ZERO);
rootRegion.setRegionPath(CommonConstants.PATH_SPILT + rootRegion.getRegionId() + CommonConstants.PATH_SPILT);
rootRegion.setDeleted(Boolean.FALSE);
return rootRegion;
}
@Override
public void userUpdateEvent(UserEventDTO param) {
switch (parseValue(param.getEventType())){
case USER_CREATED:
case USER_UPDATED:
EnterpriseUserDTO userDetail = isvHttpRequest.getUserDetailByUserId(param.getOpenId());
List<String> departmentLists = userDetail.getDepartmentLists();
Multimap<String, String> leaderDeptMap = ArrayListMultimap.create();
Map<String, String> regionPathMap = new HashMap<>();
if(CollectionUtils.isNotEmpty(departmentLists)){
List<RegionDO> regionList = regionDAO.getRegionByRegionIds(departmentLists);
List<String> regionIds = ListUtils.emptyIfNull(regionList).stream().map(RegionDO::getRegionId).collect(Collectors.toList());
//判断两个集合是否都是包含关系
if(!(regionIds.containsAll(departmentLists) && departmentLists.containsAll(regionList))){
Pair<List<RegionDO>, Multimap<String, String>> regionPair = syncRegion();
regionList = regionPair.getKey();
leaderDeptMap = regionPair.getValue();
}
regionPathMap = regionList.stream().collect(Collectors.toMap(k->k.getRegionId(), v->v.getRegionPath()));
userRegionMappingDAO.batchInsertOrUpdateUserRegion(UserRegionMappingDO.convertSyncDO(departmentLists, userDetail.getUserId()));
}
String jobTitle = userDetail.getJobTitle();
if(StringUtils.isNotBlank(jobTitle)){
SysRoleDO role = sysRoleDAO.getRoleByName(jobTitle, DataSourceEnum.SYNC);
if(Objects.isNull(role)){
//新增角色
role = SysRoleDO.convertSyncDO(jobTitle);
sysRoleDAO.batchInsertSelective(new ArrayList<>(Arrays.asList(role)));
}
List<EnterpriseUserRoleDO> enterpriseUserRole = EnterpriseUserRoleDO.convertSyncDO(role.getRoleId(), new ArrayList<>(Arrays.asList(userDetail.getUserId())));
enterpriseUserRoleDAO.batchInsertOrUpdate(enterpriseUserRole);
enterpriseUserRoleDAO.deleteUserInRole(userDetail.getUserId(), DataSourceEnum.SYNC, role.getRoleId());
}
EnterpriseUserDO enterpriseUser = EnterpriseUserDTO.transUserDtoToDo(userDetail, regionPathMap, leaderDeptMap);
enterpriseUserDAO.batchInsertOrUpdate(new ArrayList<>(Arrays.asList(enterpriseUser)));
break;
case USER_DELETED:
break;
default:
return;
}
}
}

View File

@@ -1,12 +1,16 @@
package com.cool.store.service.impl;
import com.cool.store.dao.RegionDAO;
import com.cool.store.entity.RegionDO;
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.vo.region.RegionBaseInfoVO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author zhangchenbiao
@@ -20,9 +24,12 @@ public class RegionServiceImpl implements RegionService {
@Resource
private RedisUtil redisUtil;
@Resource
private RedisConstantUtil redisConstantUtil;
@Resource
private SimpleMessageService simpleMessageService;
private RegionDAO regionDAO;
@Override
public RegionBaseInfoVO getRegionBaseInfoList() {
List<RegionDO> regionBaseInfoList = regionDAO.getRegionBaseInfoList();
return RegionBaseInfoVO.convertTree(regionBaseInfoList);
}
}