|
@@ -2,17 +2,21 @@ 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;
|
|
@@ -21,6 +25,7 @@ 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;
|
|
@@ -29,9 +34,11 @@ 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.*;
|
|
@@ -55,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 用户注册
|
|
@@ -751,4 +763,130 @@ 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())
|
|
|
+ .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<String> items : Lists.partition(imUserIds, 50)) {
|
|
|
+
|
|
|
+ items.parallelStream().forEach(item -> {
|
|
|
+
|
|
|
+ try {
|
|
|
+ ImPluginService pluginService = imPluginContext.getPluginService();
|
|
|
+ switch (member.getGroupRoleType()) {
|
|
|
+ case Admin:
|
|
|
+ // 设置管理员
|
|
|
+ pluginService.groupAdminCreate(member.getGroupId(), item);
|
|
|
+ break;
|
|
|
+ case Member:
|
|
|
+ // 取消管理员
|
|
|
+ pluginService.groupAdminRemove(member.getGroupId(), item);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("群成员身份更新异常", e);
|
|
|
+ throw new BizException("群成员身份更新异常,请联系管理员!");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("群成员身份更新异常", e);
|
|
|
+ throw new BizException("群成员身份更新异常,请联系管理员!");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|