Merge remote-tracking branch 'origin/cc_20230520_partner' into cc_20230520_partner
# Conflicts: # coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -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,51 @@ 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(regionIds))){
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user