|  | @@ -0,0 +1,727 @@
 | 
	
		
			
				|  |  | +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.metadata.IPage;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 | 
	
		
			
				|  |  | +import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
	
		
			
				|  |  | +import com.google.common.collect.Lists;
 | 
	
		
			
				|  |  | +import com.google.common.collect.Maps;
 | 
	
		
			
				|  |  | +import com.microsvc.toolkit.common.response.paging.QueryInfo;
 | 
	
		
			
				|  |  | +import com.microsvc.toolkit.common.tools.ThreadPool;
 | 
	
		
			
				|  |  | +import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
 | 
	
		
			
				|  |  | +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.ImGroupMemberRoleType;
 | 
	
		
			
				|  |  | +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.collections.MapUtils;
 | 
	
		
			
				|  |  | +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.function.Function;
 | 
	
		
			
				|  |  | +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 Long 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(),
 | 
	
		
			
				|  |  | +                getImUserId( userInfo.getUserId().toString(), userInfo.getClientType()));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 添加群成员到当前群组
 | 
	
		
			
				|  |  | +        imPluginContext.getPluginService().groupJoin(imGroup.getGroupId(), imGroup.getName(),
 | 
	
		
			
				|  |  | +                getImGroupMembers(groupMembers));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return imGroup.getId();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 获取群组成员信息
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @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) 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());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        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) 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());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 入群申请消息
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @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();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |