Ver código fonte

Merge remote-tracking branch 'origin/master_saas' into master_saas

zouxuan 2 anos atrás
pai
commit
b17a8a1cb9
22 arquivos alterados com 504 adições e 76 exclusões
  1. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ClassGroupTeacherMapperDao.java
  2. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/ImGroupMemberDao.java
  4. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java
  5. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/MusicGroupQuitDetailDto.java
  6. 18 2
      mec-biz/src/main/java/com/ym/mec/biz/service/ImGroupService.java
  7. 72 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  8. 197 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java
  9. 66 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupQuitServiceImpl.java
  11. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  12. 9 9
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java
  13. 9 0
      mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml
  14. 3 0
      mec-biz/src/main/resources/config/mybatis/ImGroupMapper.xml
  15. 20 4
      mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml
  16. 1 1
      mec-biz/src/main/resources/config/mybatis/ImGroupNoticeMapper.xml
  17. 1 1
      mec-biz/src/main/resources/config/mybatis/SubjectMapper.xml
  18. 38 0
      mec-im/src/main/java/com/ym/service/Impl/RoomMemberServiceImpl.java
  19. 12 3
      mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java
  20. 15 0
      mec-im/src/main/java/com/ym/service/RoomMemberService.java
  21. 2 2
      mec-web/src/main/java/com/ym/mec/web/controller/ImGroupController.java
  22. 4 4
      mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java

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

@@ -161,4 +161,11 @@ public interface ClassGroupTeacherMapperDao extends BaseDAO<Long, ClassGroupTeac
                                                @Param("groupType") GroupType groupType);
 
     List<Integer> queryClassIdByTeacher(@Param("groupType") GroupType groupType, @Param("mainTeacherUserId") Integer mainTeacherUserId);
+
+    /**
+     * 根据班乐团ID查询班级老师关联关系
+     *
+     * @param musicGroupIds 乐团编号
+     */
+    List<ClassGroupTeacherMapper> findAllByMusicGroupIds(@Param("musicGroupIds") List<String> musicGroupIds);
 }

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

@@ -28,9 +28,10 @@ public interface ImGroupDao extends BaseDAO<String, ImGroup> {
      * 查询群成员列表
      *
      * @param imGroupId
+     * @param search
      * @return
      */
-    List<ImGroupMemberDto> queryMemberById(String imGroupId);
+    List<ImGroupMemberDto> queryMemberById(@Param("imGroupId") String imGroupId, @Param("search") String search);
 
     ImGroupMemberDto queryMember(@Param("imGroupId") String imGroupId, @Param("userId") Integer userId);
 

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

@@ -58,4 +58,6 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
     ImGroupMember queryOneByGroupIdAndNotUser(@Param("imGroupId") String imGroupId, @Param("userId") Long userId);
 
     List<ImGroupMember> getByGroupId(@Param("musicGroupIds") List<String> musicGroupId);
+
+    void delByImGroupAndUserId(@Param("imGroupId") String imGroupId, @Param("userIds") List<Integer> userIds);
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroupMember.java

@@ -29,6 +29,10 @@ public class ImGroupMember extends BaseEntity {
 	/** 群角色 */
 	private String roleType;
 
+
+    /** 群角色 */
+    private String type;
+
 	private Integer memberRankSettingId;
 
 	private String subjectName;
@@ -41,6 +45,16 @@ public class ImGroupMember extends BaseEntity {
 	/**  */
 	private java.util.Date updateTime;
 
+
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
 	public String getSubjectId() {
 		return subjectId;
 	}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/MusicGroupQuitDetailDto.java

@@ -18,4 +18,6 @@ public class MusicGroupQuitDetailDto extends MusicGroupQuitPageDto{
 
     @ApiModelProperty(value = "学员编号",required = true)
     private MusicGroupQuit.ReasonEnum reasonEnum;
+
+    private String musicGroupName;
 }

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
@@ -57,6 +58,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
 	 * @return
 	 */
 	List<ImGroupMemberDto> queryMemberById(String imGroupId);
+	List<ImGroupMemberDto> queryMemberById(String imGroupId,String search);
 
 	/**
 	 * 查询指定用户在群众的信息
@@ -105,7 +107,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
      *
      * @param userId 用户id
      */
-    void quitSchoolGroup(Long userId);
+    void quitAllGroup(Long userId);
 
     /**
      * 用户加入群
@@ -116,6 +118,12 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
      */
     void addSchoolStaffGroup(Long schoolId, Integer userId,String name,String avatar, ESchoolStaffType leader) throws Exception;
 
+    @Transactional(rollbackFor = Exception.class)
+    void addSchoolGroup(Long schoolId, List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers);
+
+    @Transactional(rollbackFor = Exception.class)
+    void quitSchoolGroup(Long schoolId, List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers);
+
     /**
      * 群主移交
      * @param userId 用户id
@@ -131,7 +139,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
      * @param user          用户信息
      * @param userType
      */
-    void addImGroup(List<String> musicGroupIds, SysUser user, String roleType);
+    void addImGroup(List<String> musicGroupIds, Long  userId,  String roleType);
 
     /**
      * 查询群组
@@ -148,4 +156,12 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
      * @param userId    用户ID
      */
     void quitGroup(List<String> imGroupIds, Integer userId);
+
+    /**
+     * 学校人员加入群组
+     *
+     * @param cooperationOrganId 合作机构id
+     * @param imGroupId 群组id
+     */
+    void schoolJoinGroup(Integer cooperationOrganId, String imGroupId);
 }

+ 72 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -301,10 +302,63 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             imGroupService.create(classGroup.getId().toString(), null, classGroup.getName(), musicGroup.getName(),
                     musicGroup.getName(), musicGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
+            // 学校加入班级群
+            if (musicGroup.getCooperationOrganId() != null) {
+                imGroupService.schoolJoinGroup(musicGroup.getCooperationOrganId(), classGroup.getId().toString());
+            }
         }
+
+        addSchoolGroup(classGroup.getTeacherMapperList(),classGroup.getMusicGroupId());
         return classGroup.getId();
     }
 
+    private void addSchoolGroup(List<ClassGroupTeacherMapper> teacherMapperList, String musicGroupId) {
+        if (teacherMapperList == null || teacherMapperList.size() == 0) {
+            return;
+        }
+        // 加入到学校群
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup != null && musicGroup.getCooperationOrganId() != null) {
+
+            List<ImGroupMemberWrapper.ImGroupMember > imGroupMemberList = new ArrayList<>();
+            for (ClassGroupTeacherMapper classGroupTeacherMapper : teacherMapperList) {
+                ImGroupMemberWrapper.ImGroupMember build = ImGroupMemberWrapper.ImGroupMember.builder()
+                        .userId(classGroupTeacherMapper.getUserId().longValue())
+                        .roleType(EFriendRoleType.ORCHESTRA_TEACHER.getMsg())
+                        .build();
+                imGroupMemberList.add(build);
+            }
+
+            // 乐团主管加入学校群聊
+            imGroupService.addSchoolGroup(musicGroup.getCooperationOrganId().longValue(), imGroupMemberList);
+
+        }
+    }
+
+
+    private void delSchoolGroup(List<ClassGroupTeacherMapper> teacherMapperList, String musicGroupId) {
+        if (teacherMapperList == null || teacherMapperList.size() == 0) {
+            return;
+        }
+        // 加入到学校群
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+        if (musicGroup != null && musicGroup.getCooperationOrganId() != null) {
+
+            List<ImGroupMemberWrapper.ImGroupMember > imGroupMemberList = new ArrayList<>();
+            for (ClassGroupTeacherMapper classGroupTeacherMapper : teacherMapperList) {
+                ImGroupMemberWrapper.ImGroupMember build = ImGroupMemberWrapper.ImGroupMember.builder()
+                        .userId(classGroupTeacherMapper.getUserId().longValue())
+                        .roleType(EFriendRoleType.ORCHESTRA_TEACHER.getMsg())
+                        .build();
+                imGroupMemberList.add(build);
+            }
+
+            // 乐团主管加入学校群聊
+            imGroupService.quitSchoolGroup(musicGroup.getCooperationOrganId().longValue(), imGroupMemberList);
+
+        }
+    }
+
     @Override
     public List<ClassGroup> findClassGroup4Teacher(Integer teacherId) {
         return classGroupDao.findClassGroup4Teacher(teacherId);
@@ -2473,6 +2527,24 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                 classGroupTeacherMapperService.getDao().insert(tm);
             }
             imUserFriendService.refreshClassImUserFriend(classGroupId);
+            // 通知学校端
+
+
+            for (ClassGroup4MixDto classGroup4MixDto : classGroup4MixDtos) {
+                if (CollectionUtils.isEmpty(classGroup4MixDto.getClassGroupTeacherMapperList())) {
+                    continue;
+                }
+
+                // 原老师退出群聊,新老师加入群聊
+                List<ClassGroupTeacherMapper> classGroupTeachers = classGroupTeacherMapperService.getClassGroupTeachers(classGroup4MixDto.getClassGroupId());
+                if (!CollectionUtils.isEmpty(classGroupTeachers)) {
+                    delSchoolGroup(classGroupTeachers, classGroup4MixDto.getMusicGroupId());
+                }
+                addSchoolGroup(classGroup4MixDto.getClassGroupTeacherMapperList(), classGroup4MixDto.getMusicGroupId());
+
+            }
+
+
             return BaseController.succeed(classGroup);
         }
         if (classGroup4MixDtos.get(0).getCourseTimes().compareTo(0) <= 0) {
@@ -2701,7 +2773,6 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             imUserFriendService.refreshClassImUserFriend(classGroupId);
         }
 
-        // 通知学校端
 
 
         return BaseController.succeed(classGroup);

+ 197 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImGroupServiceImpl.java

@@ -6,22 +6,18 @@ import com.microsvc.toolkit.middleware.im.ImPluginContext;
 import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dao.ImGroupDao;
-import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
-import com.ym.mec.biz.dal.dao.ImGroupNoticeDao;
-import com.ym.mec.biz.dal.dao.ImUserFriendDao;
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.ImGroupDto;
 import com.ym.mec.biz.dal.dto.ImGroupMemberDto;
 import com.ym.mec.biz.dal.dto.NameDto;
-import com.ym.mec.biz.dal.entity.CooperationOrgan;
-import com.ym.mec.biz.dal.entity.ImGroup;
-import com.ym.mec.biz.dal.entity.ImGroupMember;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.EFriendRoleType;
+import com.ym.mec.biz.dal.enums.MusicGroupStatusEnum;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
+import com.ym.mec.biz.dal.mapper.SchoolStaffMapper;
 import com.ym.mec.biz.dal.wrapper.ImGroupWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.dal.BaseDAO;
-import com.ym.mec.common.entity.ImGroupModel;
 import com.ym.mec.common.entity.ImUserModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -73,6 +69,15 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
     @Autowired
     private CooperationOrganService cooperationOrganService;
 
+    @Autowired
+    private MusicGroupDao musicGroupDao;
+
+    @Autowired
+    private ClassGroupTeacherMapperDao classGroupTeacherMapperDao;
+
+    @Autowired
+    private SchoolStaffMapper schoolStaffMapper;
+
     @Override
     public BaseDAO<String, ImGroup> getDAO() {
         return imGroupDao;
@@ -183,7 +188,13 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
     @Override
     public List<ImGroupMemberDto> queryMemberById(String imGroupId) {
-        List<ImGroupMemberDto> imGroupMemberDtos = imGroupDao.queryMemberById(imGroupId);
+        return  queryMemberById(imGroupId,null);
+    }
+
+
+    @Override
+    public List<ImGroupMemberDto> queryMemberById(String imGroupId,String search) {
+        List<ImGroupMemberDto> imGroupMemberDtos = imGroupDao.queryMemberById(imGroupId,search);
 
         for (ImGroupMemberDto imGroupMemberDto : imGroupMemberDtos) {
             imGroupMemberDto.setType(EFriendRoleType.getByName(imGroupMemberDto.getRoleType()).name());
@@ -290,7 +301,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void quitSchoolGroup(Long userId) {
+    public void quitAllGroup(Long userId) {
 
         // 退出群组
         String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
@@ -316,7 +327,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
                 }
             }
             try {
-                imPluginService.groupQuit(imGroupMember.getImGroupId(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).build());
+                imPluginService.groupQuit(imGroupMember.getImGroupId(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).imUserIdFormat(false).build());
             } catch (Exception e) {
                 log.error("用户退出群失败{},{}", userId, imGroupMember.getImGroupId(), e);
             }
@@ -338,7 +349,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<ImGroup> groups = imGroups.stream().filter(imGroup -> imGroup.getMemberNum().equals(1)).collect(Collectors.toList());
         for (ImGroup group : groups) {
             try {
-                ImGroupMemberWrapper.ImGroupMember build = ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).build();
+                ImGroupMemberWrapper.ImGroupMember build = ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).imUserIdFormat(false).build();
                 imPluginService.groupDismiss(group.getId(), Lists.newArrayList(build));
             } catch (Exception e) {
                 log.error("解散群组失败{},{}", userId, group.getId(), e);
@@ -387,6 +398,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             imGroup.setTenantId(TenantContextHolder.getTenantId());
             imGroupDao.insert(imGroup);
             imPluginService.groupCreate(imGroup.getId(), imGroup.getName(), userId.toString());
+
+            initSchoolGroup(imGroup.getSchoolId());
         }
         imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), ImGroupMemberWrapper.ImGroupMember.builder()
                 .userId(userId.longValue()).imUserIdFormat(false).build());
@@ -399,10 +412,136 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         imGroupMember.setUserId(userId);
         imGroupMember.setIsAdmin(schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER));
         imGroupMember.setRoleType(schoolStaffType.getDescribe());
+        imGroupMember.setType(EFriendRoleType.getByName(schoolStaffType.getDescribe()).name());
         imGroupMember.setTenantId(imGroup.getTenantId());
         imGroupMemberDao.insert(imGroupMember);
 
+        updateImGroupUserNumber(imGroup.getId());
+    }
+
+    private void initSchoolGroup(Long schoolId) {
+
+
+        // 查询乐团主管
+        List<MusicGroup> musicGroupList = musicGroupDao.findByCooperationId(schoolId.intValue());
+        if (CollectionUtils.isEmpty(musicGroupList)) {
+            return;
+        }
+        musicGroupList = musicGroupList.stream()
+                .filter(o -> o.getStatus().equals(MusicGroupStatusEnum.PROGRESS))
+                .collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(musicGroupList)) {
+            return;
+        }
+
+        // 乐团主管
+        List<Integer> groupLeaderIds = musicGroupList.stream().map(MusicGroup::getTeamTeacherId).collect(Collectors.toList());
+
+        // 乐团ID集合
+        List<String> musicGroupIds = musicGroupList.stream().map(MusicGroup::getId).collect(Collectors.toList());
+
+        // 班级列表主教/助教老师
+        List<ClassGroupTeacherMapper> teacherMapperList = classGroupTeacherMapperDao.findAllByMusicGroupIds(musicGroupIds);
+
+        List<Integer> teacherIds = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(teacherMapperList)) {
+            teacherIds.addAll(teacherMapperList.stream().map( o -> o.getUserId()).collect(Collectors.toSet()));
+        }
+
+        List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers = new ArrayList<>();
+        for (Integer groupLeaderId : groupLeaderIds) {
+            imGroupMembers.add(ImGroupMemberWrapper.ImGroupMember.builder()
+                    .userId(groupLeaderId.longValue()).roleType(EFriendRoleType.ORCHESTRA_MANAGER.getMsg()).imUserIdFormat(false).build());
+        }
+
+        for (Integer teacherId : teacherIds) {
+            imGroupMembers.add(ImGroupMemberWrapper.ImGroupMember.builder()
+                    .userId(teacherId.longValue()).roleType(EFriendRoleType.ORCHESTRA_TEACHER.getMsg()).imUserIdFormat(false).build());
+        }
+
+        addSchoolGroup(schoolId, imGroupMembers);
+    }
+
+    /**
+     * 加入学校群聊
+     *
+     * @param schoolId
+     * @param imGroupMembers
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addSchoolGroup(Long schoolId, List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers) {
+        // 添加乐团领队,班级老师
+        List<ImGroupMember> imGroupMemberList =new ArrayList<>();
+
+
+        // 查询群是否存在
+        ImGroup imGroup = imGroupDao.queryBySchoolId(schoolId);
+        if (imGroup == null) {
+            return;
+        }
+        if (CollectionUtils.isEmpty(imGroupMembers)) {
+            return;
+        }
+
+        for (ImGroupMemberWrapper.ImGroupMember groupMember : imGroupMembers) {
+            ImGroupMember imGroupMember = new ImGroupMember();
+            imGroupMember.setImGroupId(imGroup.getId());
+            imGroupMember.setUserId(groupMember.getUserId().intValue());
+            imGroupMember.setIsAdmin(false);
+            imGroupMember.setRoleType(groupMember.getRoleType());
+            imGroupMember.setType(EFriendRoleType.getByName(groupMember.getRoleType()).name());
+            imGroupMember.setTenantId(imGroup.getTenantId());
+            imGroupMemberList.add(imGroupMember);
+            groupMember.setImUserIdFormat(false);
+        }
+
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
+
+        try {
+            imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), imGroupMembers);
+        } catch (Exception e) {
+            log.error("添加群成员失败{}", imGroup.getId(), e);
+        }
+        imGroupMemberDao.batchInsert(imGroupMemberList);
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void quitSchoolGroup(Long schoolId, List<ImGroupMemberWrapper.ImGroupMember> imGroupMembers) {
+        // 添加乐团领队,班级老师
+
+
+        // 查询群是否存在
+        ImGroup imGroup = imGroupDao.queryBySchoolId(schoolId);
+        if (imGroup == null) {
+            return;
+        }
+
+        if (CollectionUtils.isEmpty(imGroupMembers)) {
+            return;
+        }
+
+
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        List<Integer> userIds = new ArrayList<>();
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
+        for (ImGroupMemberWrapper.ImGroupMember imGroupMember : imGroupMembers) {
+            imGroupMember.setImUserIdFormat(false);
+            userIds.add(imGroupMember.getUserId().intValue());
+        }
+        try {
+            imPluginService.groupQuit(imGroup.getId(),imGroupMembers);
+        } catch (Exception e) {
+            log.error("退出群成员失败{}", imGroup.getId(), e);
+        }
+
 
+        imGroupMemberDao.delByImGroupAndUserId(imGroup.getId(),userIds);
         updateImGroupUserNumber(imGroup.getId());
     }
 
@@ -448,7 +587,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void addImGroup(List<String> imGroupIds, SysUser user, String roleType) {
+    public void addImGroup(List<String> imGroupIds, Long  userId, String roleType) {
         if (CollectionUtils.isEmpty(imGroupIds)) {
             return;
         }
@@ -470,14 +609,15 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             }
             try {
                 imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), ImGroupMemberWrapper.ImGroupMember.builder()
-                        .userId(user.getId().longValue())
+                        .userId(userId)
                         .imUserIdFormat(false).build());
 
                 ImGroupMember imGroupMember = new ImGroupMember();
                 imGroupMember.setImGroupId(imGroup.getId());
-                imGroupMember.setUserId(user.getId());
+                imGroupMember.setUserId(userId.intValue());
                 imGroupMember.setIsAdmin(false);
                 imGroupMember.setRoleType(roleType);
+                imGroupMember.setType(EFriendRoleType.getByName(roleType).name());
                 imGroupMember.setTenantId(imGroup.getTenantId());
                 imGroupMemberDao.insert(imGroupMember);
 
@@ -512,6 +652,7 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
      * @param userId     用户ID
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void quitGroup(List<String> imGroupIds, Integer userId) {
         if (CollectionUtils.isEmpty(imGroupIds)) {
             return;
@@ -526,16 +667,55 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         List<com.ym.mec.biz.dal.entity.ImGroupMember> imGroupMemberList = new ArrayList<>();
         for (ImGroup imGroup : groupList) {
             try {
-                imPluginService.groupQuit(imGroup.getId(),  ImGroupMemberWrapper.ImGroupMember.builder().userId(userId.longValue()).build());
+                imPluginService.groupQuit(imGroup.getId(),  ImGroupMemberWrapper.ImGroupMember.builder().userId(userId.longValue()).imUserIdFormat(false).build());
             } catch (Exception e) {
                 log.error("退出群聊失败",e);
             }
-            com.ym.mec.biz.dal.entity.ImGroupMember imGroupMember = new com.ym.mec.biz.dal.entity.ImGroupMember();
+            ImGroupMember imGroupMember = new ImGroupMember();
             imGroupMember.setImGroupId(imGroup.getId());
             imGroupMember.setUserId(userId);
             imGroupMemberList.add(imGroupMember);
         }
 
         imGroupMemberService.batchDeleteByGroupIdAndUserId(imGroupMemberList);
+        for (String imGroupId : imGroupIds) {
+            updateImGroupUserNumber(imGroupId);
+        }
+    }
+
+
+    /**
+     * 学校人员加入群组
+     *
+     * @param cooperationOrganId 合作机构id
+     * @param imGroupId 群组id
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void schoolJoinGroup(Integer cooperationOrganId, String imGroupId) {
+
+        CooperationOrgan cooperationOrgan = cooperationOrganService.get(cooperationOrganId);
+        if (cooperationOrgan == null) {
+            return;
+        }
+        List<SchoolStaff> schoolStaffs = schoolStaffMapper.getByCoopIdAndType(cooperationOrganId, ESchoolStaffType.ORCHESTRA_LEADER);
+        if (CollectionUtils.isEmpty(schoolStaffs)) {
+            return;
+        }
+
+
+        // 查询群是否存在
+        ImGroup imGroup = imGroupDao.queryBySchoolId(cooperationOrganId.longValue());
+        if (imGroup == null) {
+            return;
+        }
+
+
+        SchoolStaff schoolStaff = schoolStaffs.get(0);
+
+
+
+        addImGroup(Lists.newArrayList(imGroup.getId()),schoolStaff.getUserId(),ESchoolStaffType.ORCHESTRA_LEADER.getDescribe());
+
     }
 }

+ 66 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImUserFriendServiceImpl.java

@@ -195,6 +195,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
             imUserFriends.addAll(saveImUserFriends(studentIds,teacherIds,groupType,musicGroupId));
         });
 
+        setSchoolStaffImFriend(musicGroupId, imUserFriends);
+
 
         if(imUserFriends.size() > 0){
             batchInsert(imUserFriends);
@@ -205,6 +207,61 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
 //		executor.shutdown();
     }
 
+    private void setSchoolStaffImFriend(String musicGroupId, List<ImUserFriend> imUserFriends) {
+        // 更新
+        MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
+
+        if (musicGroup != null) {
+            Map<Integer,String> studentSubjectName = new HashMap<>();
+            //获取乐团关联的学员列表
+            Set<Integer> studentIds = new HashSet<>(studentRegistrationDao.queryNormalUserList(musicGroupId));
+            if(studentIds.size() > 0){
+                studentSubjectName = MapUtil.convertMybatisMap(studentRegistrationDao.getStudentSubjectNameByStuIds(musicGroup.getId(),studentIds));
+            }
+            Map<Integer, String> usernameMap = new HashMap<>();
+            if(studentIds.size() > 0){
+                usernameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(studentIds)));
+            }
+            Set<Integer> educationIds = new HashSet<>();
+            educationIds.add(musicGroup.getTeamTeacherId());
+
+            //学校乐团领队关联 乐团管理人员、教务、学员
+
+            Set<Integer> schoolStaffIds = new HashSet<>();
+            SchoolStaff schoolStaff = getSchoolOrchestraLeaderByMusicGroupId(musicGroupId);
+            if (schoolStaff != null) {
+                schoolStaffIds.add(schoolStaff.getUserId().intValue());
+            }
+            Map<Integer, String> schoolStaffRealNameMap = new HashMap<>();
+            if (schoolStaffIds.size() > 0) {
+                schoolStaffRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(schoolStaffIds)));
+            }
+            Map<Integer, String> educationRealNameMap;
+            educationRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(educationIds)));
+            //学校乐团领队关联教务
+            for (Integer schoolStaffId : schoolStaffIds) {
+                this.addImUserFriend(educationIds,null,educationRealNameMap,null
+                        ,schoolStaffId, imUserFriends,EFriendRoleType.ORCHESTRA_MANAGER.name());
+                //学校乐团领队关联学员
+                this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName()
+                        ,schoolStaffId, imUserFriends,EFriendRoleType.STUDENT.name());
+
+            }
+
+            //教务关联的老师、学员
+            for (Integer educationId : educationIds) {
+                //老师关联学校乐团领队
+                this.addImUserFriend(schoolStaffIds,null,schoolStaffRealNameMap,null,educationId, imUserFriends);
+            }
+            //学员关联的老师、教务、维修技师
+            for (Integer studentId : studentIds) {
+                //老师关联学校乐团领队
+                this.addImUserFriend(schoolStaffIds,null,schoolStaffRealNameMap,null,studentId, imUserFriends);
+            }
+
+        }
+    }
+
     private SchoolStaff getSchoolOrchestraLeaderByMusicGroupId(String musicGroupId){
 
         MusicGroup musicGroup = musicGroupDao.get(musicGroupId);
@@ -245,11 +302,8 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
     public List<ImUserFriend> saveImUserFriends(Set<Integer> studentIds,Set<Integer> teacherIds,GroupType groupType,String musicGroupId){
         List<ImUserFriend> imUserFriends = new ArrayList<>();
         Set<Integer> educationIds = new HashSet<>();
-        Set<Integer> schoolStaffIds = new HashSet<>();
-        SchoolStaff schoolStaff = null;
         Integer repairUserId = null;
         String repairUserName = null;
-        Integer musicGroupLeader = null;
         MusicGroup musicGroup = new MusicGroup();
         //获取当前学员声部
         Map<Integer,String> studentSubjectName = new HashMap<>();
@@ -261,7 +315,6 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         if(groupType == MUSIC){
             //学员关联乐团管理人员通讯录
             musicGroup = musicGroupDao.get(musicGroupId);
-            musicGroupLeader= musicGroup.getDirectorUserId();
             educationIds.add(musicGroup.getDirectorUserId());
             educationIds.add(musicGroup.getEducationalTeacherId());
             educationIds.add(musicGroup.getTeamTeacherId());
@@ -273,11 +326,6 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
                 studentSubjectName = MapUtil.convertMybatisMap(studentRegistrationDao.getStudentSubjectNameByStuIds(musicGroup.getId(),studentIds));
             }
 
-            //学校乐团领队关联 乐团管理人员、教务、学员
-            schoolStaff = getSchoolOrchestraLeaderByMusicGroupId(musicGroupId);
-            if (schoolStaff != null) {
-                schoolStaffIds.add(schoolStaff.getUserId().intValue());
-            }
         }else if(groupType == VIP){
             VipGroup vipGroup = vipGroupDao.get(Long.parseLong(musicGroupId));
             educationIds.add(vipGroup.getEducationalTeacherId());
@@ -300,6 +348,14 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         if(educationIds.size() > 0){
             educationRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(educationIds)));
         }
+
+        //学校乐团领队关联 乐团管理人员、教务、学员
+
+        Set<Integer> schoolStaffIds = new HashSet<>();
+        SchoolStaff schoolStaff = getSchoolOrchestraLeaderByMusicGroupId(musicGroupId);
+        if (schoolStaff != null) {
+            schoolStaffIds.add(schoolStaff.getUserId().intValue());
+        }
         if (schoolStaffIds.size() > 0) {
              schoolStaffRealNameMap = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(new ArrayList<>(schoolStaffIds)));
 
@@ -319,8 +375,6 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
             this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName(),educationId,imUserFriends);
             //教务关联老师
             this.addImUserFriend(teacherIds,teacherSubjectNameMap,teacherRealNameMap,musicGroup.getName(),educationId,imUserFriends);
-            //老师关联学校乐团领队
-            this.addImUserFriend(schoolStaffIds,null,schoolStaffRealNameMap,null,educationId,imUserFriends);
         }
         //学员关联的老师、教务、维修技师
         for (Integer studentId : studentIds) {
@@ -328,8 +382,6 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
             this.addImUserFriend(teacherIds,teacherSubjectNameMap,teacherRealNameMap,musicGroup.getName(),studentId,imUserFriends);
             //学员关联的教务
             this.addImUserFriend(educationIds,null,educationRealNameMap,null,studentId,imUserFriends);
-            //老师关联学校乐团领队
-            this.addImUserFriend(schoolStaffIds,null,schoolStaffRealNameMap,null,studentId,imUserFriends);
             //学员关联维修技师
             if(repairUserId != null){
                 if(repairUserId.equals(studentId)){
@@ -348,24 +400,7 @@ public class ImUserFriendServiceImpl extends BaseServiceImpl<Long, ImUserFriend>
         if(schoolStaff != null){
             //学校乐团领队关联乐团管理人员
             this.addImUserFriend(teacherIds,teacherSubjectNameMap,teacherRealNameMap,musicGroup.getName()
-                    ,schoolStaff.getId().intValue(),imUserFriends,EFriendRoleType.ORCHESTRA_TEACHER.name());
-            //学校乐团领队关联教务
-            this.addImUserFriend(Sets.newHashSet(musicGroupLeader),null,educationRealNameMap,null
-                    ,schoolStaff.getId().intValue(),imUserFriends,EFriendRoleType.ORCHESTRA_MANAGER.name());
-            //学校乐团领队关联学员
-            this.addImUserFriend(studentIds,studentSubjectName,usernameMap,musicGroup.getName()
-                    ,schoolStaff.getId().intValue(),imUserFriends,EFriendRoleType.STUDENT.name());
-            //学员关联维修技师
-            if(repairUserId != null){
-                ImUserFriend imUserFriend = new ImUserFriend();
-                imUserFriend.setUserId(schoolStaff.getUserId().intValue());
-                imUserFriend.setFriendId(repairUserId);
-                imUserFriend.setFriendNickname(repairUserName);
-                imUserFriend.setMemo(musicGroup.getName());
-                imUserFriend.setTags("维修技师");
-                imUserFriend.setRoleType(EFriendRoleType.MAINTENANCE_TECHNICIAN.name());
-                imUserFriends.add(imUserFriend);
-            }
+                    ,schoolStaff.getUserId().intValue(),imUserFriends,EFriendRoleType.ORCHESTRA_TEACHER.name());
         }
         //维修技师关联学员
         if(repairUserId != null){

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupQuitServiceImpl.java

@@ -97,6 +97,7 @@ public class MusicGroupQuitServiceImpl extends BaseServiceImpl<Long, MusicGroupQ
 		detailDto.setCreateTime(musicGroupQuit.getCreateTime());
 		detailDto.setSubjectName(subject.getName());
 		detailDto.setStatus(musicGroupQuit.getSchoolStaffAuditStatus());
+		detailDto.setMusicGroupName(musicGroupDao.get(musicGroupQuit.getMusicGroupId()).getName());
 		return detailDto;
     }
 

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.TypeReference;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.beust.jcommander.internal.Lists;
+import com.microsvc.toolkit.middleware.im.message.ImGroupMemberWrapper;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
@@ -1658,6 +1660,13 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         //统计变更学员数
         groupEventSource.musicGroupStudentChangeEvent(musicGroupId, StudentMusicGroupStatusEnum.NORMAL, null);
+
+        ImGroupMemberWrapper.ImGroupMember build = ImGroupMemberWrapper.ImGroupMember.builder()
+                .userId(musicGroup.getTeamTeacherId().longValue())
+                .roleType(EFriendRoleType.ORCHESTRA_MANAGER.getMsg())
+                .build();
+        // 乐团主管加入学校群聊
+        imGroupService.addSchoolGroup(musicGroup.getCooperationOrganId().longValue(), Lists.newArrayList(build));
     }
 
     private MusicGroup saveLog(String musicGroupId, MusicGroupStatusEnum statusEnum) throws Exception {

+ 9 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -267,12 +267,12 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         imUserFriendService.refreshSchoolStaffFriend(schoolStaff.getSchoolId().intValue());
 
         // 异步添加乐团领队到其他乐团群
-         CompletableFuture.runAsync(() -> {
+//         CompletableFuture.runAsync(() -> {
 
              if (schoolStaff.getUserType().equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
                  addMusicGroup(schoolStaff, user);
              }
-         });
+//         });
 
         // 删除缓存锁
         redissonClient.getBucket(submitLockKey).delete();
@@ -318,7 +318,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
 
     private void addMusicGroup(SchoolStaffWrapper.SchoolStaff schoolStaff, SysUser user) {
 
-        CompletableFuture.runAsync( () -> {
+//        CompletableFuture.runAsync( () -> {
             // 乐团领队添加到所有班级群
             List<MusicGroup> musicGroups = cooperationOrganService.musicGroupPage(schoolStaff.getSchoolId().intValue());
             if (CollectionUtils.isEmpty(musicGroups)) {
@@ -344,9 +344,9 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             imGroupIds.addAll(classGroupIds);
     //        imGroupIds.addAll(musicGroupIds);
 
-            imGroupService.addImGroup(imGroupIds, user, schoolStaff.getUserType().getDescribe());
+            imGroupService.addImGroup(imGroupIds, user.getId().longValue(), schoolStaff.getUserType().getDescribe());
 
-        });
+//        });
 
 
     }
@@ -488,7 +488,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
     public SchoolStaff queryByUserId(Long userId) {
 
         // 员工信息
-        List<SchoolStaff> staffs = lambdaQuery().eq(SchoolStaff::getUserId, userId).list();
+        List<SchoolStaff> staffs = lambdaQuery().eq(SchoolStaff::getUserId, userId).ne(SchoolStaff::getStatus,"-1").list();
         if (CollectionUtils.isEmpty(staffs)) {
             return null;
         }
@@ -628,7 +628,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         // 删除时判断是否群主,
         //1)如果是,则随机分配一个群主,
         //2)如果删除的是最后一个群成员,那么解散群
-        imGroupService.quitSchoolGroup(schoolStaff.getUserId());
+        imGroupService.quitAllGroup(schoolStaff.getUserId());
 
         sysUserFeignService.exitByPhone("education", sysUserService.queryUserById(schoolStaff.getUserId().intValue()).getPhone());
 
@@ -736,6 +736,8 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         if (schoolStaffUpdate.getUserType() != null && !schoolStaff.getUserType().equals(schoolStaffUpdate.getUserType())) {
 
 
+            schoolStaff.setUserType(schoolStaffUpdate.getUserType());
+            this.updateById(schoolStaff);
             if (schoolStaffUpdate.getUserType().equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
                 addMusicGroup(SchoolStaffWrapper.SchoolStaff.builder()
                         .schoolId(schoolStaff.getSchoolId())
@@ -752,8 +754,6 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
                         , sysUser);
             }
 
-            schoolStaff.setUserType(schoolStaffUpdate.getUserType());
-            this.updateById(schoolStaff);
         }
 
 

+ 9 - 0
mec-biz/src/main/resources/config/mybatis/ClassGroupTeacherMapperMapper.xml

@@ -247,4 +247,13 @@
             </if>
         </where>
     </sql>
+
+    <select id="findAllByMusicGroupIds" resultMap="ClassGroupTeacherMapper">
+        SELECT *
+        FROM  class_group_teacher_mapper
+        WHERE music_group_id_ IN
+        <foreach collection="musicGroupIds" item="musicGroupId" open="(" close=")" separator=",">
+            #{musicGroupId}
+        </foreach>
+    </select>
 </mapper>

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

@@ -172,6 +172,9 @@
 		LEFT JOIN student st ON st.user_id_ = u.id_
 		LEFT JOIN `subject` s ON s.id_ = st.subject_id_list_
 		WHERE igm.im_group_id_ = #{imGroupId}
+        <if test="search != null and search != ''">
+            AND (u.username_ like concat('%',#{search},'%') or u.real_name_ like concat('%',#{search},'%'))
+        </if>
 	</select>
 	
 	<select id="queryMember" resultMap="ImGroupMemberDto" parameterType="map">

+ 20 - 4
mec-biz/src/main/resources/config/mybatis/ImGroupMemberMapper.xml

@@ -13,6 +13,7 @@
 		<result column="nickname_" property="nickname" />
 		<result column="is_admin_" property="isAdmin" />
 		<result column="role_type_" property="roleType"/>
+		<result column="type_" property="type"/>
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
         <result column="tenant_id_" property="tenantId"/>
@@ -30,15 +31,17 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.ImGroupMember" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO im_group_member (im_group_id_,user_id_,nickname_,is_admin_,role_type_,create_time_,update_time_,tenant_id_) 
-		VALUES(#{imGroupId},#{userId},#{nickname},#{isAdmin},#{roleType},NOW(),NOW(),#{tenantId})
+		INSERT INTO im_group_member (im_group_id_,user_id_,nickname_,is_admin_,role_type_,create_time_,update_time_,tenant_id_,type_)
+		VALUES(#{imGroupId},#{userId},#{nickname},#{isAdmin},#{roleType},NOW(),NOW(),#{tenantId},#{type})
+        ON DUPLICATE KEY UPDATE nickname_ = VALUES(nickname_), is_admin_ = VALUES(is_admin_), role_type_ = VALUES(role_type_), type_ = VALUES(type_)
 	</insert>
 	
 	<insert id="batchInsert" parameterType="com.ym.mec.biz.dal.entity.ImGroupMember" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO im_group_member (im_group_id_,user_id_,nickname_,is_admin_,role_type_,create_time_,update_time_,tenant_id_) VALUES
+		INSERT INTO im_group_member (im_group_id_,user_id_,nickname_,is_admin_,role_type_,create_time_,update_time_,tenant_id_,type_) VALUES
 		 <foreach collection="list" item="item" separator=",">
-		(#{item.imGroupId},#{item.userId},#{item.nickname},#{item.isAdmin},#{item.roleType},NOW(),NOW(),#{item.tenantId})
+		(#{item.imGroupId},#{item.userId},#{item.nickname},#{item.isAdmin},#{item.roleType},NOW(),NOW(),#{item.tenantId},#{item.type})
 		</foreach>
+        ON DUPLICATE KEY UPDATE nickname_ = VALUES(nickname_), is_admin_ = VALUES(is_admin_), role_type_ = VALUES(role_type_), type_ = VALUES(type_)
 	</insert>
 	
 	<!-- 根据主键查询一条记录 -->
@@ -59,6 +62,9 @@
 		<if test="imGroupId != null">
 		im_group_id_ = #{imGroupId},
 		</if>
+        <if test="type != null">
+            type_ = #{type},
+        </if>
 		update_time_ = NOW()
 		</set> WHERE id_ = #{id} and tenant_id_ = #{tenantId}
 	</update>
@@ -82,6 +88,9 @@
 				<if test="item.imGroupId != null">
 				im_group_id_ = #{item.imGroupId},
 				</if>
+                <if test="item.type != null">
+                    type_ = #{item.type},
+                </if>
 				update_time_ = NOW()
 			</set>
 			WHERE id_ = #{item.id} and tenant_id_ = #{item.tenantId}
@@ -201,4 +210,11 @@
             #{item}
         </foreach>
     </select>
+
+	<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}
+        </foreach>
+    </delete>
 </mapper>

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

@@ -76,7 +76,7 @@
 	
 	<!-- 分页查询 -->
 	<select id="queryForPage" resultMap="ImGroupNoticeDto" parameterType="map">
-		SELECT ign.*,u.real_name_,u.avatar_ FROM im_group_notice ign left join sys_user u on ign.operator_id_ = u.id_
+		SELECT ign.*,if(u.real_name_ is null or u.real_name_ = '',u.username_,u.real_name_) as real_name_,u.avatar_ FROM im_group_notice ign left join sys_user u on ign.operator_id_ = u.id_
 		<where>
             ign.del_flag_ = 0 and ign.tenant_id_ = #{tenantId}
             <if test="groupId != null">

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

@@ -294,7 +294,7 @@
             LEFT JOIN music_group_subject_plan mgsp on s.id_ = mgsp.subject_id_
             LEFT JOIN music_group mg on mg.id_ = mgsp.music_group_id_
         WHERE
-            s.del_flag_ = 0
+            s.del_flag_ = 0 and mg.status_ = 'PROGRESS'
             <if test="musicGroupId != null and musicGroupId != ''">
                 AND mg.id_ = #{musicGroupId}
             </if>

+ 38 - 0
mec-im/src/main/java/com/ym/service/Impl/RoomMemberServiceImpl.java

@@ -0,0 +1,38 @@
+package com.ym.service.Impl;
+
+import com.ym.dao.RoomMemberDao;
+import com.ym.service.RoomMemberService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 房间用户
+ * Created by Eric.Shang on 2023/5/31.
+ */
+@Slf4j
+@Service
+public class RoomMemberServiceImpl implements RoomMemberService {
+
+    @Autowired
+    private RoomMemberDao roomMemberDao;
+
+    /**
+     * 删除房间用户
+     * @param roomId 房间编号
+     * @param userId 用户编号
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
+    @Override
+    public void deleteRoomMember(String roomId, String userId) {
+
+        try {
+            // 删除房间用户信息
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+        } catch (Exception e) {
+            log.error("deleteRoomMember roomId={}, userId={}", roomId, userId, e);
+        }
+    }
+}

+ 12 - 3
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -42,6 +42,7 @@ import com.ym.mec.im.message.*;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.pojo.*;
+import com.ym.service.RoomMemberService;
 import com.ym.service.RoomService;
 import com.ym.utils.CheckUtils;
 import com.ym.utils.CodeUtil;
@@ -82,6 +83,8 @@ public class RoomServiceImpl implements RoomService {
     @Autowired
     private RoomMemberDao roomMemberDao;
     @Autowired
+    private RoomMemberService roomMemberService;
+    @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
     @Autowired
     private WhiteBoardHelper whiteBoardHelper;
@@ -743,7 +746,7 @@ public class RoomServiceImpl implements RoomService {
         return courseSchedule.getServiceProvider();
     }
 
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     @Override
     public void leaveRoomSuccess(String roomId, String userId, String deviceNum) throws Exception {
 
@@ -805,9 +808,14 @@ public class RoomServiceImpl implements RoomService {
             updateDisplay(roomId, userId, "", 0);
         }
 
-        if (roomMemberDao.countByRid(roomId) <= 1) {
+        // 删除房间用户,事务单独提效
+        // roomMemberService.deleteRoomMember(roomId, userId);
+
+        int roomMembers = roomMemberDao.countByRid(roomId);
+        if (roomMembers <= 1) {
             // 删除群组用户信息
             roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+
             // 删除群组信息
             roomDao.deleteByRid(roomId);
             // 删除白板信息
@@ -817,6 +825,7 @@ public class RoomServiceImpl implements RoomService {
             //关闭所有曲目播放
             courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(), null, null);
             log.info("leaveRoomSuccess dismiss the room: {}, userId: {}, role={}", roomId, userId, roleEnum.name());
+
         } else {
             roomMemberDao.deleteUserByRidAndUid(roomId, userId);
 
@@ -854,7 +863,7 @@ public class RoomServiceImpl implements RoomService {
 //            imHelper.quit(new String[]{userId}, roomId);
             }
 
-            log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, userId);
+            log.info("leaveRoomSuccess quit group: roomId={}, userId: {}, roomMembers={}", roomId, userId, roomMembers);
         }
         userDao.deleteByUid(userId);
     }

+ 15 - 0
mec-im/src/main/java/com/ym/service/RoomMemberService.java

@@ -0,0 +1,15 @@
+package com.ym.service;
+
+/**
+ * 房间用户
+ * Created by Eric.Shang on 2023/5/31.
+ */
+public interface RoomMemberService {
+
+    /**
+     * 删除房间用户
+     * @param roomId 房间编号
+     * @param userId 用户编号
+     */
+    void deleteRoomMember(String roomId, String userId);
+}

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

@@ -88,8 +88,8 @@ public class ImGroupController extends BaseController {
 
 	@ApiOperation("查询群成员列表")
 	@GetMapping(value = "/queryGroupMemberList")
-	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupMemberList(String imGroupId) {
-		return succeed(imGroupService.queryMemberById(imGroupId));
+	public HttpResponseResult<List<ImGroupMemberDto>> queryGroupMemberList(String imGroupId,String search) {
+		return succeed(imGroupService.queryMemberById(imGroupId,search));
 	}
 
 	@ApiOperation("查询群学生列表")

+ 4 - 4
mec-web/src/main/java/com/ym/mec/web/controller/education/ImGroupNoticeController.java

@@ -43,7 +43,7 @@ public class ImGroupNoticeController extends BaseController {
 
     @ApiOperation(value = "修改")
     @RequestMapping("/update")
-    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/update','system')")
+//    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/update','system')")
     public Object update(ImGroupNotice imGroupNotice ) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if(sysUser == null){
@@ -57,21 +57,21 @@ public class ImGroupNoticeController extends BaseController {
 
     @ApiOperation(value = "获取最新一条群公告")
     @RequestMapping("/getNewNotice")
-    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/getNewNotice','system')")
+//    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/getNewNotice','system')")
     public Object getNewNotice(String groupId) {
         return succeed(imGroupNoticeService.queryLatestNotice(groupId));
     }
 
     @ApiOperation(value = "获取群公告列表")
     @RequestMapping("/queryNoticePage")
-    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/queryNoticePage','system')")
+//    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/queryNoticePage','system')")
     public Object queryPage(ImGroupNoticeQueryInfo queryInfo) {
         return succeed(imGroupNoticeService.queryPage(queryInfo));
     }
 
     @ApiOperation(value = "删除")
     @RequestMapping("/del")
-    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/del','system')")
+//    @PreAuthorize("@pcs.hasPermissions('imGroupNotice/del','system')")
     public Object del(Long id) {
         imGroupNoticeService.delete(id);
         return succeed();