Pārlūkot izejas kodu

1、会话限制好友关系

yys 2 dienas atpakaļ
vecāks
revīzija
46da369d47

+ 8 - 0
fs-service/src/main/java/com/fs/his/service/OpenImAsyncService.java

@@ -85,6 +85,14 @@ public class OpenImAsyncService {
             return;
         }
         try {
+            String sendID = messageInfo.getSendID();
+            String recvID = messageInfo.getRecvID();
+            // 用户与用户互聊:互相拉黑,阻止继续私聊
+            if (StringUtils.isNotBlank(sendID) && StringUtils.isNotBlank(recvID)
+                    && sendID.startsWith("U") && recvID.startsWith("U")) {
+                openIMService.deleteAndBlackBothWays(sendID, recvID);
+                return;
+            }
             openIMService.AiAutoReply(copy(messageInfo));
             appChatHistoryService.saveChatHistory(copy(messageInfo));
             inquiryOrderMsgService.openImSaveMsg(copy(messageInfo));

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderMsgServiceImpl.java

@@ -344,6 +344,12 @@ public class FsInquiryOrderMsgServiceImpl implements IFsInquiryOrderMsgService {
             }
             String send = openImMsgCallBackVO.getSendID();
             String to = openImMsgCallBackVO.getRecvID();
+            // 用户与用户互聊:互相拉黑,阻止继续私聊
+            if (StringUtils.isNotBlank(send) && StringUtils.isNotBlank(to)
+                    && send.startsWith("U") && to.startsWith("U")) {
+                openIMService.deleteAndBlackBothWays(send, to);
+                return openImMsgCallBackResponse;
+            }
             Long time = openImMsgCallBackVO.getSendTime();
             if (time == null) {
                 time = System.currentTimeMillis();

+ 8 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -48,6 +48,14 @@ public interface OpenIMService {
      */
     R deleteUserInfo(String ownerUserID,String friendUserID);
 
+    /**
+     * 双向互相拉黑(不删除好友)
+     *
+     * @param userID1 用户1
+     * @param userID2 用户2
+     */
+    void deleteAndBlackBothWays(String userID1, String userID2);
+
     OpenImResponseDTO sendPackageUtil(String sendID, String recvID, Integer contentType, String payloadData,String packageName,String packageId);
 
     /**

+ 78 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -698,6 +698,84 @@ public class OpenIMServiceImpl implements OpenIMService {
         return R.ok();
     }
 
+    @Override
+    public void deleteAndBlackBothWays(String userID1, String userID2) {
+        if (StringUtils.isBlank(userID1) || StringUtils.isBlank(userID2)) {
+            log.warn("双向拉黑参数无效 userID1={} userID2={}", userID1, userID2);
+            return;
+        }
+        log.info("用户互聊触发双向拉黑 userID1={} userID2={}", userID1, userID2);
+
+        boolean black12 = isAlreadyBlack(userID1, userID2);
+        boolean black21 = isAlreadyBlack(userID2, userID1);
+        if (black12 && black21) {
+            log.info("双方已互相拉黑,跳过处理 userID1={} userID2={}", userID1, userID2);
+            return;
+        }
+
+        // 未拉黑的一侧再拉黑
+        if (!black12) {
+            addBlackQuietly(userID1, userID2);
+        } else {
+            log.info("已拉黑,跳过 {}->{}", userID1, userID2);
+        }
+        if (!black21) {
+            addBlackQuietly(userID2, userID1);
+        } else {
+            log.info("已拉黑,跳过 {}->{}", userID2, userID1);
+        }
+    }
+
+    /**
+     * 判断 ownerUserID 是否已拉黑 blackUserID
+     */
+    private boolean isAlreadyBlack(String ownerUserID, String blackUserID) {
+        try {
+            Map<String, Object> body = new HashMap<>();
+            body.put("ownerUserID", ownerUserID);
+            body.put("userIDList", Collections.singletonList(blackUserID));
+            String result = imPost("/friend/get_specified_blacks", JSONUtil.toJsonStr(body));
+            OpenImResponseDTO responseDTO = JSONUtil.toBean(result, OpenImResponseDTO.class);
+            if (responseDTO == null || responseDTO.getErrCode() == null || responseDTO.getErrCode() != 0
+                    || responseDTO.getData() == null) {
+                log.warn("查询黑名单失败 owner={} black={} result={}", ownerUserID, blackUserID, result);
+                return false;
+            }
+            Object total = responseDTO.getData().get("total");
+            if (total != null) {
+                try {
+                    if (Integer.parseInt(total.toString()) > 0) {
+                        return true;
+                    }
+                } catch (NumberFormatException ignored) {
+                    // fall through
+                }
+            }
+            Object blacks = responseDTO.getData().get("blacks");
+            return blacks instanceof List && !((List<?>) blacks).isEmpty();
+        } catch (Exception e) {
+            log.warn("查询黑名单异常 owner={} black={}", ownerUserID, blackUserID, e);
+            return false;
+        }
+    }
+
+    private void addBlackQuietly(String ownerUserID, String blackUserID) {
+        try {
+            Map<String, Object> body = new HashMap<>();
+            body.put("ownerUserID", ownerUserID);
+            body.put("blackUserID", blackUserID);
+            String result = imPost("/friend/add_black", JSONUtil.toJsonStr(body));
+            // 已存在唯一索引冲突时视为成功,避免重复回调报错
+            if (result != null && (result.contains("E11000") || result.contains("duplicate key"))) {
+                log.info("拉黑已存在,忽略重复 {}->{} result={}", ownerUserID, blackUserID, result);
+                return;
+            }
+            log.info("拉黑 {}->{} 结果={}", ownerUserID, blackUserID, result);
+        } catch (Exception e) {
+            log.warn("拉黑异常 {}->{}", ownerUserID, blackUserID, e);
+        }
+    }
+
     @Data
     public static class UpdateUserInfo {
         private String userID;