liujc 1 vuosi sitten
vanhempi
commit
27ac716d5e
14 muutettua tiedostoa jossa 1506 lisäystä ja 215 poistoa
  1. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java
  2. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java
  3. 173 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java
  4. 727 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java
  5. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java
  6. 104 155
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  7. 0 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java
  8. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java
  9. 4 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RoomServiceImpl.java
  10. 125 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupMemberAuditWrapper.java
  11. 140 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupMemberWrapper.java
  12. 105 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupNoticeWrapper.java
  13. 122 36
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupWrapper.java
  14. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import io.rong.models.group.GroupMember;
 import org.apache.ibatis.annotations.Param;
 

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberDao;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import io.rong.models.group.GroupMember;
 
 import java.util.List;

+ 173 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java

@@ -0,0 +1,173 @@
+package com.yonge.cooleshow.biz.dal.service.im;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.config.jwt.utils.JwtUserInfo;
+import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
+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 java.util.List;
+
+/**
+ * IM群组服务
+ * Created by Eric.Shang on 2022/11/26.
+ */
+public interface ImGroupCoreService {
+
+    /**
+     * IM 用户注册
+     * @param userId 用户ID
+     * @param username 用户名
+     * @param avatar 用户头象
+     * @return IM聊天Token
+     */
+    ImGroupWrapper.ImUserInfo register(String userId,String clientType, String username, String avatar) throws Exception;
+
+    /**
+     * IM 用户注册
+     * @param userId 用户Id
+     * @return String
+     */
+    String getImUserId(String userId,String clientType);
+
+
+    String getImUserId(Long userId, RoleEnum userRole);
+
+
+    String getImUserId(Long userId, ClientEnum clientEnum);
+
+    /**
+     * 解析IM用户规则
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    String analysisImUserId(String imUserId);
+
+
+    /**
+     * 检测imUserid
+     *
+     * @param imUserId IM用户Id
+     * @return String
+     */
+    boolean checkImUserId(String imUserId);
+
+    String analysisImUserClient(String imUserId);
+
+
+    /**
+     * 添加群组信息
+     * @param groupMember 用户信息
+     * @param imGroup ImGroupWrapper.ImGroup
+     * @return Boolean
+     * @throws Exception Exception
+     */
+    Long groupCreate(GroupMemberWrapper.ImGroupMember groupMember, ImGroupWrapper.ImGroup imGroup) throws Exception;
+
+    /**
+     * 添加群组信息
+     * @param imGroups ImGroupWrapper.ImGroup
+     * @throws Exception Exception
+     */
+    void groupCreate(List<ImGroupWrapper.ImGroup> imGroups) throws Exception;
+
+    /**
+     * 群组解散
+     * @param groupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupDismiss( String groupId) throws Exception;
+
+    /**
+     * 用户主动退出群聊
+     * @param groupMember 用户信息
+     * @param groupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupQuit(GroupMemberWrapper.ImGroupMember groupMember, String groupId) throws Exception;
+
+    /**
+     * 用户主动退出群聊
+     * @param userId 用户信息
+     * @param clientType EClientType
+     * @param imGroupId 群组ID
+     * @throws Exception Exception
+     */
+    void groupQuit(Long userId, String clientType, String imGroupId) throws Exception;
+
+    /**
+     * 入群申请消息
+     * @param groupMember JwtUserInfo<?>
+     * @param memberAudit ImGroupMemberAuditWrapper.ImGroupMemberAudit
+     */
+    void groupJoinApply(GroupMemberWrapper.ImGroupMember groupMember, ImGroupMemberAuditWrapper.ImGroupMemberAudit memberAudit) throws Exception;
+
+    /**
+     * 添加群组成员
+     * @param groupId 群组ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    void saveImGroupMemberList(String groupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 添加群组成员
+     * @param imGroupId 群组主键ID
+     * @param groupMembers List<ImGroupMemberWrapper.ImGroupMember>
+     * @throws Exception Exception
+     */
+    void saveImGroupMemberList(Long imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 群成员加入
+     * @param imGroupId 群主ID
+     * @param groupMembers 群成员
+     * @throws Exception Exception
+     */
+    void groupMemberJoin(String imGroupId, List<ImGroupMemberWrapper.ImGroupMember> groupMembers) throws Exception;
+
+    /**
+     * 入群申请审核
+     * @param groupMember JwtUserInfo<?>
+     * @param audit ImGroupMemberAuditWrapper.ApplyBatchAudit
+     */
+    void groupJoinAudit(GroupMemberWrapper.ImGroupMember groupMember, ImGroupMemberAuditWrapper.ApplyBatchAudit audit) throws Exception;
+
+    /**
+     * 添加进入群组
+     *
+     * @param userId 用户ID
+     * @param clientType 客户端类型
+     * @param imGroupId 群组ID
+     */
+    void groupJoin(Long userId, String clientType, Long imGroupId) throws Exception;
+
+    /**
+     * 转让群主
+     *
+     * @param groupId 群组ID
+     * @param newOwner 新群主
+     * @param oldOwner 旧群主
+     */
+    void changeGroupOwner(String groupId, String newOwner, String oldOwner) throws Exception;
+
+    /**
+     * 更新群信息
+     * @param groupId 群ID
+     * @param groupName 群名称
+     * @param faceUrl 群头像
+     * @throws Exception Exception
+     */
+    void modifyGroupInfo(String groupId, String groupName, String faceUrl) throws Exception;
+
+    /**
+     * 群成员加入三方IM状态
+     * @param groupMemberIds 群成员ID
+     * @param groupJoin 加群状态
+     */
+    void updateGroupMemberJoinStatus(List<Long> groupMemberIds, Boolean groupJoin);
+
+}

+ 727 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java

@@ -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(),imGroup.getImg(),
+                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();
+    }
+
+}

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import io.rong.models.group.GroupMember;
 import org.apache.commons.collections.CollectionUtils;

+ 104 - 155
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -27,6 +27,7 @@ import com.yonge.cooleshow.auth.config.AppGlobalServiceConfig;
 import com.yonge.cooleshow.biz.dal.dao.CourseScheduleStudentPaymentDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupDao;
 import com.yonge.cooleshow.biz.dal.dao.ImGroupMemberAuditDao;
+import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
@@ -55,6 +56,7 @@ import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.support.IMHelper;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
@@ -176,6 +178,12 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Autowired
     private UploadFileService uploadFileService;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
+    @Autowired
+    private TeacherDao teacherDao;
+
 
     @Value("${cn.rongcloud.im.appkey}")
     private String appKey;
@@ -205,23 +213,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
      */
     @Override
     public ImGroupWrapper.ImUserInfo register(String userId, ClientEnum 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.getCode());
-
-            // 生成签名
-            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;
+        return imGroupCoreService.register(userId,clientType.name(), username, avatar);
     }
 
 
@@ -311,29 +303,42 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         //创建本地群聊
         Date now = new Date();
         if (imGroup.getType() == null) {
-            imGroup.setType(ImGroupType.FAN);
+            imGroup.setType(ImGroupType.FAN.getCode());
         }
         imGroup.setMemberNum(1);
         imGroup.setCreateTime(now);
         imGroup.setUpdateTime(now);
         imGroup.setImg(sysConfigService.findConfigValue(SysConfigConstant.ICON_FANS_GROUP_DEFAULT));
-        String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
-        imGroup.setId(imGroupId);
         ImGroup group = JSON.parseObject(JSON.toJSONString(imGroup), ImGroup.class);
-        this.baseMapper.insert(group);
-        //处理本地群成员列表
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(), true, ImGroupMemberRoleType.TEACHER);
+        createImGroup(group);
+
+
+//        String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
+//        imGroup.setId(imGroupId);
+//        this.baseMapper.insert(imGroup);
+//        //处理本地群成员列表
+//        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+//                true, ImGroupMemberRoleType.TEACHER);
+//        //创建融云群
+//        this.rtcCreate(imGroup.getCreateBy(), imGroupId, imGroup.getName(),imGroup.getImg());
+//        //加入融云群
+//        imGroupMemberService.join(groupMembers, imGroupId);
+    }
 
-        if (!imGroup.getStudentIdList().isEmpty()) {
-            List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(imGroupId,
-                    imGroup.getStudentIdList(), ImGroupMemberRoleType.STUDENT);
-            groupMembers.addAll(groupMemberList);
-        }
+    private Long createImGroup(ImGroup imGroup) throws Exception {
+        ImGroupWrapper.ImGroup group =JSON.parseObject(JSON.toJSONString(imGroup), ImGroupWrapper.ImGroup.class);
 
-        //创建融云群
-        this.rtcCreate(imGroup.getCreateBy(), imGroupId, imGroup.getName(),imGroup.getImg());
-        //加入融云群
-        imGroupMemberService.join(groupMembers,imGroupId);
+        //记录群成员
+        BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(imGroup.getCreateBy());
+        GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember
+                .builder()
+                .userId(imGroup.getCreateBy())
+                .clientType(ClientEnum.TEACHER.getCode())
+                .avatar(basicUserInfo.getAvatar())
+                .nickname(basicUserInfo.getUsername())
+                .roleType(ClientEnum.TEACHER.getCode())
+                .build();
+        return imGroupCoreService.groupCreate(groupMember, group);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -378,6 +383,9 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         }
         Date now = new Date();
         Long teacherId = courseGroup.getTeacherId();
+        //保存老师学员关联的通讯录xz
+        imUserFriendService.saveUserFriend(teacherId, studentIds);
+
         //创建群聊
         ImGroup imGroup = new ImGroup();
         imGroup.setCreateBy(teacherId);
@@ -388,67 +396,40 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         imGroup.setImg(sysConfigService.findConfigValue(SysConfigConstant.ICON_COURSE_GROUP_DEFAULT));
         imGroup.setCreateTime(now);
         imGroup.setUpdateTime(now);
-        String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
-        imGroup.setId(imGroupId);
+//        String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
+//        imGroup.setId(imGroupId);
         imGroup.setCourseGroupId(courseGroupId);
-        this.baseMapper.insert(imGroup);
-        //保存老师学员关联的通讯录xz
-        imUserFriendService.saveUserFriend(teacherId, studentIds);
+//        this.baseMapper.insert(imGroup);
+
+
+        Long groupId = createImGroup(imGroup);
+//        // 添加学生
+        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId.toString(), studentIds,
+                ImGroupMemberRoleType.STUDENT);
+        List<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMemberList = Lists.newArrayList();
+        for (ImGroupMember groupMember : groupMembers) {
+            groupMemberList.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()
+                    .groupId(groupMember.getGroupId())
+                    .userId(groupMember.getUserId())
+                    .clientType(groupMember.getRoleType().getCode())
+                    .avatar(groupMember.getAvatar())
+                    .nickname(groupMember.getNickname())
+                    .isAdmin(groupMember.getIsAdmin())
+                    .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
+                    .roleType(groupMember.getRoleType().getCode())
+                    .build());
+        }
+        imGroupCoreService.saveImGroupMemberList(groupId.toString(), groupMemberList);
         //处理本地群成员列表
         // 添加老师
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
-                true, ImGroupMemberRoleType.TEACHER);
-        if (CollectionUtils.isNotEmpty(studentIds)) {
-            // 添加学生
-            groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIds,
-                    ImGroupMemberRoleType.STUDENT));
-        }
-        //创建融云群
-        this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName(),imGroup.getImg());
-        //加入融云群
-        imGroupMemberService.join(groupMembers, imGroupId);
-        return imGroupId;
-    }
-
-
-    //创建融云群
-    private void rtcCreate(Long userId, String imGroupId, String imGroupName,String img) throws Exception {
-        rtcCreate(userId, imGroupId, imGroupName, ClientEnum.TEACHER,img);
-    }
-
-    //创建融云群
-    private void rtcCreate(Long userId, String imGroupId, String imGroupName, ClientEnum clientType,String img) throws Exception {
-        //创建群
-        SysUser user = sysUserService.findUserById(userId);
-
-        // 群组默认头象
-//        String groupDefaultAvatar = sysConfigService.findConfigValue(SysConfigConstant.GROUP_DEFAULT_AVATAR);
-        List<GroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList();
-        //记录群成员
-        GroupMemberWrapper.ImGroupMember groupMember = GroupMemberWrapper.ImGroupMember
-                .builder()
-                .id(IdWorker.getId())
-                .groupId(imGroupId)
-                .userId(userId)
-                .clientType(clientType.getCode())
-                .avatar(img)
-                .nickname(user.getUsername())
-                .isAdmin(true)
-                .imUserId(getImUserId(userId.toString(), clientType.getCode()))
-                .roleType(clientType.getCode())
-                .build();
-        groupMembers.add(groupMember);
-
-        // 自动激活学生IM帐号
-        registerUser(groupMembers);
-
-        // 创建IM群组
-        imPluginContext.getPluginService().groupCreate(imGroupId, imGroupName,
-                getImUserId(userId.toString(), clientType.getCode()));
-
-        // 添加群成员到当前群组
-        imPluginContext.getPluginService().groupJoin(imGroupId, imGroupName,
-                groupMembers);
+//        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+//                true, ImGroupMemberRoleType.TEACHER);
+
+//        //创建融云群
+//        this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName(),imGroup.getImg());
+//        //加入融云群
+//        imGroupMemberService.join(groupMembers, imGroupId);
+        return groupId.toString();
     }
 
 
@@ -465,14 +446,9 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             }
 
             try {
-                String imUserId = member.getImUserId();
-                if (StringUtils.isBlank(imUserId)) {
-                    imUserId = getImUserId(String.valueOf(member.getUserId()),
-                            member.getClientType());
-                }
 
-                imPluginContext.getPluginService().register(getImUserId(imUserId, member.getClientType()),
-                        member.getNickname(), member.getAvatar());
+                imGroupCoreService.register(member.getUserId().toString(), member.getClientType(), member.getNickname(), member.getAvatar());
+
             } catch (Exception e) {
                 log.error("registerUser member imToken");
             }
@@ -510,30 +486,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void dismiss(String groupId) throws Exception {
-        Long createBy = Optional.ofNullable(this.baseMapper.selectById(groupId)).
-                map(ImGroup::getCreateBy).
-                orElseThrow(() -> new BizException("操作失败:群组不存在"));
-        if (!sysUserService.getUserId().equals(createBy)) {
-            throw new BizException("操作失败:您没有操作权限");
-        }
-        //删除入群申请
-        imGroupMemberAuditDao.delByGroupId(groupId);
-        //获取所有群成员
-        List<ImGroupMember> groupMembers = imGroupMemberService.getDao().queryGroupMember(groupId);
-        //销毁成功,删除群
-        this.baseMapper.deleteById(groupId);
-        //删除群成员
-        imGroupMemberService.delByGroupId(groupId);
-        //解散融云群
-
-        // 获取群成员
-        List<GroupMemberWrapper.ImGroupMember> imGroupMembers = groupMembers.stream()
-                .map(x -> GroupMemberWrapper.ImGroupMember.builder().userId(x.getUserId())
-                        .groupId(x.getGroupId()).clientType(x.getRoleType().getCode()).build())
-                .collect(Collectors.toList());
-
-        // 解散群
-        imPluginContext.getPluginService().groupDismiss(groupId, imGroupMembers);
+       imGroupCoreService.groupDismiss(groupId);
     }
 
     @Override
@@ -558,29 +511,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void quit(String groupId, Long userId, ClientEnum clientType) throws Exception {
-
-        ImGroupMemberRoleType roleType = ImGroupMemberRoleType.valueOf(clientType.name());
-        // 查询群成员用户身份
-        ImGroupMember groupMember = imGroupMemberService.lambdaQuery()
-                .eq(ImGroupMember::getGroupId, groupId)
-                .eq(ImGroupMember::getUserId, userId)
-                .eq(ImGroupMember::getRoleType, roleType)
-                .one();
-
-        String imUserId = imGroupService.getImUserId( String.valueOf(groupMember.getUserId()), groupMember.getRoleType().getCode());
-        if (imGroupMemberService.getDao().delByGroupIdAndUserId(groupId, userId, roleType) < 1) {
-            throw new BizException("操作失败:用户不在此群组");
-        }
-        //修改群成员数
-        baseMapper.updateMemberNum(groupId);
-
-
-        // 群主退出
-        List<ImGroupMember> groupMembers = Lists.newArrayList();
-        groupMembers.add(groupMember);
-
-
-        imPluginContext.getPluginService().groupQuit(groupId, getImGroupMembers(groupMembers));
+        imGroupCoreService.groupQuit(userId, clientType.name(), groupId);
     }
 
     @Override
@@ -628,19 +559,37 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             imGroup.setImg(sysConfigService.findConfigValue(SysConfigConstant.ICON_FANS_GROUP_DEFAULT));
             imGroup.setUpdateTime(new Date());
             imGroup.setCreateBy(teacher.getUserId());
-            String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
-            imGroup.setId(imGroupId);
-            this.baseMapper.insert(imGroup);
-            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
-                    true, ImGroupMemberRoleType.TEACHER);
-            if (!CollectionUtils.isEmpty(studentIdList)) {
-                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList,
-                        ImGroupMemberRoleType.STUDENT));
-            }
+//            String imGroupId = UUID.randomUUID() + imGroup.getType().getCode();
+//            imGroup.setId(imGroupId);
+//            this.baseMapper.insert(imGroup);
+//            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),
+//                    true, ImGroupMemberRoleType.TEACHER);
+//            if (!CollectionUtils.isEmpty(studentIdList)) {
+//                groupMembers.addAll(imGroupMemberService.initGroupMembers(imGroupId, studentIdList,
+//                        ImGroupMemberRoleType.STUDENT));
+//            }
             //创建融云群
-            this.rtcCreate(sysUser.getId(), imGroupId, imGroup.getName(),imGroup.getImg());
+            Long groupId = createImGroup(imGroup);
+
+            // 添加学生
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId.toString(), studentIdList,
+                    ImGroupMemberRoleType.STUDENT);
+            List<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMemberList = Lists.newArrayList();
+            for (ImGroupMember groupMember : groupMembers) {
+                groupMemberList.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()
+                        .groupId(groupMember.getGroupId())
+                        .userId(groupMember.getUserId())
+                        .clientType(groupMember.getRoleType().getCode())
+                        .avatar(groupMember.getAvatar())
+                        .nickname(groupMember.getNickname())
+                        .isAdmin(groupMember.getIsAdmin())
+                        .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
+                        .roleType(groupMember.getRoleType().getCode())
+                        .build());
+            }
+            imGroupCoreService.saveImGroupMemberList(groupId.toString(), groupMemberList);
             //加入融云群
-            imGroupMemberService.join(groupMembers, imGroupId);
+//            imGroupMemberService.join(groupMembers, imGroupId);
 
         }
 

+ 0 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java

@@ -22,10 +22,8 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.BaseResponse;
 import com.yonge.cooleshow.common.enums.ErrorEnum;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.utils.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -78,8 +76,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     @Resource
     private RedisTemplate<String,Object> redisTemplate;
     @Resource
-    private RedissonClient redissonClient;
-    @Resource
     private ImGroupService imGroupService;
     @Resource
     private RoomService roomService;

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -1243,9 +1243,10 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
                 .toChatRoomId(message.getToChatroomId())
                 .content(messageContent)
                 .build();
+        LiveRoom liveRoom = getByRoomUid(message.getToChatroomId());
         try {
 
-            LivePluginService pluginService = livePluginContext.getPluginService(message.getServiceProvider());
+            LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
             pluginService.sendChatRoomMessage(build);
             log.info("sendLiveRoomMessage>>>> looker {} : roomId={}, userId={}",message.getObjectName(), message.getToChatroomId(), message.getFromUserId());
         } catch (Exception e) {

+ 4 - 18
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RoomServiceImpl.java

@@ -6,18 +6,15 @@ import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
 import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
 import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
-import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomMemberDao;
-import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.ImNetworkDisplayDataDto;
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomMemberChangedMessage;
-import com.yonge.cooleshow.biz.dal.entity.IMApiResultInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMemberStatus;
-import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomMemberChangedEnum;
 import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
-import com.yonge.cooleshow.biz.dal.service.*;
-import com.yonge.cooleshow.biz.dal.support.IMHelper;
+import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomMemberStatusService;
+import com.yonge.cooleshow.biz.dal.service.ImService;
+import com.yonge.cooleshow.biz.dal.service.RoomService;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,8 +37,6 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
 
     private final static Logger log = LoggerFactory.getLogger(RoomServiceImpl.class);
 
-    @Resource
-    private IMHelper imHelper;
     @Autowired
     private RTCRoomPluginContext rtcRoomPluginContext;
     @Autowired
@@ -72,15 +67,6 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
             room.setRoomId(roomId);
             room.setDisplay(display);
             baseMapper.insert(room);
-            IMApiResultInfo resultInfo = null;
-            try {
-                resultInfo = imHelper.createGroup(new String[]{imUserId}, roomId, roomId);
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-            if(resultInfo.getCode() != 200){
-                log.error("创建群聊失败 resultInfo:{}",resultInfo);
-            }
         }else {
             if(userRole == RoleEnum.RoleTeacher){
                 room.setDisplay(display);

+ 125 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupMemberAuditWrapper.java

@@ -0,0 +1,125 @@
+package com.yonge.cooleshow.biz.dal.wrapper.im;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 入群申请
+ * 2022-11-26 10:55:18
+ */
+@ApiModel(value = "ImGroupMemberAuditWrapper对象", description = "入群申请查询对象")
+public class ImGroupMemberAuditWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" ImGroupMemberAuditQuery-入群申请")
+    public static class ImGroupMemberAuditQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+    }
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" ImGroupMemberAudit-入群申请")
+    public static class ImGroupMemberAudit {
+
+		@ApiModelProperty("主键")
+		private Long id;
+                        
+		@ApiModelProperty("用户ID") 
+		private Long userId;
+                        
+		@ApiModelProperty("用户身份") 
+		private String clientType;
+                        
+		@ApiModelProperty("群角色TEACHER老师、STUDENT学生") 
+		private String roleType;
+                        
+		@ApiModelProperty("群组编号") 
+		private String groupId;
+                        
+		@ApiModelProperty("申请原因") 
+		private String desc;
+                        
+		@ApiModelProperty("审核状态AUDITING,REJECT,OPEN") 
+		private String auditStatus;
+                        
+		@ApiModelProperty("修改时间") 
+		private Date updateTime;
+                        
+		@ApiModelProperty("创建时间") 
+		private Date createTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static ImGroupMemberAudit from(String json) {
+            return JSON.parseObject(json, ImGroupMemberAudit.class);
+        }
+	}
+
+    /**
+     * 批量审核入群申请
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class ApplyBatchAudit implements Serializable {
+
+        @ApiModelProperty("审核编号列表")
+        private String auditIds;
+
+        @ApiModelProperty("群组ID")
+        private String groupId;
+
+        @ApiModelProperty("审核状态")
+        private String auditStatus;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static ApplyBatchAudit from(String json) {
+            return JSON.parseObject(json, ApplyBatchAudit.class);
+        }
+
+        public List<Long> getBatchAuditIds() {
+
+            if (StringUtils.isNotEmpty(getAuditIds())) {
+                return Arrays.stream(getAuditIds().split(",")).map(Long::new).collect(Collectors.toList());
+            }
+            return Lists.newArrayList();
+        }
+    }
+}

+ 140 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupMemberWrapper.java

@@ -0,0 +1,140 @@
+package com.yonge.cooleshow.biz.dal.wrapper.im;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * 群成员表
+ * 2022-11-26 10:55:18
+ */
+@ApiModel(value = "ImGroupMemberWrapper对象", description = "群成员表查询对象")
+public class ImGroupMemberWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" ImGroupMemberQuery-群成员表")
+    public static class ImGroupMemberQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("群组ID")
+        private String groupId;
+
+        public static ImGroupMemberQuery from(String json) {
+            return JSON.parseObject(json, ImGroupMemberQuery.class);
+        }
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+    }
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" ImGroupMember-群成员表")
+    public static class ImGroupMember {
+
+                
+		@ApiModelProperty("主键;") 
+		private Long id;
+
+        @ApiModelProperty("群组主键Id")
+        private Long imGroupId;
+
+		@ApiModelProperty("群组ID") 
+		private String groupId;
+
+		@ApiModelProperty("群组名称")
+		private String groupName;
+                        
+		@ApiModelProperty("用户ID") 
+		private Long userId;
+                        
+		@ApiModelProperty("用户身份") 
+		private String clientType;
+                        
+		@ApiModelProperty("用户头像") 
+		private String avatar;
+                        
+		@ApiModelProperty("昵称;") 
+		private String nickname;
+                        
+		@ApiModelProperty("是否是管理员") 
+		private Boolean isAdmin;
+                        
+		@ApiModelProperty("群角色TEACHER老师、STUDENT学生") 
+		private String roleType;
+                        
+		@ApiModelProperty("修改时间") 
+		private Date updateTime;
+                        
+		@ApiModelProperty("创建时间") 
+		private Date createTime;
+
+        @ApiModelProperty("IM用户ID")
+        private String imUserId;
+
+        @ApiModelProperty("加入群组标识")
+        private Boolean groupJoin;
+
+        public static ImGroupMember from(String json) {
+            return JSON.parseObject(json, ImGroupMember.class);
+        }
+
+        public String getImUserId() {
+            if (StringUtils.isBlank(this.imUserId)) {
+                return MessageFormat.format("{0}_{1}", String.valueOf(getUserId()), getClientType());
+            }
+            return this.imUserId;
+        }
+
+        public Boolean getGroupJoin() {
+            return Optional.ofNullable(groupJoin).orElse(true);
+        }
+
+        public ImGroupMember avatar(String avatar) {
+            this.avatar = avatar;
+            return this;
+        }
+
+        public ImGroupMember nickname(String nickname) {
+            this.nickname = nickname;
+            return this;
+        }
+
+        public ImGroupMember id(Long id) {
+            this.id = id;
+            return this;
+        }
+
+
+        public ImGroupMember imUserId(String imUserId) {
+            this.imUserId = imUserId;
+            return this;
+        }
+    }
+
+}

+ 105 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupNoticeWrapper.java

@@ -0,0 +1,105 @@
+package com.yonge.cooleshow.biz.dal.wrapper.im;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * 群公告
+ * 2022-11-26 10:55:18
+ */
+@ApiModel(value = "ImGroupNoticeWrapper对象", description = "群公告查询对象")
+public class ImGroupNoticeWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" ImGroupNoticeQuery-群公告")
+    public static class ImGroupNoticeQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("群组ID")
+        private String groupId;
+
+        @ApiModelProperty("删除标记")
+        private Boolean delFlag;
+
+        public static ImGroupNoticeQuery from(String json) {
+            return JSON.parseObject(json, ImGroupNoticeQuery.class);
+        }
+
+        public Boolean getDelFlag() {
+            return Optional.ofNullable(delFlag).orElse(false);
+        }
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+    }
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" ImGroupNotice-群公告")
+    public static class ImGroupNotice {
+
+                
+		@ApiModelProperty("主键") 
+		private Long id;
+                        
+		@ApiModelProperty("群组ID") 
+		private String groupId;
+                        
+		@ApiModelProperty("标题") 
+		private String title;
+                        
+		@ApiModelProperty("内容") 
+		private String content;
+                        
+		@ApiModelProperty("是否置顶") 
+		private Boolean topFlag;
+                        
+		@ApiModelProperty("是否发送给新人") 
+		private Boolean sentToNewMemberFlag;
+                        
+		@ApiModelProperty("操作人") 
+		private Long operatorId;
+
+        @ApiModelProperty("操作用户身份")
+        private String clientType;
+                        
+		@ApiModelProperty("是否删除1是0否;") 
+		private Boolean delFlag;
+                        
+		@ApiModelProperty("修改时间") 
+		private Date updateTime;
+                        
+		@ApiModelProperty("创建时间") 
+		private Date createTime;
+
+        public static ImGroupNotice from(String json) {
+            return JSON.parseObject(json, ImGroupNotice.class);
+        }
+                        
+	}
+
+}

+ 122 - 36
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupWrapper.java

@@ -1,16 +1,22 @@
 package com.yonge.cooleshow.biz.dal.wrapper.im;
 
 import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.helpers.MessageFormatter;
 
 import javax.validation.constraints.NotBlank;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Optional;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -18,65 +24,145 @@ import java.util.Set;
 public class ImGroupWrapper {
 
     @Data
-    @Builder
+	@Builder
     @NoArgsConstructor
     @AllArgsConstructor
-    @ApiModel("IM用户信息")
-    public static class ImUserInfo implements Serializable {
+    @ApiModel(" ImGroupQuery-即时通讯群组")
+    public static class ImGroupQuery implements QueryInfo {
 
-        @ApiModelProperty("用户ID")
-        private String imUserId;
+    	@ApiModelProperty("当前页")
+        private Integer page;
 
-        @ApiModelProperty("授权Token")
-        private String imToken;
+        @ApiModelProperty("分页行数")
+        private Integer rows;
 
-        public ImUserInfo imUserId(String imUserId) {
-            this.imUserId = imUserId;
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+
+        @ApiModelProperty("群类型")
+        private String groupType;
+
+        @ApiModelProperty("群成员ID")
+        private Long userId;
+
+        @ApiModelProperty("客户类型")
+        private String clientType;
+
+        @ApiModelProperty("群创建者")
+        private Long createBy;
+
+        @ApiModelProperty("群角色")
+        private String roleType;
+
+        public static ImGroupQuery from(String json) {
+            return JSON.parseObject(json, ImGroupQuery.class);
+        }
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public ImGroupQuery userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public ImGroupQuery clientType(String clientType) {
+            this.clientType = clientType;
             return this;
         }
     }
 
     @Data
-    @ApiModel("ImGroup")
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" ImGroup-即时通讯群组")
     public static class ImGroup {
-        @NotBlank(message = "群编号不可为空")
-        @ApiModelProperty(value = "主键;")
-        private String id;
 
-        @NotBlank(message = "群名称不能为空")
-        @ApiModelProperty(value = "群名称")
-        private String name;
 
-        @ApiModelProperty(value = "群简介")
-        private String introduce;
+		@ApiModelProperty(value = "主键ID",hidden = true)
+		private Long id;
 
-        @ApiModelProperty(value = "群成员数")
-        private Integer memberNum;
+		@ApiModelProperty("群组ID")
+		private String groupId;
 
-        @ApiModelProperty(value = "群备注")
-        private String memo;
+		@ApiModelProperty("群名称")
+		private String name;
 
-        @ApiModelProperty(value = "群头像")
-        private String img;
+		@ApiModelProperty("群简介")
+		private String introduce;
 
-        @ApiModelProperty(value = "群类型:FAN粉丝群、COURSE课程群;ORG机构群")
-        private ImGroupType type = ImGroupType.FAN;
+		@ApiModelProperty("群成员数")
+		private Integer memberNum;
 
-        @ApiModelProperty(value = "创建人")
-        private Long createBy;
+		@ApiModelProperty("群备注")
+		private String memo;
+
+		@ApiModelProperty("群头像")
+		private String img;
 
-        @ApiModelProperty(value = "是否自动通过审核")
-        private Boolean autoPassFlag;
+		@ApiModelProperty("群类型 ")
+		private String type;
 
-        @ApiModelProperty(value = "创建时间;")
-        private Date createTime;
+		@ApiModelProperty("是否自动通过审核1是0否")
+		private Boolean autoPassFlag;
 
-        @ApiModelProperty(value = "修改时间;")
-        private Date updateTime;
+		@ApiModelProperty("课程组id")
+		private Long courseGroupId;
 
-        @ApiModelProperty(value = "课程组id")
-        private Long courseGroupId;
+		@ApiModelProperty("修改时间;")
+		private Date updateTime;
+
+		@ApiModelProperty("创建人")
+		private Long createBy;
+
+		@ApiModelProperty("创建时间")
+		private Date createTime;
 
         private Set<Long> studentIdList = new HashSet<>();
+
+        public static ImGroup from(String json) {
+            return JSON.parseObject(json, ImGroup.class);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public ImGroup id(Long id) {
+            this.id = id;
+            return this;
+        }
+
+        public ImGroup groupId(String groupId) {
+            this.groupId = MessageFormatter.format("{}:{}", groupId, getType()).getMessage();
+            return this;
+        }
+
+        public ImGroup type(String type) {
+            this.type = type;
+            return this;
+        }
+
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("IM用户信息")
+    public static class ImUserInfo implements Serializable {
+
+        @ApiModelProperty("用户ID")
+        private String imUserId;
+
+        @ApiModelProperty("授权Token")
+        private String imToken;
+
+        public ImUserInfo imUserId(String imUserId) {
+            this.imUserId = imUserId;
+            return this;
+        }
     }
 }

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -65,7 +65,7 @@ public class ImGroupController extends BaseController {
     @PostMapping(value = "/addGroupMember")
     public HttpResponseResult addGroupMember(@Valid @RequestBody ImGroupWrapper.ImGroup imGroup,
                                              BindingResult bindingResult) throws Exception {
-        imGroupService.addGroupMember(imGroup.getId(), imGroup.getStudentIdList());
+        imGroupService.addGroupMember(imGroup.getGroupId(), imGroup.getStudentIdList());
         return succeed();
     }