Gqingci 1 день назад
Родитель
Сommit
4e10c0c36a

+ 25 - 5
ruoyi-modules/ruoyi-main/src/main/java/org/dromara/main/service/impl/CsMessageServiceImpl.java

@@ -67,7 +67,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
         if (beforeMsgId != null) {
         if (beforeMsgId != null) {
             lqw.lt(CsMessage::getId, beforeMsgId);
             lqw.lt(CsMessage::getId, beforeMsgId);
         }
         }
-        lqw.orderByDesc(CsMessage::getSendTime);
+        lqw.orderByDesc(CsMessage::getSendTime, CsMessage::getId);
 
 
         Page<CsMessage> page = baseMapper.selectPage(pageQuery.build(), lqw);
         Page<CsMessage> page = baseMapper.selectPage(pageQuery.build(), lqw);
         Page<CsMessageVo> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
         Page<CsMessageVo> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
@@ -90,7 +90,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
         message.setContent(bo.getContent());
         message.setContent(bo.getContent());
         message.setStatus(1);
         message.setStatus(1);
         message.setIsRead(0);
         message.setIsRead(0);
-        message.setSendTime(LocalDateTime.now());
+        message.setSendTime(resolveSendTime(bo.getSessionId()));
 
 
         baseMapper.insert(message);
         baseMapper.insert(message);
         sessionService.updateLastMessage(bo.getSessionId(),
         sessionService.updateLastMessage(bo.getSessionId(),
@@ -140,7 +140,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
             message.setFileType(contentType);
             message.setFileType(contentType);
             message.setStatus(1);
             message.setStatus(1);
             message.setIsRead(0);
             message.setIsRead(0);
-            message.setSendTime(LocalDateTime.now());
+            message.setSendTime(resolveSendTime(sessionId));
 
 
             baseMapper.insert(message);
             baseMapper.insert(message);
             sessionService.updateLastMessage(sessionId, "[图片]");
             sessionService.updateLastMessage(sessionId, "[图片]");
@@ -191,7 +191,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
             message.setFileType(contentType);
             message.setFileType(contentType);
             message.setStatus(1);
             message.setStatus(1);
             message.setIsRead(0);
             message.setIsRead(0);
-            message.setSendTime(LocalDateTime.now());
+            message.setSendTime(resolveSendTime(sessionId));
 
 
             baseMapper.insert(message);
             baseMapper.insert(message);
             sessionService.updateLastMessage(sessionId, "[文件]" + fileName);
             sessionService.updateLastMessage(sessionId, "[文件]" + fileName);
@@ -220,7 +220,7 @@ public class CsMessageServiceImpl implements ICsMessageService {
         message.setPayload(JSONUtil.toJsonStr(bo.getPayload()));
         message.setPayload(JSONUtil.toJsonStr(bo.getPayload()));
         message.setStatus(1);
         message.setStatus(1);
         message.setIsRead(0);
         message.setIsRead(0);
-        message.setSendTime(LocalDateTime.now());
+        message.setSendTime(resolveSendTime(bo.getSessionId()));
 
 
         baseMapper.insert(message);
         baseMapper.insert(message);
         sessionService.updateLastMessage(bo.getSessionId(), "[岗位推荐]");
         sessionService.updateLastMessage(bo.getSessionId(), "[岗位推荐]");
@@ -258,6 +258,26 @@ public class CsMessageServiceImpl implements ICsMessageService {
         return senderId != null ? senderId : LoginHelper.getUserId();
         return senderId != null ? senderId : LoginHelper.getUserId();
     }
     }
 
 
+    /**
+     * 同一会话内保证消息时间单调递增,避免多节点时钟偏差导致后发消息时间反而更早。
+     */
+    private LocalDateTime resolveSendTime(Long sessionId) {
+        LocalDateTime now = LocalDateTime.now();
+        if (sessionId == null) {
+            return now;
+        }
+        CsMessage lastMessage = baseMapper.selectOne(
+            Wrappers.lambdaQuery(CsMessage.class)
+                .eq(CsMessage::getSessionId, sessionId)
+                .orderByDesc(CsMessage::getSendTime, CsMessage::getId)
+                .last("LIMIT 1")
+        );
+        if (lastMessage != null && lastMessage.getSendTime() != null && !now.isAfter(lastMessage.getSendTime())) {
+            return lastMessage.getSendTime().plusSeconds(1);
+        }
+        return now;
+    }
+
     private Integer resolveSenderType(Long sessionId, Long senderId) {
     private Integer resolveSenderType(Long sessionId, Long senderId) {
         if (senderId == null || sessionId == null) {
         if (senderId == null || sessionId == null) {
             return 1;
             return 1;