Browse Source

群禁言

zouxuan 11 months ago
parent
commit
9f927f3c49
21 changed files with 839 additions and 196 deletions
  1. 34 26
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java
  2. 75 0
      mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupMemberController.java
  3. 18 13
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  4. 36 2
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupMemberController.java
  5. 270 0
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupController.java
  6. 75 0
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupMemberController.java
  7. 8 8
      mec-biz/pom.xml
  8. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  9. 0 43
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java
  10. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  11. 62 86
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  12. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/im/EImGroupRoleType.java
  13. 6 14
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupMemberQueryInfo.java
  14. 55 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupMemberWrapper.java
  15. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupWrapper.java
  16. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  17. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  18. 61 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  19. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  20. 18 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  21. 1 0
      pom.xml

+ 34 - 26
mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupController.java

@@ -1,15 +1,20 @@
 package com.ym.mec.teacher.controller;
 
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.dto.ImGroupNoticeDto;
 import com.ym.mec.biz.dal.dto.ImUserFriendDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.vo.ImUserWrapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -17,13 +22,10 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
@@ -34,31 +36,37 @@ import java.util.stream.Collectors;
 @RestController
 public class ImGroupController extends BaseController {
 
-	@Autowired
+	@Resource
 	private ImGroupService imGroupService;
-
-	@Autowired
+	@Resource
 	private ImUserFriendService imUserFriendService;
-
-	@Autowired
+	@Resource
 	private ImGroupNoticeService imGroupNoticeService;
-
-	@Autowired
+	@Resource
 	private SysUserService userLoginService;
-
-    @Autowired
+    @Resource
     private ImGroupMemberPlusService imGroupMemberPlusService;
 
+	@ApiOperation(value = "全体禁言/解除禁言")
+	@PostMapping("/muteAll")
+	public HttpResponseResult<Object> muteAll(@RequestBody ImGroupWrapper.GroupMuteAll groupMuteAll) {
+		if (StringUtils.isEmpty(groupMuteAll.getGroupId()) || groupMuteAll.getMuteAll() == null){
+			throw new BizException("参数错误");
+		}
+		imGroupService.muteAll(groupMuteAll);
+		return succeed();
+	}
+
 	@ApiOperation("查询群列表")
 	@GetMapping(value = "/queryGroupList")
-	public Object queryGroupList(String search,String groupType) {
+	public HttpResponseResult<List<ImGroup>> queryGroupList(String search, String groupType) {
 		return succeed(imGroupService.queryByUserId(userLoginService.getUserId(), search,groupType));
 	}
 
 
     @ApiOperation("查询群列表-v2")
     @GetMapping(value = "/queryGroupList/v2")
-    public Object queryGroupListV2(String search,String groupType,String musicGroupId,String classType) {
+    public HttpResponseResult<List<ImGroup>> queryGroupListV2(String search, String groupType, String musicGroupId, String classType) {
         if (StringUtils.isNotBlank(classType) && classType.equals("SINGLE")) {
             classType = "NORMAL";
         }
@@ -67,7 +75,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群详情")
 	@GetMapping(value = "/queryGroupDetail")
-	public Object queryGroupDetail(String imGroupId) {
+	public HttpResponseResult<ImGroup> queryGroupDetail(String imGroupId) {
 		if (imGroupId.contains("S") || imGroupId.contains("I")){
 			imGroupId = imGroupId.substring(1);
 		}
@@ -118,32 +126,32 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群成员列表")
 	@GetMapping(value = "/queryGroupMemberList")
-	public Object queryGroupMemberList(String imGroupId) {
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupMemberList(String imGroupId) {
 		return succeed(imGroupService.queryMemberById(imGroupId));
 	}
 
 	@ApiOperation("查询群学生列表")
 	@GetMapping(value = "/queryGroupStudentList")
-	public Object queryGroupStudentList(String imGroupId) {
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupStudentList(String imGroupId) {
 		return succeed(imGroupService.queryMemberById(imGroupId).stream().filter(e -> StringUtils.isBlank(e.getRoleType())).collect(Collectors.toList()));
 	}
 
 
     @ApiOperation("查询群学生列表v2")
     @GetMapping(value = "/queryGroupStudentList/v2")
-    public Object queryGroupStudentListV2(String imGroupId,String search,Integer subjectId,Boolean vipFlag) {
+    public HttpResponseResult<List<ImGroupMemberDto>> queryGroupStudentListV2(String imGroupId, String search, Integer subjectId, Boolean vipFlag) {
         return succeed(imGroupService.queryMemberByIdV2(imGroupId,search,subjectId,vipFlag).stream().filter(e -> StringUtils.isBlank(e.getRoleType())).collect(Collectors.toList()));
     }
 
 	@ApiOperation("查询群成员详情")
 	@GetMapping(value = "/queryGroupMemberDetail")
-	public Object queryGroupMemberDetail(String imGroupId, Integer userId) {
+	public HttpResponseResult<ImGroupMemberDto> queryGroupMemberDetail(String imGroupId, Integer userId) {
 		return succeed(imGroupService.queryMember(imGroupId, userId));
 	}
 
 	@ApiOperation("查询好友详情")
 	@GetMapping(value = "/queryFriendDetail")
-	public Object queryFriendDetail(Integer userId) {
+	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(Integer userId) {
 		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(userLoginService.getUserId(), userId);
 		if (dto == null) {
 			dto = new ImUserFriendDto();
@@ -203,7 +211,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友列表")
 	@GetMapping(value = "/queryFriendList")
-	public Object queryFriendList(String search) {
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendList(String search) {
 		return succeed(imUserFriendService.queryFriendListByUserId(userLoginService.getUserId(), search));
 	}
 
@@ -240,7 +248,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询好友中的学生列表")
 	@GetMapping(value = "/queryFriendStudentList")
-	public Object queryFriendStudentList(String search) {
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendStudentList(String search) {
 		return succeed(imUserFriendService.queryFriendListByUserId(userLoginService.getUserId(), search).stream().filter(e -> StringUtils.isBlank(e.getTags()))
 				.collect(Collectors.toList()));
 	}
@@ -248,7 +256,7 @@ public class ImGroupController extends BaseController {
 
     @ApiOperation("查询好友中的学生列表-v2")
     @GetMapping(value = "/queryFriendStudentList/v2")
-    public Object queryFriendStudentListV2(String search,String musicGroupId,Integer subjectId,Boolean vipFlag) {
+    public HttpResponseResult<List<ImUserFriendDto>> queryFriendStudentListV2(String search, String musicGroupId, Integer subjectId, Boolean vipFlag) {
         return succeed(imUserFriendService.queryFriendListByUserIdV2(userLoginService.getUserId(), search,musicGroupId,subjectId,vipFlag)
                 .stream().filter(e -> StringUtils.isBlank(e.getTags()))
                 .collect(Collectors.toList()));
@@ -256,7 +264,7 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群公告列表")
 	@GetMapping(value = "/queryNoticeList")
-	public Object queryNoticeList(ImGroupNoticeQueryInfo queryInfo) {
+	public HttpResponseResult<PageInfo<ImGroupNoticeDto>> queryNoticeList(ImGroupNoticeQueryInfo queryInfo) {
 		return succeed(imGroupNoticeService.queryPage(queryInfo));
 	}
 }

+ 75 - 0
mec-application/src/main/java/com/ym/mec/teacher/controller/ImGroupMemberController.java

@@ -0,0 +1,75 @@
+package com.ym.mec.teacher.controller;
+
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+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.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Optional;
+
+@RequestMapping("${app-config.url.teacher:}/imGroupMember")
+@Api(tags = "IM群成员服务")
+@RestController
+public class ImGroupMemberController extends BaseController {
+
+	@Resource
+	private ImGroupMemberService imGroupMemberService;
+
+	@ApiOperation(value = "群成员禁言", notes = "群成员禁言- 传入 ImGroupMemberVo.GroupMemberMute")
+	@PostMapping("/groupMute")
+	public HttpResponseResult<Object> groupMemberMute(@RequestBody ImGroupMemberWrapper.GroupMemberMute member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 群成员禁言时长无效
+		if (member.getGroupMute() && Optional.of(member.getMuteTime()).orElse(0) <= 0) {
+			throw BizException.from("群成员禁言时长无效");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberMute(member);
+		return succeed();
+	}
+
+	@ApiOperation(value = "群成员身份设置", notes = "群成员身份设置- 传入 ImGroupMemberVo.GroupMemberRole")
+	@PostMapping("/groupRole")
+	public HttpResponseResult<Object> groupMemberRole(@RequestBody ImGroupMemberWrapper.GroupMemberRole member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberRole(member);
+		return succeed();
+	}
+
+	@ApiOperation("分页查询群成员列表")
+	@PostMapping(value = "/queryGroupMemberPage")
+	public HttpResponseResult<PageInfo<ImGroupMemberDto>> queryGroupMemberPage(GroupMemberQueryInfo queryInfo) {
+		return succeed(imGroupMemberService.queryGroupMemberPage(queryInfo));
+	}
+
+	@ApiOperation("添加群成员")
+	@PostMapping(value = "/addGroupMember")
+	@ApiImplicitParams({ @ApiImplicitParam(name = "imGroupId", value = "群编号", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "roleType", value = "指导老师,乐队指导,乐团主管,运营主管,学员不传", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "userId", value = "用户编号(多个逗号分割)", required = true, dataType = "String")})
+	public Object addGroupMember(String imGroupId, String userId, String roleType) {
+		imGroupMemberService.batchJoin(imGroupId,userId,roleType);
+		return succeed();
+	}
+}

+ 18 - 13
mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java

@@ -7,7 +7,6 @@ import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.ImUserFriendDto;
 import com.ym.mec.biz.dal.dto.NameDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
 import com.ym.mec.biz.dal.enums.im.ClientEnum;
 import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
@@ -25,15 +24,11 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
+import javax.annotation.Resource;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
@@ -43,24 +38,34 @@ import java.util.stream.Collectors;
 @RestController
 public class ImGroupController extends BaseController {
 
-	@Autowired
+	@Resource
 	private ImGroupService imGroupService;
 
-	@Autowired
+	@Resource
 	private ImUserFriendService imUserFriendService;
 
-	@Autowired
+	@Resource
 	private ImGroupMemberService imGroupMemberService;
 
-    @Autowired
+    @Resource
     private ImGroupMemberPlusService imGroupMemberPlusService;
 
-	@Autowired
+	@Resource
 	private ImGroupNoticeService imGroupNoticeService;
 
-	@Autowired
+	@Resource
 	private SysUserService sysUserService;
 
+	@ApiOperation(value = "全体禁言/解除禁言")
+	@PostMapping("/muteAll")
+	public HttpResponseResult<Object> muteAll(@RequestBody ImGroupWrapper.GroupMuteAll groupMuteAll) {
+		if (StringUtils.isEmpty(groupMuteAll.getGroupId()) || groupMuteAll.getMuteAll() == null){
+			throw new com.microsvc.toolkit.common.webportal.exception.BizException("参数错误");
+		}
+		imGroupService.muteAll(groupMuteAll);
+		return succeed();
+	}
+
 	@ApiOperation("查询群列表")
 	@GetMapping(value = "/queryGroupList")
 	public HttpResponseResult<List<ImGroup>> queryGroupList(String search,String groupType) {

+ 36 - 2
mec-application/src/main/java/com/ym/mec/web/controller/ImGroupMemberController.java

@@ -1,7 +1,9 @@
 package com.ym.mec.web.controller;
 
+import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 import com.ym.mec.biz.service.ImGroupMemberService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
@@ -10,19 +12,51 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.Optional;
+
 @RequestMapping("${app-config.url.web:}/imGroupMember")
 @Api(tags = "IM群成员服务")
 @RestController
 public class ImGroupMemberController extends BaseController {
 
-	@Autowired
+	@Resource
 	private ImGroupMemberService imGroupMemberService;
 
+	@ApiOperation(value = "群成员禁言", notes = "群成员禁言- 传入 ImGroupMemberVo.GroupMemberMute")
+	@PostMapping("/groupMute")
+	public HttpResponseResult<Object> groupMemberMute(@RequestBody ImGroupMemberWrapper.GroupMemberMute member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 群成员禁言时长无效
+		if (member.getGroupMute() && Optional.of(member.getMuteTime()).orElse(0) <= 0) {
+			throw BizException.from("群成员禁言时长无效");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberMute(member);
+		return succeed();
+	}
+
+	@ApiOperation(value = "群成员身份设置", notes = "群成员身份设置- 传入 ImGroupMemberVo.GroupMemberRole")
+	@PostMapping("/groupRole")
+	public HttpResponseResult<Object> groupMemberRole(@RequestBody ImGroupMemberWrapper.GroupMemberRole member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberRole(member);
+		return succeed();
+	}
+
 	@ApiOperation("分页查询群成员列表")
 	@PostMapping(value = "/queryGroupMemberPage")
 	public HttpResponseResult<PageInfo<ImGroupMemberDto>> queryGroupMemberPage(GroupMemberQueryInfo queryInfo) {

+ 270 - 0
mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupController.java

@@ -0,0 +1,270 @@
+package com.ym.mec.web.controller.education;
+
+import com.google.common.collect.Lists;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.dto.ImGroupNoticeDto;
+import com.ym.mec.biz.dal.dto.ImUserFriendDto;
+import com.ym.mec.biz.dal.entity.ImGroup;
+import com.ym.mec.biz.dal.entity.ImGroupMemberPlus;
+import com.ym.mec.biz.dal.enums.im.ClientEnum;
+import com.ym.mec.biz.dal.page.ImGroupNoticeQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
+import com.ym.mec.biz.service.*;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.vo.ImUserWrapper;
+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.lang3.StringUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@RequestMapping("${app-config.url.web:}/eduImGroup")
+@Api(tags = "IM群服务")
+@RestController
+public class EduImGroupController extends BaseController {
+
+	@Resource
+	private ImGroupService imGroupService;
+	@Resource
+	private ImUserFriendService imUserFriendService;
+	@Resource
+	private ImGroupNoticeService imGroupNoticeService;
+	@Resource
+	private SysUserService userLoginService;
+    @Resource
+    private ImGroupMemberPlusService imGroupMemberPlusService;
+
+	@ApiOperation(value = "全体禁言/解除禁言")
+	@PostMapping("/muteAll")
+	public HttpResponseResult<Object> muteAll(@RequestBody ImGroupWrapper.GroupMuteAll groupMuteAll) {
+		if (StringUtils.isEmpty(groupMuteAll.getGroupId()) || groupMuteAll.getMuteAll() == null){
+			throw new BizException("参数错误");
+		}
+		imGroupService.muteAll(groupMuteAll);
+		return succeed();
+	}
+
+	@ApiOperation("查询群列表")
+	@GetMapping(value = "/queryGroupList")
+	public HttpResponseResult<List<ImGroup>> queryGroupList(String search, String groupType) {
+		return succeed(imGroupService.queryByUserId(userLoginService.getUserId(), search,groupType));
+	}
+
+
+    @ApiOperation("查询群列表-v2")
+    @GetMapping(value = "/queryGroupList/v2")
+    public HttpResponseResult<List<ImGroup>> queryGroupListV2(String search, String groupType, String musicGroupId, String classType) {
+        if (StringUtils.isNotBlank(classType) && classType.equals("SINGLE")) {
+            classType = "NORMAL";
+        }
+        return succeed(imGroupService.queryByUserIdV2(userLoginService.getUserId(), search,groupType,musicGroupId,classType));
+    }
+
+	@ApiOperation("查询群详情")
+	@GetMapping(value = "/queryGroupDetail")
+	public HttpResponseResult<ImGroup> queryGroupDetail(String imGroupId) {
+		if (imGroupId.contains("S") || imGroupId.contains("I")){
+			imGroupId = imGroupId.substring(1);
+		}
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, userLoginService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+		// 设置默认头像
+		if (Objects.nonNull(imGroup) && Objects.nonNull(imGroup.getGroupType()) && StringUtils.isBlank(imGroup.getImg())) {
+			imGroup.setImg(imGroup.getGroupType().getAvatar());
+		}
+		return succeed(imGroup);
+	}
+
+	@ApiOperation("查询群详情(重构版)")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "groupId", value = "群编号", required = true, dataType = "String")
+	})
+	@GetMapping(value = "/getDetail/{groupId}")
+	public HttpResponseResult<ImGroup> groupDetail(@PathVariable("groupId") String imGroupId) {
+		if (imGroupId.contains("S") || imGroupId.contains("I")){
+			imGroupId = imGroupId.substring(1);
+		}
+        ImGroup imGroup = imGroupService.get(imGroupId);
+
+        if (imGroup == null) {
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+        ImGroupMemberPlus admin = imGroupMemberPlusService.lambdaQuery()
+            .eq(ImGroupMemberPlus::getImGroupId, imGroup.getId())
+            .eq(ImGroupMemberPlus::getUserId, userLoginService.getUser().getId())
+            .last("limit 1").one();
+        if (admin == null) {
+            // 该用户不在该群,无权限查看,处理用户退出群后,查看历史消息校验
+            return failed(HttpStatus.NO_CONTENT, "群组不存在");
+        }
+		return succeed(imGroupService.get(imGroupId));
+	}
+
+	@ApiOperation("查询群成员列表")
+	@GetMapping(value = "/queryGroupMemberList")
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupMemberList(String imGroupId) {
+		return succeed(imGroupService.queryMemberById(imGroupId));
+	}
+
+	@ApiOperation("查询群学生列表")
+	@GetMapping(value = "/queryGroupStudentList")
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupStudentList(String imGroupId) {
+		return succeed(imGroupService.queryMemberById(imGroupId).stream().filter(e -> StringUtils.isBlank(e.getRoleType())).collect(Collectors.toList()));
+	}
+
+
+    @ApiOperation("查询群学生列表v2")
+    @GetMapping(value = "/queryGroupStudentList/v2")
+    public HttpResponseResult<List<ImGroupMemberDto>> queryGroupStudentListV2(String imGroupId, String search, Integer subjectId, Boolean vipFlag) {
+        return succeed(imGroupService.queryMemberByIdV2(imGroupId,search,subjectId,vipFlag).stream().filter(e -> StringUtils.isBlank(e.getRoleType())).collect(Collectors.toList()));
+    }
+
+	@ApiOperation("查询群成员详情")
+	@GetMapping(value = "/queryGroupMemberDetail")
+	public HttpResponseResult<ImGroupMemberDto> queryGroupMemberDetail(String imGroupId, Integer userId) {
+		return succeed(imGroupService.queryMember(imGroupId, userId));
+	}
+
+	@ApiOperation("查询好友详情")
+	@GetMapping(value = "/queryFriendDetail")
+	public HttpResponseResult<ImUserFriendDto> queryFriendDetail(Integer userId) {
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(userLoginService.getUserId(), userId);
+		if (dto == null) {
+			dto = new ImUserFriendDto();
+			SysUser user = userLoginService.queryUserById(userId);
+			dto.setFriend(user);
+
+			List<String> userTypes = Lists.newArrayList(user.getUserType().split(","));
+			if (userTypes.size() > 1
+				|| userTypes.contains(ClientEnum.TEACHER.getCode())
+				|| userTypes.contains(ClientEnum.SYSTEM.getCode())) {
+				// 增加用户身份数量 > 1 或者包含老师身份,统一使用实名
+				dto.setFriendNickname(Optional.ofNullable(user.getRealName()).filter(StringUtils::isNotBlank).orElse(user.getUsername()));
+			} else if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
+				dto.setFriendNickname(user.getUsername());
+			} else {
+				dto.setFriendNickname(user.getRealName());
+			}
+			dto.setFriendId(userId);
+		}
+		return succeed(dto);
+	}
+
+	@ApiOperation("查询好友详情(重构版)")
+	@ApiImplicitParams({
+		@ApiImplicitParam(name = "userId", value = "用户编号", required = true, dataType = "Integer")
+	})
+	@GetMapping(value = "/imUserFriend/getDetail/{userId}")
+	public HttpResponseResult<ImUserWrapper.ImUserFriend> getImUserFriendDetail(@PathVariable("userId") Integer userId) {
+		ImUserFriendDto dto = imUserFriendService.queryFriendDetail(userLoginService.getUserId(), userId);
+		if (dto == null) {
+			dto = new ImUserFriendDto();
+			SysUser user = userLoginService.queryUserById(userId);
+			dto.setFriend(user);
+			if (user.getUserType().contains("STUDENT") || user.getUserType().contains("SCHOOL")) {
+				dto.setFriendNickname(user.getUsername());
+			} else {
+				dto.setFriendNickname(user.getRealName());
+			}
+			dto.setFriendId(userId);
+		}
+
+		// 返回数据结构封装
+		ImUserWrapper.ImUserFriend userFriend = ImUserWrapper.ImUserFriend.builder()
+			.id(dto.getId())
+			.userId(dto.getUserId().longValue())
+			.friendId(dto.getFriendId().longValue())
+			.friendAvatar(dto.getFriend().getAvatar())
+			.friendNickname(dto.getFriendNickname())
+			.memo(dto.getMemo())
+			.updateTime(dto.getUpdateTime())
+			.createTime(dto.getCreateTime())
+			.roleType(dto.getRoleType())
+			.friendType(dto.getRoleType())
+			.build();
+		return succeed(userFriend);
+	}
+
+	@ApiOperation("查询好友列表")
+	@GetMapping(value = "/queryFriendList")
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendList(String search) {
+		return succeed(imUserFriendService.queryFriendListByUserId(userLoginService.getUserId(), search));
+	}
+
+	@ApiOperation("查询好友列表(重构版)")
+	@GetMapping(value = "/imUserFriend/queryAll")
+	public HttpResponseResult<List<ImUserWrapper.ImUserFriend>> queryImUserFriendList(String search) {
+
+		// 好友关系列表
+		List<ImUserFriendDto> friendDtos = imUserFriendService.queryFriendListByUserId(userLoginService.getUserId(), search);
+
+		List<ImUserWrapper.ImUserFriend> wrappers = Lists.newArrayList();
+		if (CollectionUtils.isNotEmpty(friendDtos)) {
+
+			// 封装返回数据结构
+			for (ImUserFriendDto item : friendDtos) {
+
+				wrappers.add(ImUserWrapper.ImUserFriend.builder()
+					.id(item.getId())
+					.userId(item.getUserId().longValue())
+					.friendId(item.getFriendId().longValue())
+					.friendAvatar(item.getFriend().getAvatar())
+					.friendNickname(item.getFriendNickname())
+					.memo(item.getMemo())
+					.roleType(item.getRoleType())
+					.friendType(item.getRoleType())
+					.updateTime(item.getUpdateTime())
+					.createTime(item.getCreateTime())
+					.build());
+			}
+		}
+
+		return succeed(wrappers);
+	}
+
+	@ApiOperation("查询好友中的学生列表")
+	@GetMapping(value = "/queryFriendStudentList")
+	public HttpResponseResult<List<ImUserFriendDto>> queryFriendStudentList(String search) {
+		return succeed(imUserFriendService.queryFriendListByUserId(userLoginService.getUserId(), search).stream().filter(e -> StringUtils.isBlank(e.getTags()))
+				.collect(Collectors.toList()));
+	}
+
+
+    @ApiOperation("查询好友中的学生列表-v2")
+    @GetMapping(value = "/queryFriendStudentList/v2")
+    public HttpResponseResult<List<ImUserFriendDto>> queryFriendStudentListV2(String search, String musicGroupId, Integer subjectId, Boolean vipFlag) {
+        return succeed(imUserFriendService.queryFriendListByUserIdV2(userLoginService.getUserId(), search,musicGroupId,subjectId,vipFlag)
+                .stream().filter(e -> StringUtils.isBlank(e.getTags()))
+                .collect(Collectors.toList()));
+    }
+
+	@ApiOperation("查询群公告列表")
+	@GetMapping(value = "/queryNoticeList")
+	public HttpResponseResult<PageInfo<ImGroupNoticeDto>> queryNoticeList(ImGroupNoticeQueryInfo queryInfo) {
+		return succeed(imGroupNoticeService.queryPage(queryInfo));
+	}
+}

+ 75 - 0
mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupMemberController.java

@@ -0,0 +1,75 @@
+package com.ym.mec.web.controller.education;
+
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
+import com.ym.mec.biz.service.ImGroupMemberService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
+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.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Optional;
+
+@RequestMapping("${app-config.url.web:}/eduImGroupMember")
+@Api(tags = "IM群成员服务")
+@RestController
+public class EduImGroupMemberController extends BaseController {
+
+	@Resource
+	private ImGroupMemberService imGroupMemberService;
+
+	@ApiOperation(value = "群成员禁言", notes = "群成员禁言- 传入 ImGroupMemberVo.GroupMemberMute")
+	@PostMapping("/groupMute")
+	public HttpResponseResult<Object> groupMemberMute(@RequestBody ImGroupMemberWrapper.GroupMemberMute member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 群成员禁言时长无效
+		if (member.getGroupMute() && Optional.of(member.getMuteTime()).orElse(0) <= 0) {
+			throw BizException.from("群成员禁言时长无效");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberMute(member);
+		return succeed();
+	}
+
+	@ApiOperation(value = "群成员身份设置", notes = "群成员身份设置- 传入 ImGroupMemberVo.GroupMemberRole")
+	@PostMapping("/groupRole")
+	public HttpResponseResult<Object> groupMemberRole(@RequestBody ImGroupMemberWrapper.GroupMemberRole member) {
+		// 群成员不能为空
+		if (CollectionUtils.isEmpty(member.getUserIds())) {
+			throw BizException.from("群成员不能为空");
+		}
+		// 更新群成员禁言
+		imGroupMemberService.groupMemberRole(member);
+		return succeed();
+	}
+
+	@ApiOperation("分页查询群成员列表")
+	@PostMapping(value = "/queryGroupMemberPage")
+	public HttpResponseResult<PageInfo<ImGroupMemberDto>> queryGroupMemberPage(GroupMemberQueryInfo queryInfo) {
+		return succeed(imGroupMemberService.queryGroupMemberPage(queryInfo));
+	}
+
+	@ApiOperation("添加群成员")
+	@PostMapping(value = "/addGroupMember")
+	@ApiImplicitParams({ @ApiImplicitParam(name = "imGroupId", value = "群编号", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "roleType", value = "指导老师,乐队指导,乐团主管,运营主管,学员不传", required = true, dataType = "String"),
+			@ApiImplicitParam(name = "userId", value = "用户编号(多个逗号分割)", required = true, dataType = "String")})
+	public Object addGroupMember(String imGroupId, String userId, String roleType) {
+		imGroupMemberService.batchJoin(imGroupId,userId,roleType);
+		return succeed();
+	}
+}

+ 8 - 8
mec-biz/pom.xml

@@ -49,17 +49,17 @@
 		<dependency>
 			<groupId>com.microsvc.toolkit.middleware</groupId>
 			<artifactId>microsvc-middleware-live</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.microsvc.toolkit.common</groupId>
 			<artifactId>microsvc-common-response</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.microsvc.toolkit.middleware</groupId>
 			<artifactId>microsvc-middleware-rtc</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 
 		<!--修复依赖冲突-->
@@ -70,22 +70,22 @@
 		<dependency>
 			<groupId>com.microsvc.toolkit.config</groupId>
 			<artifactId>microsvc-config-validator</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
         <dependency>
             <groupId>com.microsvc.toolkit.config</groupId>
             <artifactId>microsvc-config-jwt</artifactId>
-            <version>1.0.0</version>
+            <version>${com.microsvc.toolkit.version}</version>
         </dependency>
 		<dependency>
 			<groupId>com.microsvc.toolkit.middleware</groupId>
 			<artifactId>microsvc-middleware-im</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.microsvc.toolkit.middleware</groupId>
 			<artifactId>microsvc-middleware-oss</artifactId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 
 		<dependency>
@@ -106,7 +106,7 @@
 				</exclusion>
 			</exclusions>
 			<groupId>com.microsvc.toolkit.common</groupId>
-			<version>1.0.0</version>
+			<version>${com.microsvc.toolkit.version}</version>
 		</dependency>
 		<dependency>
 			<groupId>com.yonge.log</groupId>

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java

@@ -60,4 +60,8 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
     List<ImGroupMember> getByGroupId(@Param("musicGroupIds") List<String> musicGroupId);
 
     void delByImGroupAndUserId(@Param("imGroupId") String imGroupId, @Param("userIds") List<Integer> userIds);
+
+    void updateGroupMemberMute(@Param("groupId") String groupId, @Param("userIds") List<String> userIds, @Param("groupMute") Boolean groupMute);
+
+    void batchUpdateGroupMemberRole(@Param("groupId") String groupId, @Param("userIds") List<String> userIds, @Param("groupRoleType") String groupRoleType);
 }

+ 0 - 43
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java

@@ -2,30 +2,11 @@ package com.ym.mec.biz.dal.dto;
 
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
-import io.swagger.annotations.ApiModelProperty;
 
 public class ImGroupMemberDto extends ImGroupMember {
 
 	private SysUser user = new SysUser();
 
-    private String type;
-
-    private String imUserId;
-
-    @ApiModelProperty(value = "群编号;")
-    private String groupId;
-
-    @ApiModelProperty("群成员头象")
-    private String avatar;
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
     public SysUser getUser() {
 		return user;
 	}
@@ -33,28 +14,4 @@ public class ImGroupMemberDto extends ImGroupMember {
 	public void setUser(SysUser user) {
 		this.user = user;
 	}
-
-    public String getImUserId() {
-        return String.valueOf(getUserId());
-    }
-
-    public void setImUserId(String imUserId) {
-        this.imUserId = imUserId;
-    }
-
-    public String getGroupId() {
-        return getImGroupId();
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public void setAvatar(String avatar) {
-        this.avatar = avatar;
-    }
-
-    public void setGroupId(String groupId) {
-        this.groupId = groupId;
-    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -2,6 +2,8 @@ package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.common.entity.BaseEntity;
 import com.ym.mec.common.enums.BaseEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
@@ -25,6 +27,10 @@ public class ImGroup extends BaseEntity {
 	
 	/** 群备注 */
 	private String memo;
+
+	@Getter
+	@ApiModelProperty(value = "禁言配置")
+	private String configJson;
 	
 	/** 群标签 */
 	private String tags;
@@ -204,6 +210,10 @@ public class ImGroup extends BaseEntity {
 		this.importFlag = importFlag;
 	}
 
+	public void setConfigJson(String configJson) {
+		this.configJson = configJson;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 62 - 86
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -1,165 +1,141 @@
 package com.ym.mec.biz.dal.entity;
 
+import com.ym.mec.biz.dal.enums.im.EImGroupRoleType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.ym.mec.common.entity.BaseEntity;
 
+import java.util.Date;
+
 /**
  * 对应数据库表(im_group_member):
  */
 public class ImGroupMember extends BaseEntity {
 
 	/**  */
+	@Getter
 	private Long id;
 	
 	/**  */
+	@Getter
 	private String imGroupId;
 	
 	/**  */
+	@Getter
 	private Integer userId;
 	
+	@Getter
 	private String nickname;
 
-	/** 群昵称 */
+	@Getter
+	@ApiModelProperty(value = "群昵称")
 	private String groupNickname;
 	
-	/** 是否是管理员 */
+	@ApiModelProperty(value = "是否是管理员")
 	private boolean isAdmin;
+
+	@Getter
+	@ApiModelProperty(value = "是否禁言")
+	private Boolean muteFlag = false;
+
+	@Getter
+	@ApiModelProperty(value = "第三方群角色")
+	private EImGroupRoleType groupRoleType;
 	
-	/** 群角色 */
+	@Getter
+	@ApiModelProperty(value = "群角色")
 	private String roleType;
 
-
-    /** 群角色 */
+	@Getter
+	@ApiModelProperty(value = "群角色")
     private String type;
 
+	@Getter
 	private Integer memberRankSettingId;
 
+	@Getter
 	private String subjectName;
 
+	@Getter
 	private String subjectId;
 
+	@Getter
 	private String avatar;
 	
 	/**  */
+	@Getter
 	private java.util.Date createTime;
 	
 	/**  */
+	@Getter
 	private java.util.Date updateTime;
 
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-	public String getSubjectId() {
-		return subjectId;
-	}
-
-	public void setSubjectId(String subjectId) {
-		this.subjectId = subjectId;
-	}
-
-	public Integer getMemberRankSettingId() {
-		return memberRankSettingId;
-	}
-
-	public void setMemberRankSettingId(Integer memberRankSettingId) {
-		this.memberRankSettingId = memberRankSettingId;
-	}
-
-	public String getSubjectName() {
-		return subjectName;
-	}
-
-	public void setSubjectName(String subjectName) {
-		this.subjectName = subjectName;
-	}
-
-	public void setId(Long id){
+	public void setId(Long id) {
 		this.id = id;
 	}
-	
-	public Long getId(){
-		return this.id;
-	}
-			
-	public void setImGroupId(String imGroupId){
+
+	public void setImGroupId(String imGroupId) {
 		this.imGroupId = imGroupId;
 	}
-	
-	public String getImGroupId(){
-		return this.imGroupId;
-	}
-			
-	public void setUserId(Integer userId){
+
+	public void setUserId(Integer userId) {
 		this.userId = userId;
 	}
-	
-	public Integer getUserId(){
-		return this.userId;
-	}
-			
-	public String getNickname() {
-		return nickname;
-	}
 
 	public void setNickname(String nickname) {
 		this.nickname = nickname;
 	}
 
-	public void setIsAdmin(boolean isAdmin){
-		this.isAdmin = isAdmin;
+	public void setGroupNickname(String groupNickname) {
+		this.groupNickname = groupNickname;
 	}
-	
-	public boolean getIsAdmin(){
-		return this.isAdmin;
+
+	public boolean getIsAdmin() {
+		return isAdmin;
 	}
 
-	public String getRoleType() {
-		return roleType;
+	public void setIsAdmin(boolean admin) {
+		isAdmin = admin;
+	}
+
+	public void setGroupRoleType(EImGroupRoleType groupRoleType) {
+		this.groupRoleType = groupRoleType;
 	}
 
 	public void setRoleType(String roleType) {
 		this.roleType = roleType;
 	}
 
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
-		this.updateTime = updateTime;
-	}
-	
-	public java.util.Date getUpdateTime(){
-		return this.updateTime;
+	public void setType(String type) {
+		this.type = type;
 	}
 
-	public String getGroupNickname() {
-		return groupNickname;
+	public void setMemberRankSettingId(Integer memberRankSettingId) {
+		this.memberRankSettingId = memberRankSettingId;
 	}
 
-	public void setGroupNickname(String groupNickname) {
-		this.groupNickname = groupNickname;
+	public void setSubjectName(String subjectName) {
+		this.subjectName = subjectName;
 	}
 
-	public String getAvatar() {
-		return avatar;
+	public void setSubjectId(String subjectId) {
+		this.subjectId = subjectId;
 	}
 
 	public void setAvatar(String avatar) {
 		this.avatar = avatar;
 	}
 
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 39 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/im/EImGroupRoleType.java

@@ -0,0 +1,39 @@
+package com.ym.mec.biz.dal.enums.im;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.microsvc.toolkit.common.enums.ConverterEnum;
+import lombok.Getter;
+
+/**
+ * 群组成员角色
+ */
+@Getter
+public enum EImGroupRoleType implements ConverterEnum<String> {
+
+    Owner("群主"),
+    Admin("管理员"),
+    Member("群成员"),
+    ;
+
+    private final String msg;
+
+    @EnumValue
+    private final String code;
+
+    EImGroupRoleType(String msg) {
+        this.msg = msg;
+
+        this.code = this.name();
+    }
+
+    // ClientType -> EImGroupRoleType
+    public static EImGroupRoleType fromClientType(String clientType) {
+        switch (clientType) {
+            case "TEACHER":
+                return Admin;
+            case "STUDENT":
+            default:
+                return Member;
+        }
+    }
+}

+ 6 - 14
mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupMemberQueryInfo.java

@@ -2,7 +2,9 @@ package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
+@Data
 public class GroupMemberQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "群编号")
@@ -11,19 +13,9 @@ public class GroupMemberQueryInfo extends QueryInfo {
     @ApiModelProperty(value = "角色")
     private String roleType;
 
-    public String getRoleType() {
-        return roleType;
-    }
+    @ApiModelProperty("群禁言状态")
+    private Boolean groupMute;
 
-    public void setRoleType(String roleType) {
-        this.roleType = roleType;
-    }
-
-    public String getImGroupId() {
-        return imGroupId;
-    }
-
-    public void setImGroupId(String imGroupId) {
-        this.imGroupId = imGroupId;
-    }
+    @ApiModelProperty("群成员身份")
+    private String groupRoleType;
 }

+ 55 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupMemberWrapper.java

@@ -2,11 +2,16 @@ package com.ym.mec.biz.dal.wrapper;
 
 import com.alibaba.fastjson.JSON;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.webportal.validation.annotation.EnumValidation;
+import com.ym.mec.biz.dal.enums.im.EImGroupRoleType;
 import com.ym.mec.common.tenant.TenantContextHolder;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 import java.util.Optional;
 
 import lombok.AllArgsConstructor;
@@ -15,6 +20,9 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 /**
  * 群成员表
  * 2023-08-29 17:18:04
@@ -141,4 +149,51 @@ public class ImGroupMemberWrapper {
         }
     }
 
+    @Data
+    @ApiModel(" GroupMemberMute-群成员禁言")
+    public static class GroupMemberMute implements Serializable {
+
+        @ApiModelProperty(value = "群ID",required = true)
+        private String groupId;
+
+        @ApiModelProperty("禁言时长(分钟), 0取消禁方;不能小于0")
+        private Integer muteTime;
+
+        @ApiModelProperty("群禁言状态")
+        private Boolean groupMute;
+
+        @ApiModelProperty("群成员ID")
+        private List<String> userIds;
+
+        public Integer getMuteTime() {
+            // 禁言时长不能小于0,最小为1分钟
+            if (Objects.nonNull(muteTime) && muteTime < 0) {
+                return 1;
+            }
+            return Optional.ofNullable(muteTime).orElse(0);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+
+    @Data
+    @ApiModel(" GroupMemberMute-群成员角色")
+    public static class GroupMemberRole implements Serializable {
+
+        @ApiModelProperty(value = "群ID",required = true)
+        private String groupId;
+
+        @ApiModelProperty("群成员身份")
+        private EImGroupRoleType groupRoleType;
+
+        @ApiModelProperty("群成员ID")
+        private List<String> userIds;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+    }
+
 }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupWrapper.java

@@ -7,7 +7,10 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
@@ -143,4 +146,33 @@ public class ImGroupWrapper {
         }
 
     }
+
+    @Data
+    @ApiModel(" GroupMuteAll-群组禁言")
+    public static class GroupMuteAll implements Serializable {
+
+        @ApiModelProperty(value = "群ID",required = true)
+        private String groupId;
+
+        @ApiModelProperty(value = "是否禁言",required = true)
+        private Boolean muteAll;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("配置信息")
+    public static class ConfigJson implements Serializable {
+
+        @ApiModelProperty("群聊禁言(1:禁言,管理员可以发言,0:不禁言)")
+        private Boolean mute = false;
+
+        public static ConfigJson from(String json) {
+            if (StringUtils.isBlank(json)) {
+                return new ConfigJson();
+            }
+            return JSON.parseObject(json, ConfigJson.class);
+        }
+    }
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.entity.ImGroupMember;
 import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
@@ -102,4 +103,10 @@ public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
 	PageInfo<ImGroupMemberDto> queryGroupMemberPage(GroupMemberQueryInfo queryInfo);
 
 	void batchJoin(String imGroupId, String userId, String roleType);
+
+	// 群成员禁言
+    void groupMemberMute(ImGroupMemberWrapper.GroupMemberMute member);
+
+	// 群成员身份设置
+	void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member);
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java

@@ -225,6 +225,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 
     void deleteGroup();
 
-    @Transactional(rollbackFor = Exception.class)
     void delGroup(String imGroupId);
+
+    void muteAll(ImGroupWrapper.GroupMuteAll groupMuteAll);
 }

+ 61 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java

@@ -3,12 +3,12 @@ package com.ym.mec.biz.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.im.ImPluginContext;
+import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.microsvc.toolkit.middleware.im.impl.RongCloudImPlugin;
 import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
-import com.ym.mec.biz.dal.dto.im.BasicUserInfo;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.page.GroupMemberQueryInfo;
@@ -73,7 +73,7 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		return imGroupMemberDao;
 	}
 
-	public ImGroup joinGroup(String imGroupId, Integer userId, String roleType, boolean isAdmin,Map<Integer,String> userRoleMap){
+	public void joinGroup(String imGroupId, Integer userId, String roleType, boolean isAdmin, Map<Integer,String> userRoleMap){
 		int groupId = Integer.parseInt(imGroupId);
 		ClassGroup classGroup = classGroupDao.get(groupId);
 		String tags = classGroup.getName();
@@ -125,7 +125,6 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 			join(imGroupId,userId,roleType,isAdmin);
 		}
 		join(imGroupId,userRoleMap);
-		return imGroup;
 	}
 
 	@Override
@@ -520,4 +519,63 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 		userIds.stream().forEach(e->userRoleMap.put(e,roleType));
 		this.join(imGroupId,userRoleMap);
 	}
+
+    @Override
+	@Transactional(rollbackFor = Exception.class)
+    public void groupMemberMute(ImGroupMemberWrapper.GroupMemberMute member) {
+		try {
+			// 更新群成员禁言状态
+			imGroupMemberDao.updateGroupMemberMute(member.getGroupId(), member.getUserIds(), member.getGroupMute());
+			ImPluginService pluginService = imPluginContext.getPluginService();
+			if (member.getGroupMute()) {
+				// 群成员禁言
+				pluginService.groupUserGagCreate(member.getUserIds(), member.getGroupId(), member.getMuteTime().longValue());
+			} else {
+				// 群成员解除禁言
+				pluginService.groupUserGagRemove(member.getUserIds(), member.getGroupId());
+			}
+
+		} catch (Exception e) {
+			log.error("群成员禁言失败", e);
+			throw com.microsvc.toolkit.common.webportal.exception.BizException.from("群成员禁言失败,请联系管理员!");
+		}
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void groupMemberRole(ImGroupMemberWrapper.GroupMemberRole member) {
+		try {
+			// 更新群成员角色
+			imGroupMemberDao.batchUpdateGroupMemberRole(member.getGroupId(), member.getUserIds(), member.getGroupRoleType().getCode());
+
+			for (List<String> items : Lists.partition(member.getUserIds(), 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 com.microsvc.toolkit.common.webportal.exception.BizException.from("群成员身份更新异常,请联系管理员!");
+					}
+				});
+			}
+
+		} catch (Exception e) {
+			log.error("群成员身份更新异常", e);
+			throw com.microsvc.toolkit.common.webportal.exception.BizException.from("群成员身份更新异常,请联系管理员!");
+		}
+	}
 }

+ 26 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -1907,6 +1907,32 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void muteAll(ImGroupWrapper.GroupMuteAll groupMute) {
+        // 更新群组禁言状态
+        ImGroup imGroup = imGroupService.get(groupMute.getGroupId());
+        if (imGroup == null) {
+            throw new BizException("群组不存在");
+        }
+        ImGroupWrapper.ConfigJson from = ImGroupWrapper.ConfigJson.from(imGroup.getConfigJson());
+        from.setMute(groupMute.getMuteAll());
+        imGroup.setConfigJson(JSON.toJSONString(from));
+        imGroupService.update(imGroup);
+
+        // 调用IM接口
+        try {
+            if (Boolean.TRUE.equals(groupMute.getMuteAll())) {
+                imPluginContext.getPluginService().groupBanCreate(groupMute.getGroupId());
+            } else {
+                imPluginContext.getPluginService().groupBanRemove(groupMute.getGroupId());
+            }
+        } catch (Exception e) {
+            log.error("群组禁言状态修改失败", e);
+            throw new BizException("群组禁言状态修改失败");
+        }
+    }
+
     private TencentRequest.MessageBody getTimGifElem(String remoteUr,int size,int width,int height) {
         if (StringUtils.isEmpty(remoteUr) && size == 0 && width == 0 && height == 0) {
             return null;

+ 18 - 0
mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -153,6 +153,12 @@
 			<if test="imGroupId != null and imGroupId != ''">
 				AND igm.im_group_id_ = #{imGroupId}
 			</if>
+			<if test="groupRoleType != null and groupRoleType != ''">
+				AND igm.group_role_type_ = #{groupRoleType}
+			</if>
+			<if test="groupMute != null">
+				AND igm.mute_flag_ = #{groupMute}
+			</if>
 			<if test="roleType != null and roleType != ''">
 				<if test="roleType == '学员'">
 					AND (igm.role_type_ IS NULL OR igm.role_type_ = '')
@@ -200,6 +206,18 @@
 	<update id="updateAdmin">
         UPDATE im_group_member SET is_admin_ = 1 WHERE im_group_id_ = #{imGroupId} and user_id_ = #{userId}
     </update>
+    <update id="updateGroupMemberMute">
+		UPDATE im_group_member SET mute_flag_ = #{groupMute} WHERE im_group_id_ = #{groupId} and user_id_ IN
+		<foreach collection="userIds" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
+	<update id="batchUpdateGroupMemberRole">
+		UPDATE im_group_member SET group_role_Type_ = #{groupRoleType} WHERE im_group_id_ = #{groupId} and user_id_ IN
+		<foreach collection="userIds" item="item" open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</update>
 
 	<select id="queryOneByGroupIdAndNotUser" resultMap="ImGroupMember">
         SELECT * FROM im_group_member WHERE im_group_id_ = #{imGroupId} AND user_id_ != #{userId} LIMIT 1

+ 1 - 0
pom.xml

@@ -25,6 +25,7 @@
 		<docker.host>http://127.0.0.1:2375</docker.host>
 		<docker.registry.repository>127.0.0.1:5000</docker.registry.repository>
 		<docker.maven.plugin.version>1.2.2</docker.maven.plugin.version>
+		<com.microsvc.toolkit.version>1.0.3</com.microsvc.toolkit.version>
 	</properties>
 
 	<dependencyManagement>