소스 검색

Merge branch 'feature/0717_group_limit' into develop-new

Eric 1 년 전
부모
커밋
ff7f281065

+ 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);
 
     /**

+ 4 - 3
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,13 +188,13 @@ 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);
         // 查询群成员人数限制
         SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
         if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0
-            && (memberCount + addNum) >= Integer.parseInt(config.getParamValue())) {
+            && (memberCount + addNum) > Integer.parseInt(config.getParamValue())) {
             return false;
         }
         return true;

+ 35 - 14
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);
+        Set<Long> studentIds = new LinkedHashSet<>(courseScheduleStudentPaymentDao.queryStudentIds(courseGroupId, courseGroupType));
         // studentIds集合中所有null元素移除
         studentIds.removeAll(Collections.singleton(null));
         if (CollectionUtils.isEmpty(studentIds)) {