package cn.exrick.xboot.core.serviceimpl; import cn.exrick.xboot.core.common.constant.CommonConstant; import cn.exrick.xboot.core.common.exception.XbootException; import cn.exrick.xboot.core.dao.MessageDao; import cn.exrick.xboot.core.dao.MessageSendDao; import cn.exrick.xboot.core.entity.Message; import cn.exrick.xboot.core.entity.MessageSend; import cn.exrick.xboot.core.service.MessageSendService; import cn.hutool.core.util.StrUtil; import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.lang.Nullable; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.persistence.criteria.*; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 消息发送接口实现 * @author Exrick */ @Slf4j @Service @Transactional public class MessageSendServiceImpl implements MessageSendService { @Autowired private MessageDao messageDao; @Autowired private MessageSendDao messageSendDao; @Autowired private SimpMessagingTemplate messagingTemplate; @Override public MessageSendDao getRepository() { return messageSendDao; } @Override public MessageSend send(MessageSend messageSend) { MessageSend ms = messageSendDao.save(messageSend); messagingTemplate.convertAndSendToUser(messageSend.getUserId(), "/queue/subscribe", "您收到了新的消息"); return ms; } @Override public void deleteByMessageId(String messageId) { messageSendDao.deleteByMessageId(messageId); } @Override public Page findByCondition(MessageSend messageSend, Pageable pageable) { return messageSendDao.findAll(new Specification() { @Nullable @Override public Predicate toPredicate(Root root, CriteriaQuery cq, CriteriaBuilder cb) { Path messageIdField = root.get("messageId"); Path userIdField = root.get("userId"); Path statusField = root.get("status"); List list = new ArrayList<>(); if (StrUtil.isNotBlank(messageSend.getMessageId())) { list.add(cb.equal(messageIdField, messageSend.getMessageId())); } if (StrUtil.isNotBlank(messageSend.getUserId())) { list.add(cb.equal(userIdField, messageSend.getUserId())); } if (messageSend.getStatus() != null) { list.add(cb.equal(statusField, messageSend.getStatus())); } Predicate[] arr = new Predicate[list.size()]; cq.where(list.toArray(arr)); return null; } }, pageable); } @Override public void updateStatusByUserId(String userId, Integer status) { messageSendDao.updateStatusByUserId(userId, status); } @Override public void deleteByUserId(String userId) { messageSendDao.deleteByUserId(userId, CommonConstant.MESSAGE_STATUS_READ); } @Override public Message getTemplateMessage(String messageId, Map params) { Message message = messageDao.findById(messageId).orElse(null); if (message == null) { throw new XbootException("消息ID:" + messageId + "不存在"); } // 放入变量 Message newMessage = new Message(); newMessage.setTitle(changeParams(message.getTitle(), params)); newMessage.setContent(changeParams(message.getContent(), params)); return newMessage; } @Override public void sendTemplateMessage(List userIds, String messageId, Map params) { Message message = messageDao.findById(messageId).orElse(null); if (message == null) { throw new XbootException("消息ID:" + messageId + "不存在"); } List messageSends = new ArrayList<>(); for (String userId : userIds) { MessageSend ms = new MessageSend(); ms.setUserId(userId).setMessageId(messageId); // 放入变量 ms.setTitle(changeParams(message.getTitle(), params)); ms.setContent(changeParams(message.getContent(), params)); ms.setParams(new Gson().toJson(params)); messageSends.add(ms); messagingTemplate.convertAndSendToUser(userId, "/queue/subscribe", "您收到了新的消息"); } messageSendDao.saveAll(messageSends); } @Override public void sendTemplateMessage(String userId, String messageId, Map params) { List users = new ArrayList<>(); users.add(userId); this.sendTemplateMessage(users, messageId, params); } public String changeParams(String v, Map params) { if (v == null || params == null) { return ""; } for (Map.Entry entry : params.entrySet()) { String key = entry.getKey().toString(); String value = entry.getValue().toString(); v = v.replaceAll("\\$\\{" + key + "\\}", value); } return v; } }