|
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.google.common.collect.Lists;
|
|
|
+import com.google.common.collect.Sets;
|
|
|
import com.microsvc.toolkit.middleware.common.http.ImageUtil;
|
|
|
import com.microsvc.toolkit.middleware.im.ImPluginContext;
|
|
|
import com.microsvc.toolkit.middleware.im.message.GroupMemberWrapper;
|
|
@@ -33,6 +34,7 @@ import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
|
|
|
import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
|
|
|
import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
|
|
@@ -64,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;
|
|
@@ -304,6 +307,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() + 1)) {
|
|
|
+ throw new BizException("群成员人数上限为:" + config.getParamValue() + "人");
|
|
|
+ }
|
|
|
+
|
|
|
Date now = new Date();
|
|
|
if (imGroup.getType() == null) {
|
|
|
imGroup.setType(ImGroupType.FAN.getCode());
|
|
@@ -359,31 +368,52 @@ 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);
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public String autoCreate(Long courseGroupId, String courseGroupType) throws Exception {
|
|
|
+ public String autoCreate(Long courseGroupId, String courseGroupType, List<Long> noGroupJoinUserIds) throws Exception {
|
|
|
//获取课程组
|
|
|
CourseGroup courseGroup = courseGroupService.getById(courseGroupId);
|
|
|
if (courseGroup.getTeacherId() == null) {
|
|
|
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)) {
|
|
|
return null;
|
|
@@ -391,7 +421,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();
|
|
@@ -408,25 +438,48 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
|
|
|
imGroup.setCourseGroupId(courseGroupId);
|
|
|
// this.baseMapper.insert(imGroup);
|
|
|
|
|
|
-
|
|
|
String groupId = createImGroup(imGroup);
|
|
|
-// // 添加学生
|
|
|
- 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 (CourseScheduleEnum.PIANO_ROOM_CLASS.getCode().equals(courseGroupType)
|
|
|
+ || CourseScheduleEnum.LIVE.getCode().equals(courseGroupType)) {
|
|
|
+
|
|
|
+ // 增加群成员人数限制,若超过限制则不添加到群组
|
|
|
+ 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) + 1) > groupMemberLimit) {
|
|
|
+
|
|
|
+ // 已加入群组用户标记
|
|
|
+ List<Long> userIds = Lists.newArrayList(studentIds);
|
|
|
+ studentIds = userIds.subList(0, groupMemberLimit - 1);
|
|
|
+ // 未加入群组用户标记
|
|
|
+ noGroupJoinUserIds.addAll(userIds.subList(groupMemberLimit - 1, userIds.size()));
|
|
|
+ // 重置用户入群加入标记
|
|
|
+ courseScheduleStudentPaymentDao.updateGroupJoinStatus(courseGroupId, courseGroupType, false,
|
|
|
+ noGroupJoinUserIds);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!studentIds.isEmpty()) {
|
|
|
+ // 添加学生
|
|
|
+ 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()
|
|
|
+ .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(),
|
|
@@ -436,7 +489,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
|
|
|
// this.rtcCreate(courseGroup.getTeacherId(), imGroupId, imGroup.getName(),imGroup.getImg());
|
|
|
// //加入融云群
|
|
|
// imGroupMemberService.join(groupMembers, imGroupId);
|
|
|
- return groupId.toString();
|
|
|
+ return groupId;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -612,6 +665,13 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
|
|
|
public ImGroup findGroupInfoById(String groupId, Long userId) {
|
|
|
|
|
|
ImGroup group = imGroupService.getById(groupId);
|
|
|
+ if (Objects.nonNull(group)) {
|
|
|
+ // 查询群成员人数限制
|
|
|
+ SysConfig byParamName = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
|
|
|
+ if (Objects.nonNull(byParamName)) {
|
|
|
+ group.setGroupMemberLimit(Integer.parseInt(byParamName.getParamValue()));
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
// 异步执行自动加入群组功能
|
|
|
ThreadPool.getExecutor().submit(() -> {
|
|
@@ -664,6 +724,24 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
|
|
|
return group;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取群信息
|
|
|
+ *
|
|
|
+ * @param groupId 群ID
|
|
|
+ * @return ImGroup
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ImGroup getGroupById(String groupId) {
|
|
|
+ ImGroup group = imGroupService.getById(groupId);
|
|
|
+ if (Objects.nonNull(group)) {
|
|
|
+ // 查询群成员人数限制
|
|
|
+ SysConfig byParamName = sysConfigService.findByParamName(SysConfigConstant.GROUP_MEMBER_LIMIT);
|
|
|
+ if (Objects.nonNull(byParamName)) {
|
|
|
+ group.setGroupMemberLimit(Integer.parseInt(byParamName.getParamValue()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return group;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
/**
|