【8.1.0】【notice】发送系统通知打通发送个人消息

pull/60/head
fengshuonan 2024-01-14 22:57:34 +08:00
parent 9f284f1867
commit 9ad569cdae
4 changed files with 256 additions and 2 deletions

View File

@ -0,0 +1,78 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api.enums.message;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.base.ReadableEnum;
import lombok.Getter;
/**
*
* <p>
*
*
* @author fengshuonan
* @since 2024/1/14 22:55
*/
@Getter
public enum MessageBusinessTypeEnum implements ReadableEnum<MessageBusinessTypeEnum> {
/**
*
*/
SYS_NOTICE("SYS_NOTICE", "系统通知");
private final String code;
private final String message;
MessageBusinessTypeEnum(String code, String message) {
this.code = code;
this.message = message;
}
@Override
public Object getKey() {
return this.code;
}
@Override
public Object getName() {
return this.message;
}
@Override
public MessageBusinessTypeEnum parseToEnum(String originValue) {
if (ObjectUtil.isEmpty(originValue)) {
return null;
}
for (MessageBusinessTypeEnum value : MessageBusinessTypeEnum.values()) {
if (value.code.equals(originValue)) {
return value;
}
}
return null;
}
}

View File

@ -0,0 +1,81 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.sys.api.enums.message;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.rule.base.ReadableEnum;
import lombok.Getter;
/**
*
*
* @author fengshuonan
* @since 2024/1/14 22:53
*/
@Getter
public enum MessageTypeEnum implements ReadableEnum<MessageTypeEnum> {
/**
*
*/
NORMAL("NORMAL", "普通类型"),
/**
*
*/
URL("URL", "带链接跳转");
private final String code;
private final String message;
MessageTypeEnum(String code, String message) {
this.code = code;
this.message = message;
}
@Override
public Object getKey() {
return this.code;
}
@Override
public Object getName() {
return this.message;
}
@Override
public MessageTypeEnum parseToEnum(String originValue) {
if (ObjectUtil.isEmpty(originValue)) {
return null;
}
for (MessageTypeEnum value : MessageTypeEnum.values()) {
if (value.code.equals(originValue)) {
return value;
}
}
return null;
}
}

View File

@ -0,0 +1,43 @@
package cn.stylefeng.roses.kernel.sys.modular.notice.factory;
import cn.stylefeng.roses.kernel.sys.api.enums.message.MessageBusinessTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.enums.message.MessageTypeEnum;
import cn.stylefeng.roses.kernel.sys.api.pojo.message.MessageSendDTO;
import cn.stylefeng.roses.kernel.sys.modular.notice.entity.SysNotice;
import java.util.Set;
/**
*
*
* @author fengshuonan
* @since 2024/1/14 22:47
*/
public class NoticeFactory {
/**
*
*
* @author fengshuonan
* @since 2024/1/14 22:47
*/
public static MessageSendDTO createMessageSendDTO(Set<Long> userIdList, SysNotice noticeInfo) {
MessageSendDTO messageSendDTO = new MessageSendDTO();
messageSendDTO.setUserIdList(userIdList);
messageSendDTO.setSendUserId(noticeInfo.getCreateUser());
messageSendDTO.setMessageTitle(noticeInfo.getNoticeTitle());
messageSendDTO.setMessageContent(noticeInfo.getNoticeContent());
messageSendDTO.setMessageType(MessageTypeEnum.NORMAL.getMessage());
// 优先级
messageSendDTO.setPriorityLevel(noticeInfo.getPriorityLevel());
// 业务类型:系统通知
messageSendDTO.setBusinessType(MessageBusinessTypeEnum.SYS_NOTICE.getMessage());
messageSendDTO.setBusinessId(String.valueOf(noticeInfo.getNoticeId()));
return messageSendDTO;
}
}

View File

@ -7,9 +7,13 @@ import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
import cn.stylefeng.roses.kernel.rule.exception.base.ServiceException;
import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
import cn.stylefeng.roses.kernel.sys.api.MessagePublishApi;
import cn.stylefeng.roses.kernel.sys.api.SysUserOrgServiceApi;
import cn.stylefeng.roses.kernel.sys.api.enums.notice.NoticePublishStatusEnum;
import cn.stylefeng.roses.kernel.sys.modular.notice.entity.SysNotice;
import cn.stylefeng.roses.kernel.sys.modular.notice.enums.SysNoticeExceptionEnum;
import cn.stylefeng.roses.kernel.sys.modular.notice.factory.NoticeFactory;
import cn.stylefeng.roses.kernel.sys.modular.notice.mapper.SysNoticeMapper;
import cn.stylefeng.roses.kernel.sys.modular.notice.pojo.NoticeUserScope;
import cn.stylefeng.roses.kernel.sys.modular.notice.pojo.request.SysNoticeRequest;
@ -20,7 +24,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
*
@ -31,6 +39,12 @@ import java.util.List;
@Service
public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice> implements SysNoticeService {
@Resource
private MessagePublishApi messagePublishApi;
@Resource
private SysUserOrgServiceApi sysUserOrgServiceApi;
@Override
@Transactional(rollbackFor = Exception.class)
public void add(SysNoticeRequest sysNoticeRequest) {
@ -90,7 +104,8 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
LambdaQueryWrapper<SysNotice> wrapper = createWrapper(sysNoticeRequest);
// 只查询需要的字段
wrapper.select(SysNotice::getNoticeId, SysNotice::getNoticeTitle, SysNotice::getPublishStatus, SysNotice::getPriorityLevel, SysNotice::getNoticeBeginTime,
wrapper.select(SysNotice::getNoticeId, SysNotice::getNoticeTitle, SysNotice::getPublishStatus, SysNotice::getPriorityLevel,
SysNotice::getNoticeBeginTime,
SysNotice::getNoticeEndTime,
BaseEntity::getCreateUser, BaseEntity::getCreateTime);
@ -107,7 +122,12 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
sysNotice.setPublishStatus(NoticePublishStatusEnum.ALREADY.getCode());
this.updateById(sysNotice);
// 2. 发送通知给接收人
// 2. 获取发送对象全部转化为用户id
NoticeUserScope noticeUserScope = sysNoticeRequest.getNoticeUserScope();
Set<Long> noticeUserList = this.getNoticeUserList(noticeUserScope);
// 3. 发送通知给接收人
messagePublishApi.batchSendMessage(NoticeFactory.createMessageSendDTO(noticeUserList, sysNotice));
}
@Override
@ -120,6 +140,8 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
this.updateById(sysNotice);
// 2. 调用撤回接口,将已发送的消息全都撤回
}
@Override
@ -191,4 +213,34 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
}
}
/**
* id
*
* @author fengshuonan
* @since 2024/1/14 22:46
*/
private Set<Long> getNoticeUserList(NoticeUserScope noticeUserScope) {
// 初始化用户集合
Set<Long> userIdCollection = new LinkedHashSet<>();
// 添加通知中的用户集合
List<SimpleDict> pointUserList = noticeUserScope.getPointUserList();
if (ObjectUtil.isNotEmpty(pointUserList)) {
userIdCollection.addAll(pointUserList.stream().map(SimpleDict::getId).collect(Collectors.toList()));
}
// 组织机构id转化为用户id
List<SimpleDict> pointOrgList = noticeUserScope.getPointOrgList();
if (ObjectUtil.isNotEmpty(pointOrgList)) {
Set<Long> orgUserIdList = sysUserOrgServiceApi.getOrgUserIdList(
pointOrgList.stream().map(SimpleDict::getId).collect(Collectors.toSet()));
if (ObjectUtil.isNotEmpty(orgUserIdList)) {
userIdCollection.addAll(orgUserIdList);
}
}
return userIdCollection;
}
}