diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageBusinessTypeEnum.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageBusinessTypeEnum.java new file mode 100644 index 000000000..50a8874f4 --- /dev/null +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageBusinessTypeEnum.java @@ -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. + * + * Guns采用APACHE 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:55 + */ +@Getter +public enum MessageBusinessTypeEnum implements ReadableEnum { + + /** + * 系统通知 + */ + 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; + } +} diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageTypeEnum.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageTypeEnum.java new file mode 100644 index 000000000..6a5747950 --- /dev/null +++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/sys/api/enums/message/MessageTypeEnum.java @@ -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. + * + * Guns采用APACHE 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 { + + /** + * 普通类型 + */ + 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; + } +} diff --git a/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/factory/NoticeFactory.java b/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/factory/NoticeFactory.java new file mode 100644 index 000000000..9af57e607 --- /dev/null +++ b/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/factory/NoticeFactory.java @@ -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 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; + } + +} diff --git a/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/service/impl/SysNoticeServiceImpl.java b/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/service/impl/SysNoticeServiceImpl.java index 5f8a27a77..dc030e0b9 100644 --- a/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/service/impl/SysNoticeServiceImpl.java +++ b/kernel-s-system/system-business-portal/src/main/java/cn/stylefeng/roses/kernel/sys/modular/notice/service/impl/SysNoticeServiceImpl.java @@ -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 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 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 noticeUserList = this.getNoticeUserList(noticeUserScope); + + // 3. 发送通知给接收人 + messagePublishApi.batchSendMessage(NoticeFactory.createMessageSendDTO(noticeUserList, sysNotice)); } @Override @@ -120,6 +140,8 @@ public class SysNoticeServiceImpl extends ServiceImpl getNoticeUserList(NoticeUserScope noticeUserScope) { + + // 初始化用户集合 + Set userIdCollection = new LinkedHashSet<>(); + + // 添加通知中的用户集合 + List pointUserList = noticeUserScope.getPointUserList(); + if (ObjectUtil.isNotEmpty(pointUserList)) { + userIdCollection.addAll(pointUserList.stream().map(SimpleDict::getId).collect(Collectors.toList())); + } + + // 组织机构id转化为用户id + List pointOrgList = noticeUserScope.getPointOrgList(); + if (ObjectUtil.isNotEmpty(pointOrgList)) { + Set orgUserIdList = sysUserOrgServiceApi.getOrgUserIdList( + pointOrgList.stream().map(SimpleDict::getId).collect(Collectors.toSet())); + if (ObjectUtil.isNotEmpty(orgUserIdList)) { + userIdCollection.addAll(orgUserIdList); + } + } + + return userIdCollection; + } + }