|
@@ -0,0 +1,722 @@
|
|
|
+package com.yonge.cooleshow.biz.dal.service.im.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.microsvc.toolkit.common.tools.ThreadPool;
|
|
|
+import com.microsvc.toolkit.middleware.im.ImPluginContext;
|
|
|
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
|
|
|
+import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
|
|
|
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
|
|
|
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
|
|
|
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
|
|
|
+import com.yonge.toolset.base.exception.BizException;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * IM群组务
|
|
|
+ * Created by Eric.Shang on 2022/11/26.
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class ImGroupCoreServiceImpl implements ImGroupCoreService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ImPluginContext imPluginContext;
|
|
|
+ @Autowired
|
|
|
+ private ImGroupService imGroupService;
|
|
|
+ @Autowired
|
|
|
+ private ImConfigProperties imConfig;
|
|
|
+ @Autowired
|
|
|
+ private ImGroupMemberService imGroupMemberService;
|
|
|
+ @Autowired
|
|
|
+ private ImGroupMemberAuditService imGroupMemberAuditService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * IM 用户注册
|
|
|
+ *
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param username 用户名
|
|
|
+ * @param avatar 用户头象
|
|
|
+ * @return IM聊天Token
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ImGroupWrapper.ImUserInfo register(String userId,String clientType, String username, String avatar) throws Exception {
|
|
|
+
|
|
|
+ ImGroupWrapper.ImUserInfo userInfo = ImGroupWrapper.ImUserInfo.builder()
|
|
|
+ .imUserId("").imToken("").build();
|
|
|
+ // 生成IM聊天Token
|
|
|
+ try {
|
|
|
+
|
|
|
+ // 聊天Token
|
|
|
+ String imUserId = getImUserId(userId,clientType);
|
|
|
+
|
|
|
+ // 生成签名
|
|
|
+ userInfo.imUserId(imUserId)
|
|
|
+ .setImToken(imPluginContext.getPluginService().register(imUserId, username, avatar));
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("register ImToken EX, userId={}, username={}", userId, username, e);
|
|
|
+ }
|
|
|
+ return userInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * IM 用户注册
|
|
|
+ *
|
|
|
+ * @param userId 用户Id
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String getImUserId(String userId, String clientType) {
|
|
|
+ String imUserId = userId;
|
|
|
+ if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !userId.startsWith(imConfig.getAppPrefix())) {
|
|
|
+ imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
|
|
|
+ }
|
|
|
+ return imUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getImUserId(Long userId, RoleEnum userRole) {
|
|
|
+ String imUserId = String.valueOf(userId);
|
|
|
+ String clientType = "STUDENT";
|
|
|
+ if(userRole.RoleTeacher == userRole){
|
|
|
+ clientType = "TEACHER";
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
|
|
|
+ imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
|
|
|
+ }
|
|
|
+ return imUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getImUserId(Long userId, ClientEnum clientEnum) {
|
|
|
+ String imUserId = String.valueOf(userId);
|
|
|
+ String clientType = "STUDENT";
|
|
|
+ if(clientEnum.TEACHER == clientEnum){
|
|
|
+ clientType = "TEACHER";
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !imUserId.startsWith(imConfig.getAppPrefix())) {
|
|
|
+ imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
|
|
|
+ }
|
|
|
+ return imUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析IM用户规则
|
|
|
+ *
|
|
|
+ * @param imUserId IM用户Id
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String analysisImUserId(String imUserId) {
|
|
|
+ if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && imUserId.startsWith(imConfig.getAppPrefix())) {
|
|
|
+ return imUserId.replace(imConfig.getAppPrefix() + "_", "").split("_")[0];
|
|
|
+ }
|
|
|
+ return imUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 检测imUserid
|
|
|
+ *
|
|
|
+ * @param imUserId IM用户Id
|
|
|
+ * @return String
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean checkImUserId(String imUserId) {
|
|
|
+ return imUserId.startsWith(imConfig.getAppPrefix());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String analysisImUserClient(String imUserId) {
|
|
|
+ if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && imUserId.startsWith(imConfig.getAppPrefix())) {
|
|
|
+ imUserId = imUserId.replace(imConfig.getAppPrefix() + "_", "");
|
|
|
+ String[] s = imUserId.split("_");
|
|
|
+ if (s.length > 1) {
|
|
|
+ return imUserId.replace(s[0] + "_", "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return imUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加群组信息
|
|
|
+ *
|
|
|
+ * @param userInfo 用户信息
|
|
|
+ * @param imGroup ImGroupWrapper.ImGroup
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public String groupCreate(GroupMemberWrapper.ImGroupMember userInfo, ImGroupWrapper.ImGroup imGroup) throws Exception {
|
|
|
+
|
|
|
+ long id = Optional.ofNullable(imGroup.getId()).orElse(IdWorker.getId());
|
|
|
+ // 生成群组ID
|
|
|
+ imGroup.id(id)
|
|
|
+ .type(Optional.ofNullable(imGroup.getType()).orElse("CLASS"))
|
|
|
+ .groupId(String.valueOf(id));
|
|
|
+
|
|
|
+ ImGroup group = JSON.parseObject(imGroup.jsonString(), ImGroup.class);
|
|
|
+ group.setId(imGroup.getGroupId());
|
|
|
+ // 保存群组信息
|
|
|
+ imGroupService.saveOrUpdate(group);
|
|
|
+
|
|
|
+
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
|
|
|
+ //记录群成员
|
|
|
+ ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
|
|
|
+ .builder()
|
|
|
+ .id(IdWorker.getId())
|
|
|
+ .groupId(imGroup.getGroupId())
|
|
|
+ .userId(userInfo.getUserId())
|
|
|
+ .clientType(userInfo.getClientType())
|
|
|
+ .avatar(userInfo.getAvatar())
|
|
|
+ .nickname(userInfo.getNickname())
|
|
|
+ .isAdmin(true)
|
|
|
+ .roleType(userInfo.getRoleType())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ groupMembers.add(groupMember.imUserId(getImUserId(groupMember.getUserId().toString(),userInfo.getClientType())));
|
|
|
+ imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
|
|
|
+
|
|
|
+ // 自动激活学生IM帐号
|
|
|
+ registerUser(groupMembers);
|
|
|
+
|
|
|
+ // 创建IM群组
|
|
|
+ imPluginContext.getPluginService().groupCreate(imGroup.getGroupId(), imGroup.getName(),imGroup.getImg(),
|
|
|
+ getImUserId( userInfo.getUserId().toString(), userInfo.getClientType()));
|
|
|
+
|
|
|
+ // 添加群成员到当前群组
|
|
|
+ imPluginContext.getPluginService().groupJoin(imGroup.getGroupId(), imGroup.getName(),
|
|
|
+ getImGroupMembers(groupMembers));
|
|
|
+
|
|
|
+ return imGroup.getGroupId();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取群组成员信息
|
|
|
+ *
|
|
|
+ * @param groupMembers 群组成员信息
|
|
|
+ * @return List<GroupMemberWrapper.ImGroupMember>
|
|
|
+ */
|
|
|
+ private List<GroupMemberWrapper.ImGroupMember> getImGroupMembers(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
|
|
|
+ // 统一转换为群组成员信息
|
|
|
+ for (ImGroupMemberWrapper.ImGroupMember member : groupMembers) {
|
|
|
+ member.setImUserId(getImUserId(member.getUserId().toString(),member.getClientType()));
|
|
|
+ }
|
|
|
+ return JSON.parseArray(JSON.toJSONString(groupMembers), GroupMemberWrapper.ImGroupMember.class);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自动注册用户
|
|
|
+ * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
|
|
|
+ */
|
|
|
+ private void asyncRegisterUser(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
|
|
|
+ ThreadPool.getExecutor().submit(() -> registerUser(groupMembers));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 批量导入用户
|
|
|
+ * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
|
|
|
+ */
|
|
|
+ private void registerUser(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
|
|
|
+ for (ImGroupMemberWrapper.ImGroupMember member : groupMembers) {
|
|
|
+ // 激活用户帐号为空
|
|
|
+ if (StringUtils.isBlank(member.getNickname())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ String imUserId = member.getUserId().toString();
|
|
|
+ if (StringUtils.isBlank(imUserId)) {
|
|
|
+ imUserId = getImUserId(String.valueOf(member.getUserId()),
|
|
|
+ member.getClientType());
|
|
|
+ }
|
|
|
+
|
|
|
+ imPluginContext.getPluginService().register(imUserId, member.getNickname(), member.getAvatar());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("registerUser member imToken");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加群组信息
|
|
|
+ *
|
|
|
+ * @param imGroups ImGroupWrapper.ImGroup
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupCreate(List<ImGroupWrapper.ImGroup> imGroups) throws Exception {
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(imGroups)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (ImGroupWrapper.ImGroup item : imGroups) {
|
|
|
+
|
|
|
+ GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember.builder()
|
|
|
+ .userId(item.getCreateBy())
|
|
|
+ .roleType(ClientEnum.TEACHER.getCode())
|
|
|
+ .clientType(ClientEnum.TEACHER.getCode())
|
|
|
+ .build();
|
|
|
+ // 添加群组信息
|
|
|
+ groupCreate(groupMember, item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 群组解散
|
|
|
+ *
|
|
|
+ * @param groupId 群组ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupDismiss(String groupId) throws Exception {
|
|
|
+
|
|
|
+ // 判定登录用户是否为群主
|
|
|
+ ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除入群申请
|
|
|
+ LambdaQueryWrapper<ImGroupMemberAudit> auditQueryWrapper = Wrappers.<ImGroupMemberAudit>lambdaQuery()
|
|
|
+ .eq(ImGroupMemberAudit::getGroupId, groupId);
|
|
|
+ imGroupMemberAuditService.remove(auditQueryWrapper);
|
|
|
+
|
|
|
+ // 获取群成员
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
|
|
|
+ .select(ImGroupMember::getUserId, ImGroupMember::getGroupId, ImGroupMember::getRoleType)
|
|
|
+ .eq(ImGroupMember::getGroupId, groupId)
|
|
|
+ .list().stream()
|
|
|
+ .map(x -> ImGroupMemberWrapper.ImGroupMember.builder().userId(x.getUserId()).groupId(x.getGroupId()).clientType(x.getRoleType().getCode()).build())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 删除群组
|
|
|
+ imGroupService.remove(Wrappers.<ImGroup>lambdaQuery().eq(ImGroup::getId, groupId));
|
|
|
+
|
|
|
+ // 删除群组成员
|
|
|
+ imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
|
|
|
+
|
|
|
+ // 解散群
|
|
|
+ imPluginContext.getPluginService().groupDismiss(imGroup.getId(), getImGroupMembers(groupMembers));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户主动退出群聊
|
|
|
+ *
|
|
|
+ * @param imGroupMember 用户信息
|
|
|
+ * @param groupId 群组ID
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupQuit(GroupMemberWrapper.ImGroupMember imGroupMember, String groupId,Boolean quit) throws Exception {
|
|
|
+
|
|
|
+ // 判定登录用户是否为群主
|
|
|
+ ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 统计当前群成员用户数
|
|
|
+ long count = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
|
|
|
+
|
|
|
+ // 删除当前用户群成员身份
|
|
|
+ boolean remove = imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery()
|
|
|
+ .eq(ImGroupMember::getGroupId, groupId)
|
|
|
+ .eq(ImGroupMember::getUserId, imGroupMember.getUserId())
|
|
|
+ .eq(ImGroupMember::getRoleType, imGroupMember.getRoleType())
|
|
|
+ );
|
|
|
+ if (!remove) {
|
|
|
+ // 用户主动退出群聊失败
|
|
|
+ throw new BizException("用户主动退出群聊失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 修改群组成员数
|
|
|
+ imGroupService.lambdaUpdate()
|
|
|
+ .eq(ImGroup::getId, imGroup.getId())
|
|
|
+ .set(ImGroup::getMemberNum, count - 1)
|
|
|
+ .update();
|
|
|
+
|
|
|
+ // 群主退出
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
|
|
|
+ groupMembers.add(ImGroupMemberWrapper.ImGroupMember.builder()
|
|
|
+ .userId(imGroupMember.getUserId())
|
|
|
+ .groupId(groupId)
|
|
|
+ .clientType(imGroupMember.getClientType())
|
|
|
+ .build());
|
|
|
+
|
|
|
+ if (Optional.ofNullable(quit).orElse(true)) {
|
|
|
+ imPluginContext.getPluginService().groupQuit(imGroup.getId(), getImGroupMembers(groupMembers));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户主动退出群聊
|
|
|
+ *
|
|
|
+ * @param userId 用户信息
|
|
|
+ * @param clientType EClientType
|
|
|
+ * @param imGroupId 群组ID
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupQuit(Long userId, String clientType, String imGroupId ,Boolean quit) throws Exception {
|
|
|
+
|
|
|
+ ImGroup imGroup = imGroupService.getById(imGroupId);
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember.builder()
|
|
|
+ .userId(userId)
|
|
|
+ .roleType(clientType)
|
|
|
+ .clientType(clientType)
|
|
|
+ .build();
|
|
|
+ // 退出群聊
|
|
|
+ groupQuit(groupMember, imGroup.getId(), quit);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 入群申请消息
|
|
|
+ *
|
|
|
+ * @param imGroupMember JwtUserInfo<?>
|
|
|
+ * @param memberAudit ImGroupMemberAuditWrapper.ImGroupMemberAudit
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupJoinApply(GroupMemberWrapper.ImGroupMember imGroupMember, ImGroupMemberAuditWrapper.ImGroupMemberAudit memberAudit) throws Exception {
|
|
|
+
|
|
|
+ // 判断群ID是否有效
|
|
|
+ ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, memberAudit.getGroupId()).last("LIMIT 1").one();
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断用户是否已入群
|
|
|
+ int exists = imGroupMemberService.lambdaQuery()
|
|
|
+ .eq(ImGroupMember::getGroupId, memberAudit.getGroupId())
|
|
|
+ .eq(ImGroupMember::getUserId, memberAudit.getUserId())
|
|
|
+ .eq(ImGroupMember::getRoleType, memberAudit.getRoleType())
|
|
|
+ .count();
|
|
|
+ if (exists > 0) {
|
|
|
+ throw new BizException("用户已入群");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 是否有待审核消息
|
|
|
+ exists = imGroupMemberAuditService.lambdaQuery()
|
|
|
+ .eq(ImGroupMemberAudit::getGroupId, memberAudit.getGroupId())
|
|
|
+ .eq(ImGroupMemberAudit::getUserId, memberAudit.getUserId())
|
|
|
+ .eq(ImGroupMemberAudit::getRoleType, memberAudit.getRoleType())
|
|
|
+ .eq(ImGroupMemberAudit::getAuditStatus, AuditStatusEnum.AUDITING)
|
|
|
+ .count();
|
|
|
+ if (exists >0) {
|
|
|
+ throw new BizException("已有待审核消息");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存入群申请消息
|
|
|
+ imGroupMemberAuditService.save(JSON.parseObject(JSON.toJSONString(memberAudit), ImGroupMemberAudit.class));
|
|
|
+
|
|
|
+
|
|
|
+ // 群是否自动通过审核
|
|
|
+ if (Optional.ofNullable(imGroup.getAutoPassFlag()).orElse(false)) {
|
|
|
+
|
|
|
+ // 自动加群
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
|
|
|
+ //记录群成员
|
|
|
+ ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
|
|
|
+ .builder()
|
|
|
+ .groupId(imGroup.getId())
|
|
|
+ .userId(memberAudit.getUserId())
|
|
|
+ .clientType(memberAudit.getClientType())
|
|
|
+ .avatar(imGroupMember.getAvatar())
|
|
|
+ .nickname(imGroupMember.getNickname())
|
|
|
+ .isAdmin(false)
|
|
|
+ .roleType(memberAudit.getRoleType())
|
|
|
+ .build();
|
|
|
+
|
|
|
+
|
|
|
+ groupMembers.add(groupMember.imUserId(getImUserId(groupMember.getUserId().toString(),groupMember.getClientType())));
|
|
|
+ saveImGroupMemberList(imGroup.getId(), groupMembers);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加群组成员
|
|
|
+ * @param imGroupId 群组ID
|
|
|
+ * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void saveImGroupMemberList(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(groupMembers)) {
|
|
|
+ // 群成员为空,直接忽略
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 查询群组主键Id
|
|
|
+ for (ImGroupMemberWrapper.ImGroupMember item : groupMembers) {
|
|
|
+ item.id(IdWorker.getId()).imUserId(getImUserId(item.getUserId().toString(), item.getClientType())).setGroupId(imGroupId);
|
|
|
+ }
|
|
|
+
|
|
|
+ imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
|
|
|
+ // 判断群ID是否有效
|
|
|
+ ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, imGroupId).last("LIMIT 1").one();
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+ // 更新群组成员数
|
|
|
+ updateGroupMemberNumber(imGroup.getId(), imGroup);
|
|
|
+
|
|
|
+ if (groupMembers.stream().anyMatch(ImGroupMemberWrapper.ImGroupMember::getGroupJoin)) {
|
|
|
+
|
|
|
+ // 过滤出需要添加到群组的成员
|
|
|
+ groupMembers = groupMembers.stream().filter(ImGroupMemberWrapper.ImGroupMember::getGroupJoin).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 添加群成员到当前群组
|
|
|
+ imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
|
|
|
+
|
|
|
+ // 自动激活用户
|
|
|
+ asyncRegisterUser(groupMembers);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加群组成员
|
|
|
+ *
|
|
|
+ * @param imGroupId 群组主键ID
|
|
|
+ * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void saveImGroupMemberList(Long imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
|
|
|
+
|
|
|
+ // 群组信息
|
|
|
+ ImGroup imGroup = imGroupService.getById(imGroupId);
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加群组成员信息
|
|
|
+ saveImGroupMemberList(imGroup.getId(), groupMembers);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 群成员加入
|
|
|
+ *
|
|
|
+ * @param imGroupId 群主ID
|
|
|
+ * @param groupMembers 群成员
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupMemberJoin(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception {
|
|
|
+
|
|
|
+ // 群组信息
|
|
|
+ ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, imGroupId).last("LIMIT 1").one();
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加群组成员信息
|
|
|
+ if (CollectionUtils.isEmpty(groupMembers)) {
|
|
|
+ // 群成员为空,直接忽略
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加群成员到当前群组
|
|
|
+ imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
|
|
|
+
|
|
|
+ // 自动激活用户
|
|
|
+ asyncRegisterUser(groupMembers);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新群组成员数
|
|
|
+ * @param groupId 群组ID
|
|
|
+ * @param imGroup ImGroup
|
|
|
+ */
|
|
|
+ private void updateGroupMemberNumber(String groupId, ImGroup imGroup) {
|
|
|
+
|
|
|
+ // 统计当前群成员用户数
|
|
|
+ long count = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getGroupId, groupId));
|
|
|
+
|
|
|
+ // 修改群组成员数
|
|
|
+ imGroupService.lambdaUpdate()
|
|
|
+ .eq(ImGroup::getId, imGroup.getId())
|
|
|
+ .set(ImGroup::getMemberNum, count)
|
|
|
+ .update();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 入群申请审核
|
|
|
+ *
|
|
|
+ * @param imGroupMember JwtUserInfo<?>
|
|
|
+ * @param audit ImGroupMemberAuditWrapper.ApplyBatchAudit
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupJoinAudit(GroupMemberWrapper.ImGroupMember imGroupMember, ImGroupMemberAuditWrapper.ApplyBatchAudit audit) throws Exception {
|
|
|
+
|
|
|
+ Collection<ImGroupMemberAudit> memberAudits = imGroupMemberAuditService.listByIds(audit.getBatchAuditIds());
|
|
|
+ // 判断申请审核状态是否匹配
|
|
|
+ boolean anyMatch = memberAudits.stream().anyMatch(x -> x.getAuditStatus() != AuditStatusEnum.AUDITING);
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(memberAudits) || anyMatch) {
|
|
|
+ throw new BizException("审核状态不匹配");
|
|
|
+ }
|
|
|
+
|
|
|
+ ImGroup imGroup = imGroupService.getById(audit.getGroupId());
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 非群主用户,不能进行审核
|
|
|
+ if (!imGroupMember.getUserId().equals(imGroup.getCreateBy())) {
|
|
|
+ throw new BizException("非群主用户,不能进行审核");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批量更新入群申请状态
|
|
|
+ imGroupMemberAuditService.lambdaUpdate()
|
|
|
+ .in(ImGroupMemberAudit::getId, audit.getBatchAuditIds())
|
|
|
+ .eq(ImGroupMemberAudit::getGroupId, audit.getGroupId())
|
|
|
+ .set(ImGroupMemberAudit::getAuditStatus, audit.getAuditStatus())
|
|
|
+ .update();
|
|
|
+
|
|
|
+ // 申请通过
|
|
|
+ if (AuditStatusEnum.OPEN.getCode().equals(audit.getAuditStatus())) {
|
|
|
+
|
|
|
+ // 添加群成员
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
|
|
|
+ for (ImGroupMemberAudit item : memberAudits) {
|
|
|
+
|
|
|
+ //记录群成员
|
|
|
+
|
|
|
+ ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
|
|
|
+ .builder()
|
|
|
+ .groupId(imGroup.getId())
|
|
|
+ .userId(item.getUserId())
|
|
|
+ .clientType(item.getRoleType().getCode())
|
|
|
+ .imUserId(getImUserId(item.getUserId().toString(),item.getRoleType().getCode()))
|
|
|
+ .avatar("")
|
|
|
+ .nickname("")
|
|
|
+ .isAdmin(false)
|
|
|
+ .roleType(item.getRoleType().getCode())
|
|
|
+ .build();
|
|
|
+ groupMembers.add(groupMember);
|
|
|
+ }
|
|
|
+ imGroupMemberService.insertBatch(JSON.parseArray(JSON.toJSONString(groupMembers), ImGroupMember.class));
|
|
|
+
|
|
|
+ // 更新群组成员数
|
|
|
+ updateGroupMemberNumber(imGroup.getId(), imGroup);
|
|
|
+
|
|
|
+ // 添加群成员到当前群组
|
|
|
+ imPluginContext.getPluginService().groupJoin(imGroup.getId(), imGroup.getName(), getImGroupMembers(groupMembers));
|
|
|
+
|
|
|
+ // 自动激活用户
|
|
|
+ asyncRegisterUser(groupMembers);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加进入群组
|
|
|
+ *
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @param clientType 客户端类型
|
|
|
+ * @param imGroupId 群组ID
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void groupJoin(Long userId, String clientType, Long imGroupId) throws Exception {
|
|
|
+
|
|
|
+ // 群组信息
|
|
|
+ ImGroup imGroup = imGroupService.getById(imGroupId);
|
|
|
+ if (Objects.isNull(imGroup)) {
|
|
|
+ throw new BizException("群组不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers = new ArrayList<>();
|
|
|
+ ImGroupMemberWrapper.ImGroupMember groupMember = ImGroupMemberWrapper.ImGroupMember
|
|
|
+ .builder()
|
|
|
+ .groupId(imGroup.getId())
|
|
|
+ .userId(userId)
|
|
|
+ .clientType(clientType)
|
|
|
+ .imUserId(getImUserId(userId.toString(),clientType))
|
|
|
+ .isAdmin(false)
|
|
|
+ .roleType(clientType)
|
|
|
+ .build();
|
|
|
+ imGroupMembers.add(groupMember);
|
|
|
+
|
|
|
+ saveImGroupMemberList(imGroupId, imGroupMembers);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转让群主
|
|
|
+ *
|
|
|
+ * @param groupId 群组ID
|
|
|
+ * @param newOwner 新群主
|
|
|
+ * @param oldOwner 旧群主
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception {
|
|
|
+
|
|
|
+ // 转主群主
|
|
|
+ imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新群信息
|
|
|
+ *
|
|
|
+ * @param groupId 群ID
|
|
|
+ * @param groupName 群名称
|
|
|
+ * @param faceUrl 群头像
|
|
|
+ * @throws Exception Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void modifyGroupInfo(String groupId, String groupName, String faceUrl) throws Exception {
|
|
|
+
|
|
|
+ // 更新群信息
|
|
|
+ imPluginContext.getPluginService().modifyGroupInfo(groupId, groupName, faceUrl);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 群成员加入三方IM状态
|
|
|
+ *
|
|
|
+ * @param groupMemberIds 群成员ID
|
|
|
+ * @param groupJoin 加群状态
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void updateGroupMemberJoinStatus(List<Long> groupMemberIds, Boolean groupJoin) {
|
|
|
+
|
|
|
+// if (CollectionUtils.isEmpty(groupMemberIds)) {
|
|
|
+// return;
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 群成员加入三方IM状态
|
|
|
+// imGroupMemberService.lambdaUpdate()
|
|
|
+// .set(ImGroupMember::getGroupJoin, groupJoin)
|
|
|
+// .in(ImGroupMember::getId, groupMemberIds)
|
|
|
+// .update();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|