package com.tievd.cube.modules.system.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.tievd.cube.commons.constant.CommonConst; import com.tievd.cube.commons.constant.WebSocketConst; import com.tievd.cube.commons.exception.CubeAppException; import com.tievd.cube.commons.utils.SystemContextUtil; import com.tievd.cube.modules.system.entity.SysAnnouncement; import com.tievd.cube.modules.system.entity.SysAnnouncementSend; import com.tievd.cube.modules.system.mapper.SysAnnouncementMapper; import com.tievd.cube.modules.system.mapper.SysAnnouncementSendMapper; import com.tievd.cube.modules.system.model.LoginUser; import com.tievd.cube.modules.system.model.api.response.AnnouncementListByUserResponse; import com.tievd.cube.modules.system.service.ISysAnnouncementService; import com.tievd.cube.modules.system.extra.ws.AppWebSocketHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.List; @Service @Transactional public class SysAnnouncementServiceImpl extends ServiceImpl implements ISysAnnouncementService { @Autowired private SysAnnouncementSendMapper sysAnnouncementSendMapper; @Autowired private AppWebSocketHandler appWebSocketHandler; @Override public void saveAnnouncement(SysAnnouncement announcement) { baseMapper.insert(announcement); if (announcement.getMsgType().equals(CommonConst.MSG_TYPE_UESR)) { // 2.插入用户通告阅读标记表记录 String userId = announcement.getUserIds(); String[] userIds = userId.substring(0, (userId.length() - 1)).split(","); Date refDate = new Date(); for (String id : userIds) { SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(announcement.getId()); announcementSend.setUserId(id); announcementSend.setReadFlag(CommonConst.NO_READ_FLAG); announcementSend.setReadTime(refDate); sysAnnouncementSendMapper.insert(announcementSend); } } } @Override public void updateAnnouncement(SysAnnouncement announcement) { // 1.更新系统信息表数据 baseMapper.updateById(announcement); String userId = announcement.getUserIds(); if (StrUtil.isNotEmpty(userId) && announcement.getMsgType().equals(CommonConst.MSG_TYPE_UESR)) { // 2.补充新的通知用户数据 String[] userIds = userId.substring(0, (userId.length() - 1)).split(","); Date refDate = new Date(); for (String id : userIds) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); queryWrapper.eq(SysAnnouncementSend::getUserId, id); List announcementSends = sysAnnouncementSendMapper.selectList(queryWrapper); if (announcementSends.size() == 0) { SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(announcement.getId()); announcementSend.setUserId(id); announcementSend.setReadFlag(CommonConst.NO_READ_FLAG); announcementSend.setReadTime(refDate); sysAnnouncementSendMapper.insert(announcementSend); } } // 3. 删除多余通知用户数据 Collection delUserIds = Arrays.asList(userIds); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.notIn(SysAnnouncementSend::getUserId, delUserIds); queryWrapper.eq(SysAnnouncementSend::getAnntId, announcement.getId()); sysAnnouncementSendMapper.delete(queryWrapper); } } @Override public Page queryAnnouncementByUserId(Page page, String userId, int msgCategory) { return page.setRecords(baseMapper.querySysCementListByUserId(page, userId, msgCategory)); } @Override public void release(Long announcementId) { SysAnnouncement announcement = baseMapper.selectById(announcementId); if (announcement == null) { throw new CubeAppException("未找到对应实体!"); } announcement.setSendTime(new Date()); announcement.setSendStatus(CommonConst.HAS_SEND);//发布中 String currentUserName = StpUtil.getLoginIdAsString(); announcement.setSender(currentUserName); int ok = baseMapper.updateById(announcement); if (ok >= 1) { JSONObject msgData = JSONUtil.createObj(); if (announcement.getMsgType().equals(CommonConst.MSG_TYPE_ALL)) { msgData.set(WebSocketConst.MSG_CMD, WebSocketConst.CMD_TOPIC); msgData.set(WebSocketConst.MSG_ID, announcement.getId()); msgData.set(WebSocketConst.MSG_TXT, announcement.getTitle()); appWebSocketHandler.sendAllMessage(msgData.toString()); } else { // 2.插入用户通告阅读标记表记录 String userId = announcement.getUserIds(); String[] userIds = userId.substring(0, (userId.length() - 1)).split(","); msgData.set(WebSocketConst.MSG_CMD, WebSocketConst.CMD_USER); msgData.set(WebSocketConst.MSG_ID, announcement.getId()); msgData.set(WebSocketConst.MSG_TXT, announcement.getTitle()); appWebSocketHandler.sendMoreMessage(userIds, msgData.toString()); } } } @Override public void revoke(Long announcementId) { SysAnnouncement announcement = baseMapper.selectById(announcementId); if (announcement == null) { throw new CubeAppException("未找到对应数据!"); } announcement.setCancelTime(new Date()); announcement.setSendStatus(CommonConst.HAS_CANCEL); baseMapper.updateById(announcement); } @Override public AnnouncementListByUserResponse listByUser() { LoginUser sysUser = SystemContextUtil.currentLoginUser(); String userId = sysUser.getId(); // 1.将系统消息补充到用户通告阅读标记表中 List anntIds = sysAnnouncementSendMapper.queryByUserId(userId); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SysAnnouncement::getMsgType, CommonConst.MSG_TYPE_ALL); // 全部人员 wrapper.eq(SysAnnouncement::getDelFlag, CommonConst.NOT_DELETED.toString()); // 未删除 wrapper.eq(SysAnnouncement::getSendStatus, CommonConst.HAS_SEND); //已发布 wrapper.ge(SysAnnouncement::getEndTime, sysUser.getCreateTime()); //新注册用户不看结束通知 if (anntIds != null && anntIds.size() > 0) { wrapper.notIn(SysAnnouncement::getId, anntIds); } List announcements = baseMapper.selectList(wrapper); if (announcements.size() > 0) { for (SysAnnouncement announcement : announcements) { // update-begin--Author:wangshuai Date:20200803 for: 通知公告消息重复 // 因为websocket没有判断是否存在这个用户,要是判断会出现问题,故在此判断逻辑 LambdaQueryWrapper query = new LambdaQueryWrapper<>(); query.eq(SysAnnouncementSend::getAnntId, announcement.getId()); query.eq(SysAnnouncementSend::getUserId, userId); SysAnnouncementSend one = sysAnnouncementSendMapper.selectOne(query); if (null == one) { SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(announcement.getId()); announcementSend.setUserId(userId); announcementSend.setReadFlag(CommonConst.NO_READ_FLAG); sysAnnouncementSendMapper.insert(announcementSend); } // update-end--Author:wangshuai Date:20200803 for: 通知公告消息重复 } } // 2.查询用户未读的系统消息 Page anntMsgList = new Page<>(0, 5); // 通知公告消息 anntMsgList = this.queryAnnouncementByUserId(anntMsgList, userId, CommonConst.MSG_CATEGORY_NOTICE); Page sysMsgList = new Page<>(0, 5); // 系统消息 sysMsgList = this.queryAnnouncementByUserId(sysMsgList, userId, CommonConst.MSG_CATEGORY_SYSTEM); AnnouncementListByUserResponse response = new AnnouncementListByUserResponse(); response.setSysMsgTotal(sysMsgList.getTotal()); response.setAnntMsgTotal(anntMsgList.getTotal()); response.setSysMsgList(sysMsgList.getRecords()); response.setAnntMsgList(anntMsgList.getRecords()); return response; } @Override public void syncNotice(Long announcementId) { JSONObject message = JSONUtil.createObj(); if (announcementId != null) { SysAnnouncement announcement = baseMapper.selectById(announcementId); if (announcement == null) { throw new CubeAppException("未找到对应数据!"); } message.set(WebSocketConst.MSG_ID, announcement.getId()); message.set(WebSocketConst.MSG_TXT, announcement.getTitle()); if (announcement.getMsgType().equals(CommonConst.MSG_TYPE_ALL)) { message.set(WebSocketConst.MSG_CMD, WebSocketConst.CMD_TOPIC); appWebSocketHandler.sendAllMessage(message.toString()); } else { // 2.插入用户通告阅读标记表记录 String userId = announcement.getUserIds(); if (StrUtil.isNotEmpty(userId)) { message.set(WebSocketConst.MSG_CMD, WebSocketConst.CMD_USER); String[] userIds = userId.substring(0, (userId.length() - 1)).split(","); appWebSocketHandler.sendMoreMessage(userIds, message.toString()); } } } else { message.set(WebSocketConst.MSG_CMD, WebSocketConst.CMD_TOPIC); message.set(WebSocketConst.MSG_TXT, "批量设置已读"); appWebSocketHandler.sendAllMessage(message.toString()); } } }