Browse Source

Merge branch 'online' of http://git.dayaedu.com/yonge/cooleshow into zx_online_cbs

zouxuan 9 months ago
parent
commit
5847d50350
17 changed files with 768 additions and 52 deletions
  1. 24 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java
  2. 57 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupMemberController.java
  3. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImGroupMemberDao.java
  4. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java
  5. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroupMember.java
  6. 38 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImGroupMemberRoleType.java
  7. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupMemberService.java
  8. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java
  9. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/ImGroupCoreService.java
  10. 301 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/im/impl/ImGroupCoreServiceImpl.java
  11. 49 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java
  12. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  13. 108 40
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupMemberWrapper.java
  14. 57 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupWrapper.java
  15. 4 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  16. 47 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  17. 1 1
      pom.xml

+ 24 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupController.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupResultDto;
 import com.yonge.cooleshow.biz.dal.dto.ImGroupSearchDto;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
@@ -14,6 +15,7 @@ import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -25,7 +27,9 @@ import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.BindingResult;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -36,6 +40,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
@@ -65,6 +70,9 @@ public class ImGroupController extends BaseController {
     @Autowired
     private ImGroupMemberService imGroupMemberService;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
     @ApiOperation("创建群聊")
     @PostMapping(value = "/create")
     public HttpResponseResult create(@Valid @RequestBody ImGroupWrapper.ImGroup imGroup, BindingResult bindingResult) throws Exception {
@@ -198,5 +206,21 @@ public class ImGroupController extends BaseController {
 
         return succeed(ImUserFriendVO.ImUserFriend.from(JSON.toJSONString(userFriend)));
     }
+
+    @ApiOperation(value = "转让群主", notes = "转让群主- 传入 ImGroupVo.ImGroupOwner")
+    @PostMapping("/changeGroupOwner")
+    public R<Boolean> changeGroupOwner(@Validated @RequestBody ImGroupWrapper.ChangeGroupOwner changeGroupOwner) throws Exception {
+
+        // 转让群主
+        imGroupCoreService.changeGroupOwner(changeGroupOwner.getGroupId(), changeGroupOwner.getNewOwner(), changeGroupOwner.getOldOwner());
+
+        return R.from(true);
+    }
+
+    @ApiOperation("群禁言")
+    @PostMapping(value = "/muteAll")
+    public HttpResponseResult<Boolean> muteAll(@Valid @RequestBody ImGroupWrapper.Mute mute) throws Exception {
+        return succeed(imGroupService.muteAll(mute));
+    }
 }
 

+ 57 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/ImGroupMemberController.java

@@ -2,10 +2,16 @@ package com.yonge.cooleshow.teacher.controller;
 
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.im.ImUserFriendVO;
+import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
@@ -13,8 +19,11 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,6 +32,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 /**
  * 即时通讯群组(ImGroupMember)表控制层
@@ -40,6 +50,9 @@ public class ImGroupMemberController extends BaseController {
     @Autowired
     private ImGroupMemberService imGroupMemberService;
 
+    @Autowired
+    private ImGroupCoreService imGroupCoreService;
+
     @ApiImplicitParams({
             @ApiImplicitParam(name = "groupId", dataType = "String", value = "群编号",required = true),
             @ApiImplicitParam(name = "userId", dataType = "Long", value = "用户编号",required = true),
@@ -88,5 +101,49 @@ public class ImGroupMemberController extends BaseController {
                 .eq(ImGroupMember::getGroupId,params.get("groupId")).orderByDesc(ImGroupMember::getId));*/
         return succeed(groupMembers);
     }
+
+    @ApiOperation(value = "群成员禁言", notes = "群成员禁言- 传入 ImGroupMemberVo.GroupMemberMute")
+    @PostMapping("/groupMute")
+    public R<JSONObject> groupMemberMute(@Validated @RequestBody ImGroupMemberWrapper.GroupMemberMute member) {
+        // 群成员不能为空
+        if (CollectionUtils.isEmpty(member.getUserIds())) {
+            throw new BizException("群成员不能为空");
+        }
+
+        // 群成员禁言时长无效
+        if (member.getGroupMute() && Optional.of(member.getMuteTime()).orElse(0L) == 0) {
+            throw new BizException("群成员禁言时长无效");
+        }
+
+        // 更新群成员禁言
+        imGroupCoreService.groupMemberMute(member);
+        return R.defaultR();
+    }
+
+    /**
+     * 查询分页
+     * @param query ImGroupMemberVo.ImGroupMemberQuery
+     * @return R<PageInfo<ImGroupMemberVo.ImGroupMemberList>>
+     */
+    @ApiOperation(value = "查询分页", notes = "群成员表- 传入 ImGroupMemberVo.ImGroupMemberQuery")
+    @PostMapping("/page")
+    public R<PageInfo<ImGroupMemberWrapper.ImGroupMember>> page(@RequestBody ImGroupMemberWrapper.ImGroupMemberQuery query) {
+        return R.from(QueryInfo.pageInfo(imGroupCoreService.imGroupMemberPage(QueryInfo.getPage(query), query)));
+    }
+
+    @ApiOperation(value = "群成员身份设置", notes = "群成员身份设置- 传入 ImGroupMemberVo.GroupMemberRole")
+    @PostMapping("/groupRole")
+    public R<JSONObject> groupMemberRole(@Validated @RequestBody ImGroupMemberWrapper.GroupMemberRole member) {
+
+        // 群成员不能为空
+        if (CollectionUtils.isEmpty(member.getUserIds())) {
+            throw new BizException("群成员不能为空");
+        }
+
+        // 更新群成员禁言
+        imGroupCoreService.groupMemberRole(member);
+
+        return R.defaultR();
+    }
 }
 

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

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
@@ -52,5 +53,7 @@ public interface ImGroupMemberDao extends BaseMapper<ImGroupMember> {
 
     //删除群成员
     int delByGroupIdAndUserId(@Param("groupId") String groupId, @Param("userId") Long userId, @Param("roleType") ImGroupMemberRoleType roleType);
+
+    List<ImGroupMemberWrapper.ImGroupMember> selectPage(@Param("page") IPage<ImGroupMemberWrapper.ImGroupMember> page, @Param("param") ImGroupMemberWrapper.ImGroupMemberQuery param);
 }
 

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroup.java

@@ -71,6 +71,10 @@ public class ImGroup implements Serializable {
     @ApiModelProperty(value = "课程组id")
     private Long courseGroupId;
 
+    @TableField("config_json_")
+    @ApiModelProperty(value = "群聊配置")
+    private String configJson;
+
     public Long getCourseGroupId() {
         return courseGroupId;
     }
@@ -166,5 +170,13 @@ public class ImGroup implements Serializable {
     public void setType(ImGroupType type) {
         this.type = type;
     }
+
+    public String getConfigJson() {
+        return configJson;
+    }
+
+    public void setConfigJson(String configJson) {
+        this.configJson = configJson;
+    }
 }
 

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ImGroupMember.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
+import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.toolset.base.enums.BaseEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -56,6 +57,14 @@ public class ImGroupMember implements Serializable {
     @ApiModelProperty(value = "修改时间;")
     private Date updateTime;
 
+    @TableField("group_role_type_")
+    @ApiModelProperty(value = "群角色")
+    private EImGroupMemberRoleType groupRoleType;
+
+    @TableField("group_mute_")
+    @ApiModelProperty(value = "禁言")
+    private Boolean groupMute;
+
     @TableField(exist = false)
     @ApiModelProperty(value = "IM用户ID")
     private String imUserId;
@@ -153,5 +162,21 @@ public class ImGroupMember implements Serializable {
     public void setImUserId(String imUserId) {
         this.imUserId = imUserId;
     }
+
+    public EImGroupMemberRoleType getGroupRoleType() {
+        return groupRoleType;
+    }
+
+    public void setGroupRoleType(EImGroupMemberRoleType groupRoleType) {
+        this.groupRoleType = groupRoleType;
+    }
+
+    public Boolean getGroupMute() {
+        return groupMute;
+    }
+
+    public void setGroupMute(Boolean groupMute) {
+        this.groupMute = groupMute;
+    }
 }
 

+ 38 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/im/EImGroupMemberRoleType.java

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+import lombok.Getter;
+
+/**
+ * 群成员角色
+ */
+@Getter
+public enum EImGroupMemberRoleType implements BaseEnum<String, EImGroupMemberRoleType> {
+
+    Owner("群主"),
+    Admin("管理员"),
+    Member("普通成员"),
+    ;
+
+    @EnumValue
+    private final String code;
+
+    private final String msg;
+
+    EImGroupMemberRoleType(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+
+    public static EImGroupMemberRoleType fromClientType(String clientType) {
+        switch (clientType) {
+            case "TEACHER":
+                return Admin;
+            case "STUDENT":
+            default:
+                return Member;
+        }
+    }
+}

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

@@ -1,11 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 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 org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -88,5 +90,7 @@ public interface ImGroupMemberService extends IService<ImGroupMember> {
      * @return List<ImGroupMember>
      */
     List<ImGroupMember> findChatGroupAllMemberInfo(Map<String, Object> params);
+
+    IPage<ImGroupMemberWrapper.ImGroupMember> selectPage(@Param("page") IPage<ImGroupMemberWrapper.ImGroupMember> page,@Param("query") ImGroupMemberWrapper.ImGroupMemberQuery query);
 }
 

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImGroupService.java

@@ -211,5 +211,7 @@ public interface ImGroupService extends IService<ImGroup> {
     void clearImportIm(List<ImHistoryMessage> info);
 
     void groupAvatarUpdate();
+
+    Boolean muteAll(ImGroupWrapper.Mute mute);
 }
 

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

@@ -1,11 +1,14 @@
 package com.yonge.cooleshow.biz.dal.service.im;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
 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 org.apache.poi.ss.formula.functions.T;
 
 import java.util.List;
 
@@ -186,4 +189,10 @@ public interface ImGroupCoreService {
      * @throws Exception Exception
      */
     Boolean deleteGroupRecentContact(String userId, String groupId) throws Exception;
+
+    void groupMemberMute(ImGroupMemberWrapper.GroupMemberMute member);
+
+    IPage<ImGroupMemberWrapper.ImGroupMember> imGroupMemberPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query);
+
+    void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member);
 }

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

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

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -15,6 +16,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 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.enums.im.EImGroupMemberRoleType;
 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;
@@ -59,6 +61,9 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     @Autowired
     private ImGroupCoreService imGroupCoreService;
 
+    @Autowired
+    private ImGroupMemberDao imGroupMemberDao;
+
     @Override
     public ImGroupMemberDao getDao() {
         return this.baseMapper;
@@ -70,6 +75,14 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
         if(CollectionUtils.isEmpty(imGroupMembers)){
             throw new BizException("群成员列表不可为空");
         }
+        for (ImGroupMember imGroupMember : imGroupMembers) {
+            imGroupMember.setGroupMute(false);
+            if (Boolean.TRUE.equals(imGroupMember.getIsAdmin())) {
+                imGroupMember.setGroupRoleType(EImGroupMemberRoleType.Owner);
+            } else {
+                imGroupMember.setGroupRoleType(ImGroupMemberRoleType.TEACHER.equals(imGroupMember.getRoleType()) ? EImGroupMemberRoleType.Admin : EImGroupMemberRoleType.Member);
+            }
+        }
         this.baseMapper.insertBatch(imGroupMembers);
     }
 
@@ -82,6 +95,12 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
         Date date = new Date();
         imGroupMember.setCreateTime(date);
         imGroupMember.setUpdateTime(date);
+        imGroupMember.setGroupMute(false);
+        if (Boolean.TRUE.equals(isAdmin)) {
+            imGroupMember.setGroupRoleType(EImGroupMemberRoleType.Owner);
+        } else {
+            imGroupMember.setGroupRoleType(ImGroupMemberRoleType.TEACHER.equals(roleType) ? EImGroupMemberRoleType.Admin : EImGroupMemberRoleType.Member);
+        }
         this.baseMapper.insert(imGroupMember);
         //加入融云群
         List<ImGroupMember> groupMemberList = new ArrayList<>();
@@ -103,6 +122,13 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
                 item.setRoleType(roleType);
                 // 管理员村识
                 item.setIsAdmin(ImGroupMemberRoleType.TEACHER == roleType);
+                // 默认不禁言
+                item.setGroupMute(false);
+                if (Boolean.TRUE.equals(item.getIsAdmin())) {
+                    item.setGroupRoleType(EImGroupMemberRoleType.Owner);
+                } else {
+                    item.setGroupRoleType(ImGroupMemberRoleType.TEACHER.equals(roleType) ? EImGroupMemberRoleType.Admin : EImGroupMemberRoleType.Member);
+                }
             }
             baseMapper.insertBatch(imGroupMembers);
 
@@ -136,6 +162,9 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
                     .isAdmin(groupMember.getIsAdmin())
                     .imUserId(imGroupCoreService.getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
                     .roleType(groupMember.getRoleType().getCode())
+                    .groupMute(groupMember.getGroupMute())
+                    .groupRoleType(groupMember.getIsAdmin()?EImGroupMemberRoleType.Owner:
+                            (ImGroupMemberRoleType.TEACHER.equals(groupMember.getRoleType())?EImGroupMemberRoleType.Admin:EImGroupMemberRoleType.Member))
                     .build());
         }
         // 添加群成员到当前群组
@@ -201,11 +230,22 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     public List<ImGroupMember> findChatGroupAllMemberInfo(Map<String, Object> params) {
 
         Object search = params.get("search");
+        if (search == null) {
+            search = params.get("keyword");
+        }
+        Object keyword = search;
+
+        Boolean groupMute = params.get("groupMute") == null ? null : Boolean.valueOf(params.get("groupMute").toString());
+        List<String> groupRoleTypes = params.get("groupRoleTypes") == null ? new ArrayList() : ((List) params.get("groupRoleTypes"));
+        String groupRoleTypesTr = String.join(",", groupRoleTypes);
         List<ImGroupMember> members = getBaseMapper().selectList(Wrappers.<ImGroupMember>query().lambda()
-                .and(Objects.nonNull(search) && StringUtils.isNotEmpty(search.toString()),
-                        e->e.eq(ImGroupMember::getUserId, search).or()
-                                .like(ImGroupMember::getNickname, search))
-                .eq(ImGroupMember::getGroupId,params.get("groupId")).orderByDesc(ImGroupMember::getId));
+                .and(Objects.nonNull(keyword) && StringUtils.isNotEmpty(keyword.toString()),
+                        e->e.eq(ImGroupMember::getUserId, keyword).or()
+                                .like(ImGroupMember::getNickname, keyword))
+                .eq(ImGroupMember::getGroupId, params.get("groupId"))
+                .eq(groupMute != null, ImGroupMember::getGroupMute, groupMute)
+                .apply(StringUtils.isNotEmpty(groupRoleTypesTr), "find_in_set(group_role_type_,'" + groupRoleTypesTr + "')")
+                .orderByDesc(ImGroupMember::getId));
 
         if (CollectionUtils.isNotEmpty(members)) {
 
@@ -221,5 +261,10 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
 
         return Optional.ofNullable(members).orElse(Lists.newArrayList());
     }
+
+    @Override
+    public IPage<ImGroupMemberWrapper.ImGroupMember> selectPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query) {
+        return page.setRecords(imGroupMemberDao.selectPage(page, query));
+    }
 }
 

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

@@ -1363,6 +1363,33 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean muteAll(ImGroupWrapper.Mute mute) {
+        String groupId = mute.getGroupId();
+        Boolean muteAll = mute.getMuteAll();
+        ImGroup imGroup = imGroupService.lambdaQuery().eq(ImGroup::getId, groupId).last("LIMIT 1").one();
+        if (Objects.isNull(imGroup)) {
+            throw new BizException("群组不存在");
+        }
+        ImGroupWrapper.ImGroupConfigJson from = ImGroupWrapper.ImGroupConfigJson.builder().mute(muteAll).build();
+        imGroup.setConfigJson(JSON.toJSONString(from));
+        imGroupService.updateById(imGroup);
+
+        // 调用IM接口
+        try {
+            if (Boolean.TRUE.equals(muteAll)) {
+                imPluginContext.getPluginService().groupBanCreate(groupId);
+            } else {
+                imPluginContext.getPluginService().groupBanRemove(groupId);
+            }
+        } catch (Exception e) {
+            log.error("群组禁言状态修改失败", e);
+            throw new BizException("群组禁言状态修改失败");
+        }
+        return true;
+    }
+
     private void groupAvatarUpdate(List<ImGroup> records) {
 
         for (ImGroup imGroup : records) {

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

@@ -1,7 +1,10 @@
 package com.yonge.cooleshow.biz.dal.wrapper.im;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.webportal.validation.annotation.EnumValidation;
+import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -10,8 +13,15 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
 import java.text.MessageFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 
@@ -23,24 +33,30 @@ import java.util.Optional;
 public class ImGroupMemberWrapper {
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     @ApiModel(" ImGroupMemberQuery-群成员表")
     public static class ImGroupMemberQuery implements QueryInfo {
-    
-    	@ApiModelProperty("当前页")
+
+        @ApiModelProperty("当前页")
         private Integer page;
-        
+
         @ApiModelProperty("分页行数")
         private Integer rows;
-        
+
         @ApiModelProperty("关键字匹配")
-		private String keyword;
+        private String keyword;
 
         @ApiModelProperty("群组ID")
         private String groupId;
 
+        @ApiModelProperty("群禁言")
+        private Boolean groupMute;
+
+        @ApiModelProperty("群成员类型")
+        private List<EImGroupMemberRoleType> groupRoleTypes;
+
         public static ImGroupMemberQuery from(String json) {
             return JSON.parseObject(json, ImGroupMemberQuery.class);
         }
@@ -51,52 +67,59 @@ public class ImGroupMemberWrapper {
     }
 
     @Data
-	@Builder
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
-	@ApiModel(" ImGroupMember-群成员表")
+    @ApiModel(" ImGroupMember-群成员表")
     public static class ImGroupMember {
 
-                
-		@ApiModelProperty("主键;") 
-		private Long id;
+
+        @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("群组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(value = "群角色")
+        private EImGroupMemberRoleType groupRoleType;
+
+        @ApiModelProperty(value = "禁言")
+        private Boolean groupMute;
+
+
         @ApiModelProperty("加入群组标识")
         private Boolean groupJoin;
 
@@ -137,4 +160,49 @@ public class ImGroupMemberWrapper {
         }
     }
 
+    @Data
+    @ApiModel(" GroupMemberMute-群成员禁言")
+    public static class GroupMemberMute implements Serializable {
+
+        @NotNull
+        @ApiModelProperty(value = "群ID")
+        private String groupId;
+
+        @NotNull(message = "禁言时长不能为空")
+        @ApiModelProperty("禁言时长(分钟), 0取消禁方;-1永久禁言")
+        private Long muteTime;
+
+        @NotNull(message = "禁言状态不能为空")
+        @ApiModelProperty("群禁言状态")
+        private Boolean groupMute;
+
+        @ApiModelProperty("禁言角色身份,默认为成员Member")
+        private EImGroupMemberRoleType groupRoleType = EImGroupMemberRoleType.Member;
+
+        @ApiModelProperty("群成员ID")
+        @Size(min = 1, message = "群成员不能为空")
+        private List<String> userIds = new ArrayList<>();
+
+    }
+
+    @Data
+    @ApiModel(" GroupMemberMute-群成员角色")
+    public static class GroupMemberRole implements Serializable {
+
+        @NotNull
+        @ApiModelProperty(value = "群ID",required = true)
+        private String groupId;
+
+        @EnumValidation(clazz = EImGroupMemberRoleType.class, message = "群成员身份不能为空")
+        @ApiModelProperty("群成员身份")
+        private EImGroupMemberRoleType groupRoleType;
+
+        @ApiModelProperty("群成员ID")
+        private List<String> userIds;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+
 }

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

@@ -13,6 +13,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.helpers.MessageFormatter;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Optional;
@@ -81,7 +82,7 @@ public class ImGroupWrapper {
     public static class ImGroup {
 
 
-        @ApiModelProperty(value = "主键ID",hidden = true)
+        @ApiModelProperty(value = "主键ID", hidden = true)
         private Long id;
 
         @ApiModelProperty("群组ID")
@@ -120,6 +121,9 @@ public class ImGroupWrapper {
         @ApiModelProperty("创建时间")
         private Date createTime;
 
+        @ApiModelProperty("群聊配置")
+        private String configJson;
+
         private Set<Long> studentIdList = new HashSet<>();
 
         private Set<String> imUserIdList = new HashSet<>();
@@ -167,4 +171,56 @@ public class ImGroupWrapper {
             return this;
         }
     }
+
+    /**
+     * 群配置
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class ImGroupConfigJson {
+
+        // 群禁言
+        private Boolean mute;
+
+        public String toJson() {
+            return JSON.toJSONString(this);
+        }
+
+    }
+
+    /**
+     * 群禁言
+     */
+    @ApiModel("群禁言")
+    @Data
+    public static class Mute {
+
+        @ApiModelProperty("群ID")
+        @NotNull(message = "群ID不能为空")
+        private String groupId;
+
+        @ApiModelProperty("true:禁言,false:解禁言")
+        @NotNull
+        private Boolean muteAll;
+    }
+
+    @Data
+    @ApiModel("更换群主")
+    public static class ChangeGroupOwner {
+
+        @NotNull
+        @ApiModelProperty("群ID")
+        private String groupId;
+
+        @NotBlank(message = "新群主不能为空")
+        @ApiModelProperty("新群主")
+        private String newOwner;
+
+        @NotBlank(message = "旧群主不能为空")
+        @ApiModelProperty("旧群主")
+        private String oldOwner;
+    }
+
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMapper.xml

@@ -13,6 +13,7 @@
         <result column="auto_pass_flag_" property="autoPassFlag"/>
         <result column="create_time_" jdbcType="TIMESTAMP" property="createTime"/>
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="config_json_" jdbcType="VARCHAR" property="configJson"/>
     </resultMap>
 
     <sql id="Base_Column_List">
@@ -34,6 +35,9 @@
             <if test="et.memo != null and et.memo != ''">
                 memo_ = #{et.memo},
             </if>
+            <if test="et.configJson != null">
+                config_json_ = #{et.configJson},
+            </if>
             update_time_ = NOW()
         </set>
         where id_ = #{et.id}

+ 47 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -12,17 +12,33 @@
         <result column="update_time_" jdbcType="TIMESTAMP" property="updateTime"/>
     </resultMap>
 
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+        t.id_ AS id
+        , t.group_id_ AS groupId
+        , t.user_id_ AS userId
+        , t.avatar_ AS avatar
+        , t.nickname_ AS nickname
+        , t.is_admin_ AS isAdmin
+        , t.role_type_ AS roleType
+        , t.create_time_ AS createTime
+        , t.update_time_ AS updateTime
+        , t.group_role_type_ AS groupRoleType
+        , t.group_mute_ AS groupMute
+    </sql>
+
     <sql id="Base_Column_List">
-        id_ , group_id_, user_id_, nickname_, is_admin_, role_type_, create_time_, update_time_
+        id_ , group_id_, user_id_, nickname_, is_admin_, role_type_, create_time_, update_time_,group_role_type_,group_mute_
     </sql>
 
     <insert id="insertBatch" keyColumn="id_" keyProperty="id" useGeneratedKeys="true"
             parameterType="com.yonge.cooleshow.biz.dal.entity.ImGroupMember">
         insert into im_group_member(group_id_, user_id_,avatar_, nickname_, is_admin_, role_type_, create_time_,
-        update_time_)
+        update_time_,group_role_type_)
         values
         <foreach collection="entities" item="entity" separator=",">
-            (#{entity.groupId}, #{entity.userId}, #{entity.avatar}, #{entity.nickname}, #{entity.isAdmin}, #{entity.roleType},NOW(), NOW())
+            (#{entity.groupId}, #{entity.userId}, #{entity.avatar}, #{entity.nickname}, #{entity.isAdmin}, #{entity.roleType},NOW(), NOW(),#{entity.groupRoleType})
         </foreach>
         ON DUPLICATE KEY UPDATE
         group_id_ = VALUES(group_id_),
@@ -60,8 +76,10 @@
         <result property="nickname" column="nick_name_"/>
         <result property="avatar" column="avatar_"/>
         <result property="roleType" column="role_type_"/>
-        <result property="createTime" column="now_"/>
-        <result property="updateTime" column="now_"/>
+        <result property="createTime" column="create_time_"/>
+        <result property="updateTime" column="update_time_"/>
+        <result property="groupRoleType" column="group_role_type_"/>
+        <result property="groupMute" column="group_mute_"/>
     </resultMap>
     <select id="initImGroupMember" resultMap="ImGroupMember">
         SELECT #{imGroupId} group_id_,su.id_ user_id_, 0 is_admin_,su.username_ nick_name_,
@@ -75,4 +93,28 @@
     <select id="findByUserIdAndGroupId" resultMap="ImGroupMember">
         SELECT <include refid="Base_Column_List"/> FROM im_group_member WHERE group_id_ = #{groupId} AND user_id_ = #{userId} AND role_type_ = #{clientType} LIMIT 1
     </select>
+
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper$ImGroupMember">
+        SELECT
+        <include refid="baseColumns" />
+        , t.role_type_ AS clientType
+        FROM im_group_member t
+        <where>
+            <if test="param.groupId != null">
+                AND t.group_id_ = #{param.groupId}
+            </if>
+            <if test="param.keyword != null">
+                AND t.nickname_ LIKE concat('%',#{param.keyword},'%')
+            </if>
+            <if test="param.groupMute != null">
+                AND t.group_mute_ = #{param.groupMute}
+            </if>
+            <if test="param.groupRoleTypes != null">
+                AND t.group_role_type_ IN (<foreach collection="param.groupRoleTypes" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        ORDER BY t.id_ DESC
+    </select>
+
 </mapper>

+ 1 - 1
pom.xml

@@ -69,7 +69,7 @@
 			<dependency>
 				<groupId>com.microsvc.toolkit</groupId>
 				<artifactId>microsvc-dependencies-bom</artifactId>
-				<version>1.0.1</version>
+				<version>1.0.4</version>
 				<type>pom</type>
 				<scope>import</scope>
 			</dependency>