package com.zhujizheng.IHome.everymoment.service; import com.zhujizheng.IHome.everymoment.dto.*; import com.zhujizheng.IHome.everymoment.sysmsg.PYEveryMomentCommentSysMsg; import com.zhujizheng.IHome.everymoment.sysmsg.PYEveryMomentSysMsg; import com.zhujizheng.IHome.everymoment.sysmsg.PYEveryMomentThumbupSysMsg; import com.zhujizheng.IHome.everymoment.vo.PYEveryMomentCommentVO; import com.zhujizheng.IHome.everymoment.vo.PYEveryMomentImgVO; import com.zhujizheng.IHome.everymoment.vo.PYEveryMomentThumbupVO; import com.zhujizheng.IHome.generator.dao.*; import com.zhujizheng.IHome.generator.mapper.*; import com.zhujizheng.IHome.everymoment.vo.PYEveryMomentVO; import com.zhujizheng.IHome.everymomentmsg.vo.PYEveryMomentMsgVO; import com.zhujizheng.IHome.util.CodeUtil; import com.zhujizheng.IHome.util.aes.AESUtil; import com.zhujizheng.IHome.util.alipush.AliPushService; import com.zhujizheng.IHome.util.dto.DTOUtils; import com.zhujizheng.IHome.everymomentmsg.net.NetEveryMomentMsg; import com.zhujizheng.IHome.websocket.server.WebSocketServer; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; /** * Created with IntelliJ IDEA *

* Author: yons * Date: 2019/03/08 * Time: 00:13 * Description: * Copyright © 2019年 com.zhujizheng. All rights reserved. */ @Service @Slf4j @Transactional(rollbackFor = RuntimeException.class) public class PYEveryMomentServiceImpl implements PYEveryMomentService { @Autowired private PYEveryMomentMapper everyMomentMapper; @Autowired private PYEveryMomentImgMapper imgMapper; @Autowired private PYUserInfoMapper userInfoMapper; @Autowired private PYEveryMomentCommentMapper commentMapper; @Autowired private PYEveryMomentThumbupMapper thumbupMapper; @Autowired private CodeUtil codeUtil; @Autowired private AliPushService aliPushService; @Autowired private PYEveryMomentMsgMapper msgMapper; @Autowired private ApplicationEventPublisher publisher; private static final int DEFAULT_NUM = 10; @Override public List pullEveryMoment(PYEveryMomentPullDTO pullEveryMomentDTO) { Integer userId = pullEveryMomentDTO.getUserId(); Integer loverId = pullEveryMomentDTO.getLoverId(); String tag = pullEveryMomentDTO.getTag(); Integer emIdInt = pullEveryMomentDTO.getEmId(); String keyword = pullEveryMomentDTO.getKeyword(); if (emIdInt == null) { log.info("emIdInt数据异常"); return null; } int emId = codeUtil.dealInt(emIdInt); List everyMomentList = null; if (userId == null && loverId == null && tag != null) { // 查询指定类型的数据 everyMomentList = everyMomentMapper.selectKongfuData(emId, tag, DEFAULT_NUM); } else if (userId != null && loverId != null && tag != null) { // 查询指定用户,指定类型的数据 everyMomentList = everyMomentMapper.selectEveryMomentWithTag(userId, loverId, emId, tag, DEFAULT_NUM); } else if (userId != null && loverId != null && keyword != null) { // 搜索动态 everyMomentList = everyMomentMapper.selectEveryMomentWithKeyword(userId, loverId, emId, keyword, DEFAULT_NUM); } else if (userId != null && loverId != null) { // 查询指定用户的数据 everyMomentList = everyMomentMapper.selectEveryMoment(userId, loverId, emId, DEFAULT_NUM); } else { log.warn("pullEveryMoment数据异常"); return null; } if (everyMomentList == null) { log.info("pullEveryMoment 查询动态集合为空" + pullEveryMomentDTO); return null; } // 动态VO集合 List everyMomentVOList = new ArrayList<>(); // 遍历所有动态模型 for (PYEveryMoment everyMoment : everyMomentList) { // 获取某条动态模型 // 根据动态模型获取动态VO Pair pair = PYEveryMomentVO.createVO(everyMoment, userInfoMapper, imgMapper, commentMapper, thumbupMapper); if (pair != null) { // 将动态VO添加到动态VO集合 everyMomentVOList.add(pair.getLeft()); } else { log.info("pullEveryMoment 根据动态模型获取动态VO为空" + everyMoment); } } return everyMomentVOList; } @Override public PYEveryMomentVO getEveryMomentByEmId(int emId) { log.info("emId = " + emId); // 根据动态id获取动态模型 PYEveryMoment everyMoment = everyMomentMapper.selectEveryMomentByEmId(emId); // 根据动态模型获取动态VO Pair pair = PYEveryMomentVO.createVO(everyMoment, userInfoMapper, imgMapper, commentMapper, thumbupMapper); if (pair == null) { log.info("getEveryMomentByEmId 获取动态模型VO为空"); return null; } return pair.getLeft(); } @Override public PYEveryMomentVO pushEveryMoment(PYEveryMomentPushDTO pushDTO) { PYEveryMoment everyMoment = PYEveryMoment.createEveryMoment(pushDTO); int insertResult = everyMomentMapper.insertEveryMoment(everyMoment); if (insertResult == 0) { log.info("pushEveryMoment 插入动态失败" + everyMoment); return null; } if (pushDTO.getImgs() != null && pushDTO.getImgs().size() > 0) { List imgDTOList = pushDTO.getImgs(); log.info("imgDTOList = " + imgDTOList); for (PYEveryMomentPushDTO.PYPushEveryMomentImgDTO imgDTO : imgDTOList) { if (imgDTO.getType() == null) { imgDTO.setType(1); } assert everyMoment != null; int result = imgMapper.insertImgWithEmId(everyMoment.getId(), imgDTO.getUrl(), imgDTO.getIdx(), imgDTO.getWidth(), imgDTO.getHeight(), imgDTO.getOrientation(), pushDTO.getUserId(), pushDTO.getTag(), imgDTO.getType(), pushDTO.getReleaseTime()); if (result == 0) { log.info("pushEveryMoment 插入动态的图片失败" + imgDTO + everyMoment); } } } /// 发出事件通知 publisher.publishEvent(pushDTO); Pair pair = PYEveryMomentVO.createVO(everyMoment, userInfoMapper, imgMapper, commentMapper, thumbupMapper); if (pair == null) { log.info("pushEveryMoment 根据动态模型获取动态VO为空" + everyMoment); return null; } // 根据动态VO创建一个系统消息 PYEveryMomentSysMsg sysMsg = PYEveryMomentSysMsg.createSystemMessage(pair.getLeft(), pair.getRight()); // 插入系统消息并推送 this.pushRemoteMessage(sysMsg); return pair.getLeft(); } @Override public int deleteEveryMoment(PYEveryMomentDeleteDTO deleteEveryMomentDTO) { int result = everyMomentMapper.updateEveryMoment(deleteEveryMomentDTO.getEmId(), deleteEveryMomentDTO.getUserId()); if (result == 0) { log.info("deleteEveryMoment 删除动态失败" + deleteEveryMomentDTO); } PYEveryMomentMsg sysMsg = msgMapper.selectMsgWithUserIdAndMsgTypeAndMsgTypeId(deleteEveryMomentDTO.getUserId(), 1, deleteEveryMomentDTO.getEmId()); this.deleteSystemMessage(sysMsg); return result; } @Override public PYEveryMomentThumbupVO thumbupEveryMoment(PYEveryMomentThumbupDTO thumbupDTO) { log.info("thumbupDTO = " + thumbupDTO); List thumbupList = thumbupMapper.selectAllThumbupWithEmIdAndUserId(thumbupDTO.getEmId(), thumbupDTO.getFromUserId()); log.info("thumbupList = " + thumbupList); int result; PYEveryMomentThumbup thumbup; AtomicBoolean needCreateMsg = new AtomicBoolean(); if (thumbupList == null || thumbupList.size() == 0) { // 如果不能查到点赞数据,就插入一条新的点赞数据 thumbup = PYEveryMomentThumbup.createThumbup(thumbupDTO); result = thumbupMapper.insertThumbupEveryMoment(thumbup); needCreateMsg.set(true); } else { // 如果能查到点赞数据,就更新旧的点赞数据,防止多次"点赞/取消点赞"产生大量点赞记录 thumbup = thumbupList.get(0); result = thumbupMapper.updateThumbupEveryMoment( thumbup.getId(), thumbup.getEmId(), thumbup.getFromUserId(), thumbup.getToUserId(), thumbup.getThumbupTime(), 0); needCreateMsg.set(false); } if (result == 0) { log.info("thumbupEveryMoment 更新或插入点赞数据失败" + thumbupList); return null; } else { PYEveryMomentThumbupVO thumbupVO = PYEveryMomentThumbupVO.createThumbupVO(thumbup, userInfoMapper); if (thumbupVO == null) { log.info("thumbupEveryMoment 获取点赞VO为空" + thumbup); return null; } if (needCreateMsg.get()) { // 创建一条系统消息 PYEveryMomentThumbupSysMsg sysMsg = PYEveryMomentThumbupSysMsg.createSystemMessage(thumbupVO, everyMomentMapper, imgMapper, userInfoMapper); // 插入系统消息并推送 this.pushRemoteMessage(sysMsg); } else { PYEveryMomentMsg sysMsg = msgMapper.selectMsgWithUserIdAndMsgTypeAndMsgTypeId(thumbupVO.getFromUserId(), 3, thumbupVO.getThumbupId()); msgMapper.updateMsgIsRead(sysMsg.getMsgId(), false); } return thumbupVO; } } @Override public void dealThumbupEveryMoment(String dataString, WebSocketServer socketServer, String protocolNumber) { PYEveryMomentThumbupDTO thumbupDTO = (PYEveryMomentThumbupDTO) DTOUtils.createDTO(dataString, PYEveryMomentThumbupDTO.class); if (thumbupDTO == null) { log.info("dealThumbupEveryMoment 解析点赞数据异常" + dataString + protocolNumber); return; } PYEveryMomentThumbupVO thumbupVO = this.thumbupEveryMoment(thumbupDTO); // socketServer.send(thumbupVO, protocolNumber); } @Override public int cancelThumbupEveryMoment(PYEveryMomentCancelThumbupDTO cancelThumbupDTO) { int result = thumbupMapper.updateThumbupEveryMoment(cancelThumbupDTO.getThumbupId(), cancelThumbupDTO.getEmId(), cancelThumbupDTO.getFromUserId(), cancelThumbupDTO.getToUserId(), cancelThumbupDTO.getThumbupTime(), 1); if (result == 0) { log.info("cancelThumbupEveryMoment 更新点赞数据失败" + cancelThumbupDTO); } PYEveryMomentMsg sysMsg = msgMapper.selectMsgWithUserIdAndMsgTypeAndMsgTypeId(cancelThumbupDTO.getFromUserId(), 3, cancelThumbupDTO.getThumbupId()); this.deleteSystemMessage(sysMsg); return result; } @Override public void dealCancelThumbupEveryMoment(String dataString, WebSocketServer socketServer, String protocolNumber) { log.info("dataString = " + dataString); PYEveryMomentCancelThumbupDTO cancelThumbupDTO = (PYEveryMomentCancelThumbupDTO)DTOUtils.createDTO(dataString, PYEveryMomentCancelThumbupDTO.class); log.info("cancelThumbupDTO = " + cancelThumbupDTO); if (cancelThumbupDTO == null) { log.info("dealCancelThumbupEveryMoment 解析取消点赞数据异常" + dataString + protocolNumber); return; } int result = this.cancelThumbupEveryMoment(cancelThumbupDTO); // socketServer.send(result, protocolNumber); } @Override public PYEveryMomentCommentVO commentEveryMoment(PYEveryMomentCommentDTO commentDTO) { PYEveryMomentComment comment = PYEveryMomentComment.createComment(commentDTO); log.info("comment = " + comment); int result = commentMapper.insertCommentEveryMoment(comment); log.info("result = " + result + "comment = " + comment); if (result == 0) { log.info("commentEveryMoment 插入评论数据失败" + commentDTO); return null; } PYEveryMomentCommentVO commentVO = PYEveryMomentCommentVO.createCommentVO(comment, userInfoMapper); if (commentVO == null) { log.info("commentEveryMoment 获取评论数据异常" + commentDTO); return null; } // 创建一条系统消息 PYEveryMomentCommentSysMsg sysMsg = PYEveryMomentCommentSysMsg.createSystemMessage(commentVO, everyMomentMapper, imgMapper, userInfoMapper); // 插入系统消息并推送 this.pushRemoteMessage(sysMsg); return commentVO; } @Override public int deleteCommentEveryMoment(PYEveryMomentDeleteCommentDTO deleteCommentDTO) { log.info("deleteCommentDTO = " + deleteCommentDTO); int result = commentMapper.updateCommentEveryMoment(deleteCommentDTO.getCommentId(), deleteCommentDTO.getEmId(), deleteCommentDTO.getFromUserId(), deleteCommentDTO.getToUserId(), deleteCommentDTO.getCommentTime()); if (result == 0) { log.info("deleteCommentEveryMoment 删除评论失败" + deleteCommentDTO); } else { PYEveryMomentMsg sysMsg = msgMapper.selectMsgWithUserIdAndMsgTypeAndMsgTypeId(deleteCommentDTO.getFromUserId(), 2, deleteCommentDTO.getCommentId()); this.deleteSystemMessage(sysMsg); } return result; } private void deleteSystemMessage(PYEveryMomentMsg sysMsg) { log.info("sysMsg = " + sysMsg); if (sysMsg == null) { return; } int result = msgMapper.updateMsg(sysMsg.getMsgId(), true); if (result == 0) { log.info("deleteSystemMessage 删除系统消息失败"); } } @Override public List getImgListWithUserId(int userId) { log.info("getImgListWithUserId userId = " + userId); List imgList = imgMapper.selectImgListWithUserId(userId); List imgVOList = new ArrayList<>(); for (PYEveryMomentImg img: imgList) { PYEveryMomentImgVO vo = PYEveryMomentImgVO.createImgVO(img); if (vo != null) { imgVOList.add(vo); } } return imgVOList; } /** * @Description: 推送远程消息 * @Param: com.zhujizheng.IHome.generator.dao.PYSystemMessage * @return: 无 * @Author: 朱吉峥 * @Date: 2019/04/30 */ private void pushRemoteMessage(PYEveryMomentMsg sysMsg) { if (sysMsg == null) { log.info("pushRemoteMessage 创建一条系统消息失败"); return; } if (sysMsg.getMsgId() == null) { // 插入一条系统消息 int result = msgMapper.insertMsg(sysMsg); if (result == 0) { log.info("pushRemoteMessage 插入一条系统消息失败" + sysMsg); return; } log.info("pushRemoteMessage 插入一条系统消息成功:" + sysMsg); } else { // 更新一条系统消息 int result = msgMapper.updateMsg(sysMsg.getMsgId(), false); if (result == 0) { log.info("pushRemoteMessage 更新一条系统消息失败" + sysMsg); return; } } // 获取未读消息 List list = msgMapper.selectUnreadMsgs(sysMsg.getLoverId()); if (list == null || list.size() == 0) { log.info("pushRemoteMessage 获取未读消息列表异常" + list + sysMsg); return; } log.info("获取未读消息list = " + list); PYEveryMomentMsgVO msgVO = PYEveryMomentMsgVO.createVO(sysMsg, userInfoMapper); if (msgVO == null) { return; } if (null != msgVO.getContent() && msgVO.getNeedDecode()) { String result = AESUtil.commonDecrypt(msgVO.getContent()); msgVO.setContent(result); } // 在线推送 String sid = sysMsg.getLoverId().toString(); WebSocketServer item = WebSocketServer.getWebSocketMap().get(sid); if (null == item) { // 离线推送 log.info("离线推送:msgVO:" + msgVO + ", sysMsg.getLoverId() = " + sysMsg.getLoverId() + "list.size() = " + list.size()); aliPushService.pushRemoteNotify(msgVO, sysMsg.getLoverId(), list.size()); return; } log.info("在线推送:msgVO:" + msgVO + ", sid = " + sid); NetEveryMomentMsg netEveryMomentMsg = new NetEveryMomentMsg(); netEveryMomentMsg.sendObject(msgVO, sid); } }