|  | @@ -1,596 +0,0 @@
 | 
	
		
			
				|  |  | -package com.ym.mec.biz.service.impl;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import com.alibaba.fastjson.JSON;
 | 
	
		
			
				|  |  | -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.ym.mec.biz.dal.entity.ImGroup;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.entity.ImGroupMember;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.enums.EFriendRoleType;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.service.ImGroupMemberPlusService;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.service.ImGroupPlusService;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.service.ImGroupCoreService;
 | 
	
		
			
				|  |  | -import com.ym.mec.common.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 org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import java.util.ArrayList;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Objects;
 | 
	
		
			
				|  |  | -import java.util.Optional;
 | 
	
		
			
				|  |  | -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 ImGroupPlusService imGroupService;
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private ImConfigProperties imConfig;
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private ImGroupMemberPlusService imGroupMemberService;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 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(getImUserId(userId, clientType))
 | 
	
		
			
				|  |  | -            .imToken("")
 | 
	
		
			
				|  |  | -            .build();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 聊天Token
 | 
	
		
			
				|  |  | -        String imUserId = userInfo.getImUserId();
 | 
	
		
			
				|  |  | -        // 生成IM聊天Token
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            // 生成签名
 | 
	
		
			
				|  |  | -            userInfo.imUserId(imUserId)
 | 
	
		
			
				|  |  | -                    .setImToken(imPluginContext.getPluginService().register(imUserId, username, avatar));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        } catch (Exception e) {
 | 
	
		
			
				|  |  | -            log.error("register ImToken EX, userId={}, username={}", userId, username, e);
 | 
	
		
			
				|  |  | -            // 重新计算用户签名
 | 
	
		
			
				|  |  | -            userInfo.setImToken(imPluginContext.getPluginService().getUserSig(imUserId));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return userInfo;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * IM 用户签名
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param userId     用户ID
 | 
	
		
			
				|  |  | -     * @param clientType 用户身份
 | 
	
		
			
				|  |  | -     * @return ImGroupWrapper.ImUserInfo
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public ImGroupWrapper.ImUserInfo getUserSig(String userId, String clientType) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        ImGroupWrapper.ImUserInfo userInfo = ImGroupWrapper.ImUserInfo.builder()
 | 
	
		
			
				|  |  | -            .imUserId(getImUserId(userId, clientType))
 | 
	
		
			
				|  |  | -            .imToken("")
 | 
	
		
			
				|  |  | -            .build();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 计算用户IM签名
 | 
	
		
			
				|  |  | -        userInfo.setImToken(imPluginContext.getPluginService().getUserSig(userInfo.getImUserId()));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return userInfo;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * IM 用户注册
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param userId 用户Id
 | 
	
		
			
				|  |  | -     * @return String
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public String getImUserId(String userId, String clientType) {
 | 
	
		
			
				|  |  | -        /*if (StringUtils.isNotBlank(imConfig.getAppPrefix()) && !userId.startsWith(imConfig.getAppPrefix())) {
 | 
	
		
			
				|  |  | -            imUserId = MessageFormat.format("{0}_{1}_{2}", imConfig.getAppPrefix(), userId, clientType);
 | 
	
		
			
				|  |  | -        }*/
 | 
	
		
			
				|  |  | -        return userId;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 解析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;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 添加群组信息
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param userInfo 用户信息
 | 
	
		
			
				|  |  | -     * @param imGroup  ImGroupWrapper.ImGroup
 | 
	
		
			
				|  |  | -     * @return Boolean
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    @Transactional
 | 
	
		
			
				|  |  | -    public String groupCreate(ImGroupMemberWrapper.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 = null;
 | 
	
		
			
				|  |  | -        String imUserId = null;
 | 
	
		
			
				|  |  | -        if (userInfo != null) {
 | 
	
		
			
				|  |  | -            imUserId = getImUserId(userInfo.getUserId().toString(), userInfo.getClientType());
 | 
	
		
			
				|  |  | -            groupMembers = Lists.newArrayList(userInfo);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            groupMembers.add(userInfo.imUserId(imUserId));
 | 
	
		
			
				|  |  | -            imGroupMemberService.insertBatch(getImGroupMemberEntity(groupMembers));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 自动激活学生IM帐号
 | 
	
		
			
				|  |  | -            registerUser(groupMembers);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 创建IM群组
 | 
	
		
			
				|  |  | -        imPluginContext.getPluginService().groupCreate(imGroup.getGroupId(), imGroup.getName(),imUserId);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (userInfo != null) {
 | 
	
		
			
				|  |  | -            // 添加群成员到当前群组
 | 
	
		
			
				|  |  | -            imPluginContext.getPluginService().groupJoin(imGroup.getGroupId(), imGroup.getName(),
 | 
	
		
			
				|  |  | -                    getImGroupMembers(groupMembers));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return group.getId();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    private List<ImGroupMember> getImGroupMemberEntity(List<ImGroupMemberWrapper.ImGroupMember> groupMembers) {
 | 
	
		
			
				|  |  | -        if (CollectionUtils.isEmpty(groupMembers)) {
 | 
	
		
			
				|  |  | -            return new ArrayList<>();
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return groupMembers.stream().map(o -> {
 | 
	
		
			
				|  |  | -            ImGroupMember imGroupMember = new ImGroupMember();
 | 
	
		
			
				|  |  | -            imGroupMember.setImGroupId(o.getGroupId());
 | 
	
		
			
				|  |  | -            imGroupMember.setUserId(o.getUserId().intValue());
 | 
	
		
			
				|  |  | -            imGroupMember.setNickname(o.getNickname());
 | 
	
		
			
				|  |  | -            imGroupMember.setIsAdmin(o.getIsAdmin());
 | 
	
		
			
				|  |  | -            imGroupMember.setRoleType(o.getRoleType());
 | 
	
		
			
				|  |  | -            imGroupMember.setType(EFriendRoleType.getByName(o.getRoleType()).name());
 | 
	
		
			
				|  |  | -            imGroupMember.setTenantId(o.getTenantId());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            return imGroupMember;
 | 
	
		
			
				|  |  | -        }).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 获取群组成员信息
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @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 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("群组不存在");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 获取群成员
 | 
	
		
			
				|  |  | -        List<ImGroupMemberWrapper.ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | -                .select(ImGroupMember::getUserId, ImGroupMember::getImGroupId, ImGroupMember::getRoleType)
 | 
	
		
			
				|  |  | -                .eq(ImGroupMember::getImGroupId, groupId)
 | 
	
		
			
				|  |  | -                .list().stream()
 | 
	
		
			
				|  |  | -                .map(x -> ImGroupMemberWrapper.ImGroupMember.builder().userId(x.getUserId().longValue()).groupId(x.getImGroupId()).clientType(x.getRoleType()).build())
 | 
	
		
			
				|  |  | -                .collect(Collectors.toList());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 删除群组
 | 
	
		
			
				|  |  | -        imGroupService.remove(Wrappers.<ImGroup>lambdaQuery().eq(ImGroup::getId, groupId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 删除群组成员
 | 
	
		
			
				|  |  | -        imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getImGroupId, 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::getImGroupId, groupId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 删除当前用户群成员身份
 | 
	
		
			
				|  |  | -        boolean remove = imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery()
 | 
	
		
			
				|  |  | -                .eq(ImGroupMember::getImGroupId, 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())
 | 
	
		
			
				|  |  | -                .imUserId(getImUserId(imGroupMember.getUserId().toString(), imGroupMember.getClientType()))
 | 
	
		
			
				|  |  | -                .build());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        imPluginContext.getPluginService().groupQuit(imGroup.getId(), getImGroupMembers(groupMembers));
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 批量退群
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public void groupQuit(List<GroupMemberWrapper.ImGroupMember> imGroupMembers, String groupId) throws Exception {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 判定登录用户是否为群主
 | 
	
		
			
				|  |  | -        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
 | 
	
		
			
				|  |  | -        if (Objects.isNull(imGroup)) {
 | 
	
		
			
				|  |  | -            throw new BizException("群组不存在");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        if (CollectionUtils.isEmpty(imGroupMembers)){
 | 
	
		
			
				|  |  | -            return;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // id集合
 | 
	
		
			
				|  |  | -        List<Long> userIds = imGroupMembers.stream()
 | 
	
		
			
				|  |  | -            .map(GroupMemberWrapper.ImGroupMember::getUserId).collect(Collectors.toList());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 删除当前用户群成员身份
 | 
	
		
			
				|  |  | -        boolean remove = imGroupMemberService.remove(Wrappers.<ImGroupMember>lambdaQuery()
 | 
	
		
			
				|  |  | -                .eq(ImGroupMember::getImGroupId, groupId)
 | 
	
		
			
				|  |  | -                .in(ImGroupMember::getUserId, userIds)
 | 
	
		
			
				|  |  | -        );
 | 
	
		
			
				|  |  | -        if (!remove) {
 | 
	
		
			
				|  |  | -            // 用户主动退出群聊失败
 | 
	
		
			
				|  |  | -            throw new BizException("用户主动退出群聊失败");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 统计当前群成员用户数
 | 
	
		
			
				|  |  | -        long count = imGroupMemberService.count(Wrappers.<ImGroupMember>lambdaQuery().eq(ImGroupMember::getImGroupId, groupId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 修改群组成员数
 | 
	
		
			
				|  |  | -        imGroupService.lambdaUpdate()
 | 
	
		
			
				|  |  | -                .eq(ImGroup::getId, imGroup.getId())
 | 
	
		
			
				|  |  | -                .set(ImGroup::getMemberNum, count)
 | 
	
		
			
				|  |  | -                .update();
 | 
	
		
			
				|  |  | -        imPluginContext.getPluginService().groupQuit(imGroup.getId(), imGroupMembers);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        /**
 | 
	
		
			
				|  |  | -         * 用户主动退出群聊
 | 
	
		
			
				|  |  | -         *
 | 
	
		
			
				|  |  | -         * @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)
 | 
	
		
			
				|  |  | -            .imUserId(getImUserId(userId.toString(), clientType))
 | 
	
		
			
				|  |  | -            .build();
 | 
	
		
			
				|  |  | -        // 退出群聊
 | 
	
		
			
				|  |  | -        groupQuit(groupMember, imGroup.getId());
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 添加群组成员
 | 
	
		
			
				|  |  | -     * @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(getImGroupMemberEntity(groupMembers));
 | 
	
		
			
				|  |  | -        // 判断群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::getImGroupId, groupId));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        // 修改群组成员数
 | 
	
		
			
				|  |  | -        imGroupService.lambdaUpdate()
 | 
	
		
			
				|  |  | -            .eq(ImGroup::getId, imGroup.getId())
 | 
	
		
			
				|  |  | -            .set(ImGroup::getMemberNum, count)
 | 
	
		
			
				|  |  | -            .update();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 添加进入群组
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @param userId     用户ID
 | 
	
		
			
				|  |  | -     * @param clientType 客户端类型
 | 
	
		
			
				|  |  | -     * @param imGroupId  群组ID
 | 
	
		
			
				|  |  | -     */
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public void groupJoin(Long userId, String clientType, String 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, newOwner, oldOwner);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    /**
 | 
	
		
			
				|  |  | -     * 更新群信息
 | 
	
		
			
				|  |  | -     *
 | 
	
		
			
				|  |  | -     * @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();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @Override
 | 
	
		
			
				|  |  | -    public boolean checkImUserId(String imUserId) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            Integer.parseInt(analysisImUserId(imUserId));
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        } catch (Exception e) {
 | 
	
		
			
				|  |  | -            return false;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -}
 |