diff --git a/ad-distribute-admin/admin-core/pom.xml b/ad-distribute-admin/admin-core/pom.xml index 0c93171..9b5b455 100644 --- a/ad-distribute-admin/admin-core/pom.xml +++ b/ad-distribute-admin/admin-core/pom.xml @@ -48,5 +48,12 @@ ad-distribute-starter-web 1.1.0 + + + + com.baiye + distribute-notify-controller + 1.1.0 + diff --git a/ad-distribute-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java b/ad-distribute-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java index 26f8a71..ad346cc 100644 --- a/ad-distribute-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java +++ b/ad-distribute-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java @@ -34,7 +34,7 @@ import org.springframework.security.oauth2.server.resource.introspection.OpaqueT // @ComponentScan({ "com.hccake.ballcat.admin.upms", "com.hccake.ballcat.system", // "com.hccake.ballcat.log", // "com.hccake.ballcat.file", "com.hccake.ballcat.notify" }) -@ComponentScan({ "com.baiye.upms", "com.hccake.ballcat.system" }) +@ComponentScan({ "com.baiye.upms", "com.baiye.system" }) @EnableConfigurationProperties({ SystemProperties.class, SecurityProperties.class }) public class UpmsAutoConfiguration { diff --git a/ad-distribute-admin/admin-websocket/pom.xml b/ad-distribute-admin/admin-websocket/pom.xml index e124ed1..b8ef33f 100644 --- a/ad-distribute-admin/admin-websocket/pom.xml +++ b/ad-distribute-admin/admin-websocket/pom.xml @@ -20,5 +20,12 @@ ad-distribute-starter-websocket 1.1.0 + + com.baiye + distribute-notify-biz + 1.1.0 + compile + + diff --git a/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java b/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java index 97f69b2..5c8a6be 100644 --- a/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java +++ b/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java @@ -14,16 +14,12 @@ import org.springframework.web.socket.server.HandshakeInterceptor; * @author Hccake 2021/1/5 * @version 1.0 */ -@Import({ SystemWebsocketEventListenerConfiguration.class }) +@Import({ SystemWebsocketEventListenerConfiguration.class}) @Configuration @RequiredArgsConstructor public class AdminWebSocketAutoConfiguration { - @Bean - @ConditionalOnMissingBean(UserAttributeHandshakeInterceptor.class) - public HandshakeInterceptor authenticationHandshakeInterceptor() { - return new UserAttributeHandshakeInterceptor(); - } + @Bean @ConditionalOnMissingBean(SessionKeyGenerator.class) @@ -31,4 +27,8 @@ public class AdminWebSocketAutoConfiguration { return new UserSessionKeyGenerator(); } + @Bean + public HandshakeInterceptor authenticationHandshakeInterceptor() { + return new UserAttributeHandshakeInterceptor(); + } } diff --git a/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java b/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java index 34c71a1..921cce5 100644 --- a/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java +++ b/ad-distribute-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java @@ -1,60 +1,67 @@ -// package com.hccake.ballcat.admin.websocket.listener; -// -// import com.hccake.ballcat.common.util.JsonUtils; -// import com.hccake.ballcat.common.websocket.distribute.MessageDO; -// import com.hccake.ballcat.common.websocket.distribute.MessageDistributor; -// import com.hccake.ballcat.notify.event.AnnouncementCloseEvent; -// import com.hccake.ballcat.notify.event.StationNotifyPushEvent; -// import com.hccake.ballcat.notify.handler.NotifyInfoDelegateHandler; -// import com.hccake.ballcat.notify.model.domain.NotifyInfo; -// import com.hccake.ballcat.admin.websocket.message.AnnouncementCloseMessage; -// import com.hccake.ballcat.system.model.entity.SysUser; -// import lombok.RequiredArgsConstructor; -// import lombok.extern.slf4j.Slf4j; -// import org.springframework.context.event.EventListener; -// import org.springframework.scheduling.annotation.Async; -// -// import java.util.List; -// -/// ** -// * @author Hccake 2021/1/5 -// * @version 1.0 -// */ -// @Slf4j -// @RequiredArgsConstructor -// public class NotifyWebsocketEventListener { -// -// private final MessageDistributor messageDistributor; -// -// private final NotifyInfoDelegateHandler notifyInfoDelegateHandler; -// -// /** -// * 公告关闭事件监听 -// * @param event the AnnouncementCloseEvent -// */ -// @Async -// @EventListener(AnnouncementCloseEvent.class) -// public void onAnnouncementCloseEvent(AnnouncementCloseEvent event) { -// // 构建公告关闭的消息体 -// AnnouncementCloseMessage message = new AnnouncementCloseMessage(); -// message.setId(event.getId()); -// String msg = JsonUtils.toJson(message); -// -// // 广播公告关闭信息 -// MessageDO messageDO = new MessageDO().setMessageText(msg).setNeedBroadcast(true); -// messageDistributor.distribute(messageDO); -// } -// -// /** -// * 站内通知推送事件 -// * @param event the StationNotifyPushEvent -// */ -// @Async -// @EventListener(StationNotifyPushEvent.class) -// public void onAnnouncementPublishEvent(StationNotifyPushEvent event) { -// NotifyInfo notifyInfo = event.getNotifyInfo(); -// List userList = event.getUserList(); -// notifyInfoDelegateHandler.handle(userList, notifyInfo); -// } -// -// } +package com.baiye.listener; + + +import com.baiye.distribute.MessageDO; +import com.baiye.distribute.MessageDistributor; +import com.baiye.message.AnnouncementCloseMessage; +import com.baiye.notify.event.AnnouncementCloseEvent; +import com.baiye.notify.event.StationNotifyPushEvent; +import com.baiye.notify.handler.NotifyInfoDelegateHandler; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.util.JsonUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class NotifyWebsocketEventListener { + + private final MessageDistributor messageDistributor; + + private final NotifyInfoDelegateHandler notifyInfoDelegateHandler; + + /** + * 公告关闭事件监听 + * + * @param event the AnnouncementCloseEvent + */ + @Async + @EventListener(AnnouncementCloseEvent.class) + public void onAnnouncementCloseEvent(AnnouncementCloseEvent event) { + // 构建公告关闭的消息体 + AnnouncementCloseMessage message = new AnnouncementCloseMessage(); + message.setId(event.getId()); + String msg = JsonUtils.toJson(message); + + // 广播公告关闭信息 + MessageDO messageDO = new MessageDO().setMessageText(msg).setNeedBroadcast(true); + messageDistributor.distribute(messageDO); + } + + /** + * 站内通知推送事件 + * + * @param event the StationNotifyPushEvent + */ + @Async + @EventListener(StationNotifyPushEvent.class) + public void onAnnouncementPublishEvent(StationNotifyPushEvent event) { + NotifyInfo notifyInfo = event.getNotifyInfo(); + List userList = event.getUserIdList(); + notifyInfoDelegateHandler.handle(userList, notifyInfo); + } + + + + +} diff --git a/ad-distribute-common/common-desensitize/src/test/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler b/ad-distribute-common/common-desensitize/src/test/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler index f5da8dc..b62c14e 100644 --- a/ad-distribute-common/common-desensitize/src/test/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler +++ b/ad-distribute-common/common-desensitize/src/test/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler @@ -1 +1 @@ -com.hccake.common.core.test.desensite.TestDesensitizationHandler \ No newline at end of file +com.baiye.common.core.test.desensite.TestDesensitizationHandler diff --git a/ad-distribute-common/common-websocket/src/main/java/com/baiye/distribute/AbstractMessageDistributor.java b/ad-distribute-common/common-websocket/src/main/java/com/baiye/distribute/AbstractMessageDistributor.java index fc444fb..f7a3fa7 100644 --- a/ad-distribute-common/common-websocket/src/main/java/com/baiye/distribute/AbstractMessageDistributor.java +++ b/ad-distribute-common/common-websocket/src/main/java/com/baiye/distribute/AbstractMessageDistributor.java @@ -55,6 +55,7 @@ public abstract class AbstractMessageDistributor implements MessageDistributor { continue; } for (WebSocketSession wsSession : sessions) { + log.info("============ send message time {} body {} ============", System.currentTimeMillis(), messageText); WebSocketMessageSender.send(wsSession, messageText); } } diff --git a/ad-distribute-notify/distribute-notify-biz/pom.xml b/ad-distribute-notify/distribute-notify-biz/pom.xml new file mode 100644 index 0000000..d1a3be4 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/pom.xml @@ -0,0 +1,29 @@ + + + + com.baiye + ad-distribute-notify + 1.1.0 + + 4.0.0 + distribute-notify-biz + + + + com.baiye + common-websocket + + + + com.baiye + distribute-notify-model + 1.1.0 + + + + com.baiye + system-biz + + + diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/AnnouncementCloseEvent.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/AnnouncementCloseEvent.java new file mode 100644 index 0000000..ecbbd68 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/AnnouncementCloseEvent.java @@ -0,0 +1,23 @@ +package com.baiye.notify.event; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +/** + * 公告关闭事件 + * + * @author Hccake 2021/1/7 + * @version 1.0 + */ +@Getter +@ToString +@AllArgsConstructor +public class AnnouncementCloseEvent { + + /** + * ID + */ + private final Long id; + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/NotifyPublishEvent.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/NotifyPublishEvent.java new file mode 100644 index 0000000..094e091 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/NotifyPublishEvent.java @@ -0,0 +1,26 @@ +package com.baiye.notify.event; + +import com.baiye.notify.model.domain.NotifyInfo; +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +/** + * 通知发布事件 + * + * @author Hccake 2020/12/17 + * @version 1.0 + */ +@Getter +public class NotifyPublishEvent extends ApplicationEvent { + + /** + * 通知信息 + */ + private final NotifyInfo notifyInfo; + + public NotifyPublishEvent(NotifyInfo notifyInfo) { + super(notifyInfo); + this.notifyInfo = notifyInfo; + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/StationNotifyPushEvent.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/StationNotifyPushEvent.java new file mode 100644 index 0000000..ffbd36f --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/StationNotifyPushEvent.java @@ -0,0 +1,28 @@ +package com.baiye.notify.event; + +import com.baiye.notify.model.domain.NotifyInfo; +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Data +@RequiredArgsConstructor +public class StationNotifyPushEvent { + + /** + * 通知信息 + */ + private final NotifyInfo notifyInfo; + + /** + * 推送用户列表 + */ + private final List userIdList; + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/AbstractNotifyInfoHandler.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/AbstractNotifyInfoHandler.java new file mode 100644 index 0000000..cf09276 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/AbstractNotifyInfoHandler.java @@ -0,0 +1,71 @@ +package com.baiye.notify.handler; + +import cn.hutool.core.collection.CollUtil; +import com.baiye.distribute.MessageDO; +import com.baiye.distribute.MessageDistributor; +import com.baiye.message.JsonWebSocketMessage; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; +import com.baiye.util.JsonUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 公告通知 + * + * @author huyuanzhi + * @param event消息对象 + * @param websocket发送消息对象 + */ +public abstract class AbstractNotifyInfoHandler + implements NotifyInfoHandler { + + @Autowired + private MessageDistributor messageDistributor; + + protected final Class clz; + + @SuppressWarnings("unchecked") + protected AbstractNotifyInfoHandler() { + Type superClass = getClass().getGenericSuperclass(); + ParameterizedType type = (ParameterizedType) superClass; + clz = (Class) type.getActualTypeArguments()[0]; + } + + @Override + public void handle(List userIdList, T notifyInfo) { + M message = createMessage(notifyInfo); + String msg = JsonUtils.toJson(message); + List sessionKeys = new ArrayList<>(userIdList); + persistMessage(userIdList, notifyInfo); + MessageDO messageDO = new MessageDO().setMessageText(msg) + .setSessionKeys(sessionKeys) + .setNeedBroadcast(CollUtil.isEmpty(sessionKeys)); + messageDistributor.distribute(messageDO); + } + + @Override + public Class getNotifyClass() { + return this.clz; + } + + /** + * 持久化通知 + * @param userIdList 通知用户列表 + * @param notifyInfo 消息内容 + */ + protected abstract void persistMessage(List userIdList, T notifyInfo); + + /** + * 产生推送消息 + * @param notifyInfo 消息内容 + * @return 分发消息 + */ + protected abstract M createMessage(T notifyInfo); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoDelegateHandler.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoDelegateHandler.java new file mode 100644 index 0000000..b9ace65 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoDelegateHandler.java @@ -0,0 +1,52 @@ +package com.baiye.notify.handler; + +import com.baiye.notify.model.domain.NotifyInfo; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 消息处理代理 + * + * @author huyuanzhi + * @param 消息类型 + */ +@Slf4j +@Component +@AllArgsConstructor +public class NotifyInfoDelegateHandler { + + private final List> notifyInfoHandlers; + + private Map, NotifyInfoHandler> handlerMap; + + @PostConstruct + public void init() { + handlerMap = new HashMap<>(notifyInfoHandlers.size()); + for (NotifyInfoHandler handler : notifyInfoHandlers) { + handlerMap.put(handler.getNotifyClass(), handler); + } + } + + /** + * 代理方法 + * @param userIdList 发送用户列表 + * @param info 消息 + */ + public void handle(List userIdList, T info) { + Assert.notNull(info, "event message cant be null!"); + NotifyInfoHandler notifyInfoHandler = handlerMap.get(info.getClass()); + if (notifyInfoHandler == null) { + log.warn("no notifyHandler bean for class:{},please check!", info.getClass().getName()); + return; + } + notifyInfoHandler.handle(userIdList, info); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoHandler.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoHandler.java new file mode 100644 index 0000000..b496303 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoHandler.java @@ -0,0 +1,29 @@ +package com.baiye.notify.handler; + + +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; + +import java.util.List; + +/** + * event消息处理接口 + * + * @author huyuanzhi + */ +public interface NotifyInfoHandler { + + /** + * 处理消息 + * @param userIdList 发送用户列表 + * @param info 消息 + */ + void handle(List userIdList, T info); + + /** + * 获取消息类型 + * @return 消息类型 + */ + Class getNotifyClass(); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementNotifyInfoHandler.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementNotifyInfoHandler.java new file mode 100644 index 0000000..8e62765 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementNotifyInfoHandler.java @@ -0,0 +1,50 @@ +package com.baiye.notify.handler.impl; + +import com.baiye.notify.handler.AbstractNotifyInfoHandler; +import com.baiye.notify.model.domain.AnnouncementNotifyInfo; +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.service.UserAnnouncementService; +import com.baiye.system.model.entity.SysUser; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 公告通知消息处理器 + * + * @author huyuanzhi + */ +@Component +@RequiredArgsConstructor +public class AnnouncementNotifyInfoHandler + extends AbstractNotifyInfoHandler { + + private final UserAnnouncementService userAnnouncementService; + + @Override + protected void persistMessage(List userIdList, AnnouncementNotifyInfo announcementNotifyInfo) { + List userAnnouncements = new ArrayList<>(userIdList.size()); + // 向指定用户推送 + for (Long userId : userIdList) { + UserAnnouncement userAnnouncement = userAnnouncementService.prodUserAnnouncement + (userId, announcementNotifyInfo.getId(), announcementNotifyInfo.getState(), announcementNotifyInfo.getType(), + announcementNotifyInfo.getMessageKey(), announcementNotifyInfo.getTitle(), announcementNotifyInfo.getContent()); + userAnnouncements.add(userAnnouncement); + } + userAnnouncementService.saveBatch(userAnnouncements); + } + + @Override + protected AnnouncementPushMessage createMessage(AnnouncementNotifyInfo announcementNotifyInfo) { + AnnouncementPushMessage message = new AnnouncementPushMessage(); + message.setId(announcementNotifyInfo.getId()); + message.setTitle(announcementNotifyInfo.getTitle()); + message.setContent(announcementNotifyInfo.getContent()); + message.setImmortal(announcementNotifyInfo.getImmortal()); + message.setDeadline(announcementNotifyInfo.getDeadline()); + return message; + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementPushMessage.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementPushMessage.java new file mode 100644 index 0000000..a205759 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementPushMessage.java @@ -0,0 +1,49 @@ +package com.baiye.notify.handler.impl; + +import com.baiye.message.JsonWebSocketMessage; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +/** + * 公告发布消息 + * + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Getter +@Setter +public class AnnouncementPushMessage extends JsonWebSocketMessage { + + public AnnouncementPushMessage() { + super("announcement-push"); + } + + /** + * ID + */ + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 永久有效的 + * @see com.baiye.ballcat.common.core.constant.enums.BooleanEnum + */ + private Integer immortal; + + /** + * 截止日期 + */ + private LocalDateTime deadline; + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/AnnouncementLoginEventListener.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/AnnouncementLoginEventListener.java new file mode 100644 index 0000000..0c0f886 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/AnnouncementLoginEventListener.java @@ -0,0 +1,93 @@ +package com.baiye.notify.listener; + +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.recipient.RecipientHandler; +import com.baiye.notify.service.AnnouncementService; +import com.baiye.notify.service.UserAnnouncementService; +import com.baiye.security.userdetails.User; +import com.baiye.system.model.entity.SysUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.security.authentication.AbstractAuthenticationToken; +import org.springframework.security.authentication.event.AuthenticationSuccessEvent; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Hccake 2020/12/23 + * @version 1.0 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AnnouncementLoginEventListener { + + private final AnnouncementService announcementService; + + private final RecipientHandler recipientHandler; + + private final UserAnnouncementService userAnnouncementService; + + /** + * 登录成功时间监听 用户未读公告生成 + * @param event 登录成功 event + */ + @EventListener(AuthenticationSuccessEvent.class) + public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) throws InterruptedException { + + AbstractAuthenticationToken source = (AbstractAuthenticationToken) event.getSource(); + Object details = source.getDetails(); + if (!(details instanceof HashMap)) { + return; + } + // https://github.com/spring-projects-experimental/spring-authorization-server + if ("password".equals(((HashMap) details).get("grant_type"))) { + User user = (User) source.getPrincipal(); + SysUser sysUser = getSysUser(user); + + // 获取当前用户未拉取过的公告信息 + Long userId = sysUser.getUserId(); + List announcements = announcementService.listUnPulled(userId); + // 获取当前用户的各个过滤属性 + Map filterAttrs = recipientHandler.getFilterAttrs(sysUser); + // 获取符合当前用户条件的,且接收类型包含站内的公告,保存其关联关系 + List userAnnouncements = announcements.stream() + .filter(x -> x.getReceiveMode().contains(NotifyChannelEnum.STATION.getValue())) + .filter(x -> filterMatched(x, filterAttrs)) + .map(x -> userAnnouncementService.prodUserAnnouncement + (userId, x.getId(), DefaultNumberConstants.ZERO_NUMBER, x.getType(), null, x.getTitle(), x.getContent())) + .collect(Collectors.toList()); + try { + userAnnouncementService.saveBatch(userAnnouncements); + } + catch (Exception exception) { + log.error("用户公告保存失败:[{}]", userAnnouncements, exception); + } + } + } + + private SysUser getSysUser(User user) { + SysUser sysUser = new SysUser(); + sysUser.setUserId(user.getUserId()); + sysUser.setUsername(user.getUsername()); + sysUser.setNickname(user.getNickname()); + sysUser.setAvatar(user.getAvatar()); + sysUser.setOrganizationId(user.getOrganizationId()); + sysUser.setType(user.getType()); + return sysUser; + } + + private boolean filterMatched(Announcement announ, Map filterAttrs) { + Integer type = announ.getRecipientFilterType(); + return recipientHandler.match(type, filterAttrs.get(type), announ.getRecipientFilterCondition()); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/NotifyPublishEventListener.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/NotifyPublishEventListener.java new file mode 100644 index 0000000..92ad3a2 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/NotifyPublishEventListener.java @@ -0,0 +1,37 @@ +package com.baiye.notify.listener; + +import com.baiye.notify.event.NotifyPublishEvent; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.notify.push.NotifyPushExecutor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +/** + * 通知发布事件监听器 + * + * @author Hccake 2020/12/17 + * @version 1.0 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class NotifyPublishEventListener { + + private final NotifyPushExecutor notifyPushExecutor; + + /** + * 通知发布事件 + * @param event the NotifyPublishEvent + */ + @Async + @EventListener(NotifyPublishEvent.class) + public void onNotifyPublishEvent(NotifyPublishEvent event) { + NotifyInfo notifyInfo = event.getNotifyInfo(); + // 推送通知 + notifyPushExecutor.push(notifyInfo); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/AnnouncementMapper.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/AnnouncementMapper.java new file mode 100644 index 0000000..aaa9ffb --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/AnnouncementMapper.java @@ -0,0 +1,76 @@ +package com.baiye.notify.mapper; + +import com.baiye.constant.GlobalConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.notify.enums.AnnouncementStatusEnum; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.qo.AnnouncementQO; +import com.baiye.notify.model.vo.AnnouncementPageVO; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +public interface AnnouncementMapper extends ExtendMapper { + + /** + * 分页查询 + * @param pageParam 分页参数 + * @param qo 查询对象 + * @return 分页结果数据 PageResult + */ + default PageResult queryPage(PageParam pageParam, AnnouncementQO qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapperX = WrappersX.lambdaAliasQueryX(Announcement.class) + .likeIfPresent(Announcement::getTitle, qo.getTitle()) + .inIfPresent(Announcement::getStatus, (Object[]) qo.getStatus()) + .eqIfPresent(Announcement::getRecipientFilterType, qo.getRecipientFilterType()) + .eq(Announcement::getDeleted, GlobalConstants.NOT_DELETED_FLAG); + IPage voPage = this.selectByPage(page, wrapperX); + return new PageResult<>(voPage.getRecords(), voPage.getTotal()); + } + + /** + * 分页查询通知 + * @param page 分页封装对象 + * @param wrapper 条件构造器 + * @return 分页封装对象 + */ + IPage selectByPage(IPage page, + @Param(Constants.WRAPPER) Wrapper wrapper); + + /** + * 更新公共(限制只能更新未发布的公共) + * @param announcement 公共信息 + * @return 更新是否成功 + */ + default boolean updateIfUnpublished(Announcement announcement) { + int flag = this.update(announcement, + Wrappers.lambdaUpdate() + .eq(Announcement::getId, announcement.getId()) + .eq(Announcement::getStatus, AnnouncementStatusEnum.UNPUBLISHED.getValue())); + return SqlHelper.retBool(flag); + } + + /** + * 根据参数获取当前用户拉取过,或者未拉取过的有效的公告信息 + * @param userId 用户ID + * @param pulled 当前用户是否拉取过 + * @return 公告信息列表 + */ + List listUserAnnouncements(@Param("userId") Long userId, @Param("pulled") boolean pulled); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/UserAnnouncementMapper.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/UserAnnouncementMapper.java new file mode 100644 index 0000000..663d67e --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/UserAnnouncementMapper.java @@ -0,0 +1,60 @@ +package com.baiye.notify.mapper; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.notify.converter.UserAnnouncementConverter; +import com.baiye.notify.enums.UserAnnouncementStateEnum; +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.model.qo.UserAnnouncementQO; +import com.baiye.notify.model.vo.UserAnnouncementPageVO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +import java.time.LocalDateTime; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +public interface UserAnnouncementMapper extends ExtendMapper { + + /** + * 分页查询 + * @param pageParam 分页参数 + * @param qo 查询对象 + * @return 分页结果数据 PageResult + */ + default PageResult queryPage(PageParam pageParam, UserAnnouncementQO qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(UserAnnouncement.class); + if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { + wrapperX.between(UserAnnouncement::getCreateTime, qo.getStartTime(), qo.getEndTime()); + } + wrapperX.eqIfPresent(UserAnnouncement::getId, qo.getId()).likeIfPresent(UserAnnouncement::getContent, qo.getContent()) + .orderByDesc(UserAnnouncement::getState).orderByAsc(UserAnnouncement::getId); + this.selectPage(page, wrapperX); + IPage voPage = page.convert(UserAnnouncementConverter.INSTANCE::poToPageVo); + return new PageResult<>(voPage.getRecords(), voPage.getTotal()); + } + + /** + * 更新用户公共信息至已读状态 + * @param userId 用户ID + * @param announcementId 公告ID + */ + default void updateToReadState(Long userId, Long announcementId) { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .set(UserAnnouncement::getState, UserAnnouncementStateEnum.READ.getValue()) + .set(UserAnnouncement::getReadTime, LocalDateTime.now()) + .eq(UserAnnouncement::getAnnouncementId, announcementId) + .eq(UserAnnouncement::getUserId, userId); + this.update(null, wrapper); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/MailNotifyPusher.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/MailNotifyPusher.java new file mode 100644 index 0000000..ad775b9 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/MailNotifyPusher.java @@ -0,0 +1,52 @@ +/* +package com.baiye.notify.push; + +import cn.hutool.core.util.StrUtil; +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; +import lombok.RequiredArgsConstructor; +import org.springframework.mail.MailSender; + +import java.util.List; + +*/ +/** + * 通知邮件发布 + * + * @author Hccake 2020/12/21 + * @version 1.0 + *//* + +@RequiredArgsConstructor +public class MailNotifyPusher implements NotifyPusher { + + private final MailSender mailSender; + + */ +/** + * 当前发布者的推送方式 + * @see NotifyChannelEnum + * @return 推送方式 + *//* + + @Override + public Integer notifyChannel() { + return NotifyChannelEnum.MAIL.getValue(); + } + + @Override + public void push(NotifyInfo notifyInfo, List userList) { + String[] emails = userList.stream().map(SysUser::getEmail).filter(StrUtil::isNotBlank).toArray(String[]::new); + + // 密送群发,不展示其他收件人 + MailDetails mailDetails = new MailDetails(); + mailDetails.setShowHtml(true); + mailDetails.setSubject(notifyInfo.getTitle()); + mailDetails.setContent(notifyInfo.getContent()); + mailDetails.setBcc(emails); + mailSender.sendMail(mailDetails); + } + +} +*/ diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPushExecutor.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPushExecutor.java new file mode 100644 index 0000000..36f8969 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPushExecutor.java @@ -0,0 +1,77 @@ +package com.baiye.notify.push; + +import cn.hutool.core.collection.CollUtil; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.notify.recipient.RecipientHandler; +import com.baiye.system.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 NotifyPushExecutor { + + private final RecipientHandler recipientHandler; + + private final Map notifyPusherMap = new LinkedHashMap<>(); + + public NotifyPushExecutor(RecipientHandler recipientHandler, List notifyPusherList) { + this.recipientHandler = recipientHandler; + if (CollUtil.isNotEmpty(notifyPusherList)) { + for (NotifyPusher notifyPusher : notifyPusherList) { + this.addNotifyPusher(notifyPusher); + } + } + } + + /** + * 添加通知推送者 + * @param notifyPusher 通知推送者 + */ + public void addNotifyPusher(NotifyPusher notifyPusher) { + this.notifyPusherMap.put(notifyPusher.notifyChannel(), notifyPusher); + } + + /** + * 执行通知推送 + * @param notifyInfo 通知信息 + * + */ + public void push(NotifyInfo notifyInfo) { + // 获取通知接收人 + Integer recipientFilterType = notifyInfo.getRecipientFilterType(); + List recipientFilterCondition = notifyInfo.getRecipientFilterCondition(); + List userList = recipientHandler.query(recipientFilterType, recipientFilterCondition); + + // 执行推送 + // TODO 返回推送失败渠道信息,以便重试 + for (Integer notifyChannel : notifyInfo.getReceiveMode()) { + try { + NotifyPusher notifyPusher = notifyPusherMap.get(notifyChannel); + + if (notifyPusher == null) { + log.error("Unknown notify channel:[{}],notifyInfo title:[{}]", notifyChannel, + notifyInfo.getTitle()); + } + else { + notifyPusher.push(notifyInfo, userList); + } + } + catch (Exception e) { + log.error("push notify error in channel:[{}],notifyInfo title:[{}]", notifyChannel, + notifyInfo.getTitle(), e); + } + } + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPusher.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPusher.java new file mode 100644 index 0000000..5b6ddb4 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPusher.java @@ -0,0 +1,33 @@ +package com.baiye.notify.push; + + + +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; + +import java.util.List; + +/** + * 通知发布者 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +public interface NotifyPusher { + + /** + * 当前发布者对应的推送渠道 + * @see NotifyChannelEnum + * @return 推送方式对应的标识 + */ + Integer notifyChannel(); + + /** + * 推送通知 + * @param notifyInfo 通知信息 + * @param userList 用户列表 + */ + void push(NotifyInfo notifyInfo, List userList); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/SmsNotifyPusher.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/SmsNotifyPusher.java new file mode 100644 index 0000000..3c90c4f --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/SmsNotifyPusher.java @@ -0,0 +1,45 @@ +package com.baiye.notify.push; + +import cn.hutool.core.util.StrUtil; + +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; +import com.baiye.util.HtmlUtils; +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 { + + /** + * 当前发布者对应的接收方式 + * @see NotifyChannelEnum + * @return 推送方式 + */ + @Override + public Integer notifyChannel() { + return NotifyChannelEnum.SMS.getValue(); + } + + @Override + public void push(NotifyInfo notifyInfo, List userList) { + List phoneList = userList.stream() + .map(SysUser::getPhoneNumber) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toList()); + // 短信文本去除 html 标签 + String content = HtmlUtils.toText(notifyInfo.getContent()); + // TODO 对接短信发送平台 + System.out.println("短信推送"); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/StationNotifyPusher.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/StationNotifyPusher.java new file mode 100644 index 0000000..818aede --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/StationNotifyPusher.java @@ -0,0 +1,45 @@ +package com.baiye.notify.push; + +; +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.event.StationNotifyPushEvent; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.system.model.entity.SysUser; +import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +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 StationNotifyPusher implements NotifyPusher { + + private final ApplicationEventPublisher publisher; + + /** + * 当前发布者对应的接收方式 + * + * @return 推送方式 + * @see NotifyChannelEnum + */ + @Override + public Integer notifyChannel() { + return NotifyChannelEnum.STATION.getValue(); + } + + @Override + public void push(NotifyInfo notifyInfo, List userList) { + List userIdList = userList.stream().map(SysUser::getUserId).collect(Collectors.toList()); + // 发布事件,监听者进行实际的 websocket 推送 + publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, userIdList)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/AllRecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/AllRecipientFilter.java new file mode 100644 index 0000000..c5ee2a2 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/AllRecipientFilter.java @@ -0,0 +1,62 @@ +package com.baiye.notify.recipient; + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; +import com.baiye.system.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 NotifyRecipientFilterTypeEnum + */ + @Override + public Integer filterType() { + return NotifyRecipientFilterTypeEnum.ALL.getValue(); + } + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 + * @return 接收者集合 + */ + @Override + public List filter(List filterCondition) { + return sysUserService.list(); + } + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + @Override + public Object getFilterAttr(SysUser sysUser) { + return null; + } + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + @Override + public boolean match(Object filterAttr, List filterCondition) { + return true; + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientFilter.java new file mode 100644 index 0000000..a7bd1a3 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientFilter.java @@ -0,0 +1,46 @@ +package com.baiye.notify.recipient; + + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; + +import java.util.List; + +/** + * 接收者筛选器 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +public interface RecipientFilter { + + /** + * 当前筛选器对应的筛选类型 + * @see NotifyRecipientFilterTypeEnum + * @return 筛选类型对应的标识 + */ + Integer filterType(); + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 + * @return 接收者集合 + */ + List filter(List filterCondition); + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + Object getFilterAttr(SysUser sysUser); + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + boolean match(Object filterAttr, List filterCondition); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientHandler.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientHandler.java new file mode 100644 index 0000000..465926b --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientHandler.java @@ -0,0 +1,60 @@ +package com.baiye.notify.recipient; + +import com.baiye.system.model.entity.SysUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Slf4j +@Component +public class RecipientHandler { + + private final Map recipientFilterMap = new LinkedHashMap<>(); + + public RecipientHandler(List recipientFilterList) { + for (RecipientFilter recipientFilter : recipientFilterList) { + this.recipientFilterMap.put(recipientFilter.filterType(), recipientFilter); + } + } + + public List query(Integer filterType, List filterCondition) { + RecipientFilter recipientFilter = recipientFilterMap.get(filterType); + if (recipientFilter == null) { + log.error("Unknown recipient filter:[{}],filterCondition:{}", filterType, filterCondition); + return new ArrayList<>(); + } + return recipientFilter.filter(filterCondition); + } + + /** + * 判断当前是否匹配 + * @param recipientFilterType 筛选类型 + * @param filterAttr 筛选属性 + * @param recipientFilterCondition 筛选条件 + * @return boolean true:匹配 + */ + public boolean match(Integer recipientFilterType, Object filterAttr, List recipientFilterCondition) { + RecipientFilter recipientFilter = recipientFilterMap.get(recipientFilterType); + return recipientFilter != null && recipientFilter.match(filterAttr, recipientFilterCondition); + } + + /** + * 获取当前用户的各个筛选器对应的属性 + * @param sysUser 系统用户 + * @return 属性Map key:filterType value: attr + */ + public Map getFilterAttrs(SysUser sysUser) { + Map map = new HashMap<>(recipientFilterMap.size()); + for (RecipientFilter recipientFilter : recipientFilterMap.values()) { + Object obj = recipientFilter.getFilterAttr(sysUser); + map.put(recipientFilter.filterType(), obj); + } + return map; + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyOrganizationRecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyOrganizationRecipientFilter.java new file mode 100644 index 0000000..806a805 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyOrganizationRecipientFilter.java @@ -0,0 +1,65 @@ +package com.baiye.notify.recipient; + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; +import com.baiye.system.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 NotifyRecipientFilterTypeEnum + */ + @Override + public Integer filterType() { + return NotifyRecipientFilterTypeEnum.SPECIFY_ORGANIZATION.getValue(); + } + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 + * @return 接收者集合 + */ + @Override + public List filter(List filterCondition) { + List organizationIds = filterCondition.stream().map(Long.class::cast).collect(Collectors.toList()); + return sysUserService.listByOrganizationIds(organizationIds); + } + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + @Override + public Object getFilterAttr(SysUser sysUser) { + return sysUser.getOrganizationId(); + } + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + @Override + public boolean match(Object filterAttr, List filterCondition) { + Integer organizationId = (Integer) filterAttr; + return filterCondition.stream().map(Integer.class::cast).anyMatch(x -> x.equals(organizationId)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyRoleRecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyRoleRecipientFilter.java new file mode 100644 index 0000000..ce33b25 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyRoleRecipientFilter.java @@ -0,0 +1,79 @@ +package com.baiye.notify.recipient; + +import cn.hutool.core.collection.CollUtil; +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; +import com.baiye.system.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 NotifyRecipientFilterTypeEnum + */ + @Override + public Integer filterType() { + return NotifyRecipientFilterTypeEnum.SPECIFY_ROLE.getValue(); + } + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 + * @return 接收者集合 + */ + @Override + public List filter(List filterCondition) { + List roleCodes = filterCondition.stream().map(String.class::cast).collect(Collectors.toList()); + return sysUserService.listByRoleCodes(roleCodes); + } + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + @Override + public Object getFilterAttr(SysUser sysUser) { + return sysUserService.listRoleCodes(sysUser.getUserId()); + } + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + @Override + @SuppressWarnings("unchecked") + public boolean match(Object filterAttr, List filterCondition) { + if (!(filterAttr instanceof List)) { + return false; + } + List roleCodes = (List) filterAttr; + if (CollUtil.isEmpty(roleCodes)) { + return false; + } + for (Object roleCode : roleCodes) { + boolean matched = filterCondition.stream().map(String.class::cast).anyMatch(x -> x.equals(roleCode)); + if (matched) { + return true; + } + } + return false; + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserRecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserRecipientFilter.java new file mode 100644 index 0000000..1d2248a --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserRecipientFilter.java @@ -0,0 +1,65 @@ +package com.baiye.notify.recipient; + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; +import com.baiye.system.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 NotifyRecipientFilterTypeEnum + */ + @Override + public Integer filterType() { + return NotifyRecipientFilterTypeEnum.SPECIFY_USER.getValue(); + } + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 用户ID集合 + * @return 接收者集合 + */ + @Override + public List filter(List filterCondition) { + List userIds = filterCondition.stream().map(Long.class::cast).collect(Collectors.toList()); + return sysUserService.listByUserIds(userIds); + } + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + @Override + public Object getFilterAttr(SysUser sysUser) { + return sysUser.getUserId(); + } + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + @Override + public boolean match(Object filterAttr, List filterCondition) { + Long userId = (Long) filterAttr; + return filterCondition.stream().map(Long.class::cast).anyMatch(x -> x.equals(userId)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserTypeRecipientFilter.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserTypeRecipientFilter.java new file mode 100644 index 0000000..4cf45e2 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserTypeRecipientFilter.java @@ -0,0 +1,65 @@ +package com.baiye.notify.recipient; + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.system.model.entity.SysUser; +import com.baiye.system.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 NotifyRecipientFilterTypeEnum + */ + @Override + public Integer filterType() { + return NotifyRecipientFilterTypeEnum.SPECIFY_USER_TYPE.getValue(); + } + + /** + * 接收者筛选 + * @param filterCondition 筛选条件 + * @return 接收者集合 + */ + @Override + public List filter(List filterCondition) { + List userTypes = filterCondition.stream().map(Integer.class::cast).collect(Collectors.toList()); + return sysUserService.listByUserTypes(userTypes); + } + + /** + * 获取当前用户的过滤属性 + * @param sysUser 系统用户 + * @return 该用户所对应筛选条件的属性 + */ + @Override + public Object getFilterAttr(SysUser sysUser) { + return sysUser.getType(); + } + + /** + * 是否匹配当前用户 + * @param filterAttr 筛选属性 + * @param filterCondition 筛选条件 + * @return boolean true: 是否匹配 + */ + @Override + public boolean match(Object filterAttr, List filterCondition) { + Integer type = (Integer) filterAttr; + return filterCondition.stream().map(Integer.class::cast).anyMatch(x -> x.equals(type)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/AnnouncementService.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/AnnouncementService.java new file mode 100644 index 0000000..1fec1bb --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/AnnouncementService.java @@ -0,0 +1,79 @@ +package com.baiye.notify.service; + + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.notify.model.dto.AnnouncementDTO; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.qo.AnnouncementQO; +import com.baiye.notify.model.vo.AnnouncementPageVO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +public interface AnnouncementService extends ExtendService { + + /** + * 根据QueryObject查询分页数据 + * @param page 分页参数 + * @param qo 查询参数对象 + * @return PageResult 分页数据 + */ + PageResult queryPage(PageParam page, AnnouncementQO qo); + + /** + * 创建公告 + * @param announcementDTO 公告信息 + * @return boolean + */ + boolean addAnnouncement(AnnouncementDTO announcementDTO); + + /** + * 更新公告信息 + * @param announcementDTO announcementDTO + * @return boolean + */ + boolean updateAnnouncement(AnnouncementDTO announcementDTO); + + /** + * 发布公告信息 + * @param announcementId 公告ID + * @return boolean + */ + boolean publish(Long announcementId); + + /** + * 关闭公告信息 + * @param announcementId 公告ID + * @return boolean + */ + boolean close(Long announcementId); + + /** + * 批量上传公告图片 + * @param files 图片文件 + * @return 上传后的图片相对路径集合 + */ + List uploadImages(List files); + + /** + * 当前用户未拉取过的发布中,且满足失效时间的公告信息 + * @param userId 用户id + * @return List + */ + List listUnPulled(Long userId); + + /** + * 获取用户拉取过的发布中,且满足失效时间的公告信息 + * @param userId 用户id + * @return List + */ + List listActiveAnnouncements(Long userId); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/UserAnnouncementService.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/UserAnnouncementService.java new file mode 100644 index 0000000..4da05f1 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/UserAnnouncementService.java @@ -0,0 +1,47 @@ +package com.baiye.notify.service; + + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.model.qo.UserAnnouncementQO; +import com.baiye.notify.model.vo.UserAnnouncementPageVO; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +public interface UserAnnouncementService extends ExtendService { + + /** + * 根据QueryObject查询分页数据 + * @param pageParam 分页参数 + * @param qo 查询参数对象 + * @return PageResult 分页数据 + */ + PageResult queryPage(PageParam pageParam, UserAnnouncementQO qo); + + /** + * 根据用户ID和公告id初始化一个新的用户公告关联对象 + * + * @param userId 用户ID + * @param announcementId 公告ID + * @param state + * @param type + * @param messageKey + * @param title + * @param content + * @return UserAnnouncement + */ + UserAnnouncement prodUserAnnouncement(Long userId, Long announcementId, Integer state, Integer type, String messageKey, String title, String content); + + /** + * 对用户公告进行已读标记 + * @param userId 用户id + * @param announcementId 公告id + */ + void readAnnouncement(Long userId, Long announcementId); + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/AnnouncementServiceImpl.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/AnnouncementServiceImpl.java new file mode 100644 index 0000000..d96b83a --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/AnnouncementServiceImpl.java @@ -0,0 +1,214 @@ +package com.baiye.notify.service.impl; + +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.IdUtil; +import com.baiye.constant.enums.BooleanEnum; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.exception.BusinessException; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.notify.converter.AnnouncementConverter; +import com.baiye.notify.converter.NotifyInfoConverter; +import com.baiye.notify.enums.AnnouncementStatusEnum; +import com.baiye.notify.event.AnnouncementCloseEvent; +import com.baiye.notify.event.NotifyPublishEvent; +import com.baiye.notify.mapper.AnnouncementMapper; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.notify.model.dto.AnnouncementDTO; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.qo.AnnouncementQO; +import com.baiye.notify.model.vo.AnnouncementPageVO; +import com.baiye.notify.service.AnnouncementService; +import com.baiye.result.SystemResultCode; +import com.baiye.util.FileUtil; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AnnouncementServiceImpl extends ExtendServiceImpl + implements AnnouncementService { + + private final ApplicationEventPublisher publisher; + + // private final FileService fileService; + + /** + * 根据QueryObject查询分页数据 + * + * @param pageParam 分页参数 + * @param qo 查询参数对象 + * @return PageResult 分页数据 + */ + @Override + public PageResult queryPage(PageParam pageParam, AnnouncementQO qo) { + return baseMapper.queryPage(pageParam, qo); + } + + /** + * 创建公告 + * + * @param announcementDTO 公告信息 + * @return boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean addAnnouncement(AnnouncementDTO announcementDTO) { + Announcement announcement = AnnouncementConverter.INSTANCE.dtoToPo(announcementDTO); + announcement.setId(null); + int flag = baseMapper.insert(announcement); + boolean inserted = SqlHelper.retBool(flag); + // 公告发布事件 + boolean isPublishStatus = announcement.getStatus() == AnnouncementStatusEnum.ENABLED.getValue(); + if (inserted && isPublishStatus) { + this.onAnnouncementPublish(announcement); + } + return inserted; + } + + /** + * 更新公告信息 + * + * @param announcementDTO announcementDTO + * @return boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateAnnouncement(AnnouncementDTO announcementDTO) { + Announcement oldAnnouncement = baseMapper.selectById(announcementDTO.getId()); + if (oldAnnouncement.getStatus() != AnnouncementStatusEnum.UNPUBLISHED.getValue()) { + throw new BusinessException(SystemResultCode.BAD_REQUEST.getCode(), "不允许修改已经发布过的公告!"); + } + + Announcement announcement = AnnouncementConverter.INSTANCE.dtoToPo(announcementDTO); + // 不允许修改为《发布中》以外的状态 + boolean isPublishStatus = announcement.getStatus() == AnnouncementStatusEnum.ENABLED.getValue(); + if (!isPublishStatus) { + announcement.setStatus(null); + } + // 保证当前状态未被修改过 + boolean isUpdated = baseMapper.updateIfUnpublished(announcement); + // 公告发布事件 + if (isUpdated && isPublishStatus) { + this.onAnnouncementPublish(announcement); + } + return isUpdated; + } + + /** + * 发布公告信息 + * + * @param announcementId 公告ID + * @return boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public boolean publish(Long announcementId) { + Announcement announcement = baseMapper.selectById(announcementId); + if (announcement.getStatus() != AnnouncementStatusEnum.UNPUBLISHED.getValue()) { + throw new BusinessException(SystemResultCode.BAD_REQUEST.getCode(), "不允许修改已经发布过的公告!"); + } + if (BooleanEnum.TRUE.intValue().equals(announcement.getImmortal()) + && LocalDateTime.now().isAfter(announcement.getDeadline())) { + throw new BusinessException(SystemResultCode.BAD_REQUEST.getCode(), "公告失效时间必须迟于当前时间!"); + } + + // 更新公共至发布状态 + Announcement entity = new Announcement(); + entity.setId(announcementId); + entity.setStatus(AnnouncementStatusEnum.ENABLED.getValue()); + boolean isUpdated = baseMapper.updateIfUnpublished(entity); + if (isUpdated) { + announcement.setStatus(AnnouncementStatusEnum.ENABLED.getValue()); + this.onAnnouncementPublish(announcement); + } + return isUpdated; + } + + /** + * 关闭公告信息 + * + * @param announcementId 公告ID + * @return boolean + */ + @Override + public boolean close(Long announcementId) { + Announcement announcement = new Announcement(); + announcement.setId(announcementId); + announcement.setStatus(AnnouncementStatusEnum.DISABLED.getValue()); + int flag = baseMapper.updateById(announcement); + boolean isUpdated = SqlHelper.retBool(flag); + if (isUpdated) { + publisher.publishEvent(new AnnouncementCloseEvent(announcementId)); + } + return isUpdated; + } + + /** + * 批量上传公告图片 + * + * @param files 图片文件 + * @return 上传后的图片相对路径集合 + */ + @Override + public List uploadImages(List files) { + List objectNames = new ArrayList<>(); + for (MultipartFile file : files) { + String objectName = "announcement/" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE) + + StrPool.SLASH + IdUtil.fastSimpleUUID() + StrPool.DOT + + FileUtil.extName(file.getOriginalFilename()); + FileUtil.upload(file, objectName); + objectNames.add(objectName); + } + return objectNames; + } + + /** + * 当前用户未拉取过的发布中,且满足失效时间的公告信息 + * + * @return List + */ + @Override + public List listUnPulled(Long userId) { + return baseMapper.listUserAnnouncements(userId, false); + } + + /** + * 获取用户拉取过的发布中,且满足失效时间的公告信息 + * + * @param userId 用户id + * @return List + */ + @Override + public List listActiveAnnouncements(Long userId) { + return baseMapper.listUserAnnouncements(userId, true); + } + + /** + * 公告发布事件 + * + * @param announcement 公告信息 + */ + private void onAnnouncementPublish(Announcement announcement) { + NotifyInfo notifyInfo = NotifyInfoConverter.INSTANCE.fromAnnouncement(announcement); + publisher.publishEvent(new NotifyPublishEvent(notifyInfo)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/UserAnnouncementServiceImpl.java b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/UserAnnouncementServiceImpl.java new file mode 100644 index 0000000..0f03b41 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/UserAnnouncementServiceImpl.java @@ -0,0 +1,74 @@ +package com.baiye.notify.service.impl; + + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.notify.enums.UserAnnouncementStateEnum; +import com.baiye.notify.mapper.UserAnnouncementMapper; +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.model.qo.UserAnnouncementQO; +import com.baiye.notify.model.vo.UserAnnouncementPageVO; +import com.baiye.notify.service.UserAnnouncementService; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +@Service +public class UserAnnouncementServiceImpl extends ExtendServiceImpl + implements UserAnnouncementService { + + /** + * 根据QueryObject查询分页数据 + * @param pageParam 分页参数 + * @param qo 查询参数对象 + * @return PageResult 分页数据 + */ + @Override + public PageResult queryPage(PageParam pageParam, UserAnnouncementQO qo) { + return baseMapper.queryPage(pageParam, qo); + } + + /** + * 根据用户ID和公告id初始化一个新的用户公告关联对象 + * + * @param userId 用户ID + * @param announcementId 公告ID + * @param state + * @param type + * @param messageKey + * @param title + * @param content + * @return UserAnnouncement + */ + @Override + public UserAnnouncement prodUserAnnouncement(Long userId, Long announcementId, Integer state, Integer type, String messageKey, String title, String content) { + UserAnnouncement userAnnouncement = new UserAnnouncement(); + userAnnouncement.setType(type); + userAnnouncement.setState(state); + userAnnouncement.setTitle(title); + userAnnouncement.setUserId(userId); + userAnnouncement.setContent(content); + userAnnouncement.setMessageKey(messageKey); + userAnnouncement.setAnnouncementId(announcementId); + userAnnouncement.setCreateTime(LocalDateTime.now()); + userAnnouncement.setState(UserAnnouncementStateEnum.UNREAD.getValue()); + return userAnnouncement; + } + + /** + * 对用户公告进行已读标记 + * @param userId 用户id + * @param announcementId 公告id + */ + @Override + public void readAnnouncement(Long userId, Long announcementId) { + baseMapper.updateToReadState(userId, announcementId); + } + +} diff --git a/ad-distribute-notify/distribute-notify-biz/src/main/resources/mapper/AnnouncementMapper.xml b/ad-distribute-notify/distribute-notify-biz/src/main/resources/mapper/AnnouncementMapper.xml new file mode 100644 index 0000000..fca8e41 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-biz/src/main/resources/mapper/AnnouncementMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + id, title, content, recipient_filter_type, recipient_filter_condition, receive_mode, + status, immortal, deadline, create_by, create_time, update_time + + + + a.id, a.title, a.content, a.recipient_filter_type, a.recipient_filter_condition, a.receive_mode, + a.status, a.immortal, a.deadline, a.create_by, a.create_time, a.update_time + + + + + + + diff --git a/ad-distribute-notify/distribute-notify-controller/pom.xml b/ad-distribute-notify/distribute-notify-controller/pom.xml new file mode 100644 index 0000000..8586930 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-controller/pom.xml @@ -0,0 +1,26 @@ + + + + com.baiye + ad-distribute-notify + 1.1.0 + + 4.0.0 + distribute-notify-controller + + + + + com.baiye + common-log + + + + com.baiye + distribute-notify-biz + 1.1.0 + + + + diff --git a/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/AnnouncementController.java b/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/AnnouncementController.java new file mode 100644 index 0000000..6ac53eb --- /dev/null +++ b/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/AnnouncementController.java @@ -0,0 +1,139 @@ +package com.baiye.notify.controller; + + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.notify.model.dto.AnnouncementDTO; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.qo.AnnouncementQO; +import com.baiye.notify.model.vo.AnnouncementPageVO; +import com.baiye.notify.service.AnnouncementService; +import com.baiye.operation.annotation.CreateOperationLogging; +import com.baiye.operation.annotation.DeleteOperationLogging; +import com.baiye.operation.annotation.UpdateOperationLogging; +import com.baiye.result.BaseResultCode; +import com.baiye.result.R; +import com.baiye.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.Valid; +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/notify/announcement") +@Tag(name = "公告信息管理") +public class AnnouncementController { + + private final AnnouncementService announcementService; + + /** + * 分页查询 + * @param pageParam 分页对象 + * @param announcementQO 公告信息查询对象 + * @return R 通用返回体 + */ + @GetMapping("/page") + // @PreAuthorize("@per.hasPermission('notify:announcement:read')") + @Operation(summary = "分页查询", description = "分页查询") + public R> getAnnouncementPage(@Validated PageParam pageParam, + AnnouncementQO announcementQO) { + return R.ok(announcementService.queryPage(pageParam, announcementQO)); + } + + /** + * 新增公告信息 + * @param announcementDTO 公告信息 + * @return R 通用返回体 + */ + @CreateOperationLogging(msg = "新增公告信息") + @PostMapping + // @PreAuthorize("@per.hasPermission('notify:announcement:add')") + @Operation(summary = "新增公告信息", description = "新增公告信息") + public R save(@Valid @RequestBody AnnouncementDTO announcementDTO) { + return announcementService.addAnnouncement(announcementDTO) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "新增公告信息失败"); + } + + /** + * 修改公告信息 + * @param announcementDTO 公告信息 + * @return R 通用返回体 + */ + @UpdateOperationLogging(msg = "修改公告信息") + @PutMapping + // @PreAuthorize("@per.hasPermission('notify:announcement:edit')") + @Operation(summary = "修改公告信息", description = "修改公告信息") + public R updateById(@Valid @RequestBody AnnouncementDTO announcementDTO) { + return announcementService.updateAnnouncement(announcementDTO) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "修改公告信息失败"); + } + + /** + * 通过id删除公告信息 + * @param id id + * @return R 通用返回体 + */ + @DeleteOperationLogging(msg = "通过id删除公告信息") + @DeleteMapping("/{id}") + // @PreAuthorize("@per.hasPermission('notify:announcement:del')") + @Operation(summary = "通过id删除公告信息", description = "通过id删除公告信息") + public R removeById(@PathVariable("id") Long id) { + return announcementService.removeById(id) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "通过id删除公告信息失败"); + } + + /** + * 发布公告信息 + * @return R 通用返回体 + */ + @UpdateOperationLogging(msg = "发布公告信息") + @PatchMapping("/publish/{announcementId}") + // @PreAuthorize("@per.hasPermission('notify:announcement:edit')") + @Operation(summary = "发布公告信息", description = "发布公告信息") + public R enableAnnouncement(@PathVariable("announcementId") Long announcementId) { + return announcementService.publish(announcementId) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "发布公告信息失败"); + } + + /** + * 关闭公告信息 + * @return R 通用返回体 + */ + @UpdateOperationLogging(msg = "关闭公告信息") + @PatchMapping("/close/{announcementId}") + // @PreAuthorize("@per.hasPermission('notify:announcement:edit')") + @Operation(summary = "关闭公告信息", description = "关闭公告信息") + public R disableAnnouncement(@PathVariable("announcementId") Long announcementId) { + return announcementService.close(announcementId) ? R.ok() + : R.failed(BaseResultCode.UPDATE_DATABASE_ERROR, "关闭公告信息失败"); + } + + @UpdateOperationLogging(msg = "公告内容图片上传", recordParams = false) + // @PreAuthorize("@per.hasPermission('notify:announcement:edit')") + @PostMapping("/image") + @Operation(summary = "公告内容图片上传", description = "公告内容图片上传") + public R> uploadImages(@RequestParam("files") List files) { + List objectNames = announcementService.uploadImages(files); + return R.ok(objectNames); + } + + @GetMapping("/user") + // @PreAuthorize("@per.hasPermission('notify:userannouncement:read')") + @Operation(summary = "用户公告信息", description = "用户公告信息") + public R> getUserAnnouncements() { + Long userId = SecurityUtils.getUser().getUserId(); + return R.ok(announcementService.listActiveAnnouncements(userId)); + } + +} diff --git a/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/UserAnnouncementController.java b/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/UserAnnouncementController.java new file mode 100644 index 0000000..a79bf26 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/UserAnnouncementController.java @@ -0,0 +1,53 @@ +package com.baiye.notify.controller; + + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.notify.model.qo.UserAnnouncementQO; +import com.baiye.notify.model.vo.UserAnnouncementPageVO; +import com.baiye.notify.service.UserAnnouncementService; +import com.baiye.result.R; +import com.baiye.security.util.SecurityUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/notify/user-announcement") +@Tag(name = "用户公告表管理") +public class UserAnnouncementController { + + private final UserAnnouncementService userAnnouncementService; + + /** + * 分页查询 + * @param pageParam 分页参数 + * @param userAnnouncementQO 用户公告表查询对象 + * @return R 通用返回体 + */ + @GetMapping("/page") + // @PreAuthorize("@per.hasPermission('notify:userannouncement:read')") + @Operation(summary = "分页查询", description = "分页查询") + public R> getUserAnnouncementPage(@Validated PageParam pageParam, + UserAnnouncementQO userAnnouncementQO) { + return R.ok(userAnnouncementService.queryPage(pageParam, userAnnouncementQO)); + } + + @PatchMapping("/read/{announcementId}") + // @PreAuthorize("@per.hasPermission('notify:userannouncement:read')") + @Operation(summary = "用户公告已读上报", description = "用户公告已读上报") + public R readAnnouncement(@PathVariable("announcementId") Long announcementId) { + Long userId = SecurityUtils.getUser().getUserId(); + userAnnouncementService.readAnnouncement(userId, announcementId); + return R.ok(); + } + +} diff --git a/ad-distribute-notify/distribute-notify-model/pom.xml b/ad-distribute-notify/distribute-notify-model/pom.xml new file mode 100644 index 0000000..520929f --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/pom.xml @@ -0,0 +1,41 @@ + + + + com.baiye + ad-distribute-notify + 1.1.0 + + 4.0.0 + distribute-notify-model + + + + com.baiye + ad-distribute-extend-mybatis-plus + + + + io.swagger.core.v3 + swagger-annotations + + + + jakarta.validation + jakarta.validation-api + + + + + org.mapstruct + mapstruct + + + + + org.mapstruct + mapstruct-processor + 1.5.3.Final + + + diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/AnnouncementConverter.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/AnnouncementConverter.java new file mode 100644 index 0000000..aa2a4c2 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/AnnouncementConverter.java @@ -0,0 +1,36 @@ +package com.baiye.notify.converter; + +import com.baiye.notify.model.dto.AnnouncementDTO; +import com.baiye.notify.model.entity.Announcement; +import com.baiye.notify.model.vo.AnnouncementPageVO; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * @author Hccake 2020/12/16 + * @version 1.0 + */ +@Mapper +public interface AnnouncementConverter { + + AnnouncementConverter INSTANCE = Mappers.getMapper(AnnouncementConverter.class); + + /** + * PO 转 PageVO + * @param announcement 公告表 + * @return AnnouncementPageVO 公告表PageVO + */ + AnnouncementPageVO poToPageVo(Announcement announcement); + + /** + * AnnouncementDTO 转 Announcement实体 + * @param dto AnnouncementDTO + * @return Announcement + */ + @Mapping(target = "updateTime", ignore = true) + @Mapping(target = "createTime", ignore = true) + @Mapping(target = "createBy", ignore = true) + Announcement dtoToPo(AnnouncementDTO dto); + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/NotifyInfoConverter.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/NotifyInfoConverter.java new file mode 100644 index 0000000..5a2e725 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/NotifyInfoConverter.java @@ -0,0 +1,24 @@ +package com.baiye.notify.converter; + +import com.baiye.notify.model.domain.AnnouncementNotifyInfo; +import com.baiye.notify.model.entity.Announcement; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author Hccake 2020/12/23 + * @version 1.0 + */ +@Mapper +public interface NotifyInfoConverter { + + NotifyInfoConverter INSTANCE = Mappers.getMapper(NotifyInfoConverter.class); + + /** + * 公告转通知实体 + * @param announcement 公告信息 + * @return 通知信息 + */ + AnnouncementNotifyInfo fromAnnouncement(Announcement announcement); + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/UserAnnouncementConverter.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/UserAnnouncementConverter.java new file mode 100644 index 0000000..cb3d0c5 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/UserAnnouncementConverter.java @@ -0,0 +1,25 @@ +package com.baiye.notify.converter; + +import com.baiye.notify.model.entity.UserAnnouncement; +import com.baiye.notify.model.vo.UserAnnouncementPageVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * 用户公告表 + * + * @author hccake 2021-03-22 20:16:12 + */ +@Mapper +public interface UserAnnouncementConverter { + + UserAnnouncementConverter INSTANCE = Mappers.getMapper(UserAnnouncementConverter.class); + + /** + * PO 转 PageVO + * @param userAnnouncement 用户公告表 + * @return UserAnnouncementPageVO 用户公告表PageVO + */ + UserAnnouncementPageVO poToPageVo(UserAnnouncement userAnnouncement); + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/AnnouncementStatusEnum.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/AnnouncementStatusEnum.java new file mode 100644 index 0000000..e699296 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/AnnouncementStatusEnum.java @@ -0,0 +1,33 @@ +package com.baiye.notify.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 公告状态 + * + * @author Hccake 2020/12/17 + * @version 1.0 + */ +@Getter +@AllArgsConstructor +public enum AnnouncementStatusEnum { + + /** + * 关闭的 + */ + DISABLED(0), + + /** + * 开启的 + */ + ENABLED(1), + + /** + * 待发布 + */ + UNPUBLISHED(2); + + private final int value; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyChannelEnum.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyChannelEnum.java new file mode 100644 index 0000000..4685f82 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyChannelEnum.java @@ -0,0 +1,25 @@ +package com.baiye.notify.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 通知接收方式 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum NotifyChannelEnum { + + // 站内 + STATION(1), + // 短信 + SMS(2), + // 邮件 + MAIL(3); + + private final int value; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyRecipientFilterTypeEnum.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyRecipientFilterTypeEnum.java new file mode 100644 index 0000000..ada50a3 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyRecipientFilterTypeEnum.java @@ -0,0 +1,29 @@ +package com.baiye.notify.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 通知接收者筛选类型 + * + * @author Hccake 2020/12/21 + * @version 1.0 + */ +@Getter +@RequiredArgsConstructor +public enum NotifyRecipientFilterTypeEnum { + + // 全部 + ALL(1), + // 指定用户 + SPECIFY_ROLE(2), + // 指定组织 + SPECIFY_ORGANIZATION(3), + // 指定用户类型 + SPECIFY_USER_TYPE(4), + // 指定用户 + SPECIFY_USER(5),; + + private final int value; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/UserAnnouncementStateEnum.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/UserAnnouncementStateEnum.java new file mode 100644 index 0000000..72c93d1 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/UserAnnouncementStateEnum.java @@ -0,0 +1,27 @@ +package com.baiye.notify.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户公告状态 + * + * @author Hccake 2021/1/19 + * @version 1.0 + */ +@Getter +@AllArgsConstructor +public enum UserAnnouncementStateEnum { + + /** + * 未读 + */ + UNREAD(0), + /** + * 已读 + */ + READ(1); + + private final int value; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/AnnouncementNotifyInfo.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/AnnouncementNotifyInfo.java new file mode 100644 index 0000000..b1350d6 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/AnnouncementNotifyInfo.java @@ -0,0 +1,103 @@ +package com.baiye.notify.model.domain; + +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 公告通知信息 + * + * @author Hccake 2020/12/23 + * @version 1.0 + */ +@Data +@Accessors(chain = true) +@Schema(title = "公告通知信息") +public class AnnouncementNotifyInfo implements NotifyInfo { + + /** + * ID + */ + @Schema(title = "公告ID") + private Long id; + + /** + * 标题 + */ + @Schema(title = "标题") + private String title; + + + /** + * 公告类型 + */ + @Schema(title = "公告类型") + private Integer type; + + + /** + * 状态,已读(1)|未读(0) + */ + @Schema(title = "状态,已读(1)|未读(0)") + private Integer state; + + + /** + * 关键信息 + */ + @Schema(title = "关键信息") + private String messageKey; + + + /** + * 内容 + */ + @Schema(title = "内容") + private String content; + + /** + * 接收人筛选方式 + * @see NotifyRecipientFilterTypeEnum + */ + @Schema(title = "接收人筛选方式") + private Integer recipientFilterType; + + /** + * 对应接收人筛选方式的条件信息 + */ + @Schema(title = "对应接收人筛选方式的条件信息") + private List recipientFilterCondition; + + /** + * 接收方式,值与通知渠道一一对应 + * @see NotifyChannelEnum + */ + @Schema(title = "接收方式") + private List receiveMode; + + /** + * 永久有效的 + * @see com.baiye.ballcat.common.core.constant.enums.BooleanEnum + */ + @Schema(title = "永久有效的") + private Integer immortal; + + /** + * 截止日期 + */ + @Schema(title = "截止日期") + private LocalDateTime deadline; + + + /** + * 拉取时间 + */ + @Schema(title = "创建时间") + private LocalDateTime createTime; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/NotifyInfo.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/NotifyInfo.java new file mode 100644 index 0000000..d7c0b26 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/NotifyInfo.java @@ -0,0 +1,46 @@ +package com.baiye.notify.model.domain; + +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; + +import java.util.List; + +/** + * @author Hccake 2020/12/23 + * @version 1.0 + */ +public interface NotifyInfo { + + /** + * 标题 + * @return String 当前通知标题 + */ + String getTitle(); + + /** + * 内容 + * @return String 当前通知内容 + */ + String getContent(); + + /** + * 接收人筛选方式 + * @see NotifyRecipientFilterTypeEnum + * @return Integer 接收人筛选方式 + */ + Integer getRecipientFilterType(); + + /** + * 对应接收人筛选方式的条件信息 + * @return List + */ + List getRecipientFilterCondition(); + + /** + * 接收方式,值与通知渠道一一对应 + * @see NotifyChannelEnum + * @return List + */ + List getReceiveMode(); + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/dto/AnnouncementDTO.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/dto/AnnouncementDTO.java new file mode 100644 index 0000000..65821cc --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/dto/AnnouncementDTO.java @@ -0,0 +1,85 @@ +package com.baiye.notify.model.dto; + +import com.baiye.notify.enums.NotifyChannelEnum; +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +@Data +@Schema(title = "公告信息") +public class AnnouncementDTO implements Serializable { + + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @Schema(title = "ID") + private Long id; + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空") + @Schema(title = "标题") + private String title; + + /** + * 内容 + */ + @NotBlank(message = "内容不能为空") + @Schema(title = "内容") + private String content; + + /** + * 接收人筛选方式,1:全部 2:用户角色 3:组织机构 4:用户类型 5:自定义用户 + */ + @NotNull(message = "接收人范围不能为空") + @Schema(title = "接收人范围") + private Integer recipientFilterType; + + /** + * 对应接收人筛选方式的条件信息,多个用逗号分割。如角色标识,组织ID,用户类型,用户ID等 + */ + @Schema(title = "对应接收人筛选方式的条件信息。如角色标识,组织ID,用户类型,用户ID等") + private List recipientFilterCondition; + + /** + * 接收方式,值与通知渠道一一对应 + * @see NotifyChannelEnum + */ + @Schema(title = "接收方式") + private List receiveMode; + + /** + * 永久有效的 + * @see com.baiye.ballcat.common.core.constant.enums.BooleanEnum + */ + @Schema(title = "永久有效的") + private Integer immortal; + + /** + * 截止日期 + */ + @Schema(title = "截止日期") + private LocalDateTime deadline; + + /** + * 状态 + */ + @Schema(title = "状态") + private Integer status; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/Announcement.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/Announcement.java new file mode 100644 index 0000000..526e7d4 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/Announcement.java @@ -0,0 +1,104 @@ +package com.baiye.notify.model.entity; + +import com.baiye.entity.LogicDeletedBaseEntity; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.baiye.notify.enums.AnnouncementStatusEnum; +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableAlias(Announcement.TABLE_ALIAS) +@TableName(value = "notify_announcement", autoResultMap = true) +@Schema(title = "公告信息") +public class Announcement extends LogicDeletedBaseEntity { + + private static final long serialVersionUID = 1L; + + public static final String TABLE_ALIAS = "a"; + + /** + * ID + */ + @TableId + @Schema(title = "ID") + private Long id; + + /** + * 标题 + */ + @Schema(title = "标题") + private String title; + + /** + * 内容 + */ + @Schema(title = "内容") + private String content; + + /** + * 接收人筛选方式 + * @see NotifyRecipientFilterTypeEnum + */ + @Schema(title = "接收人筛选方式") + private Integer recipientFilterType; + + + /** + * 公告类型 + */ + @Schema(title = "公告类型") + private Integer type; + + /** + * 对应接收人筛选方式的条件信息,多个用逗号分割。如角色标识,组织ID,用户类型,用户ID等 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + @Schema(title = "对应接收人筛选方式的条件信息。如角色标识,组织ID,用户类型,用户ID等") + private List recipientFilterCondition; + + /** + * 接收方式,值与通知渠道一一对应 + * @see NotifyChannelEnum + */ + @TableField(typeHandler = JacksonTypeHandler.class) + @Schema(title = "接收方式") + private List receiveMode; + + /** + * 状态 + * @see AnnouncementStatusEnum + */ + @Schema(title = "状态") + private Integer status; + + /** + * 永久有效的 + * @see com.baiye.ballcat.common.core.constant.enums.BooleanEnum + */ + @Schema(title = "永久有效的") + private Integer immortal; + + /** + * 截止日期 + */ + @Schema(title = "截止日期") + private LocalDateTime deadline; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/UserAnnouncement.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/UserAnnouncement.java new file mode 100644 index 0000000..66d32da --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/UserAnnouncement.java @@ -0,0 +1,96 @@ +package com.baiye.notify.model.entity; + +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +@Data +@TableAlias(UserAnnouncement.TABLE_ALIAS) +@TableName("tb_notify_user_announcement") +@Schema(title = "用户公告表") +public class UserAnnouncement implements Serializable { + + private static final long serialVersionUID = 1L; + + + public static final String TABLE_ALIAS = "ua"; + + /** + * ID + */ + @TableId("id") + @Schema(title = "ID") + private Long id; + + /** + * 公告id + */ + @Schema(title = "公告id") + private Long announcementId; + + /** + * 公告类型 + */ + @Schema(title = "公告类型") + private Integer type; + + + /** + * 用户ID + */ + @Schema(title = "用户ID") + private Long userId; + + + /** + * 关键信息 + */ + @Schema(title = "关键信息") + private String messageKey; + + + /** + * 标题 + */ + @Schema(title = "标题") + private String title; + + /** + * 内容 + */ + @Schema(title = "内容") + private String content; + + /** + * 状态,已读(1)|未读(0) + */ + @Schema(title = "状态,已读(1)|未读(0)") + @TableField("state") + private Integer state; + + /** + * 阅读时间 + */ + @Schema(title = "阅读时间") + private LocalDateTime readTime; + + /** + * 拉取时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(title = "拉取时间") + private LocalDateTime createTime; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/AnnouncementQO.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/AnnouncementQO.java new file mode 100644 index 0000000..0fdc5bb --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/AnnouncementQO.java @@ -0,0 +1,37 @@ +package com.baiye.notify.model.qo; + +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springdoc.api.annotations.ParameterObject; + +/** + * 公告信息 查询对象 + * + * @author hccake 2020-12-15 17:01:15 + */ +@Data +@ParameterObject +@Schema(title = "公告信息查询对象") +public class AnnouncementQO { + + private static final long serialVersionUID = 1L; + + /** + * 标题 + */ + @Parameter(description = "标题") + private String title; + + /** + * 接收人筛选方式 + * @see NotifyRecipientFilterTypeEnum + */ + @Parameter(description = "接收人筛选方式") + private Integer recipientFilterType; + + @Parameter(description = "状态") + private Integer[] status; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/UserAnnouncementQO.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/UserAnnouncementQO.java new file mode 100644 index 0000000..7e12339 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/UserAnnouncementQO.java @@ -0,0 +1,37 @@ +package com.baiye.notify.model.qo; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import org.springdoc.api.annotations.ParameterObject; + +/** + * 用户公告表 查询对象 + * + * @author hccake 2020-12-25 08:04:53 + */ +@Data +@Schema(title = "用户公告表查询对象") +@ParameterObject +public class UserAnnouncementQO { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @Parameter(description = "ID") + private Long id; + + @Parameter(description = "创建人") + private String content; + + + @Parameter(description = "开始时间") + private String startTime; + + @Parameter(description = "结束时间") + private String endTime; + + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/AnnouncementPageVO.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/AnnouncementPageVO.java new file mode 100644 index 0000000..8dcbbd9 --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/AnnouncementPageVO.java @@ -0,0 +1,110 @@ +package com.baiye.notify.model.vo; + +import com.baiye.notify.enums.AnnouncementStatusEnum; +import com.baiye.notify.enums.NotifyChannelEnum; +import com.baiye.notify.enums.NotifyRecipientFilterTypeEnum; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 公告信息 + * + * @author hccake 2020-12-15 17:01:15 + */ +@Data +@Schema(title = "公告信息分页VO") +public class AnnouncementPageVO { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @Schema(title = "ID") + private Long id; + + /** + * 标题 + */ + @Schema(title = "标题") + private String title; + + /** + * 内容 + */ + @Schema(title = "内容") + private String content; + + /** + * 接收人筛选方式,1:全部 2:用户角色 3:组织机构 4:用户类型 5:自定义用户 + * @see NotifyRecipientFilterTypeEnum + */ + @Schema(title = "接收人筛选方式") + private Integer recipientFilterType; + + /** + * 对应接收人筛选方式的条件信息,多个用逗号分割。如角色标识,组织ID,用户类型,用户ID等 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + @Schema(title = "对应接收人筛选方式的条件信息。如角色标识,组织ID,用户类型,用户ID等") + private List recipientFilterCondition; + + /** + * 接收方式,值与通知渠道一一对应 + * @see NotifyChannelEnum + */ + @TableField(typeHandler = JacksonTypeHandler.class) + @Schema(title = "接收方式") + private List receiveMode; + + /** + * 状态 + * @see AnnouncementStatusEnum + */ + @Schema(title = "状态") + private Integer status; + + /** + * 永久有效的 + * @see com.baiye.ballcat.common.core.constant.enums.BooleanEnum + */ + @Schema(title = "永久有效的") + private Integer immortal; + + /** + * 截止日期 + */ + @Schema(title = "截止日期") + private LocalDateTime deadline; + + /** + * 创建人ID + */ + @Schema(title = "创建人ID") + private Integer createBy; + + /** + * 创建人名称 + */ + @Schema(title = "创建人名称") + private String createUsername; + + /** + * 创建时间 + */ + @Schema(title = "创建时间") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Schema(title = "更新时间") + private LocalDateTime updateTime; + +} diff --git a/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/UserAnnouncementPageVO.java b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/UserAnnouncementPageVO.java new file mode 100644 index 0000000..b6a6dda --- /dev/null +++ b/ad-distribute-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/UserAnnouncementPageVO.java @@ -0,0 +1,84 @@ +package com.baiye.notify.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 用户公告表 + * + * @author hccake 2020-12-25 08:04:53 + */ +@Data +@Schema(title = "用户公告分页VO") +public class UserAnnouncementPageVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @Schema(title = "ID") + private Long id; + + /** + * 公告id + */ + @Schema(title = "公告id") + private Long announcementId; + + /** + * 用户ID + */ + @Schema(title = "用户ID") + private Long userId; + + /** + * 状态,已读(1)|未读(0) + */ + @Schema(title = "状态,已读(1)|未读(0)") + private Integer state; + + /** + * 标题 + */ + @Schema(title = "关键信息") + private String messageKey; + + /** + * 公告类型 + */ + @Schema(title = "公告类型") + private Integer type; + + /** + * 标题 + */ + @Schema(title = "标题") + private String title; + + /** + * 内容 + */ + @Schema(title = "内容") + private String content; + + + + + /** + * 阅读时间 + */ + @Schema(title = "阅读时间") + private LocalDateTime readTime; + + /** + * 拉取时间 + */ + @Schema(title = "拉取时间") + private LocalDateTime createTime; + +} diff --git a/ad-distribute-notify/pom.xml b/ad-distribute-notify/pom.xml new file mode 100644 index 0000000..fa4806c --- /dev/null +++ b/ad-distribute-notify/pom.xml @@ -0,0 +1,18 @@ + + + + ad-distribute + com.baiye + 1.1.0 + + 4.0.0 + ad-distribute-notify + pom + + + distribute-notify-biz + distribute-notify-controller + distribute-notify-model + + diff --git a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/AddMessageEventListenerToContainer.java b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/AddMessageEventListenerToContainer.java similarity index 94% rename from ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/AddMessageEventListenerToContainer.java rename to ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/AddMessageEventListenerToContainer.java index a7d0ab1..4e99248 100644 --- a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/AddMessageEventListenerToContainer.java +++ b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/AddMessageEventListenerToContainer.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.redis; +package com.baiye.autoconfigure.redis; import com.baiye.listener.MessageEventListener; import lombok.RequiredArgsConstructor; diff --git a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/BallcatRedisAutoConfiguration.java b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/BallcatRedisAutoConfiguration.java similarity index 98% rename from ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/BallcatRedisAutoConfiguration.java rename to ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/BallcatRedisAutoConfiguration.java index 568f93d..4fd013d 100644 --- a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/BallcatRedisAutoConfiguration.java +++ b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/BallcatRedisAutoConfiguration.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.redis; +package com.baiye.autoconfigure.redis; import com.fasterxml.jackson.databind.ObjectMapper; import com.baiye.RedisHelper; diff --git a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/MessageEventListenerAutoConfiguration.java b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/MessageEventListenerAutoConfiguration.java similarity index 96% rename from ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/MessageEventListenerAutoConfiguration.java rename to ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/MessageEventListenerAutoConfiguration.java index dc27a62..dc9d6b5 100644 --- a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/MessageEventListenerAutoConfiguration.java +++ b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/MessageEventListenerAutoConfiguration.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.redis; +package com.baiye.autoconfigure.redis; import com.baiye.listener.MessageEventListener; import lombok.RequiredArgsConstructor; diff --git a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/RedisKeyEventAutoConfiguration.java b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/RedisKeyEventAutoConfiguration.java similarity index 99% rename from ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/RedisKeyEventAutoConfiguration.java rename to ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/RedisKeyEventAutoConfiguration.java index 31208e2..e258fc8 100644 --- a/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/ballcat/autoconfigure/redis/RedisKeyEventAutoConfiguration.java +++ b/ad-distribute-starters/ad-distribute-starter-redis/src/main/java/com/baiye/autoconfigure/redis/RedisKeyEventAutoConfiguration.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.redis; +package com.baiye.autoconfigure.redis; import com.baiye.upms.config.CacheProperties; import com.baiye.keyevent.listener.*; diff --git a/ad-distribute-starters/ad-distribute-starter-redis/src/main/resources/META-INF/spring.factories b/ad-distribute-starters/ad-distribute-starter-redis/src/main/resources/META-INF/spring.factories index 9c1c8c6..ba1acd2 100644 --- a/ad-distribute-starters/ad-distribute-starter-redis/src/main/resources/META-INF/spring.factories +++ b/ad-distribute-starters/ad-distribute-starter-redis/src/main/resources/META-INF/spring.factories @@ -1,4 +1,4 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.baiye.ballcat.autoconfigure.redis.BallcatRedisAutoConfiguration,\ - com.baiye.ballcat.autoconfigure.redis.MessageEventListenerAutoConfiguration,\ - com.baiye.ballcat.autoconfigure.redis.RedisKeyEventAutoConfiguration \ No newline at end of file + com.baiye.autoconfigure.redis.BallcatRedisAutoConfiguration,\ + com.baiye.autoconfigure.redis.MessageEventListenerAutoConfiguration,\ + com.baiye.autoconfigure.redis.RedisKeyEventAutoConfiguration diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/MessageDistributorTypeConstants.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/MessageDistributorTypeConstants.java similarity index 90% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/MessageDistributorTypeConstants.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/MessageDistributorTypeConstants.java index cfa2085..1228471 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/MessageDistributorTypeConstants.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/MessageDistributorTypeConstants.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.websocket; +package com.baiye.autoconfigure.websocket; /** * websocket 消息分发器类型常量类 diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/SockJsServiceConfigurer.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/SockJsServiceConfigurer.java similarity index 87% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/SockJsServiceConfigurer.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/SockJsServiceConfigurer.java index 60d909d..466e16e 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/SockJsServiceConfigurer.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/SockJsServiceConfigurer.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.websocket; +package com.baiye.autoconfigure.websocket; import org.springframework.web.socket.config.annotation.SockJsServiceRegistration; diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketAutoConfiguration.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketAutoConfiguration.java similarity index 79% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketAutoConfiguration.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketAutoConfiguration.java index 3e8e968..759925e 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketAutoConfiguration.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketAutoConfiguration.java @@ -1,9 +1,6 @@ -package com.baiye.ballcat.autoconfigure.websocket; +package com.baiye.autoconfigure.websocket; -import com.baiye.ballcat.autoconfigure.websocket.config.LocalMessageDistributorConfig; -import com.baiye.ballcat.autoconfigure.websocket.config.RedisMessageDistributorConfig; -import com.baiye.ballcat.autoconfigure.websocket.config.RocketMqMessageDistributorConfig; -import com.baiye.ballcat.autoconfigure.websocket.config.WebSocketHandlerConfig; +import com.baiye.autoconfigure.websocket.config.*; import com.baiye.handler.JsonMessageHandler; import com.baiye.handler.PingJsonMessageHandler; import com.baiye.holder.JsonMessageHandlerInitializer; @@ -31,8 +28,8 @@ import java.util.List; * @author Yakir Hccake */ @AutoConfiguration -@Import({ WebSocketHandlerConfig.class, LocalMessageDistributorConfig.class, RedisMessageDistributorConfig.class, - RocketMqMessageDistributorConfig.class }) +@Import({WebSocketHandlerConfig.class, LocalMessageDistributorConfig.class, RedisMessageDistributorConfig.class, + RocketMqMessageDistributorConfig.class}) @EnableWebSocket @RequiredArgsConstructor @EnableConfigurationProperties(WebSocketProperties.class) @@ -40,15 +37,16 @@ public class WebSocketAutoConfiguration { private final WebSocketProperties webSocketProperties; + @Bean @ConditionalOnMissingBean public WebSocketConfigurer webSocketConfigurer(List handshakeInterceptor, - WebSocketHandler webSocketHandler, - @Autowired(required = false) SockJsServiceConfigurer sockJsServiceConfigurer) { + WebSocketHandler webSocketHandler, + @Autowired(required = false) SockJsServiceConfigurer sockJsServiceConfigurer) { return registry -> { WebSocketHandlerRegistration registration = registry - .addHandler(webSocketHandler, webSocketProperties.getPath()) - .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); + .addHandler(webSocketHandler, webSocketProperties.getPath()) + .addInterceptors(handshakeInterceptor.toArray(new HandshakeInterceptor[0])); String[] allowedOrigins = webSocketProperties.getAllowedOrigins(); if (allowedOrigins != null && allowedOrigins.length > 0) { @@ -71,6 +69,7 @@ public class WebSocketAutoConfiguration { /** * 心跳处理器 + * * @return PingJsonMessageHandler */ @Bean @@ -82,6 +81,7 @@ public class WebSocketAutoConfiguration { /** * 注册 JsonMessageHandlerInitializer 收集所有的 json 类型消息处理器 + * * @param jsonMessageHandlerList json 类型消息处理器 * @return JsonMessageHandlerInitializer */ diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketProperties.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketProperties.java similarity index 94% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketProperties.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketProperties.java index ee3402d..3884832 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/WebSocketProperties.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketProperties.java @@ -1,4 +1,4 @@ -package com.baiye.ballcat.autoconfigure.websocket; +package com.baiye.autoconfigure.websocket; import com.baiye.handler.ConcurrentWebSocketSessionOptions; import lombok.Data; @@ -14,7 +14,7 @@ import org.springframework.boot.context.properties.NestedConfigurationProperty; @ConfigurationProperties(WebSocketProperties.PREFIX) public class WebSocketProperties { - public static final String PREFIX = "ballcat.websocket"; + public static final String PREFIX = "distribute.websocket"; /** * 路径: 无参: /ws 有参: PathVariable: 单参: /ws/{test} 多参: /ws/{test1}/{test2} query: diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/LocalMessageDistributorConfig.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/LocalMessageDistributorConfig.java similarity index 84% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/LocalMessageDistributorConfig.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/LocalMessageDistributorConfig.java index defb72a..d8705bb 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/LocalMessageDistributorConfig.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/LocalMessageDistributorConfig.java @@ -1,7 +1,7 @@ -package com.baiye.ballcat.autoconfigure.websocket.config; +package com.baiye.autoconfigure.websocket.config; -import com.baiye.ballcat.autoconfigure.websocket.MessageDistributorTypeConstants; -import com.baiye.ballcat.autoconfigure.websocket.WebSocketProperties; +import com.baiye.autoconfigure.websocket.MessageDistributorTypeConstants; +import com.baiye.autoconfigure.websocket.WebSocketProperties; import com.baiye.distribute.LocalMessageDistributor; import com.baiye.distribute.MessageDistributor; import com.baiye.session.WebSocketSessionStore; diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RedisMessageDistributorConfig.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RedisMessageDistributorConfig.java similarity index 91% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RedisMessageDistributorConfig.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RedisMessageDistributorConfig.java index 6328e8b..66bc4cd 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RedisMessageDistributorConfig.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RedisMessageDistributorConfig.java @@ -1,7 +1,7 @@ -package com.baiye.ballcat.autoconfigure.websocket.config; +package com.baiye.autoconfigure.websocket.config; -import com.baiye.ballcat.autoconfigure.websocket.MessageDistributorTypeConstants; -import com.baiye.ballcat.autoconfigure.websocket.WebSocketProperties; +import com.baiye.autoconfigure.websocket.MessageDistributorTypeConstants; +import com.baiye.autoconfigure.websocket.WebSocketProperties; import com.baiye.distribute.MessageDistributor; import com.baiye.distribute.RedisMessageDistributor; import com.baiye.distribute.RedisMessageListenerInitializer; diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java similarity index 84% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java index 0a8446a..e371dc0 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java @@ -1,7 +1,7 @@ -package com.baiye.ballcat.autoconfigure.websocket.config; +package com.baiye.autoconfigure.websocket.config; -import com.baiye.ballcat.autoconfigure.websocket.MessageDistributorTypeConstants; -import com.baiye.ballcat.autoconfigure.websocket.WebSocketProperties; +import com.baiye.autoconfigure.websocket.MessageDistributorTypeConstants; +import com.baiye.autoconfigure.websocket.WebSocketProperties; import com.baiye.distribute.MessageDistributor; import com.baiye.distribute.RocketmqMessageDistributor; import com.baiye.session.WebSocketSessionStore; diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/WebSocketHandlerConfig.java b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/WebSocketHandlerConfig.java similarity index 92% rename from ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/WebSocketHandlerConfig.java rename to ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/WebSocketHandlerConfig.java index 4899edb..c3ee484 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/ballcat/autoconfigure/websocket/config/WebSocketHandlerConfig.java +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/WebSocketHandlerConfig.java @@ -1,6 +1,6 @@ -package com.baiye.ballcat.autoconfigure.websocket.config; +package com.baiye.autoconfigure.websocket.config; -import com.baiye.ballcat.autoconfigure.websocket.WebSocketProperties; +import com.baiye.autoconfigure.websocket.WebSocketProperties; import com.baiye.handler.CustomWebSocketHandler; import com.baiye.handler.PlanTextMessageHandler; import com.baiye.session.DefaultWebSocketSessionStore; @@ -45,4 +45,4 @@ public class WebSocketHandlerConfig { return customWebSocketHandler; } -} \ No newline at end of file +} diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring.factories b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring.factories index ed0a0f4..377bb6f 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring.factories +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.baiye.ballcat.autoconfigure.websocket.WebSocketAutoConfiguration \ No newline at end of file + com.baiye.autoconfigure.websocket.WebSocketAutoConfiguration diff --git a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index f82a3e2..6b18572 100644 --- a/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ad-distribute-starters/ad-distribute-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1 @@ -com.baiye.ballcat.autoconfigure.websocket.WebSocketAutoConfiguration \ No newline at end of file +com.baiye.autoconfigure.websocket.WebSocketAutoConfiguration diff --git a/ad-distribute-system/pom.xml b/ad-distribute-system/pom.xml index 4ca6aac..fb9933a 100644 --- a/ad-distribute-system/pom.xml +++ b/ad-distribute-system/pom.xml @@ -35,12 +35,12 @@ org.mapstruct mapstruct - 1.5.0.Beta1 + org.mapstruct mapstruct-processor - 1.5.0.Beta1 + 1.5.3.Final diff --git a/admin/pom.xml b/admin/pom.xml index 83891bd..be272b8 100644 --- a/admin/pom.xml +++ b/admin/pom.xml @@ -22,16 +22,19 @@ security-oauth2-authorization-server 1.1.0 + com.baiye - admin-core + admin-websocket 1.1.0 + com.baiye - admin-websocket + admin-core 1.1.0 + org.springframework.boot spring-boot-starter-web diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueMapper.java index 12c562f..de4852c 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueMapper.java +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/ClueMapper.java @@ -26,6 +26,7 @@ public interface ClueMapper extends ExtendMapper { LambdaAliasQueryWrapperX wrapperX = WrappersX.lambdaAliasQueryX(ClueEntity.class); wrapperX.eqIfPresent(ClueEntity::getDeleted, 0) .eqIfPresent(ClueEntity::getNid, qo.getNid()) + .eqIfPresent(ClueEntity::getClueId, qo.getClueId()) .eqIfPresent(ClueEntity::getCreateBy, qo.getCreateBy()) .likeIfPresent(ClueEntity::getClueLabelName, qo.getClueLabelName()) .eqIfPresent(ClueEntity::getAssignedBy, qo.getAssignedBy()) diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java index 1b09438..31f2e91 100644 --- a/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/ClueQo.java @@ -7,6 +7,9 @@ import lombok.Data; @Data public class ClueQo { + @Schema(title = "线索id") + private String clueId; + @Schema(title = "手机号") private String nid; diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml index 7c383f1..77340d5 100644 --- a/admin/src/main/resources/logback-spring.xml +++ b/admin/src/main/resources/logback-spring.xml @@ -85,4 +85,4 @@ - \ No newline at end of file + diff --git a/admin/src/test/java/PushMessageTest.java b/admin/src/test/java/PushMessageTest.java new file mode 100644 index 0000000..f3f7a88 --- /dev/null +++ b/admin/src/test/java/PushMessageTest.java @@ -0,0 +1,41 @@ +import com.baiye.AdminApplication; +import com.baiye.notify.event.StationNotifyPushEvent; +import com.baiye.notify.model.domain.AnnouncementNotifyInfo; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + +import java.time.LocalDateTime; +import java.util.Collections; + +/** + * @author Enzo + * @date : 2023/11/24 + */ +@Slf4j +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AdminApplication.class, + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class PushMessageTest { + + @Autowired + private ApplicationContext publisher; + + @Test + public void pushMessage() { + // 发布事件,监听者进行实际的 websocket 推送 + AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo(); + notifyInfo.setTitle("变形金刚"); + notifyInfo.setMessageKey("783"); + notifyInfo.setContent("《变形金刚》是美国科幻动作系列电影,改编自起源于20世纪80年代的变形金刚品牌系列。该电影系列由派拉蒙影业公司和梦工厂发行。"); + notifyInfo.setCreateTime(LocalDateTime.now()); + notifyInfo.setType(1); + notifyInfo.setState(0); + publisher.publishEvent( new StationNotifyPushEvent(notifyInfo, Collections.singletonList(137L))); + } +} + diff --git a/pom.xml b/pom.xml index b3cefa1..d2dbf75 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,7 @@ ad-distribute-common ad-distribute-security ad-distribute-admin + ad-distribute-notify ad-distribute-starters ad-distribute-extends