|  | @@ -2,32 +2,43 @@ 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.dayaedu.cbs.common.enums.EClientType;
 | 
	
		
			
				|  |  |  import com.google.common.collect.Lists;
 | 
	
		
			
				|  |  | +import com.google.common.collect.Maps;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.common.tools.ThreadPool;
 | 
	
		
			
				|  |  |  import com.microsvc.toolkit.middleware.im.ImPluginContext;
 | 
	
		
			
				|  |  | +import com.microsvc.toolkit.middleware.im.ImPluginService;
 | 
	
		
			
				|  |  |  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.entity.SysUser;
 | 
	
		
			
				|  |  |  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.enums.im.EImGroupMemberRoleType;
 | 
	
		
			
				|  |  |  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.SysUserService;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 | 
	
		
			
				|  |  |  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 org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.text.MessageFormat;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
	
		
			
				|  | @@ -51,6 +62,11 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |      private ImGroupMemberService imGroupMemberService;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private ImGroupMemberAuditService imGroupMemberAuditService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysUserService sysUserService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private static final String IM_USER_ID_SPLIT = "_";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * IM 用户注册
 | 
	
	
		
			
				|  | @@ -179,6 +195,8 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ImGroup group = JSON.parseObject(imGroup.jsonString(), ImGroup.class);
 | 
	
		
			
				|  |  |          group.setId(imGroup.getGroupId());
 | 
	
		
			
				|  |  | +        // 创建群默认全员不禁言
 | 
	
		
			
				|  |  | +        group.setConfigJson(ImGroupWrapper.ImGroupConfigJson.builder().mute(false).build().toJson());
 | 
	
		
			
				|  |  |          // 保存群组信息
 | 
	
		
			
				|  |  |          imGroupService.saveOrUpdate(group);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -501,6 +519,9 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |              // 自动激活用户
 | 
	
		
			
				|  |  |              asyncRegisterUser(groupMembers);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 刷新群成员禁言状态
 | 
	
		
			
				|  |  | +        flushGroupMute(imGroup.getId());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -551,6 +572,44 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |          // 自动激活用户
 | 
	
		
			
				|  |  |          asyncRegisterUser(groupMembers);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        // 刷新群成员禁言状态
 | 
	
		
			
				|  |  | +        flushGroupMute(imGroup.getId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void flushGroupMute(String groupId) {
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            List<GroupMemberWrapper.Member> members = imPluginContext.getPluginService().groupUserGagList(groupId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<ImGroupMember> list = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | +                    .eq(ImGroupMember::getGroupId, groupId)
 | 
	
		
			
				|  |  | +                    .list();
 | 
	
		
			
				|  |  | +            if (CollectionUtils.isEmpty(members)) {
 | 
	
		
			
				|  |  | +                // 设置为全体非禁言状态
 | 
	
		
			
				|  |  | +                for (ImGroupMember item : list) {
 | 
	
		
			
				|  |  | +                    item.setGroupMute(false);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                List<Long> userIds = members.stream().map(o -> analysisImUserId(o.getId())).map(Long::valueOf).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +                list = list.stream().map(o -> {
 | 
	
		
			
				|  |  | +                    if (userIds.contains(o.getUserId())) {
 | 
	
		
			
				|  |  | +                        o.setGroupMute(true);
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        o.setGroupMute(false);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    return o;
 | 
	
		
			
				|  |  | +                }).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (CollectionUtils.isNotEmpty(list)) {
 | 
	
		
			
				|  |  | +                imGroupMemberService.updateBatchById(list);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("flushGroupMute error",e);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -680,8 +739,74 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |      @Override
 | 
	
		
			
				|  |  |      public void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            if (newOwner.equals(oldOwner)) {
 | 
	
		
			
				|  |  | +                throw new BizException("不能转让给自己");
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // 判断旧群主
 | 
	
		
			
				|  |  | +                String[] values = analysisImUserId(oldOwner).split(IM_USER_ID_SPLIT);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 新群主ID和身份
 | 
	
		
			
				|  |  | +                long userId = Long.parseLong(values[0]);
 | 
	
		
			
				|  |  | +                String clientType = values[1];
 | 
	
		
			
				|  |  | +                ImGroupMember groupMember = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getGroupId, groupId)
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getRoleType, clientType)
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getIsAdmin, true)
 | 
	
		
			
				|  |  | +                        .last("LIMIT 1")
 | 
	
		
			
				|  |  | +                        .one();
 | 
	
		
			
				|  |  | +                if (groupMember == null) {
 | 
	
		
			
				|  |  | +                    throw new BizException("旧群主错误");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                // 判定新群主是否为禁言状态,需要先解除禁言
 | 
	
		
			
				|  |  | +                String[] values = analysisImUserId(newOwner).split(IM_USER_ID_SPLIT);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                // 新群主ID和身份
 | 
	
		
			
				|  |  | +                long userId = Long.parseLong(values[0]);
 | 
	
		
			
				|  |  | +                String clientType = values[1];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                ImGroupMember member = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getGroupId, groupId)
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getUserId, userId)
 | 
	
		
			
				|  |  | +                        .eq(ImGroupMember::getRoleType, clientType)
 | 
	
		
			
				|  |  | +                        .last("LIMIT 1")
 | 
	
		
			
				|  |  | +                        .one();
 | 
	
		
			
				|  |  | +                if (Objects.isNull(member)) {
 | 
	
		
			
				|  |  | +                    throw new BizException("新群主用户不存在");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                // 解除禁言
 | 
	
		
			
				|  |  | +                if (Optional.ofNullable(member.getGroupMute()).orElse(false)) {
 | 
	
		
			
				|  |  | +                    imPluginContext.getPluginService().groupUserGagRemove(getImUserId(newOwner, clientType), groupId);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // 更新用户群禁言状态
 | 
	
		
			
				|  |  | +                    imGroupMemberService.lambdaUpdate()
 | 
	
		
			
				|  |  | +                            .eq(ImGroupMember::getId, member.getId())
 | 
	
		
			
				|  |  | +                            .set(ImGroupMember::getGroupMute, false)
 | 
	
		
			
				|  |  | +                            .update();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // 转主群主
 | 
	
		
			
				|  |  | +            imPluginContext.getPluginService().changeGroupOwner(groupId, newOwner, oldOwner);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 修改群成员身份
 | 
	
		
			
				|  |  | +            updateGroupOwner(groupId, newOwner, true);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 旧群主ID和身份
 | 
	
		
			
				|  |  | +            updateGroupOwner(groupId, oldOwner, false);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("changeGroupOwner 转让群主失败, groupId={}, newOwner={}, oldOwner={}", groupId, newOwner, oldOwner, e);
 | 
	
		
			
				|  |  | +            throw new BizException("转让群主失败");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          // 转主群主
 | 
	
		
			
				|  |  | -        imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
 | 
	
		
			
				|  |  | +//        imPluginContext.getPluginService().changeGroupOwner(groupId, getImUserId(newOwner,ClientEnum.TEACHER.getCode()), getImUserId(oldOwner,ClientEnum.TEACHER.getCode()));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /**
 | 
	
	
		
			
				|  | @@ -745,4 +870,179 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
 | 
	
		
			
				|  |  |          return imPluginContext.getPluginService().deleteGroupRecentContact(userId, groupId);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void groupMemberMute(ImGroupMemberWrapper.GroupMemberMute member) {
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            // 群成员ID
 | 
	
		
			
				|  |  | +            List<Long> userIds = JSON.parseArray(JSON.toJSONString(member.getUserIds()), Long.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 更新群成员禁言状态
 | 
	
		
			
				|  |  | +            List<ImGroupMember> list = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | +                    .eq(ImGroupMember::getGroupId, member.getGroupId())
 | 
	
		
			
				|  |  | +                    .eq(ImGroupMember::getGroupRoleType, member.getGroupRoleType())
 | 
	
		
			
				|  |  | +                    .in(ImGroupMember::getUserId, userIds)
 | 
	
		
			
				|  |  | +                    .list();
 | 
	
		
			
				|  |  | +            if (CollectionUtils.isEmpty(list)) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 用户ImUserId
 | 
	
		
			
				|  |  | +            List<String> imUserIds = Lists.newArrayList();
 | 
	
		
			
				|  |  | +            List<ImGroupMember> updateList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            for (ImGroupMember imGroupMember : list) {
 | 
	
		
			
				|  |  | +                imUserIds.add(getImUserId(imGroupMember.getUserId().toString(), imGroupMember.getRoleType().getCode()));
 | 
	
		
			
				|  |  | +                ImGroupMember imGroupMember1 = new ImGroupMember();
 | 
	
		
			
				|  |  | +                imGroupMember1.setId(imGroupMember.getId());
 | 
	
		
			
				|  |  | +                imGroupMember1.setGroupMute(member.getGroupMute());
 | 
	
		
			
				|  |  | +                updateList.add(imGroupMember1);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            imGroupMemberService.updateBatchById(updateList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            ImPluginService pluginService = imPluginContext.getPluginService();
 | 
	
		
			
				|  |  | +            if (Boolean.TRUE.equals(member.getGroupMute())) {
 | 
	
		
			
				|  |  | +                // 群成员禁言
 | 
	
		
			
				|  |  | +                pluginService.groupUserGagCreate(imUserIds, member.getGroupId(), member.getMuteTime());
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                // 群成员解除禁言
 | 
	
		
			
				|  |  | +                pluginService.groupUserGagRemove(imUserIds, member.getGroupId());
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("群成员禁言失败", e);
 | 
	
		
			
				|  |  | +            throw new BizException("群成员禁言失败,请联系管理员!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public IPage<ImGroupMemberWrapper.ImGroupMember> imGroupMemberPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query) {
 | 
	
		
			
				|  |  | +        // 群聊成员列表
 | 
	
		
			
				|  |  | +        IPage<ImGroupMemberWrapper.ImGroupMember> pages = imGroupMemberService.selectPage(page, query);
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isNotEmpty(pages.getRecords())) {
 | 
	
		
			
				|  |  | +            List<ImGroupMemberWrapper.ImGroupMember> records = pages.getRecords();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            List<Long> userIds = records.stream().map(ImGroupMemberWrapper.ImGroupMember::getUserId).distinct().collect(Collectors.toList());
 | 
	
		
			
				|  |  | +            Map<Long, SysUser> userIdMap = sysUserService.getMapByIds(userIds);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 填充群成员信息
 | 
	
		
			
				|  |  | +            for (ImGroupMemberWrapper.ImGroupMember item : records) {
 | 
	
		
			
				|  |  | +                item.setImUserId(getImUserId(item.getImUserId(), item.getClientType()));
 | 
	
		
			
				|  |  | +                if (userIdMap.containsKey(item.getUserId())) {
 | 
	
		
			
				|  |  | +                    SysUser sysUser = userIdMap.get(item.getUserId());
 | 
	
		
			
				|  |  | +                    item.setAvatar(sysUser.getAvatar());
 | 
	
		
			
				|  |  | +                    item.setNickname(sysUser.getUsername());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return pages;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member) {
 | 
	
		
			
				|  |  | +        try {
 | 
	
		
			
				|  |  | +            // 群成员ID
 | 
	
		
			
				|  |  | +            List<Long> userIds = JSON.parseArray(JSON.toJSONString(member.getUserIds()), Long.class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 更新群成员禁言状态
 | 
	
		
			
				|  |  | +            List<ImGroupMember> list = imGroupMemberService.lambdaQuery()
 | 
	
		
			
				|  |  | +                    .eq(ImGroupMember::getGroupId, member.getGroupId())
 | 
	
		
			
				|  |  | +                    .in(ImGroupMember::getUserId, userIds)
 | 
	
		
			
				|  |  | +                    .list();
 | 
	
		
			
				|  |  | +            if (CollectionUtils.isEmpty(list)) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 用户ImUserId
 | 
	
		
			
				|  |  | +            List<String> imUserIds = Lists.newArrayList();
 | 
	
		
			
				|  |  | +            List<ImGroupMember> updateList = new ArrayList<>();
 | 
	
		
			
				|  |  | +            for (ImGroupMember imGroupMember : list) {
 | 
	
		
			
				|  |  | +                imUserIds.add(getImUserId(imGroupMember.getUserId().toString(), imGroupMember.getRoleType().getCode()));
 | 
	
		
			
				|  |  | +                ImGroupMember imGroupMember1 = new ImGroupMember();
 | 
	
		
			
				|  |  | +                imGroupMember1.setId(imGroupMember.getId());
 | 
	
		
			
				|  |  | +                imGroupMember1.setGroupRoleType(member.getGroupRoleType());
 | 
	
		
			
				|  |  | +                updateList.add(imGroupMember1);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            imGroupMemberService.updateBatchById(updateList);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            for (List<ImGroupMember> items : Lists.partition(list, 50)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                items.parallelStream().forEach(item -> {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    String imUserId = getImUserId(item.getUserId().toString(), item.getRoleType().getCode());
 | 
	
		
			
				|  |  | +                    try {
 | 
	
		
			
				|  |  | +                        ImPluginService pluginService = imPluginContext.getPluginService();
 | 
	
		
			
				|  |  | +                        switch (member.getGroupRoleType()) {
 | 
	
		
			
				|  |  | +                            case Admin:
 | 
	
		
			
				|  |  | +                                // 管理员取消群禁言状态
 | 
	
		
			
				|  |  | +                                if (Optional.ofNullable(item.getGroupMute()).orElse(false)) {
 | 
	
		
			
				|  |  | +                                    pluginService.groupUserGagRemove(imUserId, member.getGroupId());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                    imGroupMemberService.lambdaUpdate()
 | 
	
		
			
				|  |  | +                                            .eq(ImGroupMember::getId, item.getId())
 | 
	
		
			
				|  |  | +                                            .set(ImGroupMember::getGroupMute, false)
 | 
	
		
			
				|  |  | +                                            .update();
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                // 设置管理员
 | 
	
		
			
				|  |  | +                                pluginService.groupAdminCreate(member.getGroupId(), imUserId);
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                            case Member:
 | 
	
		
			
				|  |  | +                                // 取消管理员
 | 
	
		
			
				|  |  | +                                pluginService.groupAdminRemove(member.getGroupId(), imUserId);
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                            default:
 | 
	
		
			
				|  |  | +                                break;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    } catch (Exception e) {
 | 
	
		
			
				|  |  | +                        log.error("群成员身份更新异常", e);
 | 
	
		
			
				|  |  | +                        throw new BizException("群成员身份更新异常,请联系管理员!");
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        } catch (Exception e) {
 | 
	
		
			
				|  |  | +            log.error("群成员身份更新异常", e);
 | 
	
		
			
				|  |  | +            throw new BizException("群成员身份更新异常,请联系管理员!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 更新用户群主身份
 | 
	
		
			
				|  |  | +     * @param groupId 群组ID
 | 
	
		
			
				|  |  | +     * @param groupMember 群成员
 | 
	
		
			
				|  |  | +     * @param isAdmin 群主标记
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    private void updateGroupOwner(String groupId, String groupMember, Boolean isAdmin) {
 | 
	
		
			
				|  |  | +        String[] values = analysisImUserId(groupMember).split(IM_USER_ID_SPLIT);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 新群主ID和身份
 | 
	
		
			
				|  |  | +        long userId = Long.parseLong(values[0]);
 | 
	
		
			
				|  |  | +        String clientType = values[1];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        EImGroupMemberRoleType groupRoleType = EImGroupMemberRoleType.fromClientType(clientType);
 | 
	
		
			
				|  |  | +        if (Boolean.TRUE.equals(isAdmin)) {
 | 
	
		
			
				|  |  | +            groupRoleType = EImGroupMemberRoleType.Owner;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        imGroupMemberService.lambdaUpdate()
 | 
	
		
			
				|  |  | +                .eq(ImGroupMember::getGroupId, groupId)
 | 
	
		
			
				|  |  | +                .eq(ImGroupMember::getUserId, userId)
 | 
	
		
			
				|  |  | +                .eq(ImGroupMember::getRoleType, EClientType.valueOf(clientType))
 | 
	
		
			
				|  |  | +                .set(ImGroupMember::getGroupRoleType, groupRoleType)
 | 
	
		
			
				|  |  | +                .set(ImGroupMember::getIsAdmin, isAdmin)
 | 
	
		
			
				|  |  | +                .update();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (EImGroupMemberRoleType.Admin == groupRoleType) {
 | 
	
		
			
				|  |  | +            // 设置管理员
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                imPluginContext.getPluginService().groupAdminCreate(groupId, groupMember);
 | 
	
		
			
				|  |  | +            } catch (Exception e) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                log.error("updateGroupOwner 设置管理员失败, groupId={}, groupMember={}", groupId, groupMember, e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |