Browse Source

群禁言

yuanliang 10 months ago
parent
commit
b96684a7b9

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

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

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

@@ -2,17 +2,21 @@ package com.yonge.cooleshow.biz.dal.service.im.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.dayaedu.cbs.common.enums.EClientType;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.microsvc.toolkit.common.tools.ThreadPool;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.microsvc.toolkit.middleware.im.properties.ImConfigProperties;
 import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMemberAudit;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.enums.AuditStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
@@ -21,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberAuditService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberAuditWrapper;
@@ -29,9 +34,11 @@ import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.text.MessageFormat;
 import java.util.*;
@@ -55,6 +62,11 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
     private ImGroupMemberService imGroupMemberService;
     @Autowired
     private ImGroupMemberAuditService imGroupMemberAuditService;
+    @Autowired
+    private SysUserService sysUserService;
+
+    private static final String IM_USER_ID_SPLIT = "_";
+
 
     /**
      * IM 用户注册
@@ -751,4 +763,130 @@ public class ImGroupCoreServiceImpl implements ImGroupCoreService {
         return imPluginContext.getPluginService().deleteGroupRecentContact(userId, groupId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void groupMemberMute(ImGroupMemberWrapper.GroupMemberMute member) {
+        try {
+            // 群成员ID
+            List<Long> userIds = JSON.parseArray(JSON.toJSONString(member.getUserIds()), Long.class);
+
+
+            // 更新群成员禁言状态
+            List<ImGroupMember> list = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getGroupId, member.getGroupId())
+                    .in(ImGroupMember::getUserId, userIds)
+                    .list();
+            if (CollectionUtils.isEmpty(list)) {
+                return;
+            }
+
+
+            // 用户ImUserId
+            List<String> imUserIds = Lists.newArrayList();
+            List<ImGroupMember> updateList = new ArrayList<>();
+            for (ImGroupMember imGroupMember : list) {
+                imUserIds.add(getImUserId(imGroupMember.getUserId().toString(), imGroupMember.getRoleType().getCode()));
+                ImGroupMember imGroupMember1 = new ImGroupMember();
+                imGroupMember1.setId(imGroupMember.getId());
+                imGroupMember1.setGroupMute(member.getGroupMute());
+                updateList.add(imGroupMember1);
+            }
+            imGroupMemberService.updateBatchById(updateList);
+
+            ImPluginService pluginService = imPluginContext.getPluginService();
+            if (Boolean.TRUE.equals(member.getGroupMute())) {
+                // 群成员禁言
+                pluginService.groupUserGagCreate(imUserIds, member.getGroupId(), member.getMuteTime());
+            } else {
+                // 群成员解除禁言
+                pluginService.groupUserGagRemove(imUserIds, member.getGroupId());
+            }
+
+        } catch (Exception e) {
+            log.error("群成员禁言失败", e);
+            throw new BizException("群成员禁言失败,请联系管理员!");
+        }
+    }
+
+    @Override
+    public IPage<ImGroupMemberWrapper.ImGroupMember> imGroupMemberPage(IPage<ImGroupMemberWrapper.ImGroupMember> page, ImGroupMemberWrapper.ImGroupMemberQuery query) {
+        // 群聊成员列表
+        IPage<ImGroupMemberWrapper.ImGroupMember> pages = imGroupMemberService.selectPage(page, query);
+        if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+            List<ImGroupMemberWrapper.ImGroupMember> records = pages.getRecords();
+
+            List<Long> userIds = records.stream().map(ImGroupMemberWrapper.ImGroupMember::getUserId).distinct().collect(Collectors.toList());
+            Map<Long, SysUser> userIdMap = sysUserService.getMapByIds(userIds);
+
+            // 填充群成员信息
+            for (ImGroupMemberWrapper.ImGroupMember item : records) {
+                item.setImUserId(getImUserId(item.getImUserId(), item.getClientType()));
+                if (userIdMap.containsKey(item.getUserId())) {
+                    SysUser sysUser = userIdMap.get(item.getUserId());
+                    item.setAvatar(sysUser.getAvatar());
+                    item.setNickname(sysUser.getUsername());
+                }
+            }
+        }
+        return pages;
+    }
+
+    @Override
+    public void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member) {
+        try {
+            // 群成员ID
+            List<Long> userIds = JSON.parseArray(JSON.toJSONString(member.getUserIds()), Long.class);
+
+            // 更新群成员禁言状态
+            List<ImGroupMember> list = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getGroupId, member.getGroupId())
+                    .in(ImGroupMember::getUserId, userIds)
+                    .list();
+            if (CollectionUtils.isEmpty(list)) {
+                return;
+            }
+
+
+            // 用户ImUserId
+            List<String> imUserIds = Lists.newArrayList();
+            List<ImGroupMember> updateList = new ArrayList<>();
+            for (ImGroupMember imGroupMember : list) {
+                imUserIds.add(getImUserId(imGroupMember.getUserId().toString(), imGroupMember.getRoleType().getCode()));
+                ImGroupMember imGroupMember1 = new ImGroupMember();
+                imGroupMember1.setId(imGroupMember.getId());
+                imGroupMember1.setGroupRoleType(member.getGroupRoleType());
+                updateList.add(imGroupMember1);
+            }
+            imGroupMemberService.updateBatchById(updateList);
+
+            for (List<String> items : Lists.partition(imUserIds, 50)) {
+
+                items.parallelStream().forEach(item -> {
+
+                    try {
+                        ImPluginService pluginService = imPluginContext.getPluginService();
+                        switch (member.getGroupRoleType()) {
+                            case Admin:
+                                // 设置管理员
+                                pluginService.groupAdminCreate(member.getGroupId(), item);
+                                break;
+                            case Member:
+                                // 取消管理员
+                                pluginService.groupAdminRemove(member.getGroupId(), item);
+                                break;
+                            default:
+                                break;
+                        }
+                    } catch (Exception e) {
+                        log.error("群成员身份更新异常", e);
+                        throw new BizException("群成员身份更新异常,请联系管理员!");
+                    }
+                });
+            }
+
+        } catch (Exception e) {
+            log.error("群成员身份更新异常", e);
+            throw new BizException("群成员身份更新异常,请联系管理员!");
+        }
+    }
 }

+ 9 - 0
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;
@@ -60,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;
@@ -246,5 +250,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) {

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

@@ -3,6 +3,7 @@ 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;
@@ -12,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;
 
@@ -25,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);
         }
@@ -53,48 +67,48 @@ 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;
@@ -146,4 +160,46 @@ 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("群成员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);
+        }
+    }
+
 }

+ 35 - 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")
@@ -189,4 +190,37 @@ public class ImGroupWrapper {
 
     }
 
+    /**
+     * 群禁言
+     */
+    @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;
+    }
+
 }

+ 42 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -12,6 +12,22 @@
         <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_,group_role_type_,group_mute_
     </sql>
@@ -77,4 +93,30 @@
     <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" />
+        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.groupJoin != null">
+                AND t.group_join_ = #{param.groupJoin}
+            </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

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