Browse Source

Merge branch 'zx_saas_imGroup' of http://git.dayaedu.com/yonge/mec into test

zouxuan 1 year ago
parent
commit
146de88c56
38 changed files with 1090 additions and 339 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. 4 4
      mec-application/src/main/java/com/ym/mec/web/controller/AppVersionInfoController.java
  4. 2 2
      mec-application/src/main/java/com/ym/mec/web/controller/ExportController.java
  5. 18 13
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  6. 57 2
      mec-application/src/main/java/com/ym/mec/web/controller/ImGroupMemberController.java
  7. 1 1
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduCloudStudyController.java
  8. 270 0
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupController.java
  9. 75 0
      mec-application/src/main/java/com/ym/mec/web/controller/education/EduImGroupMemberController.java
  10. 3 0
      mec-application/src/main/resources/logback-spring.xml
  11. 3 0
      mec-auth/mec-auth-server/src/main/resources/logback-spring.xml
  12. 8 8
      mec-biz/pom.xml
  13. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  14. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java
  15. 0 43
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ImGroupMemberDto.java
  16. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  17. 62 86
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  18. 39 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/im/EImGroupRoleType.java
  19. 6 14
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/GroupMemberQueryInfo.java
  20. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentAttendanceQueryInfo.java
  21. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  22. 73 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupMemberWrapper.java
  23. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/ImGroupWrapper.java
  24. 12 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupMemberService.java
  25. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  26. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  27. 4 11
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  28. 90 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupMemberServiceImpl.java
  29. 26 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  30. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java
  31. 111 117
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  32. 23 1
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  33. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  34. 9 1
      mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml
  35. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml
  36. 3 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  37. 2 1
      mec-biz/src/main/resources/config/mybatis/StudentTeacherMapperMapper.xml
  38. 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();
+	}
+}

+ 4 - 4
mec-application/src/main/java/com/ym/mec/web/controller/AppVersionInfoController.java

@@ -47,9 +47,9 @@ public class AppVersionInfoController extends BaseController {
 			if("2.0.9".equals(appVersionInfo.getVersion()) && "android-education".equals(appVersionInfo.getPlatform())){
 				AppVersionInfoBak appVersionInfoBak = JSONObject.parseObject(JSONObject.toJSONString(appVersionInfo),AppVersionInfoBak.class);
 				appVersionInfoBak.setDownloadUrl(new String(appVersionInfo.getDownloadUrl()));
-				if (StringUtils.isEmpty(localVersion)) {
+				/*if (StringUtils.isEmpty(localVersion)) {
 					appVersionInfoBak.setIsForceUpdate(true);
-				}
+				}*/
 				return succeed(appVersionInfoBak);
 			}
 			//如果应用版本跨多个版本时若其中任何一个版本有强制更新,返回字段标记为强制更新
@@ -60,9 +60,9 @@ public class AppVersionInfoController extends BaseController {
 					appVersionInfo.setIsForceUpdate(true);
 				}
 			}
-			if (StringUtils.isEmpty(localVersion)) {
+			/*if (StringUtils.isEmpty(localVersion)) {
 				appVersionInfo.setIsForceUpdate(true);
-			}
+			}*/
 			return succeed(appVersionInfo);
 		}
 		return failed();

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

@@ -2827,10 +2827,10 @@ public class ExportController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学员姓名", "学员编号", "专业", "老师姓名", "老师编号",
-                    "课程组编号","课程组名称", "课程编号", "课程名称", "课程组类型", "课程类型", "上课时间","签到时间", "签退时间", "考勤状态","来源"}, new String[]{
+                    "课程组编号","课程组名称", "课程编号", "课程名称", "课程组类型", "课程类型", "上课时间","签到时间", "签退时间", "考勤状态","是否达标","来源"}, new String[]{
                     "courseSchedule.organization.name", "username", "userId","subjectName", "courseSchedule.teacherName", "teacherId", "musicGroupId", "musicGroupName", "courseScheduleId",
                     "courseSchedule.name", "groupType.desc", "courseSchedule.type.msg", "classTimeStr", "signInTime",
-                    "signOutTime", "status.msg","joinCourseType.msg"}, rows);
+                    "signOutTime", "status.msg","qualifiedFlag == null || qualifiedFlag == 0? '未达标' : '已达标'","joinCourseType.msg"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=courseAttendance-" + DateUtil.getDate(new Date()) + ".xls");

+ 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) {

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

@@ -1,7 +1,10 @@
 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.enums.im.EImGroupRoleType;
 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 +13,71 @@ 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.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
 @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 = "群成员身份初始化")
+	@PostMapping("/groupRoleInit")
+	public HttpResponseResult<Object> groupRoleInit(String groupRoleType) {
+		List<ImGroupMemberWrapper.GroupMemberRole1> memberRoles = imGroupMemberService.getDao().groupRoleInit(groupRoleType);
+		if(CollectionUtils.isNotEmpty(memberRoles)){
+			memberRoles.stream().collect(Collectors.groupingBy(ImGroupMemberWrapper.GroupMemberRole1::getGroupId)).forEach((k,v)->{
+				ImGroupMemberWrapper.GroupMemberRole memberRole = new ImGroupMemberWrapper.GroupMemberRole();
+				memberRole.setGroupId(k);
+				memberRole.setUserIds(v.stream().map(e->e.getUserId().toString()).collect(Collectors.toList()));
+				memberRole.setGroupRoleType(EImGroupRoleType.valueOf(v.get(0).getGroupRoleType()));
+				imGroupMemberService.groupMemberRole1(memberRole);
+			});
+			return succeed();
+		}
+		return failed("没有需要初始化的数据");
+	}
+
+	@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) {

+ 1 - 1
mec-application/src/main/java/com/ym/mec/web/controller/education/EduCloudStudyController.java

@@ -52,7 +52,7 @@ public class EduCloudStudyController extends BaseController {
     @GetMapping("countStudentTrain")
     public HttpResponseResult<PageInfo<CountStudentTrainDataDto>> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo){
         //获取分部下学员列表
-        List<Integer> userIds = studentDao.queryByOrganIds(organizationService.getEmployeeOrgan(null));
+        List<Integer> userIds = studentDao.queryByOrganIds(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         queryInfo.setStudentIdList(userIds);
         return succeed(sysMusicCompareRecordService.countStudentTrain(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();
+	}
+}

+ 3 - 0
mec-application/src/main/resources/logback-spring.xml

@@ -117,6 +117,9 @@
             <appender-ref ref="file"/>
             <appender-ref ref="plumelog"/>
         </root>
+        <Logger name="org.redisson" level="INFO" additivity="false">
+            <appender-ref ref="file" level="INFO" />
+        </Logger>
     </springProfile>
     <!--生产环境:输出到文件 -->
     <springProfile name="pre">

+ 3 - 0
mec-auth/mec-auth-server/src/main/resources/logback-spring.xml

@@ -44,6 +44,9 @@
 			<appender-ref ref="plumelog" />
 			<appender-ref ref="file" />
 		</root>
+		<Logger name="org.redisson" level="INFO" additivity="false">
+			<appender-ref ref="file" level="INFO" />
+		</Logger>
 	</springProfile>
 	<!--生产环境:输出到文件 -->
 	<springProfile name="pre">

+ 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>

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

@@ -5,6 +5,7 @@ import java.util.Map;
 import java.util.Set;
 
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
+import com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import com.ym.mec.biz.dal.entity.ImGroupMember;
@@ -60,4 +61,10 @@ 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);
+
+    List<ImGroupMemberWrapper.GroupMemberRole1> groupRoleInit(@Param("groupRoleType") String groupRoleType);
 }

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentExtracurricularExercisesSituationDao.java

@@ -166,7 +166,8 @@ public interface StudentExtracurricularExercisesSituationDao extends BaseDAO<Lon
 
     List<Long> queryCourseIdByClassDate(@Param("firstDayOfMonth") Date firstDayOfMonth,
                                        @Param("lastDayOfMonth") Date lastDayOfMonth,
-                                       @Param("teacherId") Integer teacherId);
+                                       @Param("teacherId") Integer teacherId,
+                                        @Param("musicGroupIds") List<String> musicGroupIds);
 
     /**
      * 统计服务周期内可布置的作业和训练数量

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

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentAttendanceQueryInfo.java

@@ -61,4 +61,7 @@ public class StudentAttendanceQueryInfo extends QueryInfo {
     private Boolean visitFlag;
 
     private Boolean orderFlag;
+
+    @ApiModelProperty(value = "是否达标1是0否")
+    private Boolean qualifiedFlag;
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java

@@ -19,6 +19,8 @@ public class StudentQueryInfo extends QueryInfo {
 
     private Integer organId;
 
+    private String organIds;
+
     private List<String> organIdList;
 
     private String cloudStudyUseTime;
@@ -29,6 +31,14 @@ public class StudentQueryInfo extends QueryInfo {
     
     private Date cloudTeacherTrainEndDate;
 
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+    }
+
     public String getGroupType() {
         return groupType;
     }

+ 73 - 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,69 @@ 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);
+        }
+    }
+
+    @Data
+    @ApiModel(" GroupMemberMute-群成员角色")
+    public static class GroupMemberRole1 implements Serializable {
+
+        @ApiModelProperty(value = "群ID",required = true)
+        private String groupId;
+
+        @ApiModelProperty("群成员身份")
+        private String groupRoleType;
+
+        @ApiModelProperty("群成员ID")
+        private Integer userId;
+
+        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);
+        }
+    }
 }

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

@@ -1,10 +1,12 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
 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;
 
@@ -13,6 +15,8 @@ import java.util.Map;
 
 public interface ImGroupMemberService extends BaseService<Long, ImGroupMember> {
 
+	ImGroupMemberDao getDao();
+
 	/**
 	 * 加入群组
 	 * @param imGroupId 群编号
@@ -111,4 +115,12 @@ 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);
+
+	void groupMemberRole1(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);
 }

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -127,7 +127,10 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return com.ym.mec.biz.dal.dto.StatDto
      */
     StatDto organStudentData(StudentQueryInfo queryInfo);
-    StatDto exportOrganStudentData(StudentQueryInfo queryInfo);
+
+    int countOrganStudentData(Map<String, Object> params);
+
+    List<EduOrganStudentListExportDto> exportOrganStudentData(Map<String, Object> params);
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 

+ 4 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -1241,19 +1241,12 @@ public class ExportServiceImpl implements ExportService {
     //分部云教练学员训练数据导出
     @Override
     public List cloudStudyStudentTrainData(Map<String, Object> info) {
-        StudentQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentQueryInfo.class);
-        List<EduOrganStudentListExportDto> rows = ((PageInfo<EduOrganStudentListExportDto>) studentService.exportOrganStudentData(queryInfo).getDetail()).getRows();
-        if (CollectionUtils.isEmpty(rows)) {
+        info.put("tenantId", TenantContextHolder.getTenantId());
+        int count = studentService.countOrganStudentData(info);
+        if (count <= 0) {
             throw new BizException("没有可导出的记录");
         }
-        List<Integer> userIds = rows.stream().map(EduOrganStudentListExportDto::getStudentId).collect(Collectors.toList());
-        Map<Integer,String> teacherMapper = MapUtil.convertMybatisMap(studentTeacherMapperDao.queryTeacherMapper(userIds,"NORMAL"));
-        for (EduOrganStudentListExportDto row : rows) {
-            row.setCloudStudyUseTime(Math.round(row.getCloudStudyUseTime()));
-            row.setCloudStudyUseAvgTime(Math.round(row.getCloudStudyUseAvgTime()));
-            row.setSubjectTeacherName(teacherMapper.get(row.getStudentId()));
-        }
-        return rows;
+        return studentService.exportOrganStudentData(info);
     }
 
     //分部云教练学员数据详情导出

+ 90 - 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,11 @@ public class ImGroupMemberServiceImpl extends BaseServiceImpl<Long, ImGroupMembe
 			join(imGroupId,userId,roleType,isAdmin);
 		}
 		join(imGroupId,userRoleMap);
-		return imGroup;
+	}
+
+	@Override
+	public ImGroupMemberDao getDao() {
+		return imGroupMemberDao;
 	}
 
 	@Override
@@ -527,4 +531,87 @@ 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("群成员身份更新异常,请联系管理员!");
+		}
+	}
+
+	@Override
+	public void groupMemberRole1(ImGroupMemberWrapper.GroupMemberRole member) {
+		ImPluginService pluginService = imPluginContext.getPluginService();
+		try {
+			for (String userId : member.getUserIds()) {
+				switch (member.getGroupRoleType()) {
+					case Admin:
+						// 设置管理员
+						pluginService.groupAdminCreate(member.getGroupId(), userId);
+						break;
+					case Member:
+						// 取消管理员
+						pluginService.groupAdminRemove(member.getGroupId(), userId);
+						break;
+					default:
+						break;
+				}
+			}
+			imGroupMemberDao.batchUpdateGroupMemberRole(member.getGroupId(), member.getUserIds(), member.getGroupRoleType().getCode());
+		}catch (Exception e) {
+			log.error("群成员身份更新异常", e);
+		}
+	}
 }

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

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentExtracurricularExercisesSituationServiceImpl.java

@@ -434,7 +434,7 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
 			firstDayOfMonth = queryInfo.getStartTime();
 			lastDayOfMonth = queryInfo.getEndTime();
 		}
-		List<Long> courseIds = studentExtracurricularExercisesSituationDao.queryCourseIdByClassDate(firstDayOfMonth,lastDayOfMonth,queryInfo.getTeacherId());
+		List<Long> courseIds = studentExtracurricularExercisesSituationDao.queryCourseIdByClassDate(firstDayOfMonth,lastDayOfMonth,queryInfo.getTeacherId(),null);
 		if(courseIds == null || courseIds.size() == 0){
 			return pageInfo;
 		}
@@ -687,7 +687,7 @@ public class StudentExtracurricularExercisesSituationServiceImpl extends BaseSer
             courseIds.add(queryInfo.getCourseScheduleId().longValue());
         } else {
             courseIds = studentExtracurricularExercisesSituationDao.queryCourseIdByClassDate(firstDayOfMonth,
-                                                    lastDayOfMonth, queryInfo.getTeacherId());
+                                                    lastDayOfMonth, queryInfo.getTeacherId(),queryInfo.getMusicGroupIds());
         }
         if(courseIds == null || courseIds.size() == 0){
             return pageInfo;

+ 111 - 117
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -31,7 +31,6 @@ import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -85,6 +84,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private EmployeeDao employeeDao;
     @Autowired
+    private StudentTeacherMapperDao studentTeacherMapperDao;
+    @Autowired
     private OrganizationService organizationService;
     @Autowired
     private SysUserCashAccountDao sysUserCashAccountDao;
@@ -605,135 +606,128 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
-    public StatDto exportOrganStudentData(StudentQueryInfo queryInfo) {
-        PageInfo<EduOrganStudentListExportDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        Map<String, Object> params = new HashMap<String, Object>();
-        MapUtil.populateMap(params, queryInfo);
+    public int countOrganStudentData(Map<String, Object> params) {
+        return studentDao.countCloudStudyStudentData(params);
+    }
+    @Override
+    public List<EduOrganStudentListExportDto> exportOrganStudentData(Map<String, Object> params) {
+        List<EduOrganStudentListDto> dataList1 = studentDao.queryCloudStudyStudentData(params);
+        List<Integer> studentIds = dataList1.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+        Set<Integer> organIds = dataList1.stream().map(EduOrganStudentListDto::getOrganId).collect(Collectors.toSet());
+        Map<Integer,String> organMap = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
 
-        List<EduOrganStudentListDto> dataList1 = new ArrayList<>();
-        List<EduOrganStudentListExportDto> dataList = new ArrayList<>();
-        int count = studentDao.countCloudStudyStudentData(params);
-        if (count > 0) {
-            pageInfo.setTotal(count);
-            params.put("offset", pageInfo.getOffset());
-            dataList1 = studentDao.queryCloudStudyStudentData(params);
-            List<Integer> studentIds = dataList1.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
-            Set<Integer> organIds = dataList1.stream().map(EduOrganStudentListDto::getOrganId).collect(Collectors.toSet());
-            Map<Integer,String> organMap = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
+        List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
+        Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
 
-            List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
-            Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
+        List<Map<Integer, String>> studentGroupEduMapList = studentRegistrationDao.queryStudentMusicGroupEduMap(studentIds);
+        Map<Integer, String> studentGroupEduMap = MapUtil.convertIntegerMap(studentGroupEduMapList);
 
-            List<Map<Integer, String>> studentGroupEduMapList = studentRegistrationDao.queryStudentMusicGroupEduMap(studentIds);
-            Map<Integer, String> studentGroupEduMap = MapUtil.convertIntegerMap(studentGroupEduMapList);
+        List<Map<Long, BigDecimal>> activeAmountMapList = cloudTeacherOrderDao.queryActiveAmountMap(studentIds);
+        Map<Long, BigDecimal> activeAmountMap = MapUtil.convertIntegerMap(activeAmountMapList);
 
-            List<Map<Long, BigDecimal>> activeAmountMapList = cloudTeacherOrderDao.queryActiveAmountMap(studentIds);
-            Map<Long, BigDecimal> activeAmountMap = MapUtil.convertIntegerMap(activeAmountMapList);
+        Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
 
-            Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
+        List<Map<Integer, String>> studentSchoolNamesMapList = studentDao.getStudentCooperationNameMap(studentIds);
+        Map<Integer, String> studentSchoolNamesMap = MapUtil.convertIntegerMap(studentSchoolNamesMapList);
 
-            List<Map<Integer, String>> studentSchoolNamesMapList = studentDao.getStudentCooperationNameMap(studentIds);
-            Map<Integer, String> studentSchoolNamesMap = MapUtil.convertIntegerMap(studentSchoolNamesMapList);
-
-            List<SysUser> users = employeeDao.getUsers(studentIds);
-            Map<Integer, SysUser> idUserMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(users)){
-                idUserMap = users.stream().collect(Collectors.toMap(SysUser::getId, u -> u, (u1, u2) -> u1));
-            }
-
-            List<Student> students = studentDao.findByStudentIds(studentIds);
-            Map<Integer, Student> idStudentMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(students)){
-                idStudentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s->s, (s1, s2)->s1));
-            }
-
-            List<Map<Integer, Integer>> studentNotStartCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, null);
-            Map<Integer, Long> studentNotStartCourseNumMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(studentNotStartCourseNumMapList)){
-                studentNotStartCourseNumMap = MapUtil.convertIntegerMap(studentNotStartCourseNumMapList);
-            }
-            List<Map<Integer, Integer>> studentNotStartVipCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.VIP);
-            Map<Integer, Long> studentNotStartVipCourseNumMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(studentNotStartVipCourseNumMapList)){
-                studentNotStartVipCourseNumMap = MapUtil.convertIntegerMap(studentNotStartVipCourseNumMapList);
-            }
-            List<Map<Integer, Integer>> studentNotStartPracticeCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.PRACTICE);
-            Map<Integer, Long> studentNotStartPracticeCourseNumMap = new HashMap<>();
-            if(!CollectionUtils.isEmpty(studentNotStartPracticeCourseNumMapList)){
-                studentNotStartPracticeCourseNumMap = MapUtil.convertIntegerMap(studentNotStartPracticeCourseNumMapList);
-            }
-            Map<Integer, String> subjectMap = subjectService.getMap("subject", "id_", "name_", false, 1, Integer.class, String.class);
-            //获取分部年级列表
-            Map<Integer, String> gradeList = organizationService.getGradeList(1);
-            for (EduOrganStudentListDto eduOrganStudentListDto : dataList1) {
-                EduOrganStudentListExportDto data = JSON.parseObject(JSON.toJSONString(eduOrganStudentListDto),EduOrganStudentListExportDto.class);
-                data.setOrganName(organMap.get(data.getOrganId()));
-                data.setSubjectName(subjectMap.get(data.getSubjectId()));
-                if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentGradeNum())) {
-                    data.setCurrentGradeNum(eduOrganStudentListDto.getCurrentGradeNum());
-                    String grade = gradeList.get(Integer.parseInt(eduOrganStudentListDto.getCurrentGradeNum()));
-                    if (StringUtils.isNotEmpty(grade)) {
-                        data.setCurrentGradeNum(grade);
-                    }
-                }
-                if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentClass())) {
-                    data.setCurrentClass(eduOrganStudentListDto.getCurrentClass());
-                }
-                if(activeAmountMap.containsKey(data.getStudentId().longValue())){
-                    data.setActiveAmount(activeAmountMap.get(data.getStudentId().longValue()));
-                }
-                if(studentGroupEduMap.containsKey(data.getStudentId())){
-                    data.setEducationName(studentGroupEduMap.get(data.getStudentId()));
-                }
-                if(studentGroupNamesMap.containsKey(data.getStudentId())){
-                    data.setMusicGroupNames(studentGroupNamesMap.get(data.getStudentId()));
-                }
-                if(studentSchoolNamesMap.containsKey(data.getStudentId())){
-                    data.setSchoolNames(studentSchoolNamesMap.get(data.getStudentId()));
-                }
-                if(hasVipCourseStudentIds.contains(data.getStudentId())){
-                    data.setHasVipGroup(1);
-                }
-                if(data.getCloudStudyUseNum()>0 && data.getCloudStudyUseTime()>0){
-                    data.setCloudStudyUseAvgTime(data.getCloudStudyUseTime()/data.getCloudStudyUseNum());
-                }
-                data.setCloudStudyUseTime(data.getCloudStudyUseTime()/60);
-                data.setCloudStudyUseAvgTime(data.getCloudStudyUseAvgTime()/60);
+        List<SysUser> users = employeeDao.getUsers(studentIds);
+        Map<Integer, SysUser> idUserMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(users)){
+            idUserMap = users.stream().collect(Collectors.toMap(SysUser::getId, u -> u, (u1, u2) -> u1));
+        }
 
-                if(idUserMap.containsKey(eduOrganStudentListDto.getStudentId())){
-                    SysUser sysUser = idUserMap.get(data.getStudentId());
-                    data.setPhone(sysUser.getPhone());
-                    data.setEnable(StringUtils.isNotBlank(sysUser.getPassword()));
+        List<Student> students = studentDao.findByStudentIds(studentIds);
+        Map<Integer, Student> idStudentMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(students)){
+            idStudentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s->s, (s1, s2)->s1));
+        }
+
+        List<Map<Integer, Integer>> studentNotStartCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, null);
+        Map<Integer, Long> studentNotStartCourseNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(studentNotStartCourseNumMapList)){
+            studentNotStartCourseNumMap = MapUtil.convertIntegerMap(studentNotStartCourseNumMapList);
+        }
+        List<Map<Integer, Integer>> studentNotStartVipCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.VIP);
+        Map<Integer, Long> studentNotStartVipCourseNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(studentNotStartVipCourseNumMapList)){
+            studentNotStartVipCourseNumMap = MapUtil.convertIntegerMap(studentNotStartVipCourseNumMapList);
+        }
+        List<Map<Integer, Integer>> studentNotStartPracticeCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.PRACTICE);
+        Map<Integer, Long> studentNotStartPracticeCourseNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(studentNotStartPracticeCourseNumMapList)){
+            studentNotStartPracticeCourseNumMap = MapUtil.convertIntegerMap(studentNotStartPracticeCourseNumMapList);
+        }
+        Map<Integer, String> subjectMap = subjectService.getMap("subject", "id_", "name_", false, 1, Integer.class, String.class);
+        //获取分部年级列表
+        Map<Integer, String> gradeList = organizationService.getGradeList(1);
+        //获取学员指导老师
+        Map<Integer,String> teacherMapper = MapUtil.convertMybatisMap(studentTeacherMapperDao.queryTeacherMapper(studentIds,"NORMAL"));
+        List<EduOrganStudentListExportDto> dataList = new ArrayList<>();
+        for (EduOrganStudentListDto eduOrganStudentListDto : dataList1) {
+            EduOrganStudentListExportDto data = JSON.parseObject(JSON.toJSONString(eduOrganStudentListDto),EduOrganStudentListExportDto.class);
+            data.setOrganName(organMap.get(data.getOrganId()));
+            data.setSubjectName(subjectMap.get(data.getSubjectId()));
+            if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentGradeNum())) {
+                data.setCurrentGradeNum(eduOrganStudentListDto.getCurrentGradeNum());
+                String grade = gradeList.get(Integer.parseInt(eduOrganStudentListDto.getCurrentGradeNum()));
+                if (StringUtils.isNotEmpty(grade)) {
+                    data.setCurrentGradeNum(grade);
                 }
+            }
+            if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentClass())) {
+                data.setCurrentClass(eduOrganStudentListDto.getCurrentClass());
+            }
+            if(activeAmountMap.containsKey(data.getStudentId().longValue())){
+                data.setActiveAmount(activeAmountMap.get(data.getStudentId().longValue()));
+            }
+            if(studentGroupEduMap.containsKey(data.getStudentId())){
+                data.setEducationName(studentGroupEduMap.get(data.getStudentId()));
+            }
+            if(studentGroupNamesMap.containsKey(data.getStudentId())){
+                data.setMusicGroupNames(studentGroupNamesMap.get(data.getStudentId()));
+            }
+            if(studentSchoolNamesMap.containsKey(data.getStudentId())){
+                data.setSchoolNames(studentSchoolNamesMap.get(data.getStudentId()));
+            }
+            if(hasVipCourseStudentIds.contains(data.getStudentId())){
+                data.setHasVipGroup(1);
+            }
+            if(data.getCloudStudyUseNum()>0 && data.getCloudStudyUseTime()>0){
+                data.setCloudStudyUseAvgTime(data.getCloudStudyUseTime()/data.getCloudStudyUseNum());
+            }
+            data.setCloudStudyUseTime(data.getCloudStudyUseTime()/60);
+            data.setCloudStudyUseAvgTime(data.getCloudStudyUseAvgTime()/60);
 
-                if(idStudentMap.containsKey(data.getStudentId())){
-                    Student student = idStudentMap.get(data.getStudentId());
-                    data.setNewUser(student.getIsNewUser());
-                    data.setServiceTag(Objects.isNull(student.getServiceTag())?0:student.getServiceTag());
-                    data.setOperatingTag(Objects.isNull(student.getOperatingTag())?0:student.getOperatingTag());
-                    data.setCarePackage(Objects.nonNull(student.getCarePackage())?student.getCarePackage():0);
-                    data.setComeOnPackage(Objects.isNull(student.getComeOnPackage())?0:student.getComeOnPackage());
-                }
+            if(idUserMap.containsKey(eduOrganStudentListDto.getStudentId())){
+                SysUser sysUser = idUserMap.get(data.getStudentId());
+                data.setPhone(sysUser.getPhone());
+                data.setEnable(StringUtils.isNotBlank(sysUser.getPassword()));
+            }
 
-                if(studentNotStartCourseNumMap.containsKey(data.getStudentId())){
-                    data.setNotStartCourseNum(studentNotStartCourseNumMap.get(data.getStudentId()).intValue());
-                }
-                if(studentNotStartVipCourseNumMap.containsKey(data.getStudentId())){
-                    data.setNotStartVipCourseNum(studentNotStartVipCourseNumMap.get(data.getStudentId()).intValue());
-                }
-                if(studentNotStartPracticeCourseNumMap.containsKey(data.getStudentId())){
-                    data.setNotStartPracticeCourseNum(studentNotStartPracticeCourseNumMap.get(data.getStudentId()).intValue());
-                }
+            if(idStudentMap.containsKey(data.getStudentId())){
+                Student student = idStudentMap.get(data.getStudentId());
+                data.setNewUser(student.getIsNewUser());
+                data.setServiceTag(Objects.isNull(student.getServiceTag())?0:student.getServiceTag());
+                data.setOperatingTag(Objects.isNull(student.getOperatingTag())?0:student.getOperatingTag());
+                data.setCarePackage(Objects.nonNull(student.getCarePackage())?student.getCarePackage():0);
+                data.setComeOnPackage(Objects.isNull(student.getComeOnPackage())?0:student.getComeOnPackage());
+            }
 
-                dataList.add(data);
+            if(studentNotStartCourseNumMap.containsKey(data.getStudentId())){
+                data.setNotStartCourseNum(studentNotStartCourseNumMap.get(data.getStudentId()).intValue());
+            }
+            if(studentNotStartVipCourseNumMap.containsKey(data.getStudentId())){
+                data.setNotStartVipCourseNum(studentNotStartVipCourseNumMap.get(data.getStudentId()).intValue());
+            }
+            if(studentNotStartPracticeCourseNumMap.containsKey(data.getStudentId())){
+                data.setNotStartPracticeCourseNum(studentNotStartPracticeCourseNumMap.get(data.getStudentId()).intValue());
             }
+            data.setCloudStudyUseTime(Math.round(data.getCloudStudyUseTime()));
+            data.setCloudStudyUseAvgTime(Math.round(data.getCloudStudyUseAvgTime()));
+            data.setSubjectTeacherName(teacherMapper.get(data.getStudentId()));
+            dataList.add(data);
         }
-        pageInfo.setRows(dataList);
-
-        StatDto result = new StatDto();
-        result.setDetail(pageInfo);
-
-        return result;
+        return dataList;
     }
 
     @Override

+ 23 - 1
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},init_flag_ = 1 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
@@ -211,8 +229,12 @@
             #{item}
         </foreach>
     </select>
+    <select id="groupRoleInit" resultType="com.ym.mec.biz.dal.wrapper.ImGroupMemberWrapper$GroupMemberRole1">
+		select im_group_id_ groupId,group_role_type_ groupRoleType,user_id_ userId from im_group_member
+		where group_role_type_ = #{groupRoleType} AND init_flag_ = 0 order by id_ DESC
+	</select>
 
-	<delete id="delByImGroupAndUserId">
+    <delete id="delByImGroupAndUserId">
         DELETE FROM im_group_member WHERE im_group_id_ = #{imGroupId} AND user_id_ in
         <foreach collection="userIds" close=")" open="(" separator="," item="item">
             #{item}

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -949,7 +949,7 @@
         SELECT mg.id_ musicGroupId,o.name_ organName,mg.name_ musicGroupName,mg.status_ musicGroupStatus,mg.course_view_type_ courseViewType FROM
         music_group mg
         LEFT JOIN organization o ON mg.organ_id_ = o.id_
-        WHERE status_ IN ('PRE_APPLY','PRE_BUILD_FEE','FEE_AUDIT','APPLY','PAY') and mg.tenant_id_ = #{tenantId}
+        WHERE status_ IN ('PRE_APPLY','PRE_BUILD_FEE','FEE_AUDIT','APPLY','PAY') and mg.tenant_id_ = #{tenantId} AND mg.del_flag_ = 0
         <if test="organId != null">
             AND FIND_IN_SET(mg.organ_id_,#{organId})
         </if>

+ 9 - 1
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -477,7 +477,7 @@
     </select>
     
     <select id="findStudentAttendance" resultMap="StudentAttendance">
-        SELECT cssp.id_,cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,
+        SELECT cssp.id_,cssp.course_schedule_id_,cssp.user_id_,cssp.group_type_,cssp.music_group_id_,sa.sign_in_time_,sa.sign_out_time_,sa.qualified_flag_,
                CASE WHEN sa.status_ IS NULL and cs.status_ = 'OVER' THEN 'TRUANT' ELSE sa.status_ END status_,
         cs.teach_mode_,cs.type_ course_type_,o.name_ organ_name_,
         cs.name_ course_schedule_name_,cs.status_ course_status_,
@@ -510,6 +510,14 @@
                     AND (sa.visit_flag_ = 0 OR sa.visit_flag_ IS NULL)
                 </if>
             </if>
+            <if test="qualifiedFlag != null">
+                <if test="qualifiedFlag == 1">
+                    AND sa.qualified_flag_ = 1
+                </if>
+                <if test="qualifiedFlag == 0">
+                    AND (sa.qualified_flag_ = 0 OR sa.qualified_flag_ IS NULL)
+                </if>
+            </if>
             <if test="courseScheduleId != null">
                 AND cssp.course_schedule_id_ = #{courseScheduleId}
             </if>

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/StudentExtracurricularExercisesSituationMapper.xml

@@ -836,6 +836,12 @@
         left join lesson_examination le on le.course_schedule_id_ = csts.course_schedule_id_
         WHERE FIND_IN_SET(cs.id_, se.course_ids_) and le.id_ is null
         AND se.serve_type_ = 'HOMEWORK'
+        <if test="musicGroupIds != null and musicGroupIds.size > 0">
+            AND cs.music_group_id_ IN
+            <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+                #{musicGroupId}
+            </foreach>
+        </if>
         <if test="teacherId != null">
             AND csts.user_id_ = #{teacherId}
         </if>

+ 3 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -795,6 +795,9 @@
             <if test="organId!=null">
                 AND su.organ_id_=#{organId}
             </if>
+            <if test="organIds != null and organIds != ''">
+                AND FIND_IN_SET(su.organ_id_,#{organIds})
+            </if>
             <if test="search!=null and search!=''">
                 AND (t.user_id_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
             </if>

+ 2 - 1
mec-biz/src/main/resources/config/mybatis/StudentTeacherMapperMapper.xml

@@ -33,7 +33,8 @@
 		select distinct cgsm.user_id_ student_id_,cgtm.user_id_ teacher_id_,cg.type_ teacher_type_ from class_group cg
 		left join class_group_teacher_mapper cgtm ON cg.id_ = cgtm.class_group_id_
 		left join class_group_student_mapper cgsm ON cgsm.class_group_id_ = cg.id_
-		where cg.del_flag_ = 0 AND cg.type_ IN ('MIX','NORMAL') AND cgsm.status_ != 'QUIT';
+		left join music_group mg ON mg.id_ = cg.music_group_id_
+		where cg.del_flag_ = 0 AND cg.type_ IN ('MIX','NORMAL') AND mg.status_ = 'PROGRESS' AND cgsm.status_ != 'QUIT';
 	</insert>
 	<insert id="batchInsert">
 		insert into student_teacher_mapper (student_id_, teacher_id_, teacher_type_) VALUE

+ 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>