package org.jeecg.modules.system.service.impl; import com.alibaba.fastjson.JSONObject; 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 lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.CommonSendStatus; import org.jeecg.common.constant.WebsocketConst; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.message.websocket.WebSocket; import org.jeecg.modules.system.entity.SysAnnouncement; import org.jeecg.modules.system.entity.SysAnnouncementSend; import org.jeecg.modules.system.mapper.SysAnnouncementMapper; import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper; import org.jeecg.modules.system.service.ISysAnnouncementService; import org.jeecg.modules.system.service.ISysDictService; import org.jeecg.modules.system.service.ISysUserService; import org.jeecg.modules.system.util.XssUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.List; /** * @Description: 系统通告表 * @Author: jeecg-boot * @Date: 2019-01-02 * @Version: V1.0 */ @Service @Slf4j public class SysAnnouncementServiceImpl extends ServiceImpl implements ISysAnnouncementService { @Resource private SysAnnouncementMapper sysAnnouncementMapper; @Resource private SysAnnouncementSendMapper sysAnnouncementSendMapper; @Resource private ISysDictService sysDictService; @Resource private ISysUserService sysUserService; @Resource private WebSocket webSocket; @Transactional(rollbackFor = Exception.class) @Override public void saveAnnouncement(SysAnnouncement sysAnnouncement) { if(sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_ALL)) { sysAnnouncementMapper.insert(sysAnnouncement); }else { // 1.插入通告表记录 sysAnnouncementMapper.insert(sysAnnouncement); // 2.插入用户通告阅读标记表记录 String userId = sysAnnouncement.getUserIds(); String[] userIds = userId.substring(0, (userId.length()-1)).split(","); String anntId = sysAnnouncement.getId(); Date refDate = new Date(); for(int i=0;i queryWrapper = new LambdaQueryWrapper(); queryWrapper.eq(SysAnnouncementSend::getAnntId, anntId); queryWrapper.eq(SysAnnouncementSend::getUserId, userIds[i]); List announcementSends=sysAnnouncementSendMapper.selectList(queryWrapper); if(announcementSends.size()<=0) { SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(anntId); announcementSend.setUserId(userIds[i]); announcementSend.setReadFlag(CommonConstant.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, anntId); sysAnnouncementSendMapper.delete(queryWrapper); } return true; } /** * 流程执行完成保存消息通知 * @param title 标题 * @param msgContent 信息内容 */ @Override public void saveSysAnnouncement(String title, String msgContent) { SysAnnouncement announcement = new SysAnnouncement(); announcement.setTitile(title); announcement.setMsgContent(msgContent); announcement.setSender("JEECG BOOT"); announcement.setPriority(CommonConstant.PRIORITY_L); announcement.setMsgType(CommonConstant.MSG_TYPE_ALL); announcement.setSendStatus(CommonConstant.HAS_SEND); announcement.setSendTime(new Date()); announcement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); sysAnnouncementMapper.insert(announcement); } @Override public Page querySysCementPageByUserId(Page page, String userId, String msgCategory) { if (page.getSize() == -1) { return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(null, userId, msgCategory)); } else { return page.setRecords(sysAnnouncementMapper.querySysCementListByUserId(page, userId, msgCategory)); } } @Override public void completeAnnouncementSendInfo() { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = sysUser.getId(); // 1.将系统消息补充到用户通告阅读标记表中 LambdaQueryWrapper querySaWrapper = new LambdaQueryWrapper(); //全部人员 querySaWrapper.eq(SysAnnouncement::getMsgType, CommonConstant.MSG_TYPE_ALL); //未删除 querySaWrapper.eq(SysAnnouncement::getDelFlag, CommonConstant.DEL_FLAG_0.toString()); //已发布 querySaWrapper.eq(SysAnnouncement::getSendStatus, CommonConstant.HAS_SEND); //新注册用户不看结束通知 querySaWrapper.ge(SysAnnouncement::getEndTime, sysUser.getCreateTime()); //update-begin--Author:liusq Date:20210108 for:[JT-424] 【开源issue】bug处理-------------------- querySaWrapper.notInSql(SysAnnouncement::getId,"select annt_id from sys_announcement_send where user_id='"+userId+"'"); //update-begin--Author:liusq Date:20210108 for: [JT-424] 【开源issue】bug处理-------------------- List announcements = this.list(querySaWrapper); if(announcements.size()>0) { for(int i=0;i query = new LambdaQueryWrapper<>(); query.eq(SysAnnouncementSend::getAnntId,announcements.get(i).getId()); query.eq(SysAnnouncementSend::getUserId,userId); SysAnnouncementSend one = sysAnnouncementSendMapper.selectOne(query); if(null==one){ SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(announcements.get(i).getId()); announcementSend.setUserId(userId); announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG); sysAnnouncementSendMapper.insert(announcementSend); log.info("announcementSend.toString()",announcementSend.toString()); } //update-end--Author:wangshuai Date:20200803 for: 通知公告消息重复LOWCOD-759------------ } } } @Override public List querySysMessageList(int pageSize, int pageNo, String fromUser, String starFlag, Date beginDate, Date endDate) { //1. 补全send表的数据 completeAnnouncementSendInfo(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); Page page = new Page(pageNo,pageSize); // 2. 查询消息数据 List list = baseMapper.queryMessageList(page, sysUser.getId(), fromUser, starFlag, beginDate, endDate); return list; } @Override public void updateReaded(List annoceIdList) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); sysAnnouncementSendMapper.updateReaded(sysUser.getId(), annoceIdList); } @Override public void jobSendMessage(String jobDescription, String exceptionDetail) { SysAnnouncement sysAnnouncement = new SysAnnouncement(); String title = XssUtils.scriptXss(jobDescription + "失败!"); // 标题 sysAnnouncement.setTitile(title); // 消息类型 sysAnnouncement.setMsgCategory(CommonConstant.MSG_CATEGORY_2); // 优先级 sysAnnouncement.setPriority(CommonConstant.PRIORITY_H); // 通告对象类型 sysAnnouncement.setMsgType(CommonConstant.MSG_TYPE_UESR); // 删除状态 sysAnnouncement.setDelFlag(CommonConstant.DEL_FLAG_0.toString()); // 发布状态 sysAnnouncement.setSendStatus(CommonSendStatus.PUBLISHED_STATUS_1); // 发布时间 sysAnnouncement.setSendTime(new Date()); // 发布人 sysAnnouncement.setSender("admin"); // 消息内容 sysAnnouncement.setMsgContent(exceptionDetail); // 获取用户 // step1. 从字典数据中查询需要发送的角色编码 String roleCode = sysDictService.queryDictTextByKey(CommonConstant.JOB_SEND_MSG, CommonConstant.STATUS_NORMAL.toString()); // step2. 根据角色编码查询用户id集合 List userIds = sysUserService.getUserByRoleCode(roleCode); if (userIds != null && !userIds.isEmpty()) { sysAnnouncement.setUserIds(String.join(",", userIds)); sysAnnouncementMapper.insert(sysAnnouncement); String anntId = sysAnnouncement.getId(); Date refDate = new Date(); for (String userId : userIds) { SysAnnouncementSend announcementSend = new SysAnnouncementSend(); announcementSend.setAnntId(anntId); announcementSend.setUserId(userId); announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG); announcementSend.setReadTime(refDate); sysAnnouncementSendMapper.insert(announcementSend); } // 发送消息 JSONObject obj = new JSONObject(); obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_USER); obj.put(WebsocketConst.MSG_ID, sysAnnouncement.getId()); obj.put(WebsocketConst.MSG_TXT, sysAnnouncement.getTitile()); webSocket.sendMessage(sysAnnouncement.getUserIds().split(","), obj.toJSONString()); } } /** * 根据消息内容查询消息通知 */ @Override public SysAnnouncement findLastMessage(String messageContent) { return sysAnnouncementSendMapper.findLastMessage(messageContent); } }