|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|