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<SysAnnouncementMapper, SysAnnouncement> 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<userIds.length;i++) {
|
SysAnnouncementSend announcementSend = new SysAnnouncementSend();
|
announcementSend.setAnntId(anntId);
|
announcementSend.setUserId(userIds[i]);
|
announcementSend.setReadFlag(CommonConstant.NO_READ_FLAG);
|
announcementSend.setReadTime(refDate);
|
sysAnnouncementSendMapper.insert(announcementSend);
|
}
|
}
|
}
|
|
/**
|
* @功能:编辑消息信息
|
*/
|
@Transactional(rollbackFor = Exception.class)
|
@Override
|
public boolean upDateAnnouncement(SysAnnouncement sysAnnouncement) {
|
// 1.更新系统信息表数据
|
sysAnnouncementMapper.updateById(sysAnnouncement);
|
String userId = sysAnnouncement.getUserIds();
|
if(oConvertUtils.isNotEmpty(userId)&&sysAnnouncement.getMsgType().equals(CommonConstant.MSG_TYPE_UESR)) {
|
// 2.补充新的通知用户数据
|
String[] userIds = userId.substring(0, (userId.length()-1)).split(",");
|
String anntId = sysAnnouncement.getId();
|
Date refDate = new Date();
|
for(int i=0;i<userIds.length;i++) {
|
LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<SysAnnouncementSend>();
|
queryWrapper.eq(SysAnnouncementSend::getAnntId, anntId);
|
queryWrapper.eq(SysAnnouncementSend::getUserId, userIds[i]);
|
List<SysAnnouncementSend> 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<String> delUserIds = Arrays.asList(userIds);
|
LambdaQueryWrapper<SysAnnouncementSend> queryWrapper = new LambdaQueryWrapper<SysAnnouncementSend>();
|
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<SysAnnouncement> querySysCementPageByUserId(Page<SysAnnouncement> 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<SysAnnouncement> querySaWrapper = new LambdaQueryWrapper<SysAnnouncement>();
|
//全部人员
|
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<SysAnnouncement> announcements = this.list(querySaWrapper);
|
if(announcements.size()>0) {
|
for(int i=0;i<announcements.size();i++) {
|
//update-begin--Author:wangshuai Date:20200803 for: 通知公告消息重复LOWCOD-759--------------------
|
//因为websocket没有判断是否存在这个用户,要是判断会出现问题,故在此判断逻辑
|
LambdaQueryWrapper<SysAnnouncementSend> 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<SysAnnouncement> querySysMessageList(int pageSize, int pageNo, String fromUser, String starFlag, Date beginDate, Date endDate) {
|
//1. 补全send表的数据
|
completeAnnouncementSendInfo();
|
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
Page<SysAnnouncement> page = new Page<SysAnnouncement>(pageNo,pageSize);
|
// 2. 查询消息数据
|
List<SysAnnouncement> list = baseMapper.queryMessageList(page, sysUser.getId(), fromUser, starFlag, beginDate, endDate);
|
return list;
|
}
|
|
@Override
|
public void updateReaded(List<String> 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<String> 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);
|
}
|
|
}
|