消息通知接收人筛选

This commit is contained in:
b2baccline
2020-12-22 00:06:44 +08:00
parent d261b7abc7
commit 394a1245a8
13 changed files with 406 additions and 26 deletions

View File

@@ -0,0 +1,28 @@
package com.hccake.ballcat.admin.constants;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 通知接收者筛选类型
* @author Hccake 2020/12/21
* @version 1.0
*/
@Getter
@RequiredArgsConstructor
public enum NotifyRecipientFilterType {
// 全部
ALL(1),
// 指定用户
SPECIFY_ROLE(2),
// 指定组织
SPECIFY_ORGANIZATION(3),
// 指定用户类型
SPECIFY_USER_TYPE(4),
// 指定用户
SPECIFY_USER(5),;
private final int value;
}

View File

@@ -3,13 +3,13 @@ package com.hccake.ballcat.admin.modules.notify.listener;
import com.hccake.ballcat.admin.modules.notify.event.AnnouncementPublishEvent;
import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement;
import com.hccake.ballcat.admin.modules.notify.push.NotifyPushRunner;
import com.hccake.ballcat.admin.modules.notify.recipient.RecipientHandler;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
@@ -23,6 +23,8 @@ import java.util.List;
@RequiredArgsConstructor
public class AnnouncementEventListener {
private final RecipientHandler recipientHandler;
private final NotifyPushRunner notifyPusherRunner;
/**
@@ -33,11 +35,11 @@ public class AnnouncementEventListener {
public void onAnnouncementPublishEvent(AnnouncementPublishEvent event) {
Announcement announcement = event.getAnnouncement();
// TODO 根据接收人条件筛选
List<SysUser> userList = new ArrayList<>();
SysUser sysUser = new SysUser();
sysUser.setEmail("chengbohua@foxmail.com");
userList.add(sysUser);
// 获取通知接收人
Integer recipientFilterType = announcement.getRecipientFilterType();
List<Object> recipientFilterCondition = announcement.getRecipientFilterCondition();
List<SysUser> userList = recipientHandler.query(recipientFilterType, recipientFilterCondition);
log.trace("公告接收用户:[{}]", userList);
// 推送通知
notifyPusherRunner.run(announcement, userList, announcement.getReceiveMode());

View File

@@ -0,0 +1,41 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.constants.NotifyRecipientFilterType;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Component
@RequiredArgsConstructor
public class AllRecipientFilter implements RecipientFilter {
private final SysUserService sysUserService;
/**
* 当前筛选器对应的筛选类型
* @return 筛选类型对应的标识
* @see NotifyRecipientFilterType
*/
@Override
public Integer filterType() {
return NotifyRecipientFilterType.ALL.getValue();
}
/**
* 接收者筛选
* @param filterCondition 筛选条件
* @return 接收者集合
*/
@Override
public List<SysUser> filter(List<Object> filterCondition) {
return sysUserService.list();
}
}

View File

@@ -0,0 +1,29 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import java.util.List;
/**
* 接收者筛选器
*
* @author Hccake 2020/12/21
* @version 1.0
*/
public interface RecipientFilter {
/**
* 当前筛选器对应的筛选类型
* @see com.hccake.ballcat.admin.constants.NotifyRecipientFilterType
* @return 筛选类型对应的标识
*/
Integer filterType();
/**
* 接收者筛选
* @param filterCondition 筛选条件
* @return 接收者集合
*/
List<SysUser> filter(List<Object> filterCondition);
}

View File

@@ -0,0 +1,37 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Slf4j
@Component
public class RecipientHandler {
private final Map<Integer, RecipientFilter> recipientFilterMap = new LinkedHashMap<>();
public RecipientHandler(List<RecipientFilter> recipientFilterList) {
for (RecipientFilter recipientFilter : recipientFilterList) {
this.recipientFilterMap.put(recipientFilter.filterType(), recipientFilter);
}
}
public List<SysUser> query(Integer filterType, List<Object> filterCondition) {
RecipientFilter recipientFilter = recipientFilterMap.get(filterType);
if (recipientFilter == null) {
log.error("Unknown recipient filter[{}]filterCondition{}", filterType, filterCondition);
return new ArrayList<>();
}
return recipientFilter.filter(filterCondition);
}
}

View File

@@ -0,0 +1,43 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.constants.NotifyRecipientFilterType;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Component
@RequiredArgsConstructor
public class SpecifyOrganizationRecipientFilter implements RecipientFilter {
private final SysUserService sysUserService;
/**
* 当前筛选器对应的筛选类型
* @return 筛选类型对应的标识
* @see NotifyRecipientFilterType
*/
@Override
public Integer filterType() {
return NotifyRecipientFilterType.SPECIFY_ORGANIZATION.getValue();
}
/**
* 接收者筛选
* @param filterCondition 筛选条件
* @return 接收者集合
*/
@Override
public List<SysUser> filter(List<Object> filterCondition) {
List<Integer> organizationIds = filterCondition.stream().map(x -> (Integer) x).collect(Collectors.toList());
return sysUserService.selectUsersByOrganizationIds(organizationIds);
}
}

View File

@@ -0,0 +1,43 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.constants.NotifyRecipientFilterType;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Component
@RequiredArgsConstructor
public class SpecifyRoleRecipientFilter implements RecipientFilter {
private final SysUserService sysUserService;
/**
* 当前筛选器对应的筛选类型
* @return 筛选类型对应的标识
* @see NotifyRecipientFilterType
*/
@Override
public Integer filterType() {
return NotifyRecipientFilterType.SPECIFY_ROLE.getValue();
}
/**
* 接收者筛选
* @param filterCondition 筛选条件
* @return 接收者集合
*/
@Override
public List<SysUser> filter(List<Object> filterCondition) {
List<String> roleCodes = filterCondition.stream().map(x -> (String) x).collect(Collectors.toList());
return sysUserService.selectUsersByRoleCodes(roleCodes);
}
}

View File

@@ -0,0 +1,43 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.constants.NotifyRecipientFilterType;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Component
@RequiredArgsConstructor
public class SpecifyUserRecipientFilter implements RecipientFilter {
private final SysUserService sysUserService;
/**
* 当前筛选器对应的筛选类型
* @return 筛选类型对应的标识
* @see NotifyRecipientFilterType
*/
@Override
public Integer filterType() {
return NotifyRecipientFilterType.SPECIFY_USER.getValue();
}
/**
* 接收者筛选
* @param filterCondition 筛选条件 用户ID集合
* @return 接收者集合
*/
@Override
public List<SysUser> filter(List<Object> filterCondition) {
List<Integer> userIds = filterCondition.stream().map(x -> (Integer) x).collect(Collectors.toList());
return sysUserService.selectUsersByUserIds(userIds);
}
}

View File

@@ -0,0 +1,43 @@
package com.hccake.ballcat.admin.modules.notify.recipient;
import com.hccake.ballcat.admin.constants.NotifyRecipientFilterType;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author Hccake 2020/12/21
* @version 1.0
*/
@Component
@RequiredArgsConstructor
public class SpecifyUserTypeRecipientFilter implements RecipientFilter {
private final SysUserService sysUserService;
/**
* 当前筛选器对应的筛选类型
* @return 筛选类型对应的标识
* @see NotifyRecipientFilterType
*/
@Override
public Integer filterType() {
return NotifyRecipientFilterType.SPECIFY_USER_TYPE.getValue();
}
/**
* 接收者筛选
* @param filterCondition 筛选条件
* @return 接收者集合
*/
@Override
public List<SysUser> filter(List<Object> filterCondition) {
List<Integer> userTypes = filterCondition.stream().map(x -> (Integer) x).collect(Collectors.toList());
return sysUserService.selectUsersByUserTypes(userTypes);
}
}

View File

@@ -28,10 +28,10 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
/**
* 根据RoleCode 查询对应用户
* @param roleCode 角色标识
* @param roleCodes 角色标识
* @return List<SysUser> 该角色标识对应的用户列表
*/
List<SysUser> selectUsersByRoleCode(String roleCode);
List<SysUser> selectUsersByRoleCodes(@Param("roleCodes") List<String> roleCodes);
/**
* 返回用户的select数据 name=> username value => userId

View File

@@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hccake.ballcat.admin.modules.sys.model.dto.SysUserDTO;
import com.hccake.ballcat.admin.modules.sys.model.dto.SysUserScope;
import com.hccake.ballcat.admin.modules.sys.model.dto.UserInfoDTO;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser;
import com.hccake.ballcat.admin.modules.sys.model.qo.SysUserQO;
import com.hccake.ballcat.admin.modules.sys.model.dto.UserInfoDTO;
import com.hccake.ballcat.admin.modules.sys.model.vo.SysUserVO;
import com.hccake.ballcat.common.core.vo.SelectData;
import org.springframework.web.multipart.MultipartFile;
@@ -105,6 +105,34 @@ public interface SysUserService extends IService<SysUser> {
*/
List<SysUser> selectUsersByRoleCode(String roleCode);
/**
* 根据角色查询用户
* @param roleCodes 角色标识集合
* @return List<SysUser> 用户集合
*/
List<SysUser> selectUsersByRoleCodes(List<String> roleCodes);
/**
* 根据组织机构ID查询用户
* @param organizationIds 组织机构id集合
* @return 用户集合
*/
List<SysUser> selectUsersByOrganizationIds(List<Integer> organizationIds);
/**
* 根据用户类型查询用户
* @param userTypes 用户类型集合
* @return 用户集合
*/
List<SysUser> selectUsersByUserTypes(List<Integer> userTypes);
/**
* 根据用户Id集合查询用户
* @param userIds 用户Id集合
* @return 用户集合
*/
List<SysUser> selectUsersByUserIds(List<Integer> userIds);
/**
* 返回用户的select数据
* @param type 为空时返回所有客户为1返回系统客户 name=> username value => userId

View File

@@ -274,7 +274,47 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
*/
@Override
public List<SysUser> selectUsersByRoleCode(String roleCode) {
return baseMapper.selectUsersByRoleCode(roleCode);
return selectUsersByRoleCodes(Collections.singletonList(roleCode));
}
/**
* 根据角色查询用户
* @param roleCodes 角色标识集合
* @return List<SysUser>
*/
@Override
public List<SysUser> selectUsersByRoleCodes(List<String> roleCodes) {
return baseMapper.selectUsersByRoleCodes(roleCodes);
}
/**
* 根据组织机构ID查询用户
* @param organizationIds 组织机构id集合
* @return 用户集合
*/
@Override
public List<SysUser> selectUsersByOrganizationIds(List<Integer> organizationIds) {
return baseMapper.selectList(Wrappers.<SysUser>lambdaQuery().in(SysUser::getOrganizationId, organizationIds));
}
/**
* 根据用户类型查询用户
* @param userTypes 用户类型集合
* @return 用户集合
*/
@Override
public List<SysUser> selectUsersByUserTypes(List<Integer> userTypes) {
return baseMapper.selectList(Wrappers.<SysUser>lambdaQuery().in(SysUser::getType, userTypes));
}
/**
* 根据用户Id集合查询用户
* @param userIds 用户Id集合
* @return 用户集合
*/
@Override
public List<SysUser> selectUsersByUserIds(List<Integer> userIds) {
return baseMapper.selectList(Wrappers.<SysUser>lambdaQuery().in(SysUser::getUserId, userIds));
}
/**

View File

@@ -3,7 +3,10 @@
<mapper namespace="com.hccake.ballcat.admin.modules.sys.mapper.SysUserMapper">
<sql id="Base_Alias_Column_List">
su.user_id,
su
.
user_id
,
su.username,
su.nickname,
su.avatar,
@@ -23,26 +26,28 @@
, so.name as organization_name
FROM sys_user su
LEFT JOIN
sys_organization so
sys_organization so
ON su.organization_id = so.id
${ew.customSqlSegment}
</select>
<!-- 通过用户ID查询其关联的角色ID-->
<select id="selectUsersByRoleCode" resultType="com.hccake.ballcat.admin.modules.sys.model.entity.SysUser">
SELECT
<select id="selectUsersByRoleCodes" resultType="com.hccake.ballcat.admin.modules.sys.model.entity.SysUser">
SELECT
<include refid="Base_Alias_Column_List"/>
FROM
sys_user su
FROM
sys_user su
left join
sys_user_role ur
on su.user_id = ur.user_id
left join
sys_role r
on r.code = ur.role_code
WHERE r.`code` = #{0}
and su.deleted = 0
</select>
sys_user_role ur
on su.user_id = ur.user_id
WHERE
ur.`role_code`
in
<foreach collection="roleCodes" item="roleCode" separator="," open="(" close=")">
#{roleCode}
</foreach>
and su.deleted = 0
</select>
<select id="getSelectData" resultType="com.hccake.ballcat.common.core.vo.SelectData">
select
@@ -58,6 +63,4 @@
</foreach>
</if>
</select>
</mapper>