Browse Source

删除学校员工,群组

liujc 2 năm trước cách đây
mục cha
commit
96d8e24da7

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

@@ -39,4 +39,21 @@ public interface ImGroupMemberDao extends BaseDAO<Long, ImGroupMember> {
     List<ImGroupMember> queryMembersByUserId(@Param("userId") Long userId);
 
     void deleteByUserId(Long userId);
+
+    /**
+     *  查询群组
+     *
+     * @param imGroupId 群组id
+     */
+    ImGroupMember getAdmin(@Param("imGroupId") String imGroupId);
+
+    void updateAdmin(@Param("imGroupId") String imGroupId, @Param("userId") Integer userId);
+
+    /**
+     * 查询一个群组成员
+     *
+     * @param imGroupId 群组id
+     * @param userId    用户id
+     */
+    ImGroupMember queryOneByGroupIdAndNotUser(@Param("imGroupId") String imGroupId, @Param("userId") Long userId);
 }

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

@@ -39,7 +39,7 @@ public class ImGroup extends BaseEntity {
 		VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"),
 		SNAP("SNAP","临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),
 		MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课"),PARENT_MEETING("PARENT_MEETING","家长会"),
-		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课"),SHOOL("SCHOOL","学校衔接群");
+		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课"), SCHOOL("SCHOOL","学校衔接群");
 
 		private String code;
 

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

@@ -8,7 +8,6 @@ import com.ym.mec.biz.dal.entity.ImGroup;
 import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.Arrays;
 import java.util.List;
 
 public interface ImGroupService extends BaseService<String, ImGroup> {
@@ -104,7 +103,7 @@ public interface ImGroupService extends BaseService<String, ImGroup> {
      *
      * @param userId 用户id
      */
-    void quit(Long userId);
+    void quitSchoolGroup(Long userId);
 
     /**
      * 用户加入群

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

@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 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.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.ImGroupDao;
 import com.ym.mec.biz.dal.dao.ImGroupMemberDao;
@@ -271,14 +270,16 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
 
     /**
      * 用户退出所有群
-     *
+     * <p>
+     * 删除时判断是否群主,
+     * 如果是,则随机分配一个群主,
+     * 如果删除的是最后一个群成员,那么解散群
      * @param userId 用户id
      */
     @Override
-    public void quit(Long userId) {
+    public void quitSchoolGroup(Long userId) {
 
         // 退出群组
-        // 查询用户默认头象
         String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
 
         ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
@@ -289,17 +290,47 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             return;
         }
         for (ImGroupMember imGroupMember : imGroupMembers) {
+            // 如果是群主,随机分配一个群主
+            if (imGroupMember.getIsAdmin()) {
+                try {
+                    // 获取一个群成员
+                    ImGroupMember imGroupMember1 = imGroupMemberDao.queryOneByGroupIdAndNotUser(imGroupMember.getImGroupId(), userId);
+                    if (Objects.nonNull(imGroupMember1)) {
+                        groupChangeOwner(imGroupMember1.getUserId(),imGroupMember.getImGroupId());
+                    }
+                } catch (Exception e) {
+                    log.error("更换群主失败{},{}", userId, imGroupMember.getImGroupId(), e);
+                }
+            }
             try {
                 imPluginService.groupQuit(imGroupMember.getImGroupId(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId).build());
             } catch (Exception e) {
                 log.error("用户退出群失败{},{}", userId, imGroupMember.getImGroupId(), e);
             }
         }
+        List<String> imGroupIds = imGroupMembers.stream().map(ImGroupMember::getImGroupId).collect(Collectors.toList());
+        // 群组没人,删除群组
+        List<ImGroup> imGroups = imGroupDao.queryByUserId(userId.intValue(),null, ImGroup.GroupTypeEnum.SCHOOL.getCode());
+
+
         imGroupMemberDao.deleteByUserId(userId);
         // 更新群组人员数
-        imGroupDao.addMemberNum(imGroupMembers.stream().map(ImGroupMember::getImGroupId).collect(Collectors.toList()),-1);
+        imGroupDao.addMemberNum(imGroupIds,-1);
 
-         // TODO 群组没人,删除群组
+        if (CollectionUtils.isEmpty(imGroups)) {
+            return;
+        }
+
+
+        List<ImGroup> groups = imGroups.stream().filter(imGroup -> imGroup.getMemberNum().equals(1)).collect(Collectors.toList());
+        for (ImGroup group : groups) {
+            try {
+                imPluginService.groupDismiss(group.getId(), new ArrayList<>());
+            } catch (Exception e) {
+                log.error("解散群组失败{},{}", userId, group.getId(), e);
+            }
+            imGroupDao.delete(group.getId());
+        }
     }
 
     /**
@@ -327,8 +358,8 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             imGroup.setName("教学团队衔接群");
             imGroup.setIntroduce(imGroup.getName());
             imGroup.setMemberNum(1);
-            imGroup.setType(ImGroup.GroupTypeEnum.SHOOL.getCode());
-            imGroup.setGroupType(ImGroup.GroupTypeEnum.SHOOL);
+            imGroup.setType(ImGroup.GroupTypeEnum.SCHOOL.getCode());
+            imGroup.setGroupType(ImGroup.GroupTypeEnum.SCHOOL);
             imGroup.setCreateTime(new Date());
             imGroup.setUpdateTime(new Date());
             imGroup.setTenantId(TenantContextHolder.getTenantId());
@@ -339,8 +370,10 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
             if (!schoolStaffType.equals(ESchoolStaffType.ORCHESTRA_LEADER)) {
                 imPluginService.groupJoin(imGroup.getId(), imGroup.getName(), ImGroupMemberWrapper.ImGroupMember.builder().userId(userId.longValue()).build());
             } else {
-
+                groupChangeOwner(userId, imGroup.getId());
             }
+            imGroup.setMemberNum(imGroup.getMemberNum() + 1);
+            imGroupDao.update(imGroup);
         }
         ImGroupMember imGroupMember = new ImGroupMember();
         imGroupMember.setImGroupId(imGroup.getId());
@@ -349,8 +382,25 @@ public class ImGroupServiceImpl extends BaseServiceImpl<String, ImGroup> impleme
         imGroupMember.setRoleType(schoolStaffType.getDescribe());
         imGroupMember.setTenantId(imGroup.getTenantId());
         imGroupMemberDao.insert(imGroupMember);
+    }
+
+    /**
+     * 群主移交
+     * @param userId 用户id
+     * @param imGroupId     群组id
+     */
+    private void groupChangeOwner(Integer userId, String imGroupId) throws Exception {
+
+        String serviceProvider = sysConfigService.findByParamName(SysConfigService.IM_SERVICE_PROVIDER).getParanValue();
+
+        ImPluginService imPluginService =imPluginContext.getPluginService(serviceProvider);
 
+        ImGroupMember imGroupMember = imGroupMemberDao.getAdmin(imGroupId);
+        imPluginService.changeGroupOwner(imGroupId, userId.toString(),imGroupMember.getUserId().toString());
+        imGroupMember.setIsAdmin(false);
+        imGroupMemberDao.update(imGroupMember);
 
+        imGroupMemberDao.updateAdmin(imGroupId, userId);
     }
 
     /**

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

@@ -6,8 +6,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
-import com.microsvc.toolkit.middleware.im.ImPluginContext;
-import com.microsvc.toolkit.middleware.im.ImPluginService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.SysUserType;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
@@ -21,7 +19,6 @@ import com.ym.mec.biz.dal.wrapper.StatGroupWrapper;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
-import com.ym.mec.util.string.MessageFormatter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -185,6 +182,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             // 校长或乐团领队,需要校验人数是否葡,默认最多添加一人
             Integer exists = lambdaQuery()
                     .eq(SchoolStaff::getSchoolId, schoolStaff.getSchoolId())
+                    .ne(SchoolStaff::getStatus, "-1")
                     .eq(SchoolStaff::getUserType, schoolStaff.getUserType().getCode()).count();
             if (exists > 0) {
                 // 删除缓存锁
@@ -199,6 +197,7 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
             Integer exists = lambdaQuery()
                     //.ne(SchoolStaff::getSchoolId, schoolStaff.getSchoolId())
                     .eq(SchoolStaff::getUserId, user.getId())
+                    .ne(SchoolStaff::getStatus, "-1")
                     .count();
             if (exists > 0) {
                 // 删除缓存锁
@@ -209,14 +208,15 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         }
 
         // 添加学校员工信息
+        schoolStaff.setStatus("1");
         this.save(JSON.parseObject(schoolStaff.jsonString(), SchoolStaff.class));
 
 
         // 自动创建学校管理IM群 自动添加员工到学校乐团群
         try {
-            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),ESchoolStaffType.ORCHESTRA_LEADER);
+            imGroupService.addSchoolStaffGroup(schoolStaff.getSchoolId(), user.getId(),schoolStaff.getUserType());
         } catch (Exception e) {
-            log.error("加入群组失败 {}",e);
+            log.error("加入群组失败 ",e);
             throw new BizException("加入群组失败");
         }
 
@@ -495,8 +495,10 @@ public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, Schoo
         // 解除im好友关联
         imUserFriendDao.deleteByUserIdAndFriendId(schoolStaff.getUserId());
 
-
-        imGroupService.quit(schoolStaff.getUserId());
+        // 删除时判断是否群主,
+        //1)如果是,则随机分配一个群主,
+        //2)如果删除的是最后一个群成员,那么解散群
+        imGroupService.quitSchoolGroup(schoolStaff.getUserId());
 
 
         return true;

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

@@ -182,4 +182,16 @@
 	<delete id="deleteByUserId">
         DELETE FROM im_group_member WHERE user_id_ = #{userId}
     </delete>
+
+	<select id="getAdmin" resultMap="ImGroupMember">
+        SELECT * FROM im_group_member WHERE im_group_id_ = #{imGroupId} AND is_admin_ = 1 LIMIT 1
+    </select>
+
+	<update id="updateAdmin">
+        UPDATE im_group_member SET is_admin_ = 1 WHERE im_group_id_ = #{imGroupId} and user_id_ = #{userId}
+    </update>
+
+	<select id="queryOneByGroupIdAndNotUser" resultMap="ImGroupMember">
+        SELECT * FROM im_group_member WHERE im_group_id_ = #{imGroupId} AND user_id_ != #{userId} LIMIT 1
+    </select>
 </mapper>