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;
+ }
+
}