/*
|
* Copyright [2020-2030] [https://www.stylefeng.cn]
|
*
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*
|
* Guns采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
|
*
|
* 1.请不要删除和修改根目录下的LICENSE文件。
|
* 2.请不要删除和修改Guns源码头部的版权声明。
|
* 3.请保留源码和相关描述文件的项目出处,作者声明等。
|
* 4.分发源码时候,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/stylefeng/guns
|
* 6.若您的项目无法满足以上几点,可申请商业授权
|
*/
|
package cn.stylefeng.roses.kernel.message.db;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
import cn.stylefeng.roses.kernel.message.api.MessageApi;
|
import cn.stylefeng.roses.kernel.message.api.constants.MessageConstants;
|
import cn.stylefeng.roses.kernel.message.api.enums.MessageReadFlagEnum;
|
import cn.stylefeng.roses.kernel.message.api.exception.MessageException;
|
import cn.stylefeng.roses.kernel.message.api.exception.enums.MessageExceptionEnum;
|
import cn.stylefeng.roses.kernel.message.api.pojo.request.MessageRequest;
|
import cn.stylefeng.roses.kernel.message.api.pojo.request.MessageSendRequest;
|
import cn.stylefeng.roses.kernel.message.api.pojo.response.MessageResponse;
|
import cn.stylefeng.roses.kernel.message.db.entity.SysMessage;
|
import cn.stylefeng.roses.kernel.message.db.service.SysMessageService;
|
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
|
import cn.stylefeng.roses.kernel.socket.api.SocketOperatorApi;
|
import cn.stylefeng.roses.kernel.socket.api.enums.ServerMessageTypeEnum;
|
import cn.stylefeng.roses.kernel.socket.api.exception.SocketException;
|
import cn.stylefeng.roses.kernel.system.api.UserServiceApi;
|
import cn.stylefeng.roses.kernel.system.api.pojo.user.request.SysUserRequest;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* 系统消息,数据库实现
|
*
|
* @author liuhanqing
|
* @date 2021/1/2 22:00
|
*/
|
@Slf4j
|
@Service
|
public class MessageDbServiceImpl implements MessageApi {
|
|
@Resource
|
private SocketOperatorApi socketOperatorApi;
|
|
@Resource
|
private UserServiceApi userServiceApi;
|
|
@Resource
|
private SysMessageService sysMessageService;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void sendMessage(MessageSendRequest messageSendRequest) {
|
|
String receiveUserIds = messageSendRequest.getReceiveUserIds();
|
LoginUser loginUser = LoginContext.me().getLoginUserNullable();
|
|
List<SysMessage> sendMsgList = new ArrayList<>();
|
List<Long> userIds;
|
|
// 发送所有人判断
|
if (MessageConstants.RECEIVE_ALL_USER_FLAG.equals(receiveUserIds)) {
|
// 查询所有用户
|
userIds = userServiceApi.queryAllUserIdList(new SysUserRequest());
|
} else {
|
String[] userIdArr = receiveUserIds.split(",");
|
userIds = Convert.toList(Long.class, userIdArr);
|
}
|
|
// 无人可发,不发送
|
if (userIds == null || userIds.isEmpty()) {
|
throw new MessageException(MessageExceptionEnum.ERROR_RECEIVE_USER_IDS);
|
}
|
|
Set<Long> userIdSet = new HashSet<>(userIds);
|
for (Long userId : userIdSet) {
|
|
// 判断用户是否存在
|
if (!userServiceApi.userExist(userId)) {
|
continue;
|
}
|
|
SysMessage sysMessage = new SysMessage();
|
BeanUtil.copyProperties(messageSendRequest, sysMessage);
|
|
// 设置默认未读
|
sysMessage.setReadFlag(MessageReadFlagEnum.UNREAD.getCode());
|
|
// 设置发件人
|
if (loginUser != null) {
|
sysMessage.setSendUserId(loginUser.getUserId());
|
}
|
|
// 设置收信人
|
sysMessage.setReceiveUserId(userId);
|
|
sendMsgList.add(sysMessage);
|
}
|
sysMessageService.saveBatch(sendMsgList);
|
|
// 给用户发送通知
|
for (SysMessage item : sendMsgList) {
|
try {
|
socketOperatorApi.sendMsgOfUserSession(ServerMessageTypeEnum.SYS_NOTICE_MSG_TYPE.getCode(), item.getReceiveUserId().toString(), item);
|
} catch (SocketException socketException) {
|
// 该用户不在线
|
|
}
|
}
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void updateReadFlag(MessageRequest messageRequest) {
|
Long messageId = messageRequest.getMessageId();
|
SysMessage sysMessage = sysMessageService.getById(messageId);
|
Optional.ofNullable(sysMessage).ifPresent(msg -> {
|
msg.setReadFlag(messageRequest.getReadFlag());
|
sysMessageService.updateById(msg);
|
});
|
|
}
|
|
@Override
|
public void allMessageReadFlag() {
|
// 获取当前登录人
|
LoginUser loginUser = LoginContext.me().getLoginUser();
|
Long userId = loginUser.getUserId();
|
LambdaUpdateWrapper<SysMessage> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.set(SysMessage::getReadFlag, MessageReadFlagEnum.READ.getCode()).eq(SysMessage::getReadFlag, MessageReadFlagEnum.UNREAD.getCode()).eq(SysMessage::getReceiveUserId, userId).set(SysMessage::getDelFlag, YesOrNotEnum.N.getCode());
|
sysMessageService.update(updateWrapper);
|
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void batchReadFlagByMessageIds(String messageIds, MessageReadFlagEnum flagEnum) {
|
LambdaUpdateWrapper<SysMessage> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.inSql(SysMessage::getMessageId, messageIds).set(SysMessage::getReadFlag, flagEnum.getCode());
|
sysMessageService.update(updateWrapper);
|
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void deleteByMessageId(Long messageId) {
|
LambdaUpdateWrapper<SysMessage> updateWrapper = new LambdaUpdateWrapper<>();
|
// 修改为逻辑删除
|
updateWrapper.eq(SysMessage::getMessageId, messageId).set(SysMessage::getDelFlag, YesOrNotEnum.Y.getCode());
|
sysMessageService.update(updateWrapper);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void batchDeleteByMessageIds(String messageIds) {
|
LambdaUpdateWrapper<SysMessage> updateWrapper = new LambdaUpdateWrapper<>();
|
updateWrapper.inSql(SysMessage::getMessageId, messageIds).set(SysMessage::getDelFlag, YesOrNotEnum.Y.getCode());
|
sysMessageService.update(updateWrapper);
|
}
|
|
@Override
|
public MessageResponse messageDetail(MessageRequest messageRequest) {
|
SysMessage sysMessage = sysMessageService.getById(messageRequest.getMessageId());
|
// 判断消息为未读状态更新为已读
|
Optional.ofNullable(sysMessage).ifPresent(msg -> {
|
if (MessageReadFlagEnum.UNREAD.getCode().equals(sysMessage.getReadFlag())) {
|
msg.setReadFlag(MessageReadFlagEnum.READ.getCode());
|
sysMessageService.updateById(msg);
|
}
|
});
|
MessageResponse messageResponse = new MessageResponse();
|
BeanUtil.copyProperties(sysMessage, messageResponse);
|
return messageResponse;
|
}
|
|
@Override
|
public PageResult<MessageResponse> queryPage(MessageRequest messageRequest) {
|
PageResult<SysMessage> pageResult = sysMessageService.findPage(messageRequest);
|
PageResult<MessageResponse> result = new PageResult<>();
|
List<SysMessage> messageList = pageResult.getRows();
|
List<MessageResponse> resultList = messageList.stream().map(msg -> {
|
MessageResponse response = new MessageResponse();
|
BeanUtil.copyProperties(msg, response);
|
return response;
|
}).collect(Collectors.toList());
|
BeanUtil.copyProperties(pageResult, result);
|
result.setRows(resultList);
|
return result;
|
}
|
|
@Override
|
public List<MessageResponse> queryList(MessageRequest messageRequest) {
|
List<SysMessage> messageList = sysMessageService.findList(messageRequest);
|
return messageList.stream().map(msg -> {
|
MessageResponse response = new MessageResponse();
|
BeanUtil.copyProperties(msg, response);
|
return response;
|
}).collect(Collectors.toList());
|
}
|
|
@Override
|
public PageResult<MessageResponse> queryPageCurrentUser(MessageRequest messageRequest) {
|
if (ObjectUtil.isEmpty(messageRequest)) {
|
messageRequest = new MessageRequest();
|
}
|
// 获取当前登录人
|
LoginUser loginUser = LoginContext.me().getLoginUser();
|
messageRequest.setReceiveUserId(loginUser.getUserId());
|
return this.queryPage(messageRequest);
|
}
|
|
@Override
|
public List<MessageResponse> queryListCurrentUser(MessageRequest messageRequest) {
|
if (ObjectUtil.isEmpty(messageRequest)) {
|
messageRequest = new MessageRequest();
|
}
|
// 获取当前登录人
|
LoginUser loginUser = LoginContext.me().getLoginUser();
|
messageRequest.setReceiveUserId(loginUser.getUserId());
|
return this.queryList(messageRequest);
|
}
|
|
@Override
|
public Integer queryCount(MessageRequest messageRequest) {
|
return sysMessageService.findCount(messageRequest);
|
}
|
|
@Override
|
public Integer queryCountCurrentUser(MessageRequest messageRequest) {
|
if (ObjectUtil.isEmpty(messageRequest)) {
|
messageRequest = new MessageRequest();
|
}
|
// 获取当前登录人
|
LoginUser loginUser = LoginContext.me().getLoginUser();
|
messageRequest.setReceiveUserId(loginUser.getUserId());
|
return this.queryCount(messageRequest);
|
}
|
|
}
|