|
|
@@ -0,0 +1,209 @@
|
|
|
+package com.uas.console.donate.listener;
|
|
|
+
|
|
|
+import com.uas.console.donate.dao.*;
|
|
|
+import com.uas.console.donate.event.*;
|
|
|
+import com.uas.console.donate.model.*;
|
|
|
+import com.uas.console.donate.service.MessageService;
|
|
|
+import com.uas.platform.core.logging.BufferedLoggerManager;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.ApplicationListener;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 监听发布事件<br>
|
|
|
+ * 产生消息
|
|
|
+ * @author dongbw 2018年1月4日 14:02:49
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class PublishListener implements ApplicationListener<PublishEvent<?, ?>> {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MessageDetailDao messageDetailDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MessageDao messageDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserDao userDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MessageService messageService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProjectReportDao projectReportDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProjectFinanceDao projectFinanceDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProjectConcludeDao projectConcludeDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ProjectRecodeDao projectRecodeDao;
|
|
|
+
|
|
|
+ private static final UsageBufferedLogger logger = BufferedLoggerManager.getLogger(UsageBufferedLogger.class);
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 监听事件,产生消息
|
|
|
+ * @param event 事件
|
|
|
+ */
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ @Async
|
|
|
+ @Override
|
|
|
+ public void onApplicationEvent(final PublishEvent<?, ?> event) {
|
|
|
+ List<MessageDetail> messageDetailList = (List<MessageDetail>) event.release();
|
|
|
+ // TODO 事件触发监听器产生消息
|
|
|
+ // 发布项目事件 || 发布活动事件
|
|
|
+ if (event instanceof ProjectPublishEvent || event instanceof ActivityPublishEvent) {
|
|
|
+ // 发布消息
|
|
|
+ PublishAllUsersReceived(messageDetailList);
|
|
|
+ // 项目相关内容发布
|
|
|
+ } else if (event instanceof ProjectReportPublishEvent || event instanceof ProjectFinancePublishEvent || event instanceof ProjectConcludePublishEvent) {
|
|
|
+ // 发布消息
|
|
|
+ PublishProjectRelatedUsers(messageDetailList);
|
|
|
+ // 活动中奖
|
|
|
+ } else if (event instanceof GetPrizePublishEvent) {
|
|
|
+ PublishOneUser(messageDetailList);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对所有用户发送消息
|
|
|
+ * @param messageDetailList 消息list
|
|
|
+ */
|
|
|
+ private void PublishAllUsersReceived (List<MessageDetail> messageDetailList) {
|
|
|
+ List<MessageDetail> saveDetails = new ArrayList<>();
|
|
|
+ for (MessageDetail detail : messageDetailList) {
|
|
|
+ Message message = detail.getMessage();
|
|
|
+ if (null != message.getUserUU()) { // 确保消息有效才继续
|
|
|
+ // 查找所有用户
|
|
|
+ List<User> receiverUsers = userDao.findAll();
|
|
|
+ // 生成消息
|
|
|
+ createMessage(message, receiverUsers, saveDetails);
|
|
|
+ }
|
|
|
+ logger.log("消息提醒", "产生消息提醒", message.getTitle(), null, message.getId());
|
|
|
+ }
|
|
|
+ saveDetails = messageDetailDao.save(saveDetails);
|
|
|
+ // 推送消息到手机APP
|
|
|
+ pushMessageToApp(saveDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对参与项目的人发送消息
|
|
|
+ * @param messageDetailList 消息list
|
|
|
+ */
|
|
|
+ private void PublishProjectRelatedUsers(List<MessageDetail> messageDetailList) {
|
|
|
+ List<MessageDetail> saveDetails = new ArrayList<>();
|
|
|
+ for (MessageDetail detail : messageDetailList) {
|
|
|
+ Message message = detail.getMessage();
|
|
|
+ if (null != message.getTable() && null != message.getSourceId()) { // 确保消息有效才继续
|
|
|
+ // 查找接收消息用户
|
|
|
+ List<User> receiverUsers = getReceivedUsers(message.getTable(), message.getSourceId());
|
|
|
+ // 生成消息
|
|
|
+ createMessage(message, receiverUsers, saveDetails);
|
|
|
+ }
|
|
|
+ logger.log("消息提醒", "产生消息提醒", message.getTitle(), null, message.getId());
|
|
|
+ }
|
|
|
+ saveDetails = messageDetailDao.save(saveDetails);
|
|
|
+ // 推送消息到手机APP
|
|
|
+ pushMessageToApp(saveDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 为单个用户产生消息
|
|
|
+ * @param messageDetailList 消息list
|
|
|
+ */
|
|
|
+ private void PublishOneUser(List<MessageDetail> messageDetailList) {
|
|
|
+ List<MessageDetail> saveDetails = new ArrayList<>();
|
|
|
+ for (MessageDetail detail : messageDetailList) {
|
|
|
+ Message message = detail.getMessage();
|
|
|
+ saveDetails.add(detail);
|
|
|
+ logger.log("消息提醒", "产生消息提醒", message.getTitle(), null, message.getId(), detail.getReceiveUserUU());
|
|
|
+ }
|
|
|
+ saveDetails = messageDetailDao.save(saveDetails);
|
|
|
+ // 推送消息到手机APP
|
|
|
+ pushMessageToApp(saveDetails);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据来源表和来源id获取接收用户
|
|
|
+ * @param table 来源表
|
|
|
+ * @param sourceId 来源id
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<User> getReceivedUsers(String table, Long sourceId) {
|
|
|
+ List<User> users = new ArrayList<>();
|
|
|
+ Project project = new Project();
|
|
|
+ // 获取对应项目
|
|
|
+ switch(table) {
|
|
|
+ case "donate$projectreport":
|
|
|
+ ProjectReport report = projectReportDao.findOne(sourceId);
|
|
|
+ project = report.getProject();
|
|
|
+ break;
|
|
|
+ case "donate$projectfinance":
|
|
|
+ ProjectFinance finance = projectFinanceDao.findOne(sourceId);
|
|
|
+ project = finance.getProject();
|
|
|
+ break;
|
|
|
+ case "donate$projectconclude":
|
|
|
+ ProjectConclude conclude = projectConcludeDao.findOne(sourceId);
|
|
|
+ project = conclude.getProject();
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+ if (null != project.getId()) {
|
|
|
+ List<ProjectRecode> recodes = projectRecodeDao.findProjectDetail(project.getId());
|
|
|
+ for(ProjectRecode recode : recodes) {
|
|
|
+ users.add(recode.getUser());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return users;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 推送消息到App
|
|
|
+ * @param saveDetails 详细详情list
|
|
|
+ */
|
|
|
+ private void pushMessageToApp(List<MessageDetail> saveDetails) {
|
|
|
+ try {
|
|
|
+ // 推送消息
|
|
|
+ messageService.pushReleases(saveDetails);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 产生消息
|
|
|
+ * @param message 消息
|
|
|
+ * @param receiverUsers 接受人UU
|
|
|
+ * @param saveDetails 保存的消息详情list
|
|
|
+ */
|
|
|
+ private void createMessage ( Message message, List<User> receiverUsers, List<MessageDetail> saveDetails) {
|
|
|
+ // 用于存储需要接收消息的用户UU
|
|
|
+ Set<Long> userUUs = new HashSet<>();
|
|
|
+ // 设置接收人数
|
|
|
+ message.setReceiverNum(receiverUsers.size());
|
|
|
+ // 为用户新增消息(这里是所有人时,效率非常低,之后需要优化)
|
|
|
+ for (User user : receiverUsers) {
|
|
|
+ try { //去除userUU为空值的情况
|
|
|
+ if (null != user.getUserUU() && !userUUs.contains(user.getUserUU())) {
|
|
|
+ MessageDetail messageDetail = new MessageDetail(user.getUserUU());
|
|
|
+ messageDetail.setMessage(message);
|
|
|
+ saveDetails.add(messageDetail);
|
|
|
+ userUUs.add(user.getUserUU());
|
|
|
+ }
|
|
|
+ } catch (RuntimeException e) {
|
|
|
+ e.getStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|