|
@@ -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()
|