Ver Fonte

Merge branch 'feature/0717_group_limit' into test

Eric há 1 ano atrás
pai
commit
06bde22ca2

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -30,7 +30,7 @@ public interface CourseScheduleStudentPaymentDao extends BaseMapper<CourseSchedu
      * @author zx
      * @date 2022/3/23 16:18
      */
-    Set<Long> queryStudentIds(@Param("courseGroupId") Long courseGroupId,
+    List<Long> queryStudentIds(@Param("courseGroupId") Long courseGroupId,
                               @Param("courseGroupType") String courseGroupType);
 
     /**

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberAuditServiceImpl.java

@@ -101,7 +101,8 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
 
             // 统计群成员数量,大于等于群组最大人数时,不允许加入
             if (!verifyGroupMemberJoinLimit(groupId, 1)) {
-                throw new BizException("群成员数量已达上限");
+                SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
             }
 
             try {
@@ -187,7 +188,7 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
      * 校验群成员加入限制
      * @param groupId 群组ID
      */
-    private Boolean verifyGroupMemberJoinLimit(String groupId,int addNum) {
+    private Boolean verifyGroupMemberJoinLimit(String groupId, int addNum) {
         // 统计群成员数量,大于等于群组最大人数时,不允许加入
         int memberCount = imGroupMemberService.countGroupMember(groupId);
         // 查询群成员人数限制

+ 39 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -66,6 +66,7 @@ import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.UploadReturnBean;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.util.ThreadPool;
+import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.utils.date.DateUtil;
 import io.rong.RongCloud;
 import io.rong.methods.message.history.History;
@@ -318,7 +319,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     public String create(ImGroupWrapper.ImGroup imGroup) throws Exception {
         // 群成员数量限制校验
         SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
-        if (config != null && Integer.parseInt(config.getParamValue()) < imGroup.getStudentIdList().size()) {
+        if (config != null && Integer.parseInt(config.getParamValue()) < (imGroup.getStudentIdList().size() + 1)) {
             throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
         }
 
@@ -377,18 +378,38 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             throw new BizException("添加的群成员不能为空");
 
         }
-        List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
-                studentIdList, ImGroupMemberRoleType.STUDENT);
-        imGroupMemberService.join(groupMemberList, groupId);
-
-        // 如果是机构群,学生自动添加老师好友
-        if (ImGroupType.ORG.equals(imGroup.getType())) {
-            List<ImGroupMember> teacherList = imGroupMemberService.lambdaQuery()
-                    .eq(ImGroupMember::getGroupId, groupId)
-                    .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.TEACHER)
-                    .list();
-            teacherList.forEach(teacher -> imUserFriendService.saveUserFriend(teacher.getUserId(), studentIdList));
-        }
+        // 增加群成员校验锁,当群成员人数达到限制时,不允许再次加入
+        String lockName = "klx:group_member_add_lock:" + groupId;
+        DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
+            // 群成员数量限制校验
+            int memberCount = imGroupMemberService.countGroupMember(groupId);
+            // 查询群成员人数限制
+            SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0
+                && (memberCount + studentIdList.size()) > Integer.parseInt(config.getParamValue())) {
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
+
+            try {
+                List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
+                    studentIdList, ImGroupMemberRoleType.STUDENT);
+                imGroupMemberService.join(groupMemberList, groupId);
+
+                // 如果是机构群,学生自动添加老师好友
+                if (ImGroupType.ORG.equals(imGroup.getType())) {
+                    List<ImGroupMember> teacherList = imGroupMemberService.lambdaQuery()
+                        .eq(ImGroupMember::getGroupId, groupId)
+                        .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.TEACHER)
+                        .list();
+                    teacherList.forEach(teacher -> imUserFriendService.saveUserFriend(teacher.getUserId(), studentIdList));
+                }
+            } catch (Exception e) {
+                log.error("加入群组失败,{}", e.getMessage(), e);
+                throw new BizException(e.getMessage());
+            }
+            return true;
+        }, null, 10L);
+
     }
 
 
@@ -401,7 +422,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             return null;
         }
         //获取学员列表,按购买时间顺序升序排列返回
-        Set<Long> studentIds = courseScheduleStudentPaymentDao.queryStudentIds(courseGroupId, courseGroupType);
+        List<Long> studentIds = courseScheduleStudentPaymentDao.queryStudentIds(courseGroupId, courseGroupType);
         // studentIds集合中所有null元素移除
         studentIds.removeAll(Collections.singleton(null));
         if (CollectionUtils.isEmpty(studentIds)) {
@@ -410,7 +431,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         Date now = new Date();
         Long teacherId = courseGroup.getTeacherId();
         //保存老师学员关联的通讯录xz
-        imUserFriendService.saveUserFriend(teacherId, studentIds);
+        imUserFriendService.saveUserFriend(teacherId, Sets.newHashSet(studentIds));
 
         //创建群聊
         ImGroup imGroup = new ImGroup();
@@ -441,10 +462,9 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
                     // 已加入群组用户标记
                     List<Long> userIds = Lists.newArrayList(studentIds);
-                    studentIds = Sets.newHashSet(userIds.subList(0, groupMemberLimit - 1));
+                    studentIds = userIds.subList(0, groupMemberLimit - 1);
                     // 未加入群组用户标记
-                    Set<Long> addStudentIds = studentIds;
-                    noGroupJoinUserIds.addAll(userIds.stream().filter(n->!addStudentIds.contains(n)).collect(Collectors.toList()));
+                    noGroupJoinUserIds.addAll(userIds.subList(groupMemberLimit - 1, userIds.size()));
                     // 重置用户入群加入标记
                     courseScheduleStudentPaymentDao.updateGroupJoinStatus(courseGroupId, courseGroupType, false,
                         noGroupJoinUserIds);
@@ -454,7 +474,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
 
         if (!studentIds.isEmpty()) {
             // 添加学生
-            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, studentIds, ImGroupMemberRoleType.STUDENT);
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, Sets.newHashSet(studentIds), ImGroupMemberRoleType.STUDENT);
             List<com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember> groupMemberList = Lists.newArrayList();
             for (ImGroupMember groupMember : groupMembers) {
                 groupMemberList.add(com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupMemberWrapper.ImGroupMember.builder()