Prechádzať zdrojové kódy

Merge branch 'feature/0717_group_limit' into test

yuanliang 1 rok pred
rodič
commit
9b8dced695

+ 1 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/website/controller/WebCourseScheduleController.java

@@ -23,6 +23,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.validation.annotation.Validated;

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

@@ -2147,10 +2147,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 
         String message = "";
         if (CollectionUtils.isNotEmpty(noGroupJoinUserIds)) {
-            String collect = teacherService.getDao().findBasicUserInfo(Sets.newHashSet(noGroupJoinUserIds)).stream()
-                .map(BasicUserInfo::getUsername).collect(Collectors.joining());
             // 返回未加入群用户消息
-            message = collect + "由于群成员人数达到上限,未进入课程群";
+            message = "群成员人数达到上限,有" + noGroupJoinUserIds.size() + "位学生未进入课程群";
         }
         return message;
     }

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

@@ -100,7 +100,9 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
 
             // 统计群成员数量,大于等于群组最大人数时,不允许加入
-            verifyGroupMemberJoinLimit(groupId);
+            if (!verifyGroupMemberJoinLimit(groupId, 1)) {
+                throw new BizException("群成员数量已达上限");
+            }
 
             try {
                 Date date = new Date();
@@ -154,7 +156,11 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
         DistributedLock.of(redissonClient).runIfLockToFunction(lockName, (x)-> {
 
             // 校验群成员加入限制
-            verifyGroupMemberJoinLimit(groupId);
+            String[] split = auditIds.split(",");
+            if (AuditStatusEnum.OPEN.equals(auditStatus) && !verifyGroupMemberJoinLimit(groupId, split.length)) {
+                SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
             try {
                 //修改审核状态
                 baseMapper.batchUpdateAuditStatus(auditIds,auditStatus.getCode());
@@ -181,15 +187,16 @@ public class ImGroupMemberAuditServiceImpl extends ServiceImpl<ImGroupMemberAudi
      * 校验群成员加入限制
      * @param groupId 群组ID
      */
-    private void verifyGroupMemberJoinLimit(String groupId) {
+    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 > Integer.parseInt(config.getParamValue())) {
-            throw new BizException("群成员数量已达上限");
+            && (memberCount + addNum) >= Integer.parseInt(config.getParamValue())) {
+            return false;
         }
+        return true;
     }
 
     /**

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

@@ -316,6 +316,12 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     @Override
     @Transactional(rollbackFor = Exception.class)
     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()) {
+            throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+        }
+
         Date now = new Date();
         if (imGroup.getType() == null) {
             imGroup.setType(ImGroupType.FAN.getCode());
@@ -431,13 +437,14 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
             if (Objects.nonNull(config) && Integer.parseInt(config.getParamValue()) > 0) {
                 int groupMemberLimit = Integer.parseInt(config.getParamValue());
-                if (CollectionUtils.size(studentIds) > groupMemberLimit) {
+                if ((CollectionUtils.size(studentIds) + 1) > groupMemberLimit) {
 
                     // 已加入群组用户标记
                     List<Long> userIds = Lists.newArrayList(studentIds);
-                    studentIds = Sets.newHashSet(userIds.subList(0, groupMemberLimit));
+                    studentIds = Sets.newHashSet(userIds.subList(0, groupMemberLimit - 1));
                     // 未加入群组用户标记
-                    noGroupJoinUserIds.addAll(userIds.subList(groupMemberLimit, userIds.size()));
+                    Set<Long> addStudentIds = studentIds;
+                    noGroupJoinUserIds.addAll(userIds.stream().filter(n->!addStudentIds.contains(n)).collect(Collectors.toList()));
                     // 重置用户入群加入标记
                     courseScheduleStudentPaymentDao.updateGroupJoinStatus(courseGroupId, courseGroupType, false,
                         noGroupJoinUserIds);
@@ -445,22 +452,24 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
             }
         }
 
-        // 添加学生
-        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, 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()
-                    .groupId(groupMember.getGroupId())
-                    .userId(groupMember.getUserId())
-                    .clientType(groupMember.getRoleType().getCode())
-                    .avatar(groupMember.getAvatar())
-                    .nickname(groupMember.getNickname())
-                    .isAdmin(groupMember.getIsAdmin())
-                    .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
-                    .roleType(groupMember.getRoleType().getCode())
-                    .build());
+        if (!studentIds.isEmpty()) {
+            // 添加学生
+            List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMembers(groupId, 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()
+                        .groupId(groupMember.getGroupId())
+                        .userId(groupMember.getUserId())
+                        .clientType(groupMember.getRoleType().getCode())
+                        .avatar(groupMember.getAvatar())
+                        .nickname(groupMember.getNickname())
+                        .isAdmin(groupMember.getIsAdmin())
+                        .imUserId(getImUserId(groupMember.getUserId().toString(), groupMember.getRoleType().getCode()))
+                        .roleType(groupMember.getRoleType().getCode())
+                        .build());
+            }
+            imGroupCoreService.saveImGroupMemberList(groupId, groupMemberList);
         }
-        imGroupCoreService.saveImGroupMemberList(groupId, groupMemberList);
         //处理本地群成员列表
         // 添加老师
 //        List<ImGroupMember> groupMembers = imGroupMemberService.initGroupMember(imGroupId, imGroup.getCreateBy(),

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupServiceImpl.java

@@ -17,6 +17,7 @@ import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.Student;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.SysConfig;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
 import com.yonge.cooleshow.biz.dal.entity.TenantGroupAlbum;
@@ -28,6 +29,7 @@ import com.yonge.cooleshow.biz.dal.mapper.TenantGroupAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
@@ -36,6 +38,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.im.ImGroupWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -71,6 +74,8 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
     private SysUserService sysUserService;
     @Autowired
     private TenantGroupAlbumMapper tenantGroupAlbumMapper;
+    @Autowired
+    private SysConfigService sysConfigService;
 
     /**
      * 查询详情
@@ -162,6 +167,12 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
 
         this.save(entity);
         if (adminId != null && Boolean.TRUE.equals(imGroupCreate)) {
+            // 群成员数量限制校验
+            SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+            if (config != null && Integer.parseInt(config.getParamValue()) < (userIds.size() + 1)) {
+                throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+            }
+
             // 建群
             try {
                 ImGroupWrapper.ImGroup imGroup = new ImGroupWrapper.ImGroup();
@@ -231,6 +242,11 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
             ImGroup imGroup = imGroupService.getById(oldImGroupId);
             // 群被删除过,并且需要重新建群
             if (imGroup == null) {
+                SysConfig config = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
+                if (config != null && Integer.parseInt(config.getParamValue()) < (tenantGroup.getUserIds().size() + 1)) {
+                    throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
+                }
+
                 String imGroupId = createImGroup(entity.getAdminId(), tenantGroup.getName());
                 entity.setImGroupId(imGroupId);