fix(emergency): addGroupUser 增加本人判断和IM群成员去重

- 过滤当前登录用户,不允许邀请自己入群
- 查询腾讯IM实际群成员,避免重复邀请已在群中的人
- IM查询失败时降级使用本地 order_operator 数据去重
- 去重来源:本地记录 + IM实际成员 取并集

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-07 10:05:04 +08:00
co-authored by Claude
parent f10221e92c
commit 1484f621bd
@@ -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<String> candidateList = dto.getMemberList().stream()
.filter(userId -> !userId.equals(currentUserId))
.collect(Collectors.toList());
if (candidateList.isEmpty()) {
ExceptionAssertsUtil.fail("不能邀请自己入群");
}
// 1. 查询本地 order_operator 和腾讯IM实际群成员,取并集作为已在群中的用户
Set<String> alreadyInGroup = new HashSet<>();
// 1a. 本地已有记录
List<OrderOperator> existingOps = orderOperatorMapper.selectList(
new LambdaQueryWrapper<OrderOperator>()
.eq(OrderOperator::getOrderId, orderId));
existingOps.forEach(op -> alreadyInGroup.add(op.getUserId()));
alreadyInGroup.add(order.getInitiatorUserId());
// 1b. 腾讯IM实际群成员
try {
Result<GetGroupMemberInfoVO> 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<String> newMemberList = new ArrayList<>();
dto.getMemberList().forEach(userId -> {
OrderOperator existing = orderOperatorMapper.selectOne(new LambdaQueryWrapper<OrderOperator>()
.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());