|
@@ -19,14 +19,14 @@ import org.apache.commons.lang3.StringUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.util.*;
|
|
|
-import java.util.function.BiConsumer;
|
|
|
-import java.util.function.Consumer;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -58,6 +58,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
private IMHelper imHelper;
|
|
|
@Resource
|
|
|
private MusicSheetAccompanimentService musicSheetAccompanimentService;
|
|
|
+ @Resource
|
|
|
+ private RedisTemplate<String,Object> redisTemplate;
|
|
|
+
|
|
|
+ private String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
|
|
|
|
|
|
@Override
|
|
|
public ImNetworkRoomDao getDao() {
|
|
@@ -180,48 +184,32 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public void leaveRoom(String roomId) throws Exception {
|
|
|
- Long userId = sysUserService.getUserId();
|
|
|
- log.info("leaveRoom: roomId={}, userId={}", roomId, userId);
|
|
|
- long courseScheduleId = Long.parseLong(roomId);
|
|
|
- Long teacherId = Optional.ofNullable(courseScheduleService.getById(courseScheduleId)).
|
|
|
- map(CourseSchedule::getTeacherId).
|
|
|
- orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
- UserRoleEnum userRole = UserRoleEnum.STUDENT;
|
|
|
- if(teacherId.equals(userId)){
|
|
|
- userRole = UserRoleEnum.TEACHER;
|
|
|
- }
|
|
|
- if (userRole == UserRoleEnum.TEACHER){
|
|
|
- //如果老师退出房间,关闭伴奏
|
|
|
- courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
- courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
|
|
|
- courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
|
|
|
+ public void quitRoomSuccess(String roomId, Long userId) throws Exception {
|
|
|
+ log.info("quitRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
+ //防止幂等
|
|
|
+ StringBuffer sb = new StringBuffer(QUIT_ROOM_SUCCESS).append(roomId).append(userId);
|
|
|
+ if (!redisTemplate.opsForValue().setIfAbsent(sb.toString(),userId,1l, TimeUnit.SECONDS)){
|
|
|
+ log.info("quitRoomSuccess break: roomId={}, userId={}", roomId, userId);
|
|
|
+ return;
|
|
|
}
|
|
|
ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId);
|
|
|
- //删除用户信息
|
|
|
- imNetworkRoomMemberService.getDao().delByRidAndUid(roomId,userId);
|
|
|
- //发送退出房间的消息
|
|
|
- ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN);
|
|
|
- imHelper.publishMessage(userId.toString(), roomId, msg);
|
|
|
- imHelper.quit(new String[]{userId.toString()}, roomId);
|
|
|
- //记录考勤信息
|
|
|
- //是否删除房间信息
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void leaveRoomSuccess(String roomId, Long userId) throws Exception {
|
|
|
- log.info("leaveRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
+ if(Objects.isNull(roomMember)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
|
|
|
.orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
+ Long courseScheduleId = courseSchedule.getId();
|
|
|
UserRoleEnum roleEnum = UserRoleEnum.STUDENT;
|
|
|
if(Objects.equals(courseSchedule.getTeacherId(),userId)){
|
|
|
roleEnum = UserRoleEnum.TEACHER;
|
|
|
}
|
|
|
//记录考勤信息
|
|
|
-
|
|
|
ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
|
if (roleEnum == UserRoleEnum.TEACHER){
|
|
|
+ //如果老师退出房间,关闭伴奏
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
|
|
|
if (isUserDisplay(room.getDisplay(), userId)) {
|
|
|
room.setDisplay("");
|
|
|
this.updateDisplay(userId,room);
|
|
@@ -229,7 +217,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
//老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,"");
|
|
|
}
|
|
|
- ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId);
|
|
|
int memberNum = imNetworkRoomMemberService.getDao().countByRoomId(roomId);
|
|
|
if (memberNum <= 1) {
|
|
|
imHelper.dismiss(userId.toString(), roomId);
|
|
@@ -363,7 +350,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
String roomId = deviceControl.getRoomId();
|
|
|
Long userId = deviceControl.getUserId();
|
|
|
Boolean enable = deviceControl.getEnable();
|
|
|
- log.info("controlDevice: roomId:{} ,deviceType:{} ,enable:{} ,userId:{}", roomId,deviceControl.getDeviceType(),enable);
|
|
|
+ log.info("controlDevice: roomId:{} ,deviceType:{} ,enable:{} ,userId:{}", roomId,deviceControl.getDeviceType(),enable,userId);
|
|
|
if(enable){
|
|
|
long scheduleId = Long.parseLong(roomId);
|
|
|
ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),enable);
|