From 1484f621bd6520ff492c601cb1ec1233a0cf5776 Mon Sep 17 00:00:00 2001 From: pengjie <2413927716@qq.com> Date: Tue, 7 Jul 2026 10:05:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(emergency):=20addGroupUser=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9C=AC=E4=BA=BA=E5=88=A4=E6=96=AD=E5=92=8CIM?= =?UTF-8?q?=E7=BE=A4=E6=88=90=E5=91=98=E5=8E=BB=E9=87=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 过滤当前登录用户,不允许邀请自己入群 - 查询腾讯IM实际群成员,避免重复邀请已在群中的人 - IM查询失败时降级使用本地 order_operator 数据去重 - 去重来源:本地记录 + IM实际成员 取并集 Co-Authored-By: Claude --- .../service/impl/EmergencyApiServiceImpl.java | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java index a0a053d..9c071a9 100644 --- a/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java +++ b/health-emergency/health-emergency-biz/src/main/java/com/renkang/emergency/api/service/impl/EmergencyApiServiceImpl.java @@ -36,6 +36,7 @@ import com.renkang.im.dto.DeleteGroupMemberDTO; import com.renkang.im.entity.ConSessionRequestDO; import com.renkang.im.entity.ImGroupMsgTextReqDO; import com.renkang.im.vo.AddGroupMemberVO; +import com.renkang.im.vo.GetGroupMemberInfoVO; import com.renkang.im.vo.ImBaseResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -1284,17 +1285,45 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { ExceptionAssertsUtil.fail("应急单不存在"); } String orderId = order.getId(); + + // 0. 获取当前登录用户,过滤掉本人 + LoginUser loginUser = GlobalUtils.getLoginUser(); + String currentUserId = loginUser.getId(); + List candidateList = dto.getMemberList().stream() + .filter(userId -> !userId.equals(currentUserId)) + .collect(Collectors.toList()); + if (candidateList.isEmpty()) { + ExceptionAssertsUtil.fail("不能邀请自己入群"); + } + + // 1. 查询本地 order_operator 和腾讯IM实际群成员,取并集作为已在群中的用户 + Set alreadyInGroup = new HashSet<>(); + // 1a. 本地已有记录 + List existingOps = orderOperatorMapper.selectList( + new LambdaQueryWrapper() + .eq(OrderOperator::getOrderId, orderId)); + existingOps.forEach(op -> alreadyInGroup.add(op.getUserId())); + alreadyInGroup.add(order.getInitiatorUserId()); + // 1b. 腾讯IM实际群成员 + try { + Result imResult = iMHelloApi.getGroupMemberInfo(groupId); + if (imResult != null && imResult.isSuccess() && imResult.getResult() != null) { + GetGroupMemberInfoVO vo = imResult.getResult(); + if ("OK".equals(vo.getActionStatus()) && vo.getMemberList() != null) { + vo.getMemberList().forEach(m -> alreadyInGroup.add(m.getMemberAccount())); + } + } + } catch (Exception e) { + log.warn("获取腾讯IM群成员失败,仅使用本地数据进行去重, groupId: {}", groupId, e); + } + // memberType: 0=专家/专业人员(默认), 1=员工 Integer memberType = dto.getMemberType(); Integer operatorType = (memberType != null && memberType == 1) ? 2 : 1; Date now = new Date(); List newMemberList = new ArrayList<>(); - dto.getMemberList().forEach(userId -> { - OrderOperator existing = orderOperatorMapper.selectOne(new LambdaQueryWrapper() - .eq(OrderOperator::getOrderId, orderId) - .eq(OrderOperator::getUserId, userId) - ); - if (existing != null) { + candidateList.forEach(userId -> { + if (alreadyInGroup.contains(userId)) { return; } OrderOperator orderOperator = new OrderOperator(); @@ -1307,7 +1336,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService { newMemberList.add(userId); }); if (newMemberList.isEmpty()) { - ExceptionAssertsUtil.fail("所有成员已在群组中"); + ExceptionAssertsUtil.fail("所选成员已在群聊中"); } AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO(); addGroupMemberDTO.setGroupId(dto.getGroupId());