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.ConSessionRequestDO;
|
||||||
import com.renkang.im.entity.ImGroupMsgTextReqDO;
|
import com.renkang.im.entity.ImGroupMsgTextReqDO;
|
||||||
import com.renkang.im.vo.AddGroupMemberVO;
|
import com.renkang.im.vo.AddGroupMemberVO;
|
||||||
|
import com.renkang.im.vo.GetGroupMemberInfoVO;
|
||||||
import com.renkang.im.vo.ImBaseResult;
|
import com.renkang.im.vo.ImBaseResult;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
@@ -1284,17 +1285,45 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
|||||||
ExceptionAssertsUtil.fail("应急单不存在");
|
ExceptionAssertsUtil.fail("应急单不存在");
|
||||||
}
|
}
|
||||||
String orderId = order.getId();
|
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=员工
|
// memberType: 0=专家/专业人员(默认), 1=员工
|
||||||
Integer memberType = dto.getMemberType();
|
Integer memberType = dto.getMemberType();
|
||||||
Integer operatorType = (memberType != null && memberType == 1) ? 2 : 1;
|
Integer operatorType = (memberType != null && memberType == 1) ? 2 : 1;
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
List<String> newMemberList = new ArrayList<>();
|
List<String> newMemberList = new ArrayList<>();
|
||||||
dto.getMemberList().forEach(userId -> {
|
candidateList.forEach(userId -> {
|
||||||
OrderOperator existing = orderOperatorMapper.selectOne(new LambdaQueryWrapper<OrderOperator>()
|
if (alreadyInGroup.contains(userId)) {
|
||||||
.eq(OrderOperator::getOrderId, orderId)
|
|
||||||
.eq(OrderOperator::getUserId, userId)
|
|
||||||
);
|
|
||||||
if (existing != null) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
OrderOperator orderOperator = new OrderOperator();
|
OrderOperator orderOperator = new OrderOperator();
|
||||||
@@ -1307,7 +1336,7 @@ public class EmergencyApiServiceImpl implements EmergencyApiService {
|
|||||||
newMemberList.add(userId);
|
newMemberList.add(userId);
|
||||||
});
|
});
|
||||||
if (newMemberList.isEmpty()) {
|
if (newMemberList.isEmpty()) {
|
||||||
ExceptionAssertsUtil.fail("所有成员已在群组中");
|
ExceptionAssertsUtil.fail("所选成员已在群聊中");
|
||||||
}
|
}
|
||||||
AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO();
|
AddGroupMemberDTO addGroupMemberDTO = new AddGroupMemberDTO();
|
||||||
addGroupMemberDTO.setGroupId(dto.getGroupId());
|
addGroupMemberDTO.setGroupId(dto.getGroupId());
|
||||||
|
|||||||
Reference in New Issue
Block a user