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());