新增组织架构相关

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

@@ -22,6 +22,8 @@ public class CommonConstants {
public static final int THREE_DAY_SECONDS = 60*60*24*3; public static final int THREE_DAY_SECONDS = 60*60*24*3;
public static final int NORMAL_LOCK_TIMES = 60 * 1000;
/** /**
* 企业开通锁存活时间 * 企业开通锁存活时间
*/ */

View File

@@ -0,0 +1,59 @@
package com.cool.store.enums;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @author Admin
* @ClassName FsEventTypeEnum
* @Description fs的事件类型
*/
public enum FSEventTypeEnum {
//
USER_CREATED("contact.user.created_v3","员工入职"),
USER_DELETED("contact.user.deleted_v3", "员工离职"),
USER_UPDATED("contact.user.updated_v3", "员工信息被修改"),
DEPARTMENT_CREATED("contact.department.created_v3", "部门被创建"),
DEPARTMENT_UPDATED("contact.department.updated_v3", "部门信息被修改"),
DEPARTMENT_DELETED("contact.department.deleted_v3", "部门被删除"),
APP_OPEN("app_open", "首次启用应用"),
APP_STATUS_CHANGE("app_status_change", "应用停启用"),
APP_TICKET("app_ticket", "app_ticket 事件"),
APP_UNINSTALLED("app_uninstalled", "应用卸载"),
CONTACT_SCOPE_UPDATE("contact.scope.updated_v3", "通讯录范围权限被更新"),
ORDER_PAID("order_paid", "应用商店应用购买"),
;
private final String value;
private final String remark;
private static final Map<String, FSEventTypeEnum> map = Arrays.stream(values()).collect(Collectors.toMap(FSEventTypeEnum::getValue, Function.identity()));
FSEventTypeEnum(String value, String remark) {
this.value = value;
this.remark = remark;
}
public String getValue() {
return value;
}
public static FSEventTypeEnum parseValue(String value) {
return map.get(value);
}
public static boolean isUserEvent(String eventType){
return FSEventTypeEnum.USER_CREATED.getValue().equals(eventType) || FSEventTypeEnum.USER_UPDATED.getValue().equals(eventType) || FSEventTypeEnum.USER_DELETED.getValue().equals(eventType);
}
public static boolean isDepartmentEvent(String eventType){
return FSEventTypeEnum.DEPARTMENT_CREATED.getValue().equals(eventType) || FSEventTypeEnum.DEPARTMENT_UPDATED.getValue().equals(eventType) || FSEventTypeEnum.DEPARTMENT_DELETED.getValue().equals(eventType);
}
}

View File

@@ -29,11 +29,18 @@ public class EnterpriseUserRoleDAO {
return enterpriseUserRoleMapper.batchInsertOrUpdate(recordList); return enterpriseUserRoleMapper.batchInsertOrUpdate(recordList);
} }
public Integer deleteUserRole(String roleId, DataSourceEnum dataSourceEnum, List<String> userIds){ public Integer deleteRoleInUser(String roleId, DataSourceEnum dataSourceEnum, List<String> excludeUserIds){
if(StringUtils.isBlank(roleId) || Objects.isNull(dataSourceEnum)){ if(StringUtils.isBlank(roleId) || Objects.isNull(dataSourceEnum)){
return null; return null;
} }
return enterpriseUserRoleMapper.deleteUserRole(roleId, dataSourceEnum.getCode(), userIds); return enterpriseUserRoleMapper.deleteRoleInUser(roleId, dataSourceEnum.getCode(), excludeUserIds);
}
public Integer deleteUserInRole(String userId, DataSourceEnum dataSourceEnum, String excludeRoleId){
if(StringUtils.isAnyBlank(userId, excludeRoleId) || Objects.isNull(dataSourceEnum)){
return null;
}
return enterpriseUserRoleMapper.deleteUserInRole(userId, dataSourceEnum.getCode(), excludeRoleId);
} }
} }

View File

@@ -3,6 +3,7 @@ package com.cool.store.dao;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.entity.RegionDO; import com.cool.store.entity.RegionDO;
import com.cool.store.mapper.RegionMapper; import com.cool.store.mapper.RegionMapper;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@@ -37,4 +38,15 @@ public class RegionDAO {
return regionMapper.deleteNotExistRegion(regionIds); return regionMapper.deleteNotExistRegion(regionIds);
} }
public List<RegionDO> getRegionByRegionIds(List<String> regionIds){
if(CollectionUtils.isEmpty(regionIds)){
return Lists.newArrayList();
}
return regionMapper.getRegionByRegionIds(regionIds);
}
public List<RegionDO> getRegionBaseInfoList(){
return regionMapper.getRegionBaseInfoList();
}
} }

View File

@@ -43,4 +43,11 @@ public class SysRoleDAO {
} }
return sysRoleMapper.getHighestPriorityRoleByUserId(userId); return sysRoleMapper.getHighestPriorityRoleByUserId(userId);
} }
public SysRoleDO getRoleByName(String roleName, DataSourceEnum dataSource){
if(StringUtils.isBlank(roleName) || Objects.isNull(dataSource)){
return null;
}
return sysRoleMapper.getRoleByName(roleName, dataSource.getCode());
}
} }

View File

@@ -37,4 +37,18 @@ public class UserRegionMappingDAO {
return userRegionMappingMapper.deleteUserRegion(regionId, dataSourceEnum.getCode(), excludeUserIds); return userRegionMappingMapper.deleteUserRegion(regionId, dataSourceEnum.getCode(), excludeUserIds);
} }
public Integer deleteRegionUserByExcludeRegionIds(List<String> excludeRegionIds){
if(CollectionUtils.isEmpty(excludeRegionIds)){
return null;
}
return userRegionMappingMapper.deleteRegionUserByExcludeRegionIds(excludeRegionIds);
}
public Integer deleteRegionUserByExcludeUserIds(List<String> excludeUserIds){
if(CollectionUtils.isEmpty(excludeUserIds)){
return null;
}
return userRegionMappingMapper.deleteRegionUserByExcludeUserIds(excludeUserIds);
}
} }

View File

@@ -32,5 +32,7 @@ public interface EnterpriseUserRoleMapper {
* @param userIds * @param userIds
* @return * @return
*/ */
int deleteUserRole(@Param("roleId") String roleId, @Param("type") Integer type, @Param("userIds") List<String> userIds); int deleteRoleInUser(@Param("roleId") String roleId, @Param("type") Integer type, @Param("excludeUserIds") List<String> excludeUserIds);
int deleteUserInRole(@Param("userId") String userId, @Param("type") Integer type, @Param("excludeRoleId") String excludeRoleId);
} }

View File

@@ -31,4 +31,17 @@ public interface RegionMapper {
* @return * @return
*/ */
int deleteNotExistRegion(@Param("regionIds")List<String> regionIds); int deleteNotExistRegion(@Param("regionIds")List<String> regionIds);
/**
* 根据regionIds获取region
* @param regionIds
* @return
*/
List<RegionDO> getRegionByRegionIds(@Param("regionIds")List<String> regionIds);
/**
* 获取区域基本信息
* @return
*/
List<RegionDO> getRegionBaseInfoList();
} }

View File

@@ -33,4 +33,11 @@ public interface SysRoleMapper {
* @return * @return
*/ */
SysRoleDO getHighestPriorityRoleByUserId(@Param("userId") String userId); SysRoleDO getHighestPriorityRoleByUserId(@Param("userId") String userId);
/**
* 获取角色
* @param roleName
* @return
*/
SysRoleDO getRoleByName(@Param("roleName") String roleName, @Param("roleType")Integer roleType);
} }

View File

@@ -33,4 +33,18 @@ public interface UserRegionMappingMapper {
* @return * @return
*/ */
int deleteUserRegion(@Param("regionId") String regionId, @Param("type")Integer type, @Param("excludeUserIds") List<String> excludeUserIds); int deleteUserRegion(@Param("regionId") String regionId, @Param("type")Integer type, @Param("excludeUserIds") List<String> excludeUserIds);
/**
* 删除没有的部门映射关系
* @param excludeRegionIds
* @return
*/
Integer deleteRegionUserByExcludeRegionIds(@Param("excludeRegionIds") List<String> excludeRegionIds);
/**
* 删除用户不在的区域
* @param excludeUserIds
* @return
*/
Integer deleteRegionUserByExcludeUserIds(@Param("excludeUserIds") List<String> excludeUserIds);
} }

View File

@@ -5,12 +5,13 @@
<id column="id" jdbcType="INTEGER" property="id"/> <id column="id" jdbcType="INTEGER" property="id"/>
<result column="role_id" jdbcType="VARCHAR" property="roleId"/> <result column="role_id" jdbcType="VARCHAR" property="roleId"/>
<result column="user_id" jdbcType="VARCHAR" property="userId"/> <result column="user_id" jdbcType="VARCHAR" property="userId"/>
<result column="type" jdbcType="INTEGER" property="type"/>
<result column="deleted" jdbcType="BIT" property="deleted"/> <result column="deleted" jdbcType="BIT" property="deleted"/>
<result column="create_time" jdbcType="TIMESTAMP" property="createTime"/> <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, role_id, user_id, deleted, create_time, update_time id, role_id, user_id, type, deleted, create_time, update_time
</sql> </sql>
<insert id="batchInsertOrUpdate"> <insert id="batchInsertOrUpdate">
<foreach collection="recordList" separator=";" item="record"> <foreach collection="recordList" separator=";" item="record">
@@ -22,6 +23,9 @@
<if test="record.userId != null"> <if test="record.userId != null">
user_id, user_id,
</if> </if>
<if test="record.type != null">
type,
</if>
<if test="record.deleted != null"> <if test="record.deleted != null">
deleted, deleted,
</if> </if>
@@ -39,6 +43,9 @@
<if test="record.userId != null"> <if test="record.userId != null">
#{record.userId}, #{record.userId},
</if> </if>
<if test="record.type != null">
#{record.type},
</if>
<if test="record.deleted != null"> <if test="record.deleted != null">
#{record.deleted}, #{record.deleted},
</if> </if>
@@ -61,6 +68,9 @@
<if test="userId != null"> <if test="userId != null">
user_id = #{userId}, user_id = #{userId},
</if> </if>
<if test="type != null">
type = #{type},
</if>
<if test="deleted != null"> <if test="deleted != null">
deleted = #{deleted}, deleted = #{deleted},
</if> </if>
@@ -74,7 +84,11 @@
where id = #{id} where id = #{id}
</update> </update>
<update id="deleteUserRole"> <update id="deleteRoleInUser">
update enterprise_user_role set deleted = 1 where role_id = #{roleId} and user_id not in <foreach collection="userIds" item="userId" separator="," open="(" close=")">#{userId}</foreach> update enterprise_user_role set deleted = 1 where role_id = #{roleId} and type = #{type} and user_id not in <foreach collection="excludeUserIds" item="userId" separator="," open="(" close=")">#{userId}</foreach>
</update>
<update id="deleteUserInRole">
update enterprise_user_role set deleted = 1 where role_id != #{roleId} and user_id = #{userId} and type = #{type}
</update> </update>
</mapper> </mapper>

View File

@@ -158,4 +158,23 @@
<update id="deleteNotExistRegion"> <update id="deleteNotExistRegion">
update region set deleted = 1 , update_time = UNIX_TIMESTAMP() where region_id not in <foreach collection="regionIds" separator="," item="regionId" open="(" close=")"> #{regionId}</foreach> update region set deleted = 1 , update_time = UNIX_TIMESTAMP() where region_id not in <foreach collection="regionIds" separator="," item="regionId" open="(" close=")"> #{regionId}</foreach>
</update> </update>
<select id="getRegionByRegionIds" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from
region
where
region_id in <foreach collection="regionIds" item="regionId" separator="," open="(" close=")">#{regionId}</foreach>
</select>
<select id="getRegionBaseInfoList" resultMap="BaseResultMap">
select
region_id, name, parent_id
from
region
where
deleted = 0
</select>
</mapper> </mapper>

View File

@@ -126,7 +126,16 @@
from from
sys_role r inner join enterprise_user_role e on r.role_id = e.role_id sys_role r inner join enterprise_user_role e on r.role_id = e.role_id
where where
e.user_id = #{userId} e.user_id = #{userId} and r.deleted = 0
limit 1 limit 1
</select> </select>
<select id="getRoleByName" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from
sys_role
where
role_name = #{roleName} and role_type = #{roleType} and deleted = 0 limit 1
</select>
</mapper> </mapper>

View File

@@ -104,10 +104,19 @@
where id = #{id} where id = #{id}
</update> </update>
<delete id="deleteUserRegion"> <update id="deleteUserRegion">
update user_region_mapping set deleted = 1 where region_id = #{regionId} and type = #{type} update user_region_mapping set deleted = 1 where region_id = #{regionId} and type = #{type}
<if test="excludeUserIds != null and excludeUserIds.size() > 0"> <if test="excludeUserIds != null and excludeUserIds.size() > 0">
and user_id not in <foreach collection="excludeUserIds" separator="," open="(" close=")" item="userId" >#{userId}</foreach> and user_id not in <foreach collection="excludeUserIds" separator="," open="(" close=")" item="userId" >#{userId}</foreach>
</if> </if>
</delete> </update>
<update id="deleteRegionUserByExcludeRegionIds">
update user_region_mapping set deleted = 1 where region_id not in <foreach collection="excludeRegionIds" open="(" close=")" separator="," item="regionId">#{regionId}</foreach>
</update>
<update id="deleteRegionUserByExcludeUserIds">
update user_region_mapping set deleted = 1 where user_id not in <foreach collection="excludeUserIds" open="(" close=")" separator="," item="userId">#{userId}</foreach>
</update>
</mapper> </mapper>

View File

@@ -0,0 +1,24 @@
package com.cool.store.dto.buser;
import lombok.Data;
/**
* @author zhangchenbiao
* @FileName: UserEventDTO
* @Description:
* @date 2023-06-09 13:53
*/
@Data
public class UserEventDTO {
private String corpId;
private String eventType;
private String userId;
private String openId;
private String unionId;
}

View File

@@ -93,7 +93,7 @@ public class EnterpriseUserDTO implements Serializable {
private String openUserid; private String openUserid;
@ApiModelProperty("") @ApiModelProperty("用户所属部门")
private List<String> departmentLists; private List<String> departmentLists;
@@ -141,4 +141,39 @@ public class EnterpriseUserDTO implements Serializable {
return resultList; return resultList;
} }
public static EnterpriseUserDO transUserDtoToDo(EnterpriseUserDTO user, Map<String, String> regionPathMap, Multimap<String, String> leaderDeptMap) {
EnterpriseUserDO enterpriseUserDO = new EnterpriseUserDO();
enterpriseUserDO.setId(UUIDUtils.get32UUID());
enterpriseUserDO.setUserId(user.getUserId());
enterpriseUserDO.setName(user.getName());
enterpriseUserDO.setRemark(user.getRemark());
enterpriseUserDO.setMobile(user.getMobile());
enterpriseUserDO.setEmail(user.getEmail());
enterpriseUserDO.setOrgEmail(user.getOrgEmail());
enterpriseUserDO.setMainAdmin(user.getMainAdmin());
enterpriseUserDO.setIsAdmin(user.getIsAdmin());
enterpriseUserDO.setUnionid(user.getUnionid());
enterpriseUserDO.setAvatar(user.getAvatar());
enterpriseUserDO.setJobnumber(user.getJobnumber());
enterpriseUserDO.setUserStatus(UserStatusEnum.NORMAL.getCode());
enterpriseUserDO.setIsLeader(Boolean.FALSE);
List<String> departmentLists = user.getDepartmentLists();
List<String> regionPaths = new ArrayList<>();
if(CollectionUtils.isNotEmpty(departmentLists)){
for (String departmentId : departmentLists) {
regionPaths.add(regionPathMap.get(departmentId));
}
}
Collection<String> deptIds = leaderDeptMap.get(user.getUserId());
if(CollectionUtils.isNotEmpty(deptIds)){
enterpriseUserDO.setIsLeader(Boolean.TRUE);
enterpriseUserDO.setLeaderDeptIds(JSONObject.toJSONString(deptIds));
}
enterpriseUserDO.setUserRegionIds(JSONObject.toJSONString(regionPaths));
enterpriseUserDO.setDeleted(Boolean.FALSE);
enterpriseUserDO.setCreateTime(new Date());
return enterpriseUserDO;
}
} }

View File

@@ -217,7 +217,7 @@ public class SysDepartmentDTO {
Collections.reverse(pathIds); Collections.reverse(pathIds);
String regionPath = CommonConstants.PATH_SPILT + String.join(CommonConstants.PATH_SPILT, pathIds) + CommonConstants.PATH_SPILT; String regionPath = CommonConstants.PATH_SPILT + String.join(CommonConstants.PATH_SPILT, pathIds) + CommonConstants.PATH_SPILT;
region.setRegionPath(regionPath); region.setRegionPath(regionPath);
region.setDeleted(Boolean.TRUE); region.setDeleted(Boolean.FALSE);
if(CollectionUtils.isNotEmpty(dept.getDeptManagerUseridList())){ if(CollectionUtils.isNotEmpty(dept.getDeptManagerUseridList())){
for (String leader : dept.getDeptManagerUseridList()) { for (String leader : dept.getDeptManagerUseridList()) {
leaderDeptMap.put(leader, dept.getId()); leaderDeptMap.put(leader, dept.getId());

View File

@@ -1,5 +1,6 @@
package com.cool.store.entity; package com.cool.store.entity;
import com.cool.store.enums.DataSourceEnum;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable; import java.io.Serializable;
@@ -32,6 +33,9 @@ public class EnterpriseUserRoleDO implements Serializable {
@ApiModelProperty("用户id") @ApiModelProperty("用户id")
private String userId; private String userId;
@ApiModelProperty("type")
private Integer type;
@ApiModelProperty("删除标识") @ApiModelProperty("删除标识")
private Boolean deleted; private Boolean deleted;
@@ -41,7 +45,7 @@ public class EnterpriseUserRoleDO implements Serializable {
@ApiModelProperty("更新时间") @ApiModelProperty("更新时间")
private Date updateTime; private Date updateTime;
public static List<EnterpriseUserRoleDO> convertDO(String roleId, List<String> userIds){ public static List<EnterpriseUserRoleDO> convertSyncDO(String roleId, List<String> userIds){
if(CollectionUtils.isEmpty(userIds)){ if(CollectionUtils.isEmpty(userIds)){
return Lists.newArrayList(); return Lists.newArrayList();
} }
@@ -50,6 +54,7 @@ public class EnterpriseUserRoleDO implements Serializable {
EnterpriseUserRoleDO userRole = new EnterpriseUserRoleDO(); EnterpriseUserRoleDO userRole = new EnterpriseUserRoleDO();
userRole.setRoleId(roleId); userRole.setRoleId(roleId);
userRole.setUserId(userId); userRole.setUserId(userId);
userRole.setType(DataSourceEnum.SYNC.getCode());
userRole.setDeleted(Boolean.FALSE); userRole.setDeleted(Boolean.FALSE);
userRole.setCreateTime(new Date()); userRole.setCreateTime(new Date());
userRole.setUpdateTime(new Date()); userRole.setUpdateTime(new Date());

View File

@@ -14,6 +14,7 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
/** /**
* *
@@ -69,4 +70,22 @@ public class UserRegionMappingDO implements Serializable {
} }
return resultList; return resultList;
} }
public static List<UserRegionMappingDO> convertSyncDO(List<String> regionIds, String userId){
if(CollectionUtils.isEmpty(regionIds) || StringUtils.isBlank(userId)){
return Lists.newArrayList();
}
List<UserRegionMappingDO> resultList = new ArrayList<>();
for (String regionId : regionIds) {
UserRegionMappingDO userRegion = new UserRegionMappingDO();
userRegion.setRegionId(regionId);
userRegion.setUserId(userId);
userRegion.setType(DataSourceEnum.SYNC.getCode());
userRegion.setCreateTime(System.currentTimeMillis());
userRegion.setUpdateTime(System.currentTimeMillis());
userRegion.setDeleted(Boolean.FALSE);
resultList.add(userRegion);
}
return resultList;
}
} }

View File

@@ -0,0 +1,64 @@
package com.cool.store.vo.region;
import com.cool.store.constants.CommonConstants;
import com.cool.store.entity.RegionDO;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author zhangchenbiao
* @FileName: RegionBaseInfoVO
* @Description:
* @date 2023-06-12 16:08
*/
@Data
public class RegionBaseInfoVO {
@ApiModelProperty("区域id")
private String regionId;
@ApiModelProperty("区域名称")
private String name;
@ApiModelProperty("子区域")
private List<RegionBaseInfoVO> subRegionList;
public RegionBaseInfoVO(String regionId, String name) {
this.regionId = regionId;
this.name = name;
}
public static RegionBaseInfoVO convertTree(List<RegionDO> regionList){
Map<String, List<RegionDO>> parentMap = regionList.stream().collect(Collectors.groupingBy(k -> k.getParentId()));
RegionDO rootRegion = regionList.stream().filter(o -> CommonConstants.ZERO_STR.equals(o.getParentId())).findFirst().get();
RegionBaseInfoVO result = new RegionBaseInfoVO(rootRegion.getRegionId(), rootRegion.getName());
result.setSubRegionList(getSubRegion(rootRegion.getRegionId(), parentMap));
return result;
}
public static List<RegionBaseInfoVO> getSubRegion(String regionId, Map<String, List<RegionDO>> parentMap){
List<RegionBaseInfoVO> resultList = new ArrayList<>();
if(Objects.isNull(parentMap) || StringUtils.isBlank(regionId)){
return resultList;
}
List<RegionDO> subRegion = parentMap.get(regionId);
if(CollectionUtils.isNotEmpty(subRegion)){
for (RegionDO region : subRegion) {
RegionBaseInfoVO regionBaseInfo = new RegionBaseInfoVO(region.getRegionId(), region.getName());
regionBaseInfo.setSubRegionList(getSubRegion(region.getRegionId(), parentMap));
resultList.add(regionBaseInfo);
}
}
return resultList;
}
}

View File

@@ -8,7 +8,7 @@ import com.aliyun.openservices.ons.api.bean.Subscription;
import com.cool.store.constants.CommonConstants; import com.cool.store.constants.CommonConstants;
import com.cool.store.enums.RocketMqGroupEnum; import com.cool.store.enums.RocketMqGroupEnum;
import com.cool.store.mq.RocketMqConfig; 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 com.google.common.collect.Maps;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@@ -29,7 +29,7 @@ public class ConsumerClient {
@Resource @Resource
private RocketMqConfig rocketMqConfig; private RocketMqConfig rocketMqConfig;
@Resource @Resource
private TestListener testListener; private UserEventDealListener userEventDealListener;
/** /**
* 获取通用配置 * 获取通用配置
@@ -71,12 +71,12 @@ public class ConsumerClient {
*/ */
@Bean(initMethod = "start", destroyMethod = "shutdown") @Bean(initMethod = "start", destroyMethod = "shutdown")
public ConsumerBean test() { public ConsumerBean test() {
RocketMqGroupEnum groupEnum = RocketMqGroupEnum.TEST; RocketMqGroupEnum groupEnum = RocketMqGroupEnum.DING_MSG_DEAL;
ConsumerBean consumerBean = new ConsumerBean(); ConsumerBean consumerBean = new ConsumerBean();
//配置文件 //配置文件
Properties properties = getCommonProperties(groupEnum); Properties properties = getCommonProperties(groupEnum);
consumerBean.setProperties(properties); consumerBean.setProperties(properties);
Map<Subscription, MessageListener> commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, testListener); Map<Subscription, MessageListener> commonSubscriptionTable = getCommonSubscriptionTable(groupEnum, userEventDealListener);
//订阅多个topic如上面设置 //订阅多个topic如上面设置
consumerBean.setSubscriptionTable(commonSubscriptionTable); consumerBean.setSubscriptionTable(commonSubscriptionTable);
return consumerBean; 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; package com.cool.store.service;
import com.cool.store.dto.buser.UserEventDTO;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
* @FileName: EnterpriseInitService * @FileName: EnterpriseInitService
@@ -9,4 +11,10 @@ package com.cool.store.service;
public interface EnterpriseSyncService { public interface EnterpriseSyncService {
void syncAll(); void syncAll();
/**
* 飞书人员事件
* @param param
*/
void userUpdateEvent(UserEventDTO param);
} }

View File

@@ -1,5 +1,9 @@
package com.cool.store.service; package com.cool.store.service;
import com.cool.store.vo.region.RegionBaseInfoVO;
import java.util.List;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
* @FileName: RegionService * @FileName: RegionService
@@ -8,4 +12,10 @@ package com.cool.store.service;
*/ */
public interface RegionService { 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.constants.CommonConstants;
import com.cool.store.dao.*; import com.cool.store.dao.*;
import com.cool.store.dto.buser.UserEventDTO;
import com.cool.store.dto.enterprise.*; import com.cool.store.dto.enterprise.*;
import com.cool.store.entity.*; import com.cool.store.entity.*;
import com.cool.store.enums.DataSourceEnum; import com.cool.store.enums.DataSourceEnum;
@@ -9,6 +10,7 @@ import com.cool.store.http.ISVHttpRequest;
import com.cool.store.service.EnterpriseSyncService; import com.cool.store.service.EnterpriseSyncService;
import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import javafx.util.Pair;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.ListUtils; import org.apache.commons.collections4.ListUtils;
@@ -19,6 +21,8 @@ import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.cool.store.enums.FSEventTypeEnum.*;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
* @FileName: EnterpriseInitService * @FileName: EnterpriseInitService
@@ -46,19 +50,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
@Override @Override
public void syncAll() { public void syncAll() {
//同步部门 //同步部门
List<SysDepartmentDTO> departments = isvHttpRequest.getSubDepartments(CommonConstants.ROOT_DEPT_ID_STR, true); Pair<List<RegionDO>, Multimap<String, String>> listMultimapPair = syncRegion();
//获取企业信息 List<RegionDO> regionList = listMultimapPair.getKey();
AuthInfoDTO authInfo = isvHttpRequest.getAuthInfo(); Multimap<String, String> leaderDeptMap = listMultimapPair.getValue();
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(); Multimap<String, String> roleUserMap = ArrayListMultimap.create();
//同步用户及部门 //同步用户及部门
syncUserAndUserRegion(regionList, roleUserMap, leaderDeptMap); syncUserAndUserRegion(regionList, roleUserMap, leaderDeptMap);
@@ -72,9 +66,9 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
roleIds.add(sysRole.getRoleId()); roleIds.add(sysRole.getRoleId());
Collection<String> userIds = roleUserMap.get(roleName); Collection<String> userIds = roleUserMap.get(roleName);
insertOrUpdateList.add(sysRole); 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); sysRoleDAO.batchInsertSelective(insertOrUpdateList);
enterpriseUserRoleDAO.batchInsertOrUpdate(userRoleInsertOrUpdateList); 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){ 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)); Map<String, String> regionPathMap = regionList.stream().collect(Collectors.toMap(RegionDO::getRegionId, RegionDO::getRegionPath));
List<EnterpriseUserDO> userList = new ArrayList<>(); List<EnterpriseUserDO> userList = new ArrayList<>();
@@ -117,6 +137,7 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList); userRegionMappingDAO.batchInsertOrUpdateUserRegion(userRegionList);
//删除不存在的用户 //删除不存在的用户
enterpriseUserDAO.deleteUser(userIds); enterpriseUserDAO.deleteUser(userIds);
userRegionMappingDAO.deleteRegionUserByExcludeUserIds(userIds);
} }
/** /**
@@ -132,6 +153,50 @@ public class EnterpriseSyncServiceImpl implements EnterpriseSyncService {
rootRegion.setThirdDeptId(CommonConstants.ROOT_DEPT_ID_STR); rootRegion.setThirdDeptId(CommonConstants.ROOT_DEPT_ID_STR);
rootRegion.setOrderNum(CommonConstants.ZERO); rootRegion.setOrderNum(CommonConstants.ZERO);
rootRegion.setRegionPath(CommonConstants.PATH_SPILT + rootRegion.getRegionId() + CommonConstants.PATH_SPILT); rootRegion.setRegionPath(CommonConstants.PATH_SPILT + rootRegion.getRegionId() + CommonConstants.PATH_SPILT);
rootRegion.setDeleted(Boolean.FALSE);
return rootRegion; 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; 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.mq.producer.SimpleMessageService;
import com.cool.store.service.RegionService; import com.cool.store.service.RegionService;
import com.cool.store.utils.RedisConstantUtil; import com.cool.store.utils.RedisConstantUtil;
import com.cool.store.utils.RedisUtil; import com.cool.store.utils.RedisUtil;
import com.cool.store.vo.region.RegionBaseInfoVO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
/** /**
* @author zhangchenbiao * @author zhangchenbiao
@@ -20,9 +24,12 @@ public class RegionServiceImpl implements RegionService {
@Resource @Resource
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Resource @Resource
private RedisConstantUtil redisConstantUtil; private RegionDAO regionDAO;
@Resource
private SimpleMessageService simpleMessageService;
@Override
public RegionBaseInfoVO getRegionBaseInfoList() {
List<RegionDO> regionBaseInfoList = regionDAO.getRegionBaseInfoList();
return RegionBaseInfoVO.convertTree(regionBaseInfoList);
}
} }

View File

@@ -0,0 +1,35 @@
package com.cool.store.controller;
import com.cool.store.response.ResponseResult;
import com.cool.store.service.RegionService;
import com.cool.store.vo.region.RegionBaseInfoVO;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author zhangchenbiao
* @FileName: RegionController
* @Description:
* @date 2023-06-12 15:53
*/
@RestController
@RequestMapping({"/v1/region" })
@Slf4j
@Api(tags = "组织架构")
public class RegionController {
@Resource
private RegionService regionService;
@GetMapping("/getRegionList")
public ResponseResult<RegionBaseInfoVO> getRegionBaseInfoList(){
return ResponseResult.success(regionService.getRegionBaseInfoList());
}
}