update 放行部分接口,方便游客使用。区分游客和客服的对象。
This commit is contained in:
parent
cd57115454
commit
40f4cd0007
|
@ -1,3 +1,4 @@
|
||||||
|
|
||||||
server:
|
server:
|
||||||
port: 8101
|
port: 8101
|
||||||
# Spring
|
# Spring
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class WebSocketBrokerConfig implements WebSocketMessageBrokerConfigurer {
|
||||||
@Override
|
@Override
|
||||||
public void configureMessageBroker(MessageBrokerRegistry config) {
|
public void configureMessageBroker(MessageBrokerRegistry config) {
|
||||||
|
|
||||||
config.enableSimpleBroker(Destination.TOPIC, Destination.QUEUE)
|
config.enableSimpleBroker(Destination.TOPIC, Destination.QUEUE_USER,Destination.QUEUE_CUSTOMER)
|
||||||
.setHeartbeatValue(new long[] {10000, 10000})
|
.setHeartbeatValue(new long[] {10000, 10000})
|
||||||
.setTaskScheduler(new DefaultManagedTaskScheduler());
|
.setTaskScheduler(new DefaultManagedTaskScheduler());
|
||||||
|
|
||||||
|
@ -82,12 +82,23 @@ public class WebSocketBrokerConfig implements WebSocketMessageBrokerConfigurer {
|
||||||
registration
|
registration
|
||||||
.setMessageSizeLimit(customWebSocketConfig.getMessageSizeLimit())
|
.setMessageSizeLimit(customWebSocketConfig.getMessageSizeLimit())
|
||||||
.setSendTimeLimit(customWebSocketConfig.getSendTimeLimit())
|
.setSendTimeLimit(customWebSocketConfig.getSendTimeLimit())
|
||||||
.setSendBufferSizeLimit(customWebSocketConfig.getSendBufferSizeLimit())
|
.setSendBufferSizeLimit(customWebSocketConfig.getSendBufferSizeLimit());
|
||||||
// 首次连接超时时间.正常情况下,前端订阅 和 心跳包的影响 不会超时断连
|
// 首次连接超时时间.正常情况下,前端订阅 和 心跳包的影响 不会超时断连
|
||||||
.setTimeToFirstMessage(customWebSocketConfig.getTimeToFirstMessage());
|
// .setTimeToFirstMessage(customWebSocketConfig.getTimeToFirstMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// @Bean
|
||||||
|
// public ServletServerContainerFactoryBean createServletServerContainerFactoryBean() {
|
||||||
|
// ServletServerContainerFactoryBean factoryBean = new ServletServerContainerFactoryBean();
|
||||||
|
// factoryBean.setMaxTextMessageBufferSize(customWebSocketConfig.getMessageSizeLimit());
|
||||||
|
// factoryBean.setMaxBinaryMessageBufferSize(customWebSocketConfig.getMessageSizeLimit());
|
||||||
|
// factoryBean.setMaxSessionIdleTimeout(2048L * 2048L);
|
||||||
|
// factoryBean.setAsyncSendTimeout(2048L * 2048L);
|
||||||
|
// return factoryBean;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 配置客户端出站通道拦截器(默认线程1)
|
* 配置客户端出站通道拦截器(默认线程1)
|
||||||
|
|
|
@ -7,11 +7,21 @@ package com.m2pool.chat.constant;
|
||||||
* @Date 2025/4/14 14:54
|
* @Date 2025/4/14 14:54
|
||||||
*/
|
*/
|
||||||
public class Destination {
|
public class Destination {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stomp 默认单对单 发送目的地.单对单消息默认 /
|
* stomp 默认单对单 发送目的地.单对单消息默认 /
|
||||||
*/
|
*/
|
||||||
public static final String QUEUE = "/queue";
|
public static final String QUEUE = "/queue";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stomp 默认单对单 发送目的地.单对单消息默认 /
|
||||||
|
*/
|
||||||
|
public static final String QUEUE_USER = "/queue/user";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stomp 默认单对单 发送目的地.单对单消息默认 /
|
||||||
|
*/
|
||||||
|
public static final String QUEUE_CUSTOMER = "/queue/customer";
|
||||||
/**
|
/**
|
||||||
* 聊天室关闭 路径
|
* 聊天室关闭 路径
|
||||||
*/
|
*/
|
||||||
|
@ -23,9 +33,9 @@ public class Destination {
|
||||||
public static final String TOPIC = "/topic";
|
public static final String TOPIC = "/topic";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 前端订阅消息所需前缀。 stomp 默认user前缀。
|
* 前端订阅消息所需前缀point。 stomp 默认user前缀。
|
||||||
*/
|
*/
|
||||||
public static final String USER_PREFIX = "/user";
|
public static final String USER_PREFIX = "/sub";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stomp 默认发送消息前缀。
|
* stomp 默认发送消息前缀。
|
||||||
|
|
|
@ -52,7 +52,6 @@ public class ChatMessageController {
|
||||||
|
|
||||||
@PostMapping("/read/message")
|
@PostMapping("/read/message")
|
||||||
@ApiOperation(value = "聊天室消息改已读")
|
@ApiOperation(value = "聊天室消息改已读")
|
||||||
@RequiresLogin
|
|
||||||
public R<String> readMessage(@RequestBody MessagePageVo pageVo) {
|
public R<String> readMessage(@RequestBody MessagePageVo pageVo) {
|
||||||
return chatMessageService.readMessage(pageVo.getRoomId(),pageVo.getUserType());
|
return chatMessageService.readMessage(pageVo.getRoomId(),pageVo.getUserType());
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,13 +27,25 @@ public class StompController extends BaseController {
|
||||||
private StompService stompService;
|
private StompService stompService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送消息到对应的用户
|
* 发送消息给普通用户和游客
|
||||||
* @param userMessageVo 消息体
|
* @param userMessageVo 消息体
|
||||||
* @return 返回值通过CommonMessageConvert消息转换器转换
|
* @return 返回值通过CommonMessageConvert消息转换器转换
|
||||||
*/
|
*/
|
||||||
@MessageMapping("/send/message")
|
@MessageMapping("/send/message/to/user")
|
||||||
@SendToUser("/queue")
|
@SendToUser("/queue/user")
|
||||||
public AjaxResult sendMessageToUser(StompPrincipal principal, @Payload UserMessageVo userMessageVo) {
|
public AjaxResult sendMessageToUser(StompPrincipal principal, @Payload UserMessageVo userMessageVo) {
|
||||||
return stompService.sendMessageToUser(principal,userMessageVo);
|
return stompService.sendMessageToUser(principal,userMessageVo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息到对应的客服
|
||||||
|
* @param userMessageVo 消息体
|
||||||
|
* @return 返回值通过CommonMessageConvert消息转换器转换
|
||||||
|
*/
|
||||||
|
@MessageMapping("/send/message/to/customer")
|
||||||
|
@SendToUser("/queue/customer/")
|
||||||
|
public AjaxResult sendMessageToCustomer(StompPrincipal principal, @Payload UserMessageVo userMessageVo) {
|
||||||
|
return stompService.sendMessageToCustomer(principal,userMessageVo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,4 +13,11 @@ public interface StompService {
|
||||||
*/
|
*/
|
||||||
AjaxResult sendMessageToUser(StompPrincipal principal, UserMessageVo userMessageVo);
|
AjaxResult sendMessageToUser(StompPrincipal principal, UserMessageVo userMessageVo);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息给客服
|
||||||
|
* @param userMessageVo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
AjaxResult sendMessageToCustomer(StompPrincipal principal, UserMessageVo userMessageVo);
|
||||||
}
|
}
|
|
@ -9,6 +9,7 @@ import com.m2pool.chat.mapper.ChatMessageMapper;
|
||||||
import com.m2pool.chat.mapper.ChatRoomMapper;
|
import com.m2pool.chat.mapper.ChatRoomMapper;
|
||||||
import com.m2pool.chat.service.ChatMessageService;
|
import com.m2pool.chat.service.ChatMessageService;
|
||||||
import com.m2pool.common.core.Result.R;
|
import com.m2pool.common.core.Result.R;
|
||||||
|
import com.m2pool.common.core.utils.StringUtils;
|
||||||
import com.m2pool.common.security.utils.SecurityUtils;
|
import com.m2pool.common.security.utils.SecurityUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
@ -17,8 +18,7 @@ import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import static com.m2pool.chat.constant.UserType.CUSTOMER;
|
import static com.m2pool.chat.constant.UserType.*;
|
||||||
import static com.m2pool.chat.constant.UserType.LOGIN_USER;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class ChatMessageServiceImpl implements ChatMessageService {
|
public class ChatMessageServiceImpl implements ChatMessageService {
|
||||||
|
@ -44,6 +44,9 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
||||||
@Override
|
@Override
|
||||||
public R<List<ChatMessageDto>> findRecentlyMessage(String email,Long id,Integer pageNum,Long roomId) {
|
public R<List<ChatMessageDto>> findRecentlyMessage(String email,Long id,Integer pageNum,Long roomId) {
|
||||||
ChatMessage chatMessage;
|
ChatMessage chatMessage;
|
||||||
|
if(StringUtils.isEmpty(email)){
|
||||||
|
return R.fail("查询失败,用户标识或邮箱不能为空");
|
||||||
|
}
|
||||||
if(id != null && id != 0){
|
if(id != null && id != 0){
|
||||||
chatMessage = chatMessageMapper.selectById(id);
|
chatMessage = chatMessageMapper.selectById(id);
|
||||||
}else{
|
}else{
|
||||||
|
@ -81,7 +84,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
|
||||||
.id(roomId)
|
.id(roomId)
|
||||||
.build();
|
.build();
|
||||||
if (chatRoom != null){
|
if (chatRoom != null){
|
||||||
if (Objects.equals(type, LOGIN_USER)) {
|
if (Objects.equals(type, LOGIN_USER) || Objects.equals(type, TOURIST) ) {
|
||||||
build.setClientReadNum(0);
|
build.setClientReadNum(0);
|
||||||
}
|
}
|
||||||
if(Objects.equals(type, CUSTOMER)){
|
if(Objects.equals(type, CUSTOMER)){
|
||||||
|
|
|
@ -49,6 +49,44 @@ public class StompServiceImpl implements StompService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AjaxResult sendMessageToUser(StompPrincipal principal, UserMessageVo userMessageVo) {
|
public AjaxResult sendMessageToUser(StompPrincipal principal, UserMessageVo userMessageVo) {
|
||||||
|
WebsocketMessageDto build = buildDto(principal, userMessageVo);
|
||||||
|
//获取当前聊天室对象
|
||||||
|
ChatRoom chatRoom = chatRoomMapper.selectOne(new LambdaQueryWrapper<ChatRoom>()
|
||||||
|
.eq(ChatRoom::getUserOneEmail, principal.getName())
|
||||||
|
.eq(ChatRoom::getUserTwoEmail, userMessageVo.getEmail()));
|
||||||
|
build.setRoomId(String.valueOf(userMessageVo.getRoomId()));
|
||||||
|
int serviceReadNum = chatRoom != null ? chatRoom.getClientReadNum() : 0;
|
||||||
|
build.setClientReadNum( serviceReadNum+ 1);
|
||||||
|
//不在判断接收者是否在线
|
||||||
|
// boolean bool = checkOnline(userMessageVo);
|
||||||
|
//在线用户才发送消息
|
||||||
|
messagingTemplate.convertAndSendToUser(userMessageVo.getEmail(), Destination.QUEUE_USER + "/" + userMessageVo.getEmail(),build);
|
||||||
|
executeTran(principal, userMessageVo, chatRoom);
|
||||||
|
return AjaxResult.success("成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AjaxResult sendMessageToCustomer(StompPrincipal principal, UserMessageVo userMessageVo) {
|
||||||
|
WebsocketMessageDto build = buildDto(principal, userMessageVo);
|
||||||
|
|
||||||
|
ChatRoom chatRoom = chatRoomMapper.selectOne(new LambdaQueryWrapper<ChatRoom>()
|
||||||
|
.eq(ChatRoom::getUserOneEmail, userMessageVo.getEmail())
|
||||||
|
.eq(ChatRoom::getUserTwoEmail, principal.getName()));
|
||||||
|
build.setRoomId(String.valueOf(userMessageVo.getRoomId()));
|
||||||
|
int serviceReadNum = chatRoom != null ? chatRoom.getServiceReadNum() : 0;
|
||||||
|
build.setClientReadNum(serviceReadNum + 1);
|
||||||
|
messagingTemplate.convertAndSendToUser(userMessageVo.getEmail(), Destination.QUEUE_CUSTOMER + "/" + userMessageVo.getEmail(),build);
|
||||||
|
executeTran(principal, userMessageVo, chatRoom);
|
||||||
|
return AjaxResult.success("成功");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建聊天实时返回信息
|
||||||
|
* @param principal
|
||||||
|
* @param userMessageVo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private WebsocketMessageDto buildDto(StompPrincipal principal, UserMessageVo userMessageVo) {
|
||||||
Boolean isCreate = principal.getIsCreate();
|
Boolean isCreate = principal.getIsCreate();
|
||||||
WebsocketMessageDto build = WebsocketMessageDto.builder()
|
WebsocketMessageDto build = WebsocketMessageDto.builder()
|
||||||
.type(userMessageVo.getType())
|
.type(userMessageVo.getType())
|
||||||
|
@ -62,28 +100,16 @@ public class StompServiceImpl implements StompService {
|
||||||
if (isCreate){
|
if (isCreate){
|
||||||
principal.setIsCreate(false);
|
principal.setIsCreate(false);
|
||||||
}
|
}
|
||||||
//获取当前聊天室对象
|
return build;
|
||||||
ChatRoom chatRoom;
|
}
|
||||||
|
|
||||||
if(!CUSTOMER.equals(principal.getType())){
|
/**
|
||||||
chatRoom = chatRoomMapper.selectOne(new LambdaQueryWrapper<ChatRoom>()
|
* 执行消息表新增消息和聊天室已读未读消息数量更新事务
|
||||||
.eq(ChatRoom::getUserOneEmail, principal.getName())
|
* @param principal
|
||||||
.eq(ChatRoom::getUserTwoEmail, userMessageVo.getEmail()));
|
* @param userMessageVo
|
||||||
build.setRoomId(String.valueOf(userMessageVo.getRoomId()));
|
* @param chatRoom
|
||||||
build.setClientReadNum(chatRoom.getServiceReadNum() + 1);
|
*/
|
||||||
}else {
|
private void executeTran(StompPrincipal principal, UserMessageVo userMessageVo, ChatRoom chatRoom){
|
||||||
chatRoom = chatRoomMapper.selectOne(new LambdaQueryWrapper<ChatRoom>()
|
|
||||||
.eq(ChatRoom::getUserOneEmail, userMessageVo.getEmail())
|
|
||||||
.eq(ChatRoom::getUserTwoEmail, principal.getName()));
|
|
||||||
build.setRoomId(String.valueOf(userMessageVo.getRoomId()));
|
|
||||||
build.setClientReadNum(chatRoom.getClientReadNum() + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean bool = checkOnline(userMessageVo);
|
|
||||||
//在线用户才发送消息
|
|
||||||
if (bool){
|
|
||||||
messagingTemplate.convertAndSendToUser(userMessageVo.getEmail(), Destination.QUEUE + "/" + userMessageVo.getEmail(),build);
|
|
||||||
}
|
|
||||||
// 消息存储
|
// 消息存储
|
||||||
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
|
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -92,7 +118,7 @@ public class StompServiceImpl implements StompService {
|
||||||
// 插入消息并获取 ID
|
// 插入消息并获取 ID
|
||||||
insertMessage(principal,userMessageVo);
|
insertMessage(principal,userMessageVo);
|
||||||
//聊天室,已读未读数量,更新。
|
//聊天室,已读未读数量,更新。
|
||||||
updateRoom(chatRoom,principal.getType(),bool);
|
updateRoom(chatRoom,principal.getType());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 回滚事务
|
// 回滚事务
|
||||||
status.setRollbackOnly();
|
status.setRollbackOnly();
|
||||||
|
@ -100,8 +126,6 @@ public class StompServiceImpl implements StompService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return AjaxResult.success("成功");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,6 +133,7 @@ public class StompServiceImpl implements StompService {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private boolean checkOnline(UserMessageVo userMessageVo){
|
private boolean checkOnline(UserMessageVo userMessageVo){
|
||||||
|
|
||||||
return userRegistry.getUsers().stream()
|
return userRegistry.getUsers().stream()
|
||||||
.anyMatch(user -> user.getName().equals(userMessageVo.getEmail()));
|
.anyMatch(user -> user.getName().equals(userMessageVo.getEmail()));
|
||||||
}
|
}
|
||||||
|
@ -133,19 +158,21 @@ public class StompServiceImpl implements StompService {
|
||||||
* 修改聊天信息
|
* 修改聊天信息
|
||||||
* @param chatRoom 本次聊天聊天室信息
|
* @param chatRoom 本次聊天聊天室信息
|
||||||
* @param sendUserType 发送者类型
|
* @param sendUserType 发送者类型
|
||||||
* @param bool 发送者是否在线,不在线,需要更新未读消息数量
|
* @param {bool 废弃 发送者是否在线,不在线,需要更新未读消息数量}
|
||||||
*/
|
*/
|
||||||
private void updateRoom(ChatRoom chatRoom,Integer sendUserType,Boolean bool){
|
private void updateRoom(ChatRoom chatRoom,Integer sendUserType){
|
||||||
|
if(chatRoom != null){
|
||||||
ChatRoom room = ChatRoom.builder().id(chatRoom.getId()).build();
|
ChatRoom room = ChatRoom.builder().id(chatRoom.getId()).build();
|
||||||
if (CUSTOMER.equals(sendUserType)) {
|
if (CUSTOMER.equals(sendUserType)) {
|
||||||
room.setClientReadNum(chatRoom.getClientReadNum() + 1);
|
room.setClientReadNum(chatRoom.getClientReadNum() + 1);
|
||||||
room.setLastCustomerSendTime(LocalDateTime.now());
|
room.setLastCustomerSendTime(LocalDateTime.now());
|
||||||
} else {
|
} else {
|
||||||
room.setServiceReadNum(chatRoom.getServiceReadNum() + 1);
|
room.setServiceReadNum(chatRoom.getServiceReadNum() + 1);
|
||||||
room.setLastUserSendTime(LocalDateTime.now());
|
room.setLastUserSendTime(LocalDateTime.now());
|
||||||
|
}
|
||||||
|
chatRoomMapper.updateById(room);
|
||||||
}
|
}
|
||||||
chatRoomMapper.updateById(room);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<where>
|
<where>
|
||||||
room_id = #{roomId}
|
room_id = #{roomId}
|
||||||
<if test="id != null">
|
<if test="id != null">
|
||||||
AND id <![CDATA[ <= ]]> #{id}
|
AND id <![CDATA[ < ]]> #{id}
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
ORDER BY id DESC
|
ORDER BY id DESC
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<where>
|
<where>
|
||||||
room_id = #{roomId}
|
room_id = #{roomId}
|
||||||
<if test="id != null">
|
<if test="id != null">
|
||||||
AND id <![CDATA[ <= ]]> #{id}
|
AND id <![CDATA[ < ]]> #{id}
|
||||||
</if>
|
</if>
|
||||||
</where>
|
</where>
|
||||||
ORDER BY id DESC
|
ORDER BY id DESC
|
||||||
|
|
|
@ -121,6 +121,10 @@ public class DataTask {
|
||||||
}
|
}
|
||||||
uTime ++;
|
uTime ++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Map<String, List<MinerDataDto>> userMap = list.stream().collect(Collectors.groupingBy(MinerDataDto::getMiner));
|
Map<String, List<MinerDataDto>> userMap = list.stream().collect(Collectors.groupingBy(MinerDataDto::getMiner));
|
||||||
|
|
Loading…
Reference in New Issue