fix(emergency): addGroupUser 增加本人判断和IM群成员去重
- 过滤当前登录用户,不允许邀请自己入群 - 查询腾讯IM实际群成员,避免重复邀请已在群中的人 - IM查询失败时降级使用本地 order_operator 数据去重 - 去重来源:本地记录 + IM实际成员 取并集 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+36
-7
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user