diff --git a/ballcat-admin/ballcat-admin-core/pom.xml b/ballcat-admin/ballcat-admin-core/pom.xml index 2a07b170..fd39c754 100644 --- a/ballcat-admin/ballcat-admin-core/pom.xml +++ b/ballcat-admin/ballcat-admin-core/pom.xml @@ -39,6 +39,10 @@ org.springframework.security.oauth spring-security-oauth2 + + com.hccake + ballcat-spring-boot-starter-mail + \ No newline at end of file diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/constants/NotifyChannel.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/constants/NotifyChannel.java new file mode 100644 index 00000000..3ec3041b --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/constants/NotifyChannel.java @@ -0,0 +1,24 @@ +package com.hccake.ballcat.admin.constants; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 通知接收方式 + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum NotifyChannel { + + // 站内 + STATION(1), + // 短信 + SMS(2), + // 邮件 + MAIL(3); + + private final int value; + +} diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/listener/AnnouncementEventListener.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/listener/AnnouncementEventListener.java index a1672492..afc0ac14 100644 --- a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/listener/AnnouncementEventListener.java +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/listener/AnnouncementEventListener.java @@ -1,28 +1,46 @@ 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.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; + /** * 公告事件监听器 * * @author Hccake 2020/12/17 * @version 1.0 */ +@Slf4j @Component @RequiredArgsConstructor public class AnnouncementEventListener { + private final NotifyPushRunner notifyPusherRunner; + /** - * 公告发布事件处理 + * // TODO 同步处理,失败回滚 公告发布事件处理 * @param event the AnnouncementPublishEvent */ @EventListener(AnnouncementPublishEvent.class) public void onAnnouncementPublishEvent(AnnouncementPublishEvent event) { - // TODO 公告通知 - System.out.println(event.getAnnouncement()); + Announcement announcement = event.getAnnouncement(); + + // TODO 根据接收人条件筛选 + List userList = new ArrayList<>(); + SysUser sysUser = new SysUser(); + sysUser.setEmail("chengbohua@foxmail.com"); + userList.add(sysUser); + + // 推送通知 + notifyPusherRunner.run(announcement, userList, announcement.getReceiveMode()); } } diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/entity/Announcement.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/entity/Announcement.java index 00da08fc..88955f52 100644 --- a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/entity/Announcement.java +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/entity/Announcement.java @@ -20,7 +20,7 @@ import java.util.List; * @author hccake 2020-12-15 17:01:15 */ @Data -@TableName("notify_announcement") +@TableName(value = "notify_announcement", autoResultMap = true) @EqualsAndHashCode(callSuper = true) @ApiModel(value = "公告信息") public class Announcement extends Model { diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/vo/AnnouncementVO.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/vo/AnnouncementVO.java index 9890412f..b700fa4e 100644 --- a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/vo/AnnouncementVO.java +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/model/vo/AnnouncementVO.java @@ -1,5 +1,7 @@ package com.hccake.ballcat.admin.modules.notify.model.vo; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -46,12 +48,14 @@ public class AnnouncementVO { * 对应接收人筛选方式的条件信息,多个用逗号分割。如角色标识,组织ID,用户类型,用户ID等 */ @ApiModelProperty(value = "对应接收人筛选方式的条件信息。如角色标识,组织ID,用户类型,用户ID等") + @TableField(typeHandler = JacksonTypeHandler.class) private List recipientFilterCondition; /** * 接收方式 */ @ApiModelProperty(value = "接收方式") + @TableField(typeHandler = JacksonTypeHandler.class) private List receiveMode; /** diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/MailNotifyPusher.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/MailNotifyPusher.java new file mode 100644 index 00000000..a9b81e27 --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/MailNotifyPusher.java @@ -0,0 +1,40 @@ +package com.hccake.ballcat.admin.modules.notify.push; + +import com.hccake.ballcat.admin.constants.NotifyChannel; +import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement; +import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser; +import com.hccake.ballcat.common.mail.sender.MailSender; +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 MailNotifyPusher implements NotifyPusher { + + private final MailSender mailSender; + + /** + * 当前发布者的推送方式 + * @return 推送方式 + */ + @Override + public Integer notifyChannel() { + return NotifyChannel.MAIL.getValue(); + } + + @Override + public void push(Announcement announcement, List userList) { + List emails = userList.stream().map(SysUser::getEmail).collect(Collectors.toList()); + mailSender.sendHtmlMail(announcement.getTitle(), announcement.getContent(), emails); + } + +} diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPushRunner.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPushRunner.java new file mode 100644 index 00000000..287a6146 --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPushRunner.java @@ -0,0 +1,66 @@ +package com.hccake.ballcat.admin.modules.notify.push; + +import cn.hutool.core.collection.CollectionUtil; +import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement; +import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 通知消息推送执行器 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Slf4j +@Component +public class NotifyPushRunner { + + private final Map notifyPusherMap = new LinkedHashMap<>(); + + public NotifyPushRunner(List notifyPusherList) { + if (CollectionUtil.isNotEmpty(notifyPusherList)) { + for (NotifyPusher notifyPusher : notifyPusherList) { + this.addNotifyPusher(notifyPusher); + } + } + } + + /** + * 添加通知推送者 + * @param notifyPusher 通知推送者 + */ + public void addNotifyPusher(NotifyPusher notifyPusher) { + this.notifyPusherMap.put(notifyPusher.notifyChannel(), notifyPusher); + } + + /** + * 执行通知推送 + * @param announcement 公告信息 + * @param userList 用户列表 + * @param receiveModes 接收模式(推送渠道) + */ + public void run(Announcement announcement, List userList, List receiveModes) { + for (Integer notifyChannel : receiveModes) { + try { + NotifyPusher notifyPusher = notifyPusherMap.get(notifyChannel); + + if (notifyPusher == null) { + log.error("Unknown notify channel:[{}],announcement id:[{}]", notifyChannel, announcement.getId()); + } + else { + notifyPusher.push(announcement, userList); + } + } + catch (Exception e) { + log.error("push notify error in channel:[{}],announcement id:[{}]", notifyChannel, + announcement.getId()); + } + } + } + +} diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPusher.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPusher.java new file mode 100644 index 00000000..0c244dc8 --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/NotifyPusher.java @@ -0,0 +1,29 @@ +package com.hccake.ballcat.admin.modules.notify.push; + +import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement; +import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser; + +import java.util.List; + +/** + * 通知发布者 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +public interface NotifyPusher { + + /** + * 当前发布者对应的推送渠道 + * @return 推送方式对应的标识 + */ + Integer notifyChannel(); + + /** + * 推送通知 + * @param announcement 公告 + * @param userList 用户列表 + */ + void push(Announcement announcement, List userList); + +} diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/SmsNotifyPusher.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/SmsNotifyPusher.java new file mode 100644 index 00000000..04784880 --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/SmsNotifyPusher.java @@ -0,0 +1,35 @@ +package com.hccake.ballcat.admin.modules.notify.push; + +import com.hccake.ballcat.admin.constants.NotifyChannel; +import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement; +import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 短信通知发布 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Component +public class SmsNotifyPusher implements NotifyPusher { + + /** + * 当前发布者对应的接收方式 + * @return 推送方式 + */ + @Override + public Integer notifyChannel() { + return NotifyChannel.SMS.getValue(); + } + + @Override + public void push(Announcement announcement, List userList) { + List phoneList = userList.stream().map(SysUser::getPhone).collect(Collectors.toList()); + System.out.println("短信推送"); + } + +} diff --git a/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/StationNotifyPusher.java b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/StationNotifyPusher.java new file mode 100644 index 00000000..4e5c584f --- /dev/null +++ b/ballcat-admin/ballcat-admin-core/src/main/java/com/hccake/ballcat/admin/modules/notify/push/StationNotifyPusher.java @@ -0,0 +1,33 @@ +package com.hccake.ballcat.admin.modules.notify.push; + +import com.hccake.ballcat.admin.constants.NotifyChannel; +import com.hccake.ballcat.admin.modules.notify.model.entity.Announcement; +import com.hccake.ballcat.admin.modules.sys.model.entity.SysUser; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 消息通知站内推送 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Component +public class StationNotifyPusher implements NotifyPusher { + + /** + * 当前发布者对应的接收方式 + * @return 推送方式 + */ + @Override + public Integer notifyChannel() { + return NotifyChannel.STATION.getValue(); + } + + @Override + public void push(Announcement announcement, List userList) { + System.out.println("站内信推送"); + } + +}